arnaucube
arnaucube/go-iden3-cryptoPublic Self-hosted repository
go-iden3-crypto/babyjub/babyjub_test.go
babyjub/babyjub_test.goRaw
  1package babyjub
  2
  3import (
  4	"encoding/hex"
  5	"math/big"
  6	"math/rand"
  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)
 13
 14func TestAdd1(t *testing.T) {
 15	a := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
 16	b := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
 17
 18	c := NewPoint().Add(a, b)
 19	// fmt.Printf("%v = 2 * %v", *c, *a)
 20	assert.Equal(t, "0", c.X.String())
 21	assert.Equal(t, "1", c.Y.String())
 22}
 23
 24func TestAdd2(t *testing.T) {
 25	aX := utils.NewIntFromString(
 26		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
 27	aY := utils.NewIntFromString(
 28		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
 29	a := &Point{X: aX, Y: aY}
 30
 31	bX := utils.NewIntFromString(
 32		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
 33	bY := utils.NewIntFromString(
 34		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
 35	b := &Point{X: bX, Y: bY}
 36
 37	c := NewPoint().Add(a, b)
 38	// fmt.Printf("%v = 2 * %v", *c, *a)
 39	assert.Equal(t,
 40		"6890855772600357754907169075114257697580319025794532037257385534741338397365",
 41		c.X.String())
 42	assert.Equal(t,
 43		"4338620300185947561074059802482547481416142213883829469920100239455078257889",
 44		c.Y.String())
 45}
 46
 47func TestAdd3(t *testing.T) {
 48	aX := utils.NewIntFromString(
 49		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
 50	aY := utils.NewIntFromString(
 51		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
 52	a := &Point{X: aX, Y: aY}
 53
 54	bX := utils.NewIntFromString(
 55		"16540640123574156134436876038791482806971768689494387082833631921987005038935")
 56	bY := utils.NewIntFromString(
 57		"20819045374670962167435360035096875258406992893633759881276124905556507972311")
 58	b := &Point{X: bX, Y: bY}
 59
 60	c := NewPoint().Add(a, b)
 61	// fmt.Printf("%v = 2 * %v", *c, *a)
 62	assert.Equal(t,
 63		"7916061937171219682591368294088513039687205273691143098332585753343424131937",
 64		c.X.String())
 65	assert.Equal(t,
 66		"14035240266687799601661095864649209771790948434046947201833777492504781204499",
 67		c.Y.String())
 68}
 69
 70func TestAdd4(t *testing.T) {
 71	aX := utils.NewIntFromString(
 72		"0")
 73	aY := utils.NewIntFromString(
 74		"1")
 75	a := &Point{X: aX, Y: aY}
 76
 77	bX := utils.NewIntFromString(
 78		"16540640123574156134436876038791482806971768689494387082833631921987005038935")
 79	bY := utils.NewIntFromString(
 80		"20819045374670962167435360035096875258406992893633759881276124905556507972311")
 81	b := &Point{X: bX, Y: bY}
 82
 83	c := NewPoint().Add(a, b)
 84	// fmt.Printf("%v = 2 * %v", *c, *a)
 85	assert.Equal(t,
 86		"16540640123574156134436876038791482806971768689494387082833631921987005038935",
 87		c.X.String())
 88	assert.Equal(t,
 89		"20819045374670962167435360035096875258406992893633759881276124905556507972311",
 90		c.Y.String())
 91}
 92
 93func TestInCurve1(t *testing.T) {
 94	p := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
 95	assert.Equal(t, true, p.InCurve())
 96}
 97
 98func TestInCurve2(t *testing.T) {
 99	p := &Point{X: big.NewInt(1), Y: big.NewInt(0)}
100	assert.Equal(t, false, p.InCurve())
101}
102
103func TestMul0(t *testing.T) {
104	x := utils.NewIntFromString(
105		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
106	y := utils.NewIntFromString(
107		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
108	p := &Point{X: x, Y: y}
109	s := utils.NewIntFromString("3")
110
111	r2 := NewPoint().Add(p, p)
112	r2 = NewPoint().Add(r2, p)
113	r := NewPoint().Mul(s, p)
114	assert.Equal(t, r2.X.String(), r.X.String())
115	assert.Equal(t, r2.Y.String(), r.Y.String())
116
117	assert.Equal(t,
118		"19372461775513343691590086534037741906533799473648040012278229434133483800898",
119		r.X.String())
120	assert.Equal(t,
121		"9458658722007214007257525444427903161243386465067105737478306991484593958249",
122		r.Y.String())
123}
124
125func TestMul1(t *testing.T) {
126	x := utils.NewIntFromString(
127		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
128	y := utils.NewIntFromString(
129		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
130	p := &Point{X: x, Y: y}
131	s := utils.NewIntFromString(
132		"14035240266687799601661095864649209771790948434046947201833777492504781204499")
133	r := NewPoint().Mul(s, p)
134	assert.Equal(t,
135		"17070357974431721403481313912716834497662307308519659060910483826664480189605",
136		r.X.String())
137	assert.Equal(t,
138		"4014745322800118607127020275658861516666525056516280575712425373174125159339",
139		r.Y.String())
140}
141
142func TestMul2(t *testing.T) {
143	x := utils.NewIntFromString(
144		"6890855772600357754907169075114257697580319025794532037257385534741338397365")
145	y := utils.NewIntFromString(
146		"4338620300185947561074059802482547481416142213883829469920100239455078257889")
147	p := &Point{X: x, Y: y}
148	s := utils.NewIntFromString(
149		"20819045374670962167435360035096875258406992893633759881276124905556507972311")
150	r := NewPoint().Mul(s, p)
151	assert.Equal(t,
152		"13563888653650925984868671744672725781658357821216877865297235725727006259983",
153		r.X.String())
154	assert.Equal(t,
155		"8442587202676550862664528699803615547505326611544120184665036919364004251662",
156		r.Y.String())
157}
158
159func TestInCurve3(t *testing.T) {
160	x := utils.NewIntFromString(
161		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
162	y := utils.NewIntFromString(
163		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
164	p := &Point{X: x, Y: y}
165	assert.Equal(t, true, p.InCurve())
166}
167
168func TestInCurve4(t *testing.T) {
169	x := utils.NewIntFromString(
170		"6890855772600357754907169075114257697580319025794532037257385534741338397365")
171	y := utils.NewIntFromString(
172		"4338620300185947561074059802482547481416142213883829469920100239455078257889")
173	p := &Point{X: x, Y: y}
174	assert.Equal(t, true, p.InCurve())
175}
176
177func TestInSubGroup1(t *testing.T) {
178	x := utils.NewIntFromString(
179		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
180	y := utils.NewIntFromString(
181		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
182	p := &Point{X: x, Y: y}
183	assert.Equal(t, true, p.InSubGroup())
184}
185
186func TestInSubGroup2(t *testing.T) {
187	x := utils.NewIntFromString(
188		"6890855772600357754907169075114257697580319025794532037257385534741338397365")
189	y := utils.NewIntFromString(
190		"4338620300185947561074059802482547481416142213883829469920100239455078257889")
191	p := &Point{X: x, Y: y}
192	assert.Equal(t, true, p.InSubGroup())
193}
194
195func TestCompressDecompress1(t *testing.T) {
196	x := utils.NewIntFromString(
197		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
198	y := utils.NewIntFromString(
199		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
200	p := &Point{X: x, Y: y}
201
202	buf := p.Compress()
203	assert.Equal(t, "53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85", hex.EncodeToString(buf[:]))
204
205	p2, err := NewPoint().Decompress(buf)
206	assert.Equal(t, nil, err)
207	assert.Equal(t, p.X.String(), p2.X.String())
208	assert.Equal(t, p.Y.String(), p2.Y.String())
209}
210
211func TestCompressDecompress2(t *testing.T) {
212	x := utils.NewIntFromString(
213		"6890855772600357754907169075114257697580319025794532037257385534741338397365")
214	y := utils.NewIntFromString(
215		"4338620300185947561074059802482547481416142213883829469920100239455078257889")
216	p := &Point{X: x, Y: y}
217
218	buf := p.Compress()
219	assert.Equal(t, "e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709", hex.EncodeToString(buf[:]))
220
221	p2, err := NewPoint().Decompress(buf)
222	assert.Equal(t, nil, err)
223	assert.Equal(t, p.X.String(), p2.X.String())
224	assert.Equal(t, p.Y.String(), p2.Y.String())
225}
226
227func TestCompressDecompressRnd(t *testing.T) {
228	for i := 0; i < 64; i++ {
229		p1 := NewPoint().Mul(big.NewInt(int64(i)), B8)
230		buf := p1.Compress()
231		p2, err := NewPoint().Decompress(buf)
232		assert.Equal(t, nil, err)
233		assert.Equal(t, p1, p2)
234	}
235}
236
237func BenchmarkBabyjub(b *testing.B) {
238	const n = 256
239
240	rnd := rand.New(rand.NewSource(42))
241
242	var badpoints [n]*Point
243	for i := 0; i < n; i++ {
244		x := new(big.Int).Rand(rnd, constants.Q)
245		y := new(big.Int).Rand(rnd, constants.Q)
246		badpoints[i] = &Point{X: x, Y: y}
247	}
248
249	var points [n]*Point
250	baseX := utils.NewIntFromString(
251		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
252	baseY := utils.NewIntFromString(
253		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
254	base := &Point{X: baseX, Y: baseY}
255	for i := 0; i < n; i++ {
256		s := new(big.Int).Rand(rnd, constants.Q)
257		points[i] = NewPoint().Mul(s, base)
258	}
259
260	var scalars [n]*big.Int
261	for i := 0; i < n; i++ {
262		scalars[i] = new(big.Int).Rand(rnd, constants.Q)
263	}
264
265	b.Run("AddConst", func(b *testing.B) {
266		p0 := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
267		p1 := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
268
269		p2 := NewPoint()
270		for i := 0; i < b.N; i++ {
271			p2.Add(p0, p1)
272		}
273	})
274
275	b.Run("AddRnd", func(b *testing.B) {
276		res := NewPoint()
277		for i := 0; i < b.N; i++ {
278			res.Add(points[i%(n/2)], points[i%(n/2)+1])
279		}
280	})
281
282	b.Run("MulRnd", func(b *testing.B) {
283		res := NewPoint()
284		for i := 0; i < b.N; i++ {
285			res.Mul(scalars[i%n], points[i%n])
286		}
287	})
288
289	b.Run("Compress", func(b *testing.B) {
290		for i := 0; i < b.N; i++ {
291			points[i%n].Compress()
292		}
293	})
294
295	b.Run("InCurve", func(b *testing.B) {
296		for i := 0; i < b.N; i++ {
297			badpoints[i%n].InCurve()
298		}
299	})
300
301	b.Run("InSubGroup", func(b *testing.B) {
302		for i := 0; i < b.N; i++ {
303			points[i%n].InCurve()
304		}
305	})
306}