github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/crypto/poseidon/poseidon_test.go (about) 1 // from github.com/iden3/go-iden3-crypto/ff/poseidon 2 package poseidon 3 4 import ( 5 "math/big" 6 "testing" 7 8 "github.com/iden3/go-iden3-crypto/utils" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestPoseidonHashFixed(t *testing.T) { 14 b0 := big.NewInt(0) 15 b1 := big.NewInt(1) 16 b2 := big.NewInt(2) 17 b3 := big.NewInt(3) 18 b4 := big.NewInt(4) 19 b5 := big.NewInt(5) 20 b6 := big.NewInt(6) 21 b7 := big.NewInt(7) 22 b8 := big.NewInt(8) 23 b9 := big.NewInt(9) 24 b10 := big.NewInt(10) 25 b11 := big.NewInt(11) 26 b12 := big.NewInt(12) 27 b13 := big.NewInt(13) 28 b14 := big.NewInt(14) 29 b15 := big.NewInt(15) 30 b16 := big.NewInt(16) 31 32 h, err := HashFixed([]*big.Int{b1}) 33 assert.Nil(t, err) 34 assert.Equal(t, 35 "18586133768512220936620570745912940619677854269274689475585506675881198879027", 36 h.String()) 37 38 h, err = HashFixed([]*big.Int{b1, b2}) 39 assert.Nil(t, err) 40 assert.Equal(t, 41 "7853200120776062878684798364095072458815029376092732009249414926327459813530", 42 h.String()) 43 44 h, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0}) 45 assert.Nil(t, err) 46 assert.Equal(t, 47 "1018317224307729531995786483840663576608797660851238720571059489595066344487", 48 h.String()) 49 h, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0}) 50 assert.Nil(t, err) 51 assert.Equal(t, 52 "15336558801450556532856248569924170992202208561737609669134139141992924267169", 53 h.String()) 54 55 h, err = HashFixed([]*big.Int{b3, b4, b0, b0, b0}) 56 assert.Nil(t, err) 57 assert.Equal(t, 58 "5811595552068139067952687508729883632420015185677766880877743348592482390548", 59 h.String()) 60 h, err = HashFixed([]*big.Int{b3, b4, b0, b0, b0, b0}) 61 assert.Nil(t, err) 62 assert.Equal(t, 63 "12263118664590987767234828103155242843640892839966517009184493198782366909018", 64 h.String()) 65 66 h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6}) 67 assert.Nil(t, err) 68 assert.Equal(t, 69 "20400040500897583745843009878988256314335038853985262692600694741116813247201", 70 h.String()) 71 72 h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14}) 73 assert.Nil(t, err) 74 assert.Equal(t, 75 "8354478399926161176778659061636406690034081872658507739535256090879947077494", 76 h.String()) 77 78 h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0}) 79 assert.Nil(t, err) 80 assert.Equal(t, 81 "5540388656744764564518487011617040650780060800286365721923524861648744699539", 82 h.String()) 83 84 h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, b0, b0, b0, b0, b0, b0}) 85 assert.Nil(t, err) 86 assert.Equal(t, 87 "11882816200654282475720830292386643970958445617880627439994635298904836126497", 88 h.String()) 89 90 h, err = HashFixed([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16}) 91 assert.Nil(t, err) 92 assert.Equal(t, 93 "9989051620750914585850546081941653841776809718687451684622678807385399211877", 94 h.String()) 95 96 h, err = HashFixedWithDomain([]*big.Int{b1, b2}, big.NewInt(256)) 97 assert.Nil(t, err) 98 assert.Equal(t, 99 "2362370911616048355006851495576377379220050231129891536935411970097789775493", 100 h.String()) 101 h_ref, _ := HashFixed([]*big.Int{b1, b2}) 102 assert.NotEqual(t, h_ref, h) 103 } 104 105 func TestErrorInputs(t *testing.T) { 106 b0 := big.NewInt(0) 107 b1 := big.NewInt(1) 108 b2 := big.NewInt(2) 109 110 var err error 111 112 _, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0}) 113 require.Nil(t, err) 114 115 _, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0}) 116 require.NotNil(t, err) 117 assert.Equal(t, "invalid inputs length 17, max 16", err.Error()) 118 119 _, err = HashFixed([]*big.Int{b1, b2, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0}) 120 require.NotNil(t, err) 121 assert.Equal(t, "invalid inputs length 18, max 16", err.Error()) 122 } 123 124 func TestInputsNotInField(t *testing.T) { 125 var err error 126 127 // Very big number, should just return error and not go into endless loop 128 b1 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061999999999999999999999999999999999999999999999999999999999") //nolint:lll 129 _, err = HashFixed([]*big.Int{b1}) 130 require.Error(t, err, "inputs values not inside Finite Field") 131 132 // Finite Field const Q, should return error 133 b2 := utils.NewIntFromString("21888242871839275222246405745257275088548364400416034343698204186575808495617") //nolint:lll 134 _, err = HashFixed([]*big.Int{b2}) 135 require.Error(t, err, "inputs values not inside Finite Field") 136 } 137 138 func TestPoseidonHash(t *testing.T) { 139 ret, err := Hash(nil, 3) 140 if err != nil { 141 t.Fatal(err) 142 } 143 144 // Hash nil for width 3 equal to Hash([0, 0]) 145 retRef, err := HashFixed([]*big.Int{big.NewInt(0), big.NewInt(0)}) 146 if err != nil { 147 t.Fatal(err) 148 } 149 150 assert.Equal(t, ret, retRef) 151 152 // hash is different for the cap flag 153 ret1, err := Hash([]*big.Int{big.NewInt(0)}, 3) 154 if err != nil { 155 t.Fatal(err) 156 } 157 158 assert.NotEqual(t, ret1, retRef) 159 160 ret2, err := HashWithCap([]*big.Int{big.NewInt(0)}, 3, 0) 161 if err != nil { 162 t.Fatal(err) 163 } 164 165 assert.Equal(t, ret2, retRef) 166 } 167 168 func BenchmarkPoseidonHash(b *testing.B) { 169 b0 := big.NewInt(0) 170 b1 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061") //nolint:lll 171 b2 := utils.NewIntFromString("12242166908188651009877250812424843524687801523336557272219921456462821518061") //nolint:lll 172 173 bigArray4 := []*big.Int{b1, b2, b0, b0, b0, b0} 174 175 for i := 0; i < b.N; i++ { 176 HashFixed(bigArray4) //nolint:errcheck,gosec 177 } 178 }