go-iden3-crypto/babyjub/eddsa_test.go
babyjub/eddsa_test.goRaw
1package babyjub
2
3import (
4 "encoding/hex"
5 "fmt"
6 "math/big"
7 "testing"
8
9 "github.com/iden3/go-iden3-crypto/constants"
10 "github.com/iden3/go-iden3-crypto/utils"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func TestPublicKey(t *testing.T) {
16 var k PrivateKey
17 for i := 0; i < 32; i++ {
18 k[i] = byte(i)
19 }
20 pk := k.Public()
21 assert.True(t, pk.X.Cmp(constants.Q) == -1)
22 assert.True(t, pk.Y.Cmp(constants.Q) == -1)
23}
24
25func TestSignVerifyMimc7(t *testing.T) {
26 var k PrivateKey
27 _, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
28 require.Nil(t, err)
29 msgBuf, err := hex.DecodeString("00010203040506070809")
30 if err != nil {
31 panic(err)
32 }
33 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
34
35 pk := k.Public()
36 assert.Equal(t,
37 "13277427435165878497778222415993513565335242147425444199013288855685581939618",
38 pk.X.String())
39 assert.Equal(t,
40 "13622229784656158136036771217484571176836296686641868549125388198837476602820",
41 pk.Y.String())
42
43 sig := k.SignMimc7(msg)
44 assert.Equal(t,
45 "11384336176656855268977457483345535180380036354188103142384839473266348197733",
46 sig.R8.X.String())
47 assert.Equal(t,
48 "15383486972088797283337779941324724402501462225528836549661220478783371668959",
49 sig.R8.Y.String())
50 assert.Equal(t,
51 "2523202440825208709475937830811065542425109372212752003460238913256192595070",
52 sig.S.String())
53
54 ok := pk.VerifyMimc7(msg, sig)
55 assert.Equal(t, true, ok)
56
57 sigBuf := sig.Compress()
58 sig2, err := new(Signature).Decompress(sigBuf)
59 assert.Equal(t, nil, err)
60
61 assert.Equal(t, ""+
62 "dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
63 "7ed40dab29bf993c928e789d007387998901a24913d44fddb64b1f21fc149405",
64 hex.EncodeToString(sigBuf[:]))
65
66 ok = pk.VerifyMimc7(msg, sig2)
67 assert.Equal(t, true, ok)
68}
69
70func TestSignVerifyPoseidon(t *testing.T) {
71 var k PrivateKey
72 _, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
73 require.Nil(t, err)
74 msgBuf, err := hex.DecodeString("00010203040506070809")
75 if err != nil {
76 panic(err)
77 }
78 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
79
80 pk := k.Public()
81 assert.Equal(t,
82 "13277427435165878497778222415993513565335242147425444199013288855685581939618",
83 pk.X.String())
84 assert.Equal(t,
85 "13622229784656158136036771217484571176836296686641868549125388198837476602820",
86 pk.Y.String())
87
88 sig := k.SignPoseidon(msg)
89 assert.Equal(t,
90 "11384336176656855268977457483345535180380036354188103142384839473266348197733",
91 sig.R8.X.String())
92 assert.Equal(t,
93 "15383486972088797283337779941324724402501462225528836549661220478783371668959",
94 sig.R8.Y.String())
95 assert.Equal(t,
96 "248298168863866362217836334079793350221620631973732197668910946177382043688",
97 sig.S.String())
98
99 ok := pk.VerifyPoseidon(msg, sig)
100 assert.Equal(t, true, ok)
101
102 sigBuf := sig.Compress()
103 sig2, err := new(Signature).Decompress(sigBuf)
104 assert.Equal(t, nil, err)
105
106 assert.Equal(t, ""+
107 "dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
108 "28506bce274aa1b3f7e7c2fd7e4fe09bff8f9aa37a42def7994e98f322888c00",
109 hex.EncodeToString(sigBuf[:]))
110
111 ok = pk.VerifyPoseidon(msg, sig2)
112 assert.Equal(t, true, ok)
113}
114
115func TestCompressDecompress(t *testing.T) {
116 var k PrivateKey
117 _, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
118 require.Nil(t, err)
119 pk := k.Public()
120 for i := 0; i < 64; i++ {
121 msgBuf, err := hex.DecodeString(fmt.Sprintf("000102030405060708%02d", i))
122 if err != nil {
123 panic(err)
124 }
125 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
126 sig := k.SignMimc7(msg)
127 sigBuf := sig.Compress()
128 sig2, err := new(Signature).Decompress(sigBuf)
129 assert.Equal(t, nil, err)
130 ok := pk.VerifyMimc7(msg, sig2)
131 assert.Equal(t, true, ok)
132 }
133}
134
135func BenchmarkBabyjubEddsa(b *testing.B) {
136 var k PrivateKey
137 _, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
138 require.Nil(b, err)
139 pk := k.Public()
140
141 const n = 256
142
143 msgBuf, err := hex.DecodeString("00010203040506070809")
144 if err != nil {
145 panic(err)
146 }
147 msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
148 var msgs [n]*big.Int
149 for i := 0; i < n; i++ {
150 msgs[i] = new(big.Int).Add(msg, big.NewInt(int64(i)))
151 }
152 var sigs [n]*Signature
153
154 b.Run("SignMimc7", func(b *testing.B) {
155 for i := 0; i < b.N; i++ {
156 k.SignMimc7(msgs[i%n])
157 }
158 })
159
160 for i := 0; i < n; i++ {
161 sigs[i%n] = k.SignMimc7(msgs[i%n])
162 }
163
164 b.Run("VerifyMimc7", func(b *testing.B) {
165 for i := 0; i < b.N; i++ {
166 pk.VerifyMimc7(msgs[i%n], sigs[i%n])
167 }
168 })
169
170 b.Run("SignPoseidon", func(b *testing.B) {
171 for i := 0; i < b.N; i++ {
172 k.SignPoseidon(msgs[i%n])
173 }
174 })
175
176 for i := 0; i < n; i++ {
177 sigs[i%n] = k.SignPoseidon(msgs[i%n])
178 }
179
180 b.Run("VerifyPoseidon", func(b *testing.B) {
181 for i := 0; i < b.N; i++ {
182 pk.VerifyPoseidon(msgs[i%n], sigs[i%n])
183 }
184 })
185}