arnaucube
arnaucube/go-iden3-cryptoPublic Self-hosted repository
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	"database/sql"
 10	"database/sql/driver"
 11
 12	"github.com/iden3/go-iden3-crypto/constants"
 13	"github.com/iden3/go-iden3-crypto/utils"
 14	"github.com/stretchr/testify/assert"
 15	"github.com/stretchr/testify/require"
 16)
 17
 18func TestPublicKey(t *testing.T) {
 19	var k PrivateKey
 20	for i := 0; i < 32; i++ {
 21		k[i] = byte(i)
 22	}
 23	pk := k.Public()
 24	assert.True(t, pk.X.Cmp(constants.Q) == -1)
 25	assert.True(t, pk.Y.Cmp(constants.Q) == -1)
 26}
 27
 28func TestSignVerifyMimc7(t *testing.T) {
 29	var k PrivateKey
 30	_, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 31	require.Nil(t, err)
 32	msgBuf, err := hex.DecodeString("00010203040506070809")
 33	if err != nil {
 34		panic(err)
 35	}
 36	msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
 37
 38	pk := k.Public()
 39	assert.Equal(t,
 40		"13277427435165878497778222415993513565335242147425444199013288855685581939618",
 41		pk.X.String())
 42	assert.Equal(t,
 43		"13622229784656158136036771217484571176836296686641868549125388198837476602820",
 44		pk.Y.String())
 45
 46	sig := k.SignMimc7(msg)
 47	assert.Equal(t,
 48		"11384336176656855268977457483345535180380036354188103142384839473266348197733",
 49		sig.R8.X.String())
 50	assert.Equal(t,
 51		"15383486972088797283337779941324724402501462225528836549661220478783371668959",
 52		sig.R8.Y.String())
 53	assert.Equal(t,
 54		"2523202440825208709475937830811065542425109372212752003460238913256192595070",
 55		sig.S.String())
 56
 57	ok := pk.VerifyMimc7(msg, sig)
 58	assert.Equal(t, true, ok)
 59
 60	sigBuf := sig.Compress()
 61	sig2, err := new(Signature).Decompress(sigBuf)
 62	assert.Equal(t, nil, err)
 63
 64	assert.Equal(t, ""+
 65		"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
 66		"7ed40dab29bf993c928e789d007387998901a24913d44fddb64b1f21fc149405",
 67		hex.EncodeToString(sigBuf[:]))
 68
 69	ok = pk.VerifyMimc7(msg, sig2)
 70	assert.Equal(t, true, ok)
 71}
 72
 73func TestSignVerifyPoseidon(t *testing.T) {
 74	var k PrivateKey
 75	_, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 76	require.Nil(t, err)
 77	msgBuf, err := hex.DecodeString("00010203040506070809")
 78	if err != nil {
 79		panic(err)
 80	}
 81	msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
 82
 83	pk := k.Public()
 84	assert.Equal(t,
 85		"13277427435165878497778222415993513565335242147425444199013288855685581939618",
 86		pk.X.String())
 87	assert.Equal(t,
 88		"13622229784656158136036771217484571176836296686641868549125388198837476602820",
 89		pk.Y.String())
 90
 91	sig := k.SignPoseidon(msg)
 92	assert.Equal(t,
 93		"11384336176656855268977457483345535180380036354188103142384839473266348197733",
 94		sig.R8.X.String())
 95	assert.Equal(t,
 96		"15383486972088797283337779941324724402501462225528836549661220478783371668959",
 97		sig.R8.Y.String())
 98	assert.Equal(t,
 99		"1398758333392199195742243841591064350253744445503462896781493968760929513778",
100		sig.S.String())
101
102	ok := pk.VerifyPoseidon(msg, sig)
103	assert.Equal(t, true, ok)
104
105	sigBuf := sig.Compress()
106	sig2, err := new(Signature).Decompress(sigBuf)
107	assert.Equal(t, nil, err)
108
109	assert.Equal(t, ""+
110		"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
111		"32f16b0f2f4c4e1169aa59685637e1429b6581a9531d058d65f4ab224eab1703",
112		hex.EncodeToString(sigBuf[:]))
113
114	ok = pk.VerifyPoseidon(msg, sig2)
115	assert.Equal(t, true, ok)
116}
117
118func TestCompressDecompress(t *testing.T) {
119	var k PrivateKey
120	_, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
121	require.Nil(t, err)
122	pk := k.Public()
123	for i := 0; i < 64; i++ {
124		msgBuf, err := hex.DecodeString(fmt.Sprintf("000102030405060708%02d", i))
125		if err != nil {
126			panic(err)
127		}
128		msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
129		sig := k.SignMimc7(msg)
130		sigBuf := sig.Compress()
131		sig2, err := new(Signature).Decompress(sigBuf)
132		assert.Equal(t, nil, err)
133		ok := pk.VerifyMimc7(msg, sig2)
134		assert.Equal(t, true, ok)
135	}
136}
137
138func TestSignatureCompScannerValuer(t *testing.T) {
139	privK := NewRandPrivKey()
140	var value driver.Valuer //nolint:gosimple this is done to ensure interface compability
141	value = privK.SignPoseidon(big.NewInt(674238462)).Compress()
142	scan := privK.SignPoseidon(big.NewInt(1)).Compress()
143	fromDB, err := value.Value()
144	assert.Nil(t, err)
145	assert.Nil(t, scan.Scan(fromDB))
146	assert.Equal(t, value, scan)
147}
148
149func TestSignatureScannerValuer(t *testing.T) {
150	privK := NewRandPrivKey()
151	var value driver.Valuer
152	var scan sql.Scanner
153	value = privK.SignPoseidon(big.NewInt(674238462))
154	scan = privK.SignPoseidon(big.NewInt(1))
155	fromDB, err := value.Value()
156	assert.Nil(t, err)
157	assert.Nil(t, scan.Scan(fromDB))
158	assert.Equal(t, value, scan)
159}
160
161func TestPubKeyScannerValuer(t *testing.T) {
162	privKValue := NewRandPrivKey()
163	pubKValue := privKValue.Public()
164	privKScan := NewRandPrivKey()
165	pubKScan := privKScan.Public()
166	var value driver.Valuer
167	var scan sql.Scanner
168	value = pubKValue
169	scan = pubKScan
170	fromDB, err := value.Value()
171	assert.Nil(t, err)
172	assert.Nil(t, scan.Scan(fromDB))
173	assert.Equal(t, value, scan)
174}
175
176func BenchmarkBabyjubEddsa(b *testing.B) {
177	var k PrivateKey
178	_, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
179	require.Nil(b, err)
180	pk := k.Public()
181
182	const n = 256
183
184	msgBuf, err := hex.DecodeString("00010203040506070809")
185	if err != nil {
186		panic(err)
187	}
188	msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
189	var msgs [n]*big.Int
190	for i := 0; i < n; i++ {
191		msgs[i] = new(big.Int).Add(msg, big.NewInt(int64(i)))
192	}
193	var sigs [n]*Signature
194
195	b.Run("SignMimc7", func(b *testing.B) {
196		for i := 0; i < b.N; i++ {
197			k.SignMimc7(msgs[i%n])
198		}
199	})
200
201	for i := 0; i < n; i++ {
202		sigs[i%n] = k.SignMimc7(msgs[i%n])
203	}
204
205	b.Run("VerifyMimc7", func(b *testing.B) {
206		for i := 0; i < b.N; i++ {
207			pk.VerifyMimc7(msgs[i%n], sigs[i%n])
208		}
209	})
210
211	b.Run("SignPoseidon", func(b *testing.B) {
212		for i := 0; i < b.N; i++ {
213			k.SignPoseidon(msgs[i%n])
214		}
215	})
216
217	for i := 0; i < n; i++ {
218		sigs[i%n] = k.SignPoseidon(msgs[i%n])
219	}
220
221	b.Run("VerifyPoseidon", func(b *testing.B) {
222		for i := 0; i < b.N; i++ {
223			pk.VerifyPoseidon(msgs[i%n], sigs[i%n])
224		}
225	})
226}