Browse Source

Merge pull request #49 from iden3/feature/neptune

Neptune Hash Implementation
fix/bbjj-err
cool-developer 2 years ago
committed by GitHub
parent
commit
edc36bfa52
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 894 additions and 109 deletions
  1. +815
    -94
      goldenposeidon/constants.go
  2. +38
    -10
      goldenposeidon/poseidon.go
  3. +41
    -5
      goldenposeidon/poseidon_test.go

+ 815
- 94
goldenposeidon/constants.go

@ -14,102 +14,814 @@ var (
mdiag = []uint64{8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
c = []uint64{
0xb585f766f2144405, 0x7746a55f43921ad7, 0xb2fb0d31cee799b4, 0x0f6760a4803427d7,
0xe10d666650f4e012, 0x8cae14cb07d09bf1, 0xd438539c95f63e9f, 0xef781c7ce35b4c3d,
0xcdc4a239b0c44426, 0x277fa208bf337bff, 0xe17653a29da578a1, 0xc54302f225db2c76,
0x86287821f722c881, 0x59cd1a8a41c18e55, 0xc3b919ad495dc574, 0xa484c4c5ef6a0781,
0x308bbd23dc5416cc, 0x6e4a40c18f30c09c, 0x9a2eedb70d8f8cfa, 0xe360c6e0ae486f38,
0xd5c7718fbfc647fb, 0xc35eae071903ff0b, 0x849c2656969c4be7, 0xc0572c8c08cbbbad,
0xe9fa634a21de0082, 0xf56f6d48959a600d, 0xf7d713e806391165, 0x8297132b32825daf,
0xad6805e0e30b2c8a, 0xac51d9f5fcf8535e, 0x502ad7dc18c2ad87, 0x57a1550c110b3041,
0x66bbd30e6ce0e583, 0x0da2abef589d644e, 0xf061274fdb150d61, 0x28b8ec3ae9c29633,
0x92a756e67e2b9413, 0x70e741ebfee96586, 0x019d5ee2af82ec1c, 0x6f6f2ed772466352,
0x7cf416cfe7e14ca1, 0x61df517b86a46439, 0x85dc499b11d77b75, 0x4b959b48b9c10733,
0xe8be3e5da8043e57, 0xf5c0bc1de6da8699, 0x40b12cbf09ef74bf, 0xa637093ecb2ad631,
0x3cc3f892184df408, 0x2e479dc157bf31bb, 0x6f49de07a6234346, 0x213ce7bede378d7b,
0x5b0431345d4dea83, 0xa2de45780344d6a1, 0x7103aaf94a7bf308, 0x5326fc0d97279301,
0xa9ceb74fec024747, 0x27f8ec88bb21b1a3, 0xfceb4fda1ded0893, 0xfac6ff1346a41675,
0x7131aa45268d7d8c, 0x9351036095630f9f, 0xad535b24afc26bfb, 0x4627f5c6993e44be,
0x645cf794b8f1cc58, 0x241c70ed0af61617, 0xacb8e076647905f1, 0x3737e9db4c4f474d,
0xe7ea5e33e75fffb6, 0x90dee49fc9bfc23a, 0xd1b1edf76bc09c92, 0x0b65481ba645c602,
0x99ad1aab0814283b, 0x438a7c91d416ca4d, 0xb60de3bcc5ea751c, 0xc99cab6aef6f58bc,
0x69a5ed92a72ee4ff, 0x5e7b329c1ed4ad71, 0x5fc0ac0800144885, 0x32db829239774eca,
0x0ade699c5830f310, 0x7cc5583b10415f21, 0x85df9ed2e166d64f, 0x6604df4fee32bcb1,
0xeb84f608da56ef48, 0xda608834c40e603d, 0x8f97fe408061f183, 0xa93f485c96f37b89,
0x6704e8ee8f18d563, 0xcee3e9ac1e072119, 0x510d0e65e2b470c1, 0xf6323f486b9038f0,
0x0b508cdeffa5ceef, 0xf2417089e4fb3cbd, 0x60e75c2890d15730, 0xa6217d8bf660f29c,
0x7159cd30c3ac118e, 0x839b4e8fafead540, 0x0d3f3e5e82920adc, 0x8f7d83bddee7bba8,
0x780f2243ea071d06, 0xeb915845f3de1634, 0xd19e120d26b6f386, 0x016ee53a7e5fecc6,
0xcb5fd54e7933e477, 0xacb8417879fd449f, 0x9c22190be7f74732, 0x5d693c1ba3ba3621,
0xdcef0797c2b69ec7, 0x3d639263da827b13, 0xe273fd971bc8d0e7, 0x418f02702d227ed5,
0x8c25fda3b503038c, 0x2cbaed4daec8c07c, 0x5f58e6afcdd6ddc2, 0x284650ac5e1b0eba,
0x635b337ee819dab5, 0x9f9a036ed4f2d49f, 0xb93e260cae5c170e, 0xb0a7eae879ddb76d,
0xd0762cbc8ca6570c, 0x34c6efb812b04bf5, 0x40bf0ab5fa14c112, 0xb6b570fc7c5740d3,
0x5a27b9002de33454, 0xb1a5b165b6d2b2d2, 0x8722e0ace9d1be22, 0x788ee3b37e5680fb,
0x14a726661551e284, 0x98b7672f9ef3b419, 0xbb93ae776bb30e3a, 0x28fd3b046380f850,
0x30a4680593258387, 0x337dc00c61bd9ce1, 0xd5eca244c7a4ff1d, 0x7762638264d279bd,
0xc1e434bedeefd767, 0x0299351a53b8ec22, 0xb2d456e4ad251b80, 0x3e9ed1fda49cea0b,
0x2972a92ba450bed8, 0x20216dd77be493de, 0xadffe8cf28449ec6, 0x1c4dbb1c4c27d243,
0x15a16a8a8322d458, 0x388a128b7fd9a609, 0x2300e5d6baedf0fb, 0x2f63aa8647e15104,
0xf1c36ce86ecec269, 0x27181125183970c9, 0xe584029370dca96d, 0x4d9bbc3e02f1cfb2,
0xea35bc29692af6f8, 0x18e21b4beabb4137, 0x1e3b9fc625b554f4, 0x25d64362697828fd,
0x5a3f1bb1c53a9645, 0xdb7f023869fb8d38, 0xb462065911d4e1fc, 0x49c24ae4437d8030,
0xd793862c112b0566, 0xaadd1106730d8feb, 0xc43b6e0e97b0d568, 0xe29024c18ee6fca2,
0x5e50c27535b88c66, 0x10383f20a4ff9a87, 0x38e8ee9d71a45af8, 0xdd5118375bf1a9b9,
0x775005982d74d7f7, 0x86ab99b4dde6c8b0, 0xb1204f603f51c080, 0xef61ac8470250ecf,
0x1bbcd90f132c603f, 0x0cd1dabd964db557, 0x11a3ae5beb9d1ec9, 0xf755bfeea585d11d,
0xa3b83250268ea4d7, 0x516306f4927c93af, 0xddb4ac49c9efa1da, 0x64bb6dec369d4418,
0xf9cc95c22b4c1fcc, 0x08d37f755f4ae9f6, 0xeec49b613478675b, 0xf143933aed25e0b0,
0xe4c5dd8255dfc622, 0xe7ad7756f193198e, 0x92c2318b87fff9cb, 0x739c25f8fd73596d,
0x5636cac9f16dfed0, 0xdd8f909a938e0172, 0xc6401fe115063f5b, 0x8ad97b33f1ac1455,
0x0c49366bb25e8513, 0x0784d3d2f1698309, 0x530fb67ea1809a81, 0x410492299bb01f49,
0x139542347424b9ac, 0x9cb0bd5ea1a1115e, 0x02e3f615c38f49a1, 0x985d4f4a9c5291ef,
0x775b9feafdcd26e7, 0x304265a6384f0f2d, 0x593664c39773012c, 0x4f0a2e5fb028f2ce,
0xdd611f1000c17442, 0xd8185f9adfea4fd0, 0xef87139ca9a3ab1e, 0x3ba71336c34ee133,
0x7d3a455d56b70238, 0x660d32e130182684, 0x297a863f48cd1f43, 0x90e0a736a751ebb7,
0x549f80ce550c4fd3, 0x0f73b2922f38bd64, 0x16bf1f73fb7a9c3f, 0x6d1f5a59005bec17,
0x02ff876fa5ef97c4, 0xc5cb72a2a51159b0, 0x8470f39d2d5c900e, 0x25abb3f1d39fcb76,
0x23eb8cc9b372442f, 0xd687ba55c64f6364, 0xda8d9e90fd8ff158, 0xe3cbdc7d2fe45ea7,
0xb9a8c9b3aee52297, 0xc0d28a5c10960bd3, 0x45d7ac9b68f71a34, 0xeeb76e397069e804,
0x3d06c8bd1514e2d9, 0x9c9c98207cb10767, 0x65700b51aedfb5ef, 0x911f451539869408,
0x7ae6849fbc3a0ec6, 0x3bb340eba06afe7e, 0xb46e9d8b682ea65e, 0x8dcf22f9a3b34356,
0x77bdaeda586257a7, 0xf19e400a5104d20d, 0xc368a348e46d950f, 0x9ef1cd60e679f284,
0xe89cd854d5d01d33, 0x5cd377dc8bb882a2, 0xa7b0fb7883eee860, 0x7684403ec392950d,
0x5fa3f06f4fed3b52, 0x8df57ac11bc04831, 0x2db01efa1e1e1897, 0x54846de4aadb9ca2,
0xba6745385893c784, 0x541d496344d2c75b, 0xe909678474e687fe, 0xdfe89923f6c9c2ff,
0xece5a71e0cfedc75, 0x5ff98fd5d51fe610, 0x83e8941918964615, 0x5922040b47f150c1,
0xf97d750e3dd94521, 0x5080d4c2b86f56d7, 0xa7de115b56c78d70, 0x6a9242ac87538194,
0xf7856ef7f9173e44, 0x2265fc92feb0dc09, 0x17dfc8e4f7ba8a57, 0x9001a64209f21db8,
0x90004c1371b893c5, 0xb932b7cf752e5545, 0xa0b1df81b6fe59fc, 0x8ef1dd26770af2c2,
0x0541a4f9cfbeed35, 0x9e61106178bfc530, 0xb3767e80935d8af2, 0x0098d5782065af06,
0x31d191cd5c1466c7, 0x410fefafa319ac9d, 0xbdf8f242e316c4ab, 0x9e8cd55b57637ed0,
0xde122bebe9a39368, 0x4d001fd58f002526, 0xca6637000eb4a9f8, 0x2f2339d624f91f78,
0x6d1a7918c80df518, 0xdf9a4939342308e9, 0xebc2151ee6c8398c, 0x03cc2ba8a1116515,
0xd341d037e840cf83, 0x387cb5d25af4afcc, 0xbba2515f22909e87, 0x7248fe7705f38e47,
0x4d61e56a525d225a, 0x262e963c8da05d3d, 0x59e89b094d220ec2, 0x055d5b52b78b9c5e,
0x82b27eb33514ef99, 0xd30094ca96b7ce7b, 0xcf5cb381cd0a1535, 0xfeed4db6919e5a7c,
0x41703f53753be59f, 0x5eeea940fcde8b6f, 0x4cd1f1b175100206, 0x4a20358574454ec0,
0x1478d361dbbf9fac, 0x6f02dc07d141875c, 0x296a202ed8e556a2, 0x2afd67999bf32ee5,
0x7acfd96efa95491d, 0x6798ba0c0abb2c6d, 0x34c6f57b26c92122, 0x5736e1bad206b5de,
0x20057d2a0056521b, 0x3dea5bd5d0578bd7, 0x16e50d897d4634ac, 0x29bff3ecb9b7a6e3,
0x475cd3205a3bdcde, 0x18a42105c31b7e88, 0x023e7414af663068, 0x15147108121967d7,
0xe4a3dff1d7d6fef9, 0x01a8d1a588085737, 0x11b4c74eda62beef, 0xe587cc0d69a73346,
0x1ff7327017aa2a6e, 0x594e29c42473d06b, 0xf6f31db1899b12d5, 0xc02ac5e47312d3ca,
0xe70201e960cb78b8, 0x6f90ff3b6a65f108, 0x42747a7245e7fa84, 0xd1f507e43ab749b2,
0x1c86d265f15750cd, 0x3996ce73dd832c1c, 0x8e7fba02983224bd, 0xba0dec7103255dd4,
0x9e9cbd781628fc5b, 0xdae8645996edd6a5, 0xdebe0853b1a1d378, 0xa49229d24d014343,
0x7be5b9ffda905e1c, 0xa3c95eaec244aa30, 0x0230bca8f4df0544, 0x4135c2bebfe148c6,
0x166fc0cc438a3c72, 0x3762b59a8ae83efa, 0xe8928a4c89114750, 0x2a440b51a4945ee5,
0x80cefd2b7d99ff83, 0xbb9879c6e61fd62a, 0x6e7c8f1a84265034, 0x164bb2de1bbeddc8,
0xf3c12fe54d5c653b, 0x40b9e922ed9771e2, 0x551f5b0fbe7b1840, 0x25032aa7c4cb1811,
0xaaed34074b164346, 0x8ffd96bbf9c9c81d, 0x70fc91eb5937085c, 0x7f795e2a5f915440,
0x4543d9df5476d3cb, 0xf172d73e004fc90d, 0xdfd1c4febcc81238, 0xbc8dfb627fe558fc,
0xb585f766f2144405,
0x7746a55f43921ad7,
0xb2fb0d31cee799b4,
0xf6760a4803427d7,
0xe10d666650f4e012,
0x8cae14cb07d09bf1,
0xd438539c95f63e9f,
0xef781c7ce35b4c3d,
0xcdc4a239b0c44426,
0x277fa208bf337bff,
0xe17653a29da578a1,
0xc54302f225db2c76,
0xac6c9c2b4418dd61,
0xe0888eb1e8a01286,
0x813dbe952b98904e,
0xcc3033609c9cf175,
0x72cebc82a59c0f82,
0x8150d8525753e741,
0xb1122c74b268d66e,
0x7c6ddd482375aa2,
0xa4dd6f1ef49fb6af,
0xd33b0d5b4f7ccfe5,
0xc523112247209124,
0x464804200134c32d,
0xcd09dea180de4f2c,
0xadb069225c93e4e6,
0xbf01209b8a7c8534,
0xb1eb37d319913823,
0xdadf943b8d3e5a0d,
0x6d15f3cb7a3520ba,
0xf07af62b134ef181,
0x568355076c6b0de6,
0x31ca4bf93cab68b8,
0xfbad37a125735ba,
0x9d3a9caaf1ac9e0a,
0x4f265810f020c095,
0x6a84c9524e81a8bc,
0x68ba410537925c79,
0x422604631b34b07a,
0x28e3a001f62f8290,
0x3adfdccb8f734d41,
0x73503e539baec66a,
0xe8c1fd0142d9849c,
0xe204ac13660546c5,
0x8e2bb3ea97a40c53,
0xac2800d1bf56548c,
0x9494dca005d180d0,
0xf36e1d066383ef53,
0x8aa35b97a0e03c04,
0xcf42a59addbd1f0c,
0xa43ace89f8fdbd79,
0x37585d8c243870c,
0x4ab94ee3e26596fe,
0xcee3abbb50d57b23,
0xac91a7101a5ec55b,
0x9173aa8462280d2d,
0xaec1ca46ccb95105,
0x57b2f2845db61e4a,
0x95704158500c90c6,
0x66e023b0e6c9df5f,
0x315f63f4fec360ba,
0xf3009795713abcf1,
0xf4decc3fb00765ee,
0x32620ac918682d50,
0x49717d63a5fc742e,
0x153516f22014ea2d,
0xcc316380a2761fe4,
0x2e49b3f7076d203d,
0x44ac3e9bf0a2dc89,
0x49d1e388d8e35c,
0x53ec867cb39989fa,
0xd2c9bcc8d65f5a62,
0xc0cc930ee8540455,
0x40651e0872505e8,
0x168973b2ebafbe6c,
0x9c7eecb3b40581c2,
0x389473bcdfca97a2,
0xb1cb0b3abe9753ad,
0x41afceccffdb18e6,
0x7bf841e237ccd6c9,
0x6082a3f101fb888,
0x8c1a39196f4163cc,
0xb56664760c1c9476,
0x2a02ac020d1eb5a3,
0x6a9d48e8aa83605d,
0x8a0d2f5c4c9c51b2,
0x75fc65575b284ad4,
0xadaedf7d1ce2a8dd,
0x235bc889cc83968e,
0xa8c30cf1781738f5,
0x546b2a846753bcf8,
0x9b68e8c06c04bd25,
0x3fdf80794ebb443b,
0x92ca132a9bec5a45,
0x76133eecfd9bd1ff,
0x3fb0fd5381054812,
0xf15925978dbd52ff,
0x2ee289ac37f0e879,
0xd8af8654e9a2e659,
0x8595bbd7f34c5e8a,
0x206ddbf781e47b2,
0xe101a767854a2f97,
0xf4d4f0a01072c996,
0x197aec2894aab642,
0x8d0c3911220db49b,
0xa62a8bad609227ca,
0x1e4813a7e7b9cbce,
0x6b547528731244eb,
0xd08e48512bfea84e,
0xb2920c88d3885857,
0x1f0cd5d7a309fcc2,
0x99a0ea0842fdb4fb,
0xc227210554b6c53d,
0x70e5269708f6f3a9,
0xbe8f71c8c98bb3bd,
0xf96fb39adc4baaf6,
0x7f9a7555c60fc6c7,
0xccaa5446d71fe6a5,
}
p = [][]uint64{
{
0x19,
0x78566230aa7cc5d0,
0xdbf23e50005e7f24,
0xb4a02c5c826d523e,
0x466d8f66a8f9fed5,
0x68da2264f65ec3e,
0xb59f9ff0ac6d5d78,
0xcfb03c902d447551,
0x2044ce14eaf8f5d9,
0xfb9373c8481e0f0d,
0x72af70cdcb99214f,
0xe3ef40eacc6ff78d,
},
{
0xf,
0x817bd8a7869ed1b5,
0x819f2c14a8366b1f,
0x7a5cf5b7b922e946,
0x727eca45c8d7bb71,
0x605a82c52b5ad2f1,
0x59ccc4d5184bc93a,
0x66c8bab2096cfd38,
0xeb4c0ce280c3e935,
0x17f9202c16676b2f,
0x9b6e5164ed35d878,
0x6fadc9347faeee81,
},
{
0x29,
0xd267254bea1097f4,
0x2dc10fce3233f443,
0xfa9db0de2d852e7a,
0xde2a0516f8c9d943,
0xe6fdf23648931b99,
0x3743057c07a5dbfa,
0xa6fdb8ebccc51667,
0x2c4916605e3dea58,
0xe95c10ae32e05085,
0x97f9b7d2cfc2ade5,
0x9b6e5164ed35d878,
},
{
0x10,
0x60c33ebd1e023f0a,
0xdb6945a20d277091,
0x383dd77e07998487,
0xe04ea1957ad8305c,
0xd499fcbf63fbd266,
0x462269e4b04620a5,
0x63c9679d8572a867,
0x81c44e9699915693,
0x62ecbe05e02433fc,
0xe95c10ae32e05085,
0x17f9202c16676b2f,
},
{
0x2,
0xa89ef32ae1462322,
0x77c1a153e73659e8,
0x2aec981be4b62ed5,
0xb70fb5f2b4f1f85f,
0x7c66d474cd2087cb,
0x39302966be7df654,
0xb827c807875511c0,
0xa4daffb3ffd0e78f,
0x81c44e9699915693,
0x2c4916605e3dea58,
0xeb4c0ce280c3e935,
},
{
0x1c,
0x6250f5f176d483e7,
0xaad1255d46e78f07,
0x8a00c7c83c762584,
0xc734f3829ed30b0c,
0xb1a0132288b1619b,
0x88685b4f0798dfd1,
0xfc02e869e21b72f8,
0xb827c807875511c0,
0x63c9679d8572a867,
0xa6fdb8ebccc51667,
0x66c8bab2096cfd38,
},
{
0xd,
0xe16a6c1dee3ba347,
0x13d316e45539aef4,
0x577e0472764f061d,
0x226a4dcf5db3316d,
0x3373035a3ca3dac6,
0x441f3a3747b5adb7,
0x88685b4f0798dfd1,
0x39302966be7df654,
0x462269e4b04620a5,
0x3743057c07a5dbfa,
0x59ccc4d5184bc93a,
},
{
0xd,
0xec9730136b7c2c05,
0xe1ecc5c21eec0646,
0x956d3c8b5528e064,
0x6df1d31fa84398f4,
0xf4898a1a3554ee49,
0x3373035a3ca3dac6,
0xb1a0132288b1619b,
0x7c66d474cd2087cb,
0xd499fcbf63fbd266,
0xe6fdf23648931b99,
0x605a82c52b5ad2f1,
},
{
0x27,
0x3cf7c3a39d94c236,
0x9e62c7d7b000cb0b,
0xe202be7ad7265af6,
0x82178371fa5fff69,
0x6df1d31fa84398f4,
0x226a4dcf5db3316d,
0xc734f3829ed30b0c,
0xb70fb5f2b4f1f85f,
0xe04ea1957ad8305c,
0xde2a0516f8c9d943,
0x727eca45c8d7bb71,
},
{
0x12,
0xb4707207455f57e3,
0x8e1de42b665c6706,
0xee7b04568203481,
0xe202be7ad7265af6,
0x956d3c8b5528e064,
0x577e0472764f061d,
0x8a00c7c83c762584,
0x2aec981be4b62ed5,
0x383dd77e07998487,
0xfa9db0de2d852e7a,
0x7a5cf5b7b922e946,
},
{
0x22,
0xaadb39e83e76a9e0,
0xcd9bf0bd292c5fda,
0x8e1de42b665c6706,
0x9e62c7d7b000cb0b,
0xe1ecc5c21eec0646,
0x13d316e45539aef4,
0xaad1255d46e78f07,
0x77c1a153e73659e8,
0xdb6945a20d277091,
0x2dc10fce3233f443,
0x819f2c14a8366b1f,
},
{
0x14,
0x32f8ae916e567d39,
0xaadb39e83e76a9e0,
0xb4707207455f57e3,
0x3cf7c3a39d94c236,
0xec9730136b7c2c05,
0xe16a6c1dee3ba347,
0x6250f5f176d483e7,
0xa89ef32ae1462322,
0x60c33ebd1e023f0a,
0xd267254bea1097f4,
0x817bd8a7869ed1b5,
},
}
s = []uint64{
0x19,
0x3d999c961b7c63b0,
0x814e82efcd172529,
0x2421e5d236704588,
0x887af7d4dd482328,
0xa5e9c291f6119b27,
0xbdc52b2676a4b4aa,
0x64832009d29bcf57,
0x9c4155174a552cc,
0x463f9ee03d290810,
0xc810936e64982542,
0x43b1c289f7bc3ac,
0x94877900674181c3,
0xc6c67cc37a2a2bbd,
0xd667c2055387940f,
0xba63a63e94b5ff0,
0x99460cc41b8f079f,
0x7ff02375ed524bb3,
0xea0870b47a8caf0e,
0xabcad82633b7bc9d,
0x3b8d135261052241,
0xfb4515f5e5b0d539,
0x3ee8011c2b37f77c,
0x19,
0x673655aae8be5a8b,
0xd510fe714f39fa10,
0x2c68a099b51c9e73,
0xa667bfa9aa96999d,
0x4d67e72f063e2108,
0xf84dde3e6acda179,
0x40f9cc8c08f80981,
0x5ead032050097142,
0x6591b02092d671bb,
0xe18c71963dd1b7,
0x8a21bcd24a14218a,
0xadef3740e71c726,
0xa37bf67c6f986559,
0xc6b16f7ed4fa1b00,
0x6a065da88d8bfc3c,
0x4cabc0916844b46f,
0x407faac0f02e78d1,
0x7a786d9cf0852cf,
0x42433fb6949a629a,
0x891682a147ce43b0,
0x26cfd58e7b003b55,
0x2bbf0ed7b657acb3,
0x19,
0x202800f4addbdc87,
0xe4b5bdb1cc3504ff,
0xbe32b32a825596e7,
0x8e0f68c5dc223b9a,
0x58022d9e1c256ce3,
0x584d29227aa073ac,
0x8b9352ad04bef9e7,
0xaead42a3f445ecbf,
0x3c667a1d833a3cca,
0xda6f61838efa1ffe,
0xe8f749470bd7c446,
0x481ac7746b159c67,
0xe367de32f108e278,
0x73f260087ad28bec,
0x5cfc82216bc1bdca,
0xcaccc870a2663a0e,
0xdb69cd7b4298c45d,
0x7bc9e0c57243e62d,
0x3cc51c5d368693ae,
0x366b4e8cc068895b,
0x2bd18715cdabbca4,
0xa752061c4f33b8cf,
0x19,
0xc5b85bab9e5b3869,
0x45245258aec51cf7,
0x16e6b8e68b931830,
0xe2ae0f051418112c,
0x470e26a0093a65b,
0x6bef71973a8146ed,
0x119265be51812daf,
0xb0be7356254bea2e,
0x8584defff7589bd7,
0x3c5fe4aeb1fb52ba,
0x9e7cd88acf543a5e,
0xb22d2432b72d5098,
0x9e18a487f44d2fe4,
0x4b39e14ce22abd3c,
0x9e77fde2eb315e0d,
0xca5e0385fe67014d,
0xc2cb99bf1b6bddb,
0x99ec1cd2a4460bfe,
0x8577a815a2ff843f,
0x7d80a6b4fd6518a5,
0xeb6c67123eab62cb,
0x8f7851650eca21a5,
0x19,
0x179be4bba87f0a8c,
0xacf63d95d8887355,
0x6696670196b0074f,
0xd99ddf1fe75085f9,
0xc2597881fef0283b,
0xcf48395ee6c54f14,
0x15226a8e4cd8d3b6,
0xc053297389af5d3b,
0x2c08893f0d1580e2,
0xed3cbcff6fcc5ba,
0xc82f510ecf81f6d0,
0x11ba9a1b81718c2a,
0x9f7d798a3323410c,
0xa821855c8c1cf5e5,
0x535e8d6fac0031b2,
0x404e7c751b634320,
0xa729353f6e55d354,
0x4db97d92e58bb831,
0xb53926c27897bf7d,
0x965040d52fe115c5,
0x9565fa41ebd31fd7,
0xaae4438c877ea8f4,
0x19,
0x94b06183acb715cc,
0x500392ed0d431137,
0x861cc95ad5c86323,
0x5830a443f86c4ac,
0x3b68225874a20a7c,
0x10b3309838e236fb,
0x9b77fc8bcd559e2c,
0xbdecf5e0cb9cb213,
0x30276f1221ace5fa,
0x7935dd342764a144,
0xeac6db520bb03708,
0x37f4e36af6073c6e,
0x4edc0918210800e9,
0xc44998e99eae4188,
0x9f4310d05d068338,
0x9ec7fe4350680f29,
0xc5b2c1fdc0b50874,
0xa01920c5ef8b2ebe,
0x59fa6f8bd91d58ba,
0x8bfc9eb89b515a82,
0xbe86a7a2555ae775,
0xcbb8bbaa3810babf,
0x19,
0x7186a80551025f8f,
0x622247557e9b5371,
0xc4cbe326d1ad9742,
0x55f1523ac6a23ea2,
0xa13dfe77a3d52f53,
0xe30750b6301c0452,
0x8bd488070a3a32b,
0xcd800caef5b72ae3,
0x83329c90f04233ce,
0xb5b99e6664a0a3ee,
0x6b0731849e200a7f,
0x577f9a9e7ee3f9c2,
0x88c522b949ace7b1,
0x82f07007c8b72106,
0x8283d37c6675b50e,
0x98b074d9bbac1123,
0x75c56fb7758317c1,
0xfed24e206052bc72,
0x26d7c3d1bc07dae5,
0xf88c5e441e28dbb4,
0x4fe27f9f96615270,
0x514d4ba49c2b14fe,
0x19,
0xec3fabc192b01799,
0x382b38cee8ee5375,
0x3bfb6c3f0e616572,
0x514abd0cf6c7bc86,
0x47521b1361dcc546,
0x178093843f863d14,
0xad1003c5d28918e7,
0x738450e42495bc81,
0xaf947c59af5e4047,
0x4653fb0685084ef2,
0x57fde2062ae35bf,
0xf02a3ac068ee110b,
0xa3630dafb8ae2d7,
0xce0dc874eaf9b55c,
0x9a95f6cff5b55c7e,
0x626d76abfed00c7b,
0xa0c1cf1251c204ad,
0xdaebd3006321052c,
0x3d4bd48b625a8065,
0x7f1e584e071f6ed2,
0x720574f0501caed3,
0xe3260ba93d23540a,
0x19,
0xe376678d843ce55e,
0x66f3860d7514e7fc,
0x7817f3dfff8b4ffa,
0x3929624a9def725b,
0x126ca37f215a80a,
0xfce2f5d02762a303,
0x1bc927375febbad7,
0x85b481e5243f60bf,
0x2d3c5f42a39c91a0,
0x811719919351ae8,
0xf669de0add993131,
0xab1cbd41d8c1e335,
0x9322ed4c0bc2df01,
0x51c3c0983d4284e5,
0x94178e291145c231,
0xfd0f1a973d6b2085,
0xd427ad96e2b39719,
0x8a52437fecaac06b,
0xdc20ee4b8c4c9a80,
0xa2c98e9549da2100,
0x1603fe12613db5b6,
0xe174929433c5505,
0x19,
0x7de38bae084da92d,
0x5b848442237e8a9b,
0xf6c705da84d57310,
0x31e6a4bdb6a49017,
0x889489706e5c5c0f,
0xe4a205459692a1b,
0xbac3fa75ee26f299,
0x5f5894f4057d755e,
0xb0dc3ecd724bb076,
0x5e34d8554a6452ba,
0x4f78fd8c1fdcc5f,
0x3d4eab2b8ef5f796,
0xcfff421583896e22,
0x4143cb32d39ac3d9,
0x22365051b78a5b65,
0x6f7fd010d027c9b6,
0xd9dd36fba77522ab,
0xa44cf1cb33e37165,
0x3fc83d3038c86417,
0xc4588d418e88d270,
0xce1320f10ab80fe2,
0xdb5eadbbec18de5d,
0x19,
0x4dd19c38779512ea,
0xdb79ba02704620e9,
0x92a29a3675a5d2be,
0xd5177029fe495166,
0xd32b3298a13330c1,
0x251c4a3eb2c5f8fd,
0xe1c48b26e0d98825,
0x3301d3362a4ffccb,
0x9bb6c88de8cd178,
0xdc05b676564f538a,
0x60192d883e473fee,
0x1183dfce7c454afd,
0x21cea4aa3d3ed949,
0xfce6f70303f2304,
0x19557d34b55551be,
0x4c56f689afc5bbc9,
0xa1e920844334f944,
0xbad66d423d2ec861,
0xf318c785dc9e0479,
0x99e2032e765ddd81,
0x400ccc9906d66f45,
0xe1197454db2e0dd9,
0x19,
0x16b9774801ac44a0,
0x3cb8411e786d3c8e,
0xa86e9cf505072491,
0x178928152e109ae,
0x5317b905a6e1ab7b,
0xda20b3be7f53d59f,
0xcb97dedecebee9ad,
0x4bd545218c59f58d,
0x77dc8d856c05a44a,
0x87948589e4f243fd,
0x7e5217af969952c2,
0x84d1ecc4d53d2ff1,
0xd8af8b9ceb4e11b6,
0x335856bb527b52f4,
0xc756f17fb59be595,
0xc0654e4ea5553a78,
0x9e9a46b61f2ea942,
0x14fc8b5b3b809127,
0xd7009f0f103be413,
0x3e0ee7b7a9fb4601,
0xa74e888922085ed7,
0xe80a7cde3d4ac526,
0x19,
0xbc58987d06a84e4d,
0xb5d420244c9cae3,
0xa3c4711b938c02c0,
0x3aace640a3e03990,
0x865a0f3249aacd8a,
0x8d00b2a7dbed06c7,
0x6eacb905beb7e2f8,
0x45322b216ec3ec7,
0xeb9de00d594828e6,
0x88c5f20df9e5c26,
0xf555f4112b19781f,
0x238aa6daa612186d,
0x9137a5c630bad4b4,
0xc7db3817870c5eda,
0x217e4f04e5718dc9,
0xcae814e2817bd99d,
0xe3292e7ab770a8ba,
0x7bb36ef70b6b9482,
0x3c7835fb85bca2d3,
0xfe2cdf8ee3c25e86,
0x61b3915ad7274b20,
0xeab75ca7c918e4ef,
0x19,
0xa8cedbff1813d3a7,
0x50dcaee0fd27d164,
0xf1cb02417e23bd82,
0xfaf322786e2abe8b,
0x937a4315beb5d9b6,
0x1b18992921a11d85,
0x7d66c4368b3c497b,
0xe7946317a6b4e99,
0xbe4430134182978b,
0x3771e82493ab262d,
0xa671690d8095ce82,
0xd6e15ffc055e154e,
0xec67881f381a32bf,
0xfbb1196092bf409c,
0xdc9d2e07830ba226,
0x698ef3245ff7988,
0x194fae2974f8b576,
0x7a5d9bea6ca4910e,
0x7aebfea95ccdd1c9,
0xf9bd38a67d5f0e86,
0xfa65539de65492d8,
0xf0dfcbe7653ff787,
0x19,
0xb035585f6e929d9d,
0xba1579c7e219b954,
0xcb201cf846db4ba3,
0x287bf9177372cf45,
0xa350e4f61147d0a6,
0xd5d0ecfb50bcff99,
0x2e166aa6c776ed21,
0xe1e66c991990e282,
0x662b329b01e7bb38,
0x8aa674b36144d9a9,
0xcbabf78f97f95e65,
0xbd87ad390420258,
0xad8617bca9e33c8,
0xc00ad377a1e2666,
0xac6fc58b3f0518f,
0xc0cc8a892cc4173,
0xc210accb117bc21,
0xb73630dbb46ca18,
0xc8be4920cbd4a54,
0xbfe877a21be1690,
0xae790559b0ded81,
0xbf50db2f8d6ce31,
0x19,
0xeec24b15a06b53fe,
0xc8a7aa07c5633533,
0xefe9c6fa4311ad51,
0xb9173f13977109a1,
0x69ce43c9cc94aedc,
0xecf623c9cd118815,
0x28625def198c33c7,
0xccfc5f7de5c3636a,
0xf5e6c40f1621c299,
0xcec0e58c34cb64b1,
0xa868ea113387939f,
0xcf29427ff7c58,
0xbd9b3cf49eec8,
0xd1dc8aa81fb26,
0xbc792d5c394ef,
0xd2ae0b2266453,
0xd413f12c496c1,
0xc84128cfed618,
0xdb5ebd48fc0d4,
0xd1b77326dcb90,
0xbeb0ccc145421,
0xd10e5b22b11d1,
0x19,
0xd8dddbdc5ce4ef45,
0xacfc51de8131458c,
0x146bb3c0fe499ac0,
0x9e65309f15943903,
0x80d0ad980773aa70,
0xf97817d4ddbf0607,
0xe4626620a75ba276,
0xdfdc7fd6fc74f66,
0xf464864ad6f2bb93,
0x2d55e52a5d44414,
0xdd8de62487c40925,
0xe24c99adad8,
0xcf389ed4bc8,
0xe580cbf6966,
0xcde5fd7e04f,
0xe63628041b3,
0xe7e81a87361,
0xdabe78f6d98,
0xefb14cac554,
0xe5574743b10,
0xd05709f42c1,
0xe4690c96af1,
0x19,
0xc15acf44759545a3,
0xcbfdcf39869719d4,
0x33f62042e2f80225,
0x2599c5ead81d8fa3,
0xb306cb6c1d7c8d0,
0x658c80d3df3729b1,
0xe8d1b2b21b41429c,
0xa1b67f09d4b3ccb8,
0xe1adf8b84437180,
0xd593a5e584af47b,
0xa023d94c56e151c7,
0xf7157bc98,
0xe3006d948,
0xfa65811e6,
0xe0d127e2f,
0xfc18bfe53,
0xfd002d901,
0xeed6461d8,
0x1068562754,
0xfa0236f50,
0xe3af13ee1,
0xfa460f6d1,
0x19,
0x49026cc3a4afc5a6,
0xe06dff00ab25b91b,
0xab38c561e8850ff,
0x92c3c8275e105eeb,
0xb65256e546889bd0,
0x3c0468236ea142f6,
0xee61766b889e18f2,
0xa206f41b12c30415,
0x2fe9d756c9f12d1,
0xe9633210630cbf12,
0x1ffea9fe85a0b0b1,
0x11131738,
0xf56d588,
0x11050f86,
0xf848f4f,
0x111527d3,
0x114369a1,
0x106f2f38,
0x11e2ca94,
0x110a29f0,
0xfa9f5c1,
0x10f625d1,
0x19,
0x81d1ae8cc50240f3,
0xf4c77a079a4607d7,
0xed446b2315e3efc1,
0xb0a6b70915178c3,
0xb11ff3e089f15d9a,
0x1d4dba0b7ae9cc18,
0x65d74e2f43b48d05,
0xa2df8c6b8ae0804a,
0xa4e6f0a8c33348a6,
0xc0a26efc7be5669b,
0xa6b6582c547d0d60,
0x11f718,
0x10b6c8,
0x134a96,
0x10cf7f,
0x124d03,
0x13f8a1,
0x117c58,
0x132c94,
0x134fc0,
0x10a091,
0x128961,
0x19,
0x84afc741f1c13213,
0x2f8f43734fc906f3,
0xde682d72da0a02d9,
0xbb005236adb9ef2,
0x5bdf35c10a8b5624,
0x739a8a343950010,
0x52f515f44785cfbc,
0xcbaf4e5d82856c60,
0xac9ea09074e3e150,
0x8f0fa011a2035fb0,
0x1a37905d8450904a,
0x1300,
0x1750,
0x114e,
0x131f,
0x167b,
0x1371,
0x1230,
0x182c,
0x1368,
0xf31,
0x15c9,
0x19,
0x3abeb80def61cc85,
0x9d19c9dd4eac4133,
0x75a652d9641a985,
0x9daf69ae1b67e667,
0x364f71da77920a18,
0x50bd769f745c95b1,
0xf223d1180dbbf3fc,
0x2f885e584e04aa99,
0xb69a0fa70aea684a,
0x9584acaa6e062a0,
0xbc051640145b19b,
0x14,
0x22,
0x12,
0x27,
0xd,
0xd,
0x1c,
0x2,
0x10,
0x29,
0xf,
}
// C is a constant array of element
C []*ffg.Element
// M is a matrix
M [][]*ffg.Element
// P is a matrix
P [][]*ffg.Element
// S is a array of element
S []*ffg.Element
)
func init() {
@ -117,15 +829,24 @@ func init() {
C = append(C, ffg.NewElementFromUint64(c[i]))
}
for i := 0; i < len(s); i++ {
S = append(S, ffg.NewElementFromUint64(s[i]))
}
for i := 0; i < mLen; i++ {
var row []*ffg.Element
var (
mRow []*ffg.Element
pRow []*ffg.Element
)
for j := 0; j < mLen; j++ {
ele := ffg.NewElementFromUint64(mcirc[(-i+j+mLen)%mLen])
ele := ffg.NewElementFromUint64(mcirc[(i-j+mLen)%mLen])
if i == j {
ele = ffg.NewElementFromUint64(mcirc[0] + mdiag[i])
}
row = append(row, ele)
mRow = append(mRow, ele)
pRow = append(pRow, ffg.NewElementFromUint64(p[i][j]))
}
M = append(M, row)
M = append(M, mRow)
P = append(P, pRow)
}
}

+ 38
- 10
goldenposeidon/poseidon.go

@ -30,7 +30,7 @@ func ark(state []*ffg.Element, it int) {
}
// mix returns [[matrix]] * [vector]
func mix(state []*ffg.Element) []*ffg.Element {
func mix(state []*ffg.Element, opt bool) []*ffg.Element {
mul := zero()
newState := make([]*ffg.Element, mLen)
for i := 0; i < mLen; i++ {
@ -39,14 +39,18 @@ func mix(state []*ffg.Element) []*ffg.Element {
for i := 0; i < mLen; i++ {
newState[i].SetUint64(0)
for j := 0; j < mLen; j++ {
mul.Mul(M[i][j], state[j])
if opt {
mul.Mul(P[j][i], state[j])
} else {
mul.Mul(M[j][i], state[j])
}
newState[i].Add(newState[i], mul)
}
}
return newState
}
// Hash computes the Poseidon hash for the given inputs
// Hash computes the hash for the given inputs
func Hash(inpBI [NROUNDSF]uint64, capBI [CAPLEN]uint64) ([CAPLEN]uint64, error) {
state := make([]*ffg.Element, mLen)
for i := 0; i < NROUNDSF; i++ {
@ -56,16 +60,40 @@ func Hash(inpBI [NROUNDSF]uint64, capBI [CAPLEN]uint64) ([CAPLEN]uint64, error)
state[i+NROUNDSF] = ffg.NewElement().SetUint64(capBI[i])
}
for r := 0; r < NROUNDSF+NROUNDSP; r++ {
ark(state, r*mLen)
for i := 0; i < mLen; i++ {
state[i].Add(state[i], C[i])
}
for r := 0; r < NROUNDSF/2; r++ {
exp7state(state)
ark(state, (r+1)*mLen)
state = mix(state, r == NROUNDSF/2-1)
}
for r := 0; r < NROUNDSP; r++ {
exp7(state[0])
state[0].Add(state[0], C[(NROUNDSF/2+1)*mLen+r])
s0 := zero()
mul := zero()
mul.Mul(S[(mLen*2-1)*r], state[0])
s0.Add(s0, mul)
for i := 1; i < mLen; i++ {
mul.Mul(S[(mLen*2-1)*r+i], state[i])
s0.Add(s0, mul)
mul.Mul(S[(mLen*2-1)*r+mLen+i-1], state[0])
state[i].Add(state[i], mul)
}
state[0] = s0
}
if r < NROUNDSF/2 || r >= NROUNDSF/2+NROUNDSP {
exp7state(state)
} else {
exp7(state[0])
for r := 0; r < NROUNDSF/2; r++ {
exp7state(state)
if r < NROUNDSF/2-1 {
ark(state, (NROUNDSF/2+1+r)*mLen+NROUNDSP)
}
state = mix(state)
state = mix(state, false)
}
return [CAPLEN]uint64{

+ 41
- 5
goldenposeidon/poseidon_test.go

@ -1,20 +1,23 @@
package poseidon
import (
"math/big"
"testing"
"github.com/iden3/go-iden3-crypto/poseidon"
"github.com/stretchr/testify/assert"
)
const prime uint64 = 18446744069414584321
func TestPoseidonHash(t *testing.T) {
func TestPoseidonHashCompare(t *testing.T) {
b0 := uint64(0)
b1 := uint64(1)
bm1 := prime - 1
bM := prime
h, err := Hash([NROUNDSF]uint64{b0, b0, b0, b0, b0, b0, b0, b0}, [CAPLEN]uint64{b0, b0, b0, b0})
h, err := Hash([NROUNDSF]uint64{b0, b0, b0, b0, b0, b0, b0, b0},
[CAPLEN]uint64{b0, b0, b0, b0})
assert.Nil(t, err)
assert.Equal(t,
[CAPLEN]uint64{
@ -25,7 +28,8 @@ func TestPoseidonHash(t *testing.T) {
}, h,
)
h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, [CAPLEN]uint64{b1, b1, b1, b1})
h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1},
[CAPLEN]uint64{b1, b1, b1, b1})
assert.Nil(t, err)
assert.Equal(t,
[CAPLEN]uint64{
@ -36,7 +40,8 @@ func TestPoseidonHash(t *testing.T) {
}, h,
)
h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1}, [CAPLEN]uint64{b1, b1, b1, b1})
h, err = Hash([NROUNDSF]uint64{b1, b1, b1, b1, b1, b1, b1, b1},
[CAPLEN]uint64{b1, b1, b1, b1})
assert.Nil(t, err)
assert.Equal(t,
[CAPLEN]uint64{
@ -61,7 +66,8 @@ func TestPoseidonHash(t *testing.T) {
}, h,
)
h, err = Hash([NROUNDSF]uint64{bM, bM, bM, bM, bM, bM, bM, bM}, [CAPLEN]uint64{b0, b0, b0, b0})
h, err = Hash([NROUNDSF]uint64{bM, bM, bM, bM, bM, bM, bM, bM},
[CAPLEN]uint64{b0, b0, b0, b0})
assert.Nil(t, err)
assert.Equal(t,
[CAPLEN]uint64{
@ -92,3 +98,33 @@ func TestPoseidonHash(t *testing.T) {
}, h,
)
}
func BenchmarkPoseidonHash12Inputs(b *testing.B) {
bigArray12 := []*big.Int{
big.NewInt(1),
big.NewInt(2),
big.NewInt(3),
big.NewInt(4),
big.NewInt(5),
big.NewInt(6),
big.NewInt(7),
big.NewInt(8),
big.NewInt(9),
big.NewInt(10),
big.NewInt(11),
big.NewInt(12),
}
for i := 0; i < b.N; i++ {
poseidon.Hash(bigArray12) //nolint:errcheck,gosec
}
}
func BenchmarkNeptuneHash(b *testing.B) {
inp := [NROUNDSF]uint64{1, 2, 3, 4, 5, 6, 7, 8}
cap := [CAPLEN]uint64{10, 11, 12, 13}
for i := 0; i < b.N; i++ {
Hash(inp, cap) //nolint:errcheck,gosec
}
}

Loading…
Cancel
Save