go-iden3-crypto/poseidon/poseidon_test.go
poseidon/poseidon_test.goRaw
1package poseidon
2
3import (
4 "encoding/hex"
5 "math/big"
6 "testing"
7
8 "github.com/iden3/go-iden3-crypto/utils"
9 "github.com/stretchr/testify/assert"
10 "golang.org/x/crypto/blake2b"
11)
12
13func TestBlake2bVersion(t *testing.T) {
14 h := blake2b.Sum256([]byte("poseidon_constants"))
15 assert.Equal(t, "e57ba154fb2c47811dc1a2369b27e25a44915b4e4ece4eb8ec74850cb78e01b1", hex.EncodeToString(h[:]))
16}
17
18func TestPoseidon(t *testing.T) {
19 b1 := big.NewInt(1)
20 b2 := big.NewInt(2)
21 h, err := Hash([]*big.Int{b1, b2})
22 assert.Nil(t, err)
23 assert.Equal(t, "4932297968297298434239270129193057052722409868268166443802652458940273154855", h.String())
24
25 b3 := big.NewInt(3)
26 b4 := big.NewInt(4)
27 h, err = Hash([]*big.Int{b3, b4})
28 assert.Nil(t, err)
29 assert.Equal(t, "4635491972858758537477743930622086396911540895966845494943021655521913507504", h.String())
30
31 b5 := big.NewInt(5)
32 b6 := big.NewInt(6)
33 b7 := big.NewInt(7)
34 b8 := big.NewInt(8)
35 b9 := big.NewInt(9)
36 b10 := big.NewInt(10)
37 b11 := big.NewInt(11)
38 b12 := big.NewInt(12)
39 h, err = Hash([]*big.Int{b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12})
40 assert.Nil(t, err)
41 assert.Equal(t, "15278801138972282646981503374384603641625274360649669926363020545395022098027", h.String())
42
43 msg := []byte("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
44 n := 31
45 msgElems := make([]*big.Int, 0, len(msg)/n+1)
46 for i := 0; i < len(msg)/n; i++ {
47 v := new(big.Int)
48 utils.SetBigIntFromLEBytes(v, msg[n*i:n*(i+1)])
49 msgElems = append(msgElems, v)
50 }
51 if len(msg)%n != 0 {
52 v := new(big.Int)
53 utils.SetBigIntFromLEBytes(v, msg[(len(msg)/n)*n:])
54 msgElems = append(msgElems, v)
55 }
56 hmsg, err := Hash(msgElems)
57 assert.Nil(t, err)
58 assert.Equal(t, "16019700159595764790637132363672701294192939959594423814006267756172551741065", hmsg.String())
59
60 msg2 := []byte("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet.")
61 msg2Elems := make([]*big.Int, 0, len(msg2)/n+1)
62 for i := 0; i < len(msg2)/n; i++ {
63 v := new(big.Int)
64 utils.SetBigIntFromLEBytes(v, msg2[n*i:n*(i+1)])
65 msg2Elems = append(msg2Elems, v)
66 }
67 if len(msg2)%n != 0 {
68 v := new(big.Int)
69 utils.SetBigIntFromLEBytes(v, msg2[(len(msg2)/n)*n:])
70 msg2Elems = append(msg2Elems, v)
71 }
72 hmsg2, err := Hash(msg2Elems)
73 assert.Nil(t, err)
74 assert.Equal(t, "2978613163687734485261639854325792381691890647104372645321246092227111432722", hmsg2.String())
75
76 hmsg2 = HashBytes(msg2)
77 assert.Equal(t, "2978613163687734485261639854325792381691890647104372645321246092227111432722", hmsg2.String())
78}
79
80func TestPoseidonBrokenChunks(t *testing.T) {
81 h1, err := Hash([]*big.Int{big.NewInt(0), big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4),
82 big.NewInt(5), big.NewInt(6), big.NewInt(7), big.NewInt(8), big.NewInt(9)})
83 assert.Nil(t, err)
84 h2, err := Hash([]*big.Int{big.NewInt(5), big.NewInt(6), big.NewInt(7), big.NewInt(8), big.NewInt(9),
85 big.NewInt(0), big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4)})
86 assert.Nil(t, err)
87 assert.NotEqual(t, h1, h2)
88}
89
90func TestPoseidonBrokenPadding(t *testing.T) {
91 h1, err := Hash([]*big.Int{big.NewInt(int64(1))})
92 assert.Nil(t, err)
93 h2, err := Hash([]*big.Int{big.NewInt(int64(1)), big.NewInt(int64(0))})
94 assert.Nil(t, err)
95 assert.NotEqual(t, h1, h2)
96}
97
98func BenchmarkPoseidon(b *testing.B) {
99 b12 := big.NewInt(int64(12))
100 b45 := big.NewInt(int64(45))
101 b78 := big.NewInt(int64(78))
102 b41 := big.NewInt(int64(41))
103 bigArray4 := []*big.Int{b12, b45, b78, b41}
104
105 for i := 0; i < b.N; i++ {
106 Hash(bigArray4) //nolint:errcheck
107 }
108}
109
110func BenchmarkPoseidonLarge(b *testing.B) {
111 b12 := utils.NewIntFromString("11384336176656855268977457483345535180380036354188103142384839473266348197733")
112 b45 := utils.NewIntFromString("11384336176656855268977457483345535180380036354188103142384839473266348197733")
113 b78 := utils.NewIntFromString("11384336176656855268977457483345535180380036354188103142384839473266348197733")
114 b41 := utils.NewIntFromString("11384336176656855268977457483345535180380036354188103142384839473266348197733")
115
116 bigArray4 := []*big.Int{b12, b45, b78, b41}
117
118 for i := 0; i < b.N; i++ {
119 Hash(bigArray4) //nolint:errcheck
120 }
121}