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 TestPointFromSignAndy(t *testing.T) {
196	x := utils.NewIntFromString(
197		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
198	y := utils.NewIntFromString(
199		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
200	p := &Point{X: x, Y: y}
201
202	sign := PointCoordSign(p.X)
203	p2, err := PointFromSignAndY(sign, p.Y)
204	assert.Equal(t, nil, err)
205	assert.Equal(t, p.X.String(), p2.X.String())
206	assert.Equal(t, p.Y.String(), p2.Y.String())
207}
208
209func TestCompressDecompress1(t *testing.T) {
210	x := utils.NewIntFromString(
211		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
212	y := utils.NewIntFromString(
213		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
214	p := &Point{X: x, Y: y}
215
216	buf := p.Compress()
217	assert.Equal(t, "53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85", hex.EncodeToString(buf[:]))
218
219	p2, err := NewPoint().Decompress(buf)
220	assert.Equal(t, nil, err)
221	assert.Equal(t, p.X.String(), p2.X.String())
222	assert.Equal(t, p.Y.String(), p2.Y.String())
223}
224
225func TestCompressDecompress2(t *testing.T) {
226	x := utils.NewIntFromString(
227		"6890855772600357754907169075114257697580319025794532037257385534741338397365")
228	y := utils.NewIntFromString(
229		"4338620300185947561074059802482547481416142213883829469920100239455078257889")
230	p := &Point{X: x, Y: y}
231
232	buf := p.Compress()
233	assert.Equal(t, "e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709", hex.EncodeToString(buf[:]))
234
235	p2, err := NewPoint().Decompress(buf)
236	assert.Equal(t, nil, err)
237	assert.Equal(t, p.X.String(), p2.X.String())
238	assert.Equal(t, p.Y.String(), p2.Y.String())
239}
240
241func TestCompressDecompressRnd(t *testing.T) {
242	for i := 0; i < 64; i++ {
243		p1 := NewPoint().Mul(big.NewInt(int64(i)), B8)
244		buf := p1.Compress()
245		p2, err := NewPoint().Decompress(buf)
246		assert.Equal(t, nil, err)
247		assert.Equal(t, p1, p2)
248	}
249}
250
251func BenchmarkBabyjub(b *testing.B) {
252	const n = 256
253
254	rnd := rand.New(rand.NewSource(42))
255
256	var badpoints [n]*Point
257	for i := 0; i < n; i++ {
258		x := new(big.Int).Rand(rnd, constants.Q)
259		y := new(big.Int).Rand(rnd, constants.Q)
260		badpoints[i] = &Point{X: x, Y: y}
261	}
262
263	var points [n]*Point
264	baseX := utils.NewIntFromString(
265		"17777552123799933955779906779655732241715742912184938656739573121738514868268")
266	baseY := utils.NewIntFromString(
267		"2626589144620713026669568689430873010625803728049924121243784502389097019475")
268	base := &Point{X: baseX, Y: baseY}
269	for i := 0; i < n; i++ {
270		s := new(big.Int).Rand(rnd, constants.Q)
271		points[i] = NewPoint().Mul(s, base)
272	}
273
274	var scalars [n]*big.Int
275	for i := 0; i < n; i++ {
276		scalars[i] = new(big.Int).Rand(rnd, constants.Q)
277	}
278
279	b.Run("AddConst", func(b *testing.B) {
280		p0 := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
281		p1 := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
282
283		p2 := NewPoint()
284		for i := 0; i < b.N; i++ {
285			p2.Add(p0, p1)
286		}
287	})
288
289	b.Run("AddRnd", func(b *testing.B) {
290		res := NewPoint()
291		for i := 0; i < b.N; i++ {
292			res.Add(points[i%(n/2)], points[i%(n/2)+1])
293		}
294	})
295
296	b.Run("MulRnd", func(b *testing.B) {
297		res := NewPoint()
298		for i := 0; i < b.N; i++ {
299			res.Mul(scalars[i%n], points[i%n])
300		}
301	})
302
303	b.Run("Compress", func(b *testing.B) {
304		for i := 0; i < b.N; i++ {
305			points[i%n].Compress()
306		}
307	})
308
309	b.Run("InCurve", func(b *testing.B) {
310		for i := 0; i < b.N; i++ {
311			badpoints[i%n].InCurve()
312		}
313	})
314
315	b.Run("InSubGroup", func(b *testing.B) {
316		for i := 0; i < b.N; i++ {
317			points[i%n].InCurve()
318		}
319	})
320}