arnaucube
arnaucube/go-snarkPublic Self-hosted repository
go-snark/bn128/fqn_test.go
bn128/fqn_test.goRaw
  1package bn128
  2
  3import (
  4	"math/big"
  5	"testing"
  6
  7	"github.com/stretchr/testify/assert"
  8)
  9
 10func iToBig(a int) *big.Int {
 11	return big.NewInt(int64(a))
 12}
 13
 14func iiToBig(a, b int) [2]*big.Int {
 15	return [2]*big.Int{iToBig(a), iToBig(b)}
 16}
 17
 18func iiiToBig(a, b int) [2]*big.Int {
 19	return [2]*big.Int{iToBig(a), iToBig(b)}
 20}
 21
 22func TestFq1(t *testing.T) {
 23	fq1 := NewFq(iToBig(7))
 24
 25	res := fq1.Add(iToBig(4), iToBig(4))
 26	assert.Equal(t, iToBig(1), fq1.Affine(res))
 27
 28	res = fq1.Double(iToBig(5))
 29	assert.Equal(t, iToBig(3), fq1.Affine(res))
 30
 31	res = fq1.Sub(iToBig(5), iToBig(7))
 32	assert.Equal(t, iToBig(5), fq1.Affine(res))
 33
 34	res = fq1.Neg(iToBig(5))
 35	assert.Equal(t, iToBig(2), fq1.Affine(res))
 36
 37	res = fq1.Mul(iToBig(5), iToBig(11))
 38	assert.Equal(t, iToBig(6), fq1.Affine(res))
 39
 40	res = fq1.Inverse(iToBig(4))
 41	assert.Equal(t, iToBig(2), res)
 42
 43	res = fq1.Square(iToBig(5))
 44	assert.Equal(t, iToBig(4), res)
 45}
 46
 47func TestFq2(t *testing.T) {
 48	fq1 := NewFq(iToBig(7))
 49	nonResidueFq2str := "-1" // i/j
 50	nonResidueFq2, ok := new(big.Int).SetString(nonResidueFq2str, 10)
 51	assert.True(t, ok)
 52	assert.Equal(t, nonResidueFq2.String(), nonResidueFq2str)
 53
 54	fq2 := Fq2{fq1, nonResidueFq2}
 55
 56	res := fq2.Add(iiToBig(4, 4), iiToBig(3, 4))
 57	assert.Equal(t, iiToBig(0, 1), fq2.Affine(res))
 58
 59	res = fq2.Double(iiToBig(5, 3))
 60	assert.Equal(t, iiToBig(3, 6), fq2.Affine(res))
 61
 62	res = fq2.Sub(iiToBig(5, 3), iiToBig(7, 2))
 63	assert.Equal(t, iiToBig(5, 1), fq2.Affine(res))
 64
 65	res = fq2.Neg(iiToBig(4, 4))
 66	assert.Equal(t, iiToBig(3, 3), fq2.Affine(res))
 67
 68	res = fq2.Mul(iiToBig(4, 4), iiToBig(3, 4))
 69	assert.Equal(t, iiToBig(3, 0), fq2.Affine(res))
 70
 71	res = fq2.Inverse(iiToBig(4, 4))
 72	assert.Equal(t, iiToBig(1, 6), fq2.Affine(res))
 73
 74	res = fq2.Square(iiToBig(4, 4))
 75	assert.Equal(t, iiToBig(0, 4), fq2.Affine(res))
 76	res2 := fq2.Mul(iiToBig(4, 4), iiToBig(4, 4))
 77	assert.Equal(t, fq2.Affine(res), fq2.Affine(res2))
 78	assert.True(t, fq2.Equal(res, res2))
 79
 80	res = fq2.Square(iiToBig(3, 5))
 81	assert.Equal(t, iiToBig(5, 2), fq2.Affine(res))
 82	res2 = fq2.Mul(iiToBig(3, 5), iiToBig(3, 5))
 83	assert.Equal(t, fq2.Affine(res), fq2.Affine(res2))
 84}
 85
 86func TestFq6(t *testing.T) {
 87	bn128, err := NewBn128()
 88	assert.Nil(t, err)
 89
 90	a := [3][2]*big.Int{
 91		iiToBig(1, 2),
 92		iiToBig(3, 4),
 93		iiToBig(5, 6)}
 94	b := [3][2]*big.Int{
 95		iiToBig(12, 11),
 96		iiToBig(10, 9),
 97		iiToBig(8, 7)}
 98
 99	mulRes := bn128.Fq6.Mul(a, b)
100	divRes := bn128.Fq6.Div(mulRes, b)
101	assert.Equal(t, bn128.Fq6.Affine(a), bn128.Fq6.Affine(divRes))
102}
103
104func TestFq12(t *testing.T) {
105	q, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10) // i
106	assert.True(t, ok)
107	fq1 := NewFq(q)
108	nonResidueFq2, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208582", 10) // i
109	assert.True(t, ok)
110	nonResidueFq6 := iiToBig(9, 1)
111
112	fq2 := Fq2{fq1, nonResidueFq2}
113	fq6 := Fq6{fq2, nonResidueFq6}
114	fq12 := Fq12{fq6, fq2, nonResidueFq6}
115
116	a := [2][3][2]*big.Int{
117		{
118			iiToBig(1, 2),
119			iiToBig(3, 4),
120			iiToBig(5, 6),
121		},
122		{
123			iiToBig(7, 8),
124			iiToBig(9, 10),
125			iiToBig(11, 12),
126		},
127	}
128	b := [2][3][2]*big.Int{
129		{
130			iiToBig(12, 11),
131			iiToBig(10, 9),
132			iiToBig(8, 7),
133		},
134		{
135			iiToBig(6, 5),
136			iiToBig(4, 3),
137			iiToBig(2, 1),
138		},
139	}
140
141	res := fq12.Add(a, b)
142	assert.Equal(t,
143		[2][3][2]*big.Int{
144			{
145				iiToBig(13, 13),
146				iiToBig(13, 13),
147				iiToBig(13, 13),
148			},
149			{
150				iiToBig(13, 13),
151				iiToBig(13, 13),
152				iiToBig(13, 13),
153			},
154		},
155		res)
156
157	mulRes := fq12.Mul(a, b)
158	divRes := fq12.Div(mulRes, b)
159	assert.Equal(t, fq12.Affine(a), fq12.Affine(divRes))
160}