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		"1662463587877312619203503803508234533733252768380479199263194005796068211378",
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		"b23a1f04909fc088dec7e4835d85a326f7c0d0b2a3d0232d84448ca7c9ebac03",
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 TestSignatureScannerValuer(t *testing.T) {
139	privK := NewRandPrivKey()
140	var value driver.Valuer
141	var scan sql.Scanner
142	value = privK.SignPoseidon(big.NewInt(674238462))
143	scan = privK.SignPoseidon(big.NewInt(1))
144	fromDB, err := value.Value()
145	assert.NoError(t, err)
146	assert.NoError(t, scan.Scan(fromDB))
147	assert.Equal(t, value, scan)
148}
149
150func TestPubKeyScannerValuer(t *testing.T) {
151	privKValue := NewRandPrivKey()
152	pubKValue := privKValue.Public()
153	privKScan := NewRandPrivKey()
154	pubKScan := privKScan.Public()
155	var value driver.Valuer
156	var scan sql.Scanner
157	value = pubKValue
158	scan = pubKScan
159	fromDB, err := value.Value()
160	assert.NoError(t, err)
161	assert.NoError(t, scan.Scan(fromDB))
162	assert.Equal(t, value, scan)
163}
164
165func BenchmarkBabyjubEddsa(b *testing.B) {
166	var k PrivateKey
167	_, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
168	require.Nil(b, err)
169	pk := k.Public()
170
171	const n = 256
172
173	msgBuf, err := hex.DecodeString("00010203040506070809")
174	if err != nil {
175		panic(err)
176	}
177	msg := utils.SetBigIntFromLEBytes(new(big.Int), msgBuf)
178	var msgs [n]*big.Int
179	for i := 0; i < n; i++ {
180		msgs[i] = new(big.Int).Add(msg, big.NewInt(int64(i)))
181	}
182	var sigs [n]*Signature
183
184	b.Run("SignMimc7", func(b *testing.B) {
185		for i := 0; i < b.N; i++ {
186			k.SignMimc7(msgs[i%n])
187		}
188	})
189
190	for i := 0; i < n; i++ {
191		sigs[i%n] = k.SignMimc7(msgs[i%n])
192	}
193
194	b.Run("VerifyMimc7", func(b *testing.B) {
195		for i := 0; i < b.N; i++ {
196			pk.VerifyMimc7(msgs[i%n], sigs[i%n])
197		}
198	})
199
200	b.Run("SignPoseidon", func(b *testing.B) {
201		for i := 0; i < b.N; i++ {
202			k.SignPoseidon(msgs[i%n])
203		}
204	})
205
206	for i := 0; i < n; i++ {
207		sigs[i%n] = k.SignPoseidon(msgs[i%n])
208	}
209
210	b.Run("VerifyPoseidon", func(b *testing.B) {
211		for i := 0; i < b.N; i++ {
212			pk.VerifyPoseidon(msgs[i%n], sigs[i%n])
213		}
214	})
215}