arnaucube
arnaucube/go-snarkPublic Self-hosted repository
go-snark/bn128/bn128_test.go
bn128/bn128_test.goRaw
 1package bn128
 2
 3import (
 4	"bytes"
 5	"math/big"
 6	"testing"
 7
 8	"github.com/stretchr/testify/assert"
 9)
10
11func TestBN128(t *testing.T) {
12	bn128, err := NewBn128()
13	assert.Nil(t, err)
14
15	big40 := big.NewInt(int64(40))
16	big75 := big.NewInt(int64(75))
17
18	g1a := bn128.G1.MulScalar(bn128.G1.G, bn128.Fq1.Copy(big40))
19	g2a := bn128.G2.MulScalar(bn128.G2.G, bn128.Fq1.Copy(big75))
20
21	g1b := bn128.G1.MulScalar(bn128.G1.G, bn128.Fq1.Copy(big75))
22	g2b := bn128.G2.MulScalar(bn128.G2.G, bn128.Fq1.Copy(big40))
23
24	pre1a := bn128.PreComputeG1(g1a)
25	pre2a := bn128.PreComputeG2(g2a)
26	assert.Nil(t, err)
27	pre1b := bn128.PreComputeG1(g1b)
28	pre2b := bn128.PreComputeG2(g2b)
29	assert.Nil(t, err)
30
31	r1 := bn128.MillerLoop(pre1a, pre2a)
32	r2 := bn128.MillerLoop(pre1b, pre2b)
33
34	rbe := bn128.Fq12.Mul(r1, bn128.Fq12.Inverse(r2))
35
36	res := bn128.FinalExponentiation(rbe)
37
38	a := bn128.Fq12.Affine(res)
39	b := bn128.Fq12.Affine(bn128.Fq12.One())
40
41	assert.True(t, bn128.Fq12.Equal(a, b))
42	assert.True(t, bn128.Fq12.Equal(res, bn128.Fq12.One()))
43}
44
45func TestBN128Pairing(t *testing.T) {
46	bn128, err := NewBn128()
47	assert.Nil(t, err)
48
49	big25 := big.NewInt(int64(25))
50	big30 := big.NewInt(int64(30))
51
52	g1a := bn128.G1.MulScalar(bn128.G1.G, big25)
53	g2a := bn128.G2.MulScalar(bn128.G2.G, big30)
54
55	g1b := bn128.G1.MulScalar(bn128.G1.G, big30)
56	g2b := bn128.G2.MulScalar(bn128.G2.G, big25)
57
58	pA := bn128.Pairing(g1a, g2a)
59	pB := bn128.Pairing(g1b, g2b)
60
61	assert.True(t, bn128.Fq12.Equal(pA, pB))
62
63	assert.True(t, !bytes.Equal(pA[0][0][0].Bytes(), big.NewInt(int64(0)).Bytes()))
64	assert.True(t, !bytes.Equal(bn128.Fq12.Affine(pA)[0][0][0].Bytes(), big.NewInt(int64(0)).Bytes()))
65	// assert.Equal(t, pA[0][0][0].String(), "73680848340331011700282047627232219336104151861349893575958589557226556635706")
66	// assert.Equal(t, bn128.Fq12.Affine(pA)[0][0][0].String(), "8016119724813186033542830391460394070015218389456422587891475873290878009957")
67}
68
69func TestBN128Pairing2(t *testing.T) {
70	// test idea from https://bplib.readthedocs.io/en/latest/ by George Danezis
71	bn, err := NewBn128()
72	assert.Nil(t, err)
73
74	gt := bn.Pairing(bn.G1.G, bn.G2.G)
75
76	gt6 := bn.Fq12.Exp(gt, big.NewInt(int64(6)))
77
78	// e(g1, g2)^6 == e(g1, 6*g2)
79	assert.True(t, bn.Fq12.Equal(gt6, bn.Pairing(bn.G1.G, bn.G2.MulScalar(bn.G2.G, big.NewInt(int64(6))))))
80
81	// e(g1, g2)^6 == e(6* g1, g2)
82	assert.True(t, bn.Fq12.Equal(gt6, bn.Pairing(bn.G1.MulScalar(bn.G1.G, big.NewInt(int64(6))), bn.G2.G)))
83	// e(g1, g2)^6 == e(3*g1, 2*g2)
84	assert.True(t, bn.Fq12.Equal(gt6, bn.Pairing(bn.G1.MulScalar(bn.G1.G, big.NewInt(int64(3))), bn.G2.MulScalar(bn.G2.G, big.NewInt(int64(2))))))
85	// e(g1, g2)^6 == e(2*g1, 3*g2)
86	assert.True(t, bn.Fq12.Equal(gt6, bn.Pairing(bn.G1.MulScalar(bn.G1.G, big.NewInt(int64(2))), bn.G2.MulScalar(bn.G2.G, big.NewInt(int64(3))))))
87
88}