arnaucube
arnaucube/cryptofunPublic Self-hosted repository
cryptofun/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), res)
 27
 28	res = fq1.Double(iToBig(5))
 29	assert.Equal(t, iToBig(3), res)
 30
 31	res = fq1.Sub(iToBig(5), iToBig(7))
 32	assert.Equal(t, iToBig(5), res)
 33
 34	res = fq1.Neg(iToBig(5))
 35	assert.Equal(t, iToBig(2), res)
 36
 37	res = fq1.Mul(iToBig(5), iToBig(11))
 38	assert.Equal(t, iToBig(6), 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 / Beta
 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), res)
 58
 59	res = fq2.Double(iiToBig(5, 3))
 60	assert.Equal(t, iiToBig(3, 6), res)
 61
 62	res = fq2.Sub(iiToBig(5, 3), iiToBig(7, 2))
 63	assert.Equal(t, iiToBig(5, 1), res)
 64
 65	res = fq2.Neg(iiToBig(4, 4))
 66	assert.Equal(t, iiToBig(3, 3), res)
 67
 68	res = fq2.Mul(iiToBig(4, 4), iiToBig(3, 4))
 69	assert.Equal(t, iiToBig(3, 0), res)
 70
 71	res = fq2.Inverse(iiToBig(4, 4))
 72	assert.Equal(t, iiToBig(1, 6), res)
 73
 74	res = fq2.Div(iiToBig(4, 4), iiToBig(3, 4))
 75	assert.Equal(t, iiToBig(0, 6), res)
 76
 77	res = fq2.Square(iiToBig(4, 4))
 78	assert.Equal(t, iiToBig(0, 4), res)
 79	res2 := fq2.Mul(iiToBig(4, 4), iiToBig(4, 4))
 80	assert.Equal(t, res, res2)
 81
 82	res = fq2.Square(iiToBig(3, 5))
 83	assert.Equal(t, iiToBig(5, 2), res)
 84	res2 = fq2.Mul(iiToBig(3, 5), iiToBig(3, 5))
 85	assert.Equal(t, res, res2)
 86}
 87
 88func TestFq6(t *testing.T) {
 89	fq1 := NewFq(big.NewInt(int64(7)))
 90	nonResidueFq2, ok := new(big.Int).SetString("-1", 10) // i
 91	assert.True(t, ok)
 92	nonResidueFq6 := iiToBig(9, 1) // TODO
 93
 94	fq2 := Fq2{fq1, nonResidueFq2}
 95	fq6 := Fq6{fq2, nonResidueFq6}
 96	a := [3][2]*big.Int{
 97		iiToBig(1, 2),
 98		iiToBig(3, 4),
 99		iiToBig(5, 6)}
100	b := [3][2]*big.Int{
101		iiToBig(12, 11),
102		iiToBig(10, 9),
103		iiToBig(8, 7)}
104
105	res := fq6.Add(a, b)
106	assert.Equal(t,
107		[3][2]*big.Int{
108			iiToBig(6, 6),
109			iiToBig(6, 6),
110			iiToBig(6, 6)},
111		res)
112
113	res = fq6.Sub(a, b)
114	assert.Equal(t,
115		[3][2]*big.Int{
116			iiToBig(3, 5),
117			iiToBig(0, 2),
118			iiToBig(4, 6)},
119		res)
120
121	res = fq6.Mul(a, b)
122	assert.Equal(t,
123		[3][2]*big.Int{
124			iiToBig(5, 0),
125			iiToBig(2, 1),
126			iiToBig(3, 0)},
127		res)
128
129	mulRes := fq6.Mul(a, b)
130	divRes := fq6.Div(mulRes, b)
131	assert.Equal(t, a, divRes)
132}
133
134func TestFq12(t *testing.T) {
135	q, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10) // i
136	assert.True(t, ok)
137	fq1 := NewFq(q)
138	nonResidueFq2, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208582", 10) // i
139	assert.True(t, ok)
140	nonResidueFq6 := iiToBig(9, 1)
141
142	fq2 := Fq2{fq1, nonResidueFq2}
143	fq6 := Fq6{fq2, nonResidueFq6}
144	fq12 := Fq12{fq6, fq2, nonResidueFq6}
145
146	a := [2][3][2]*big.Int{
147		{
148			iiToBig(1, 2),
149			iiToBig(3, 4),
150			iiToBig(5, 6),
151		},
152		{
153			iiToBig(7, 8),
154			iiToBig(9, 10),
155			iiToBig(11, 12),
156		},
157	}
158	b := [2][3][2]*big.Int{
159		{
160			iiToBig(12, 11),
161			iiToBig(10, 9),
162			iiToBig(8, 7),
163		},
164		{
165			iiToBig(6, 5),
166			iiToBig(4, 3),
167			iiToBig(2, 1),
168		},
169	}
170
171	res := fq12.Add(a, b)
172	assert.Equal(t,
173		[2][3][2]*big.Int{
174			{
175				iiToBig(13, 13),
176				iiToBig(13, 13),
177				iiToBig(13, 13),
178			},
179			{
180				iiToBig(13, 13),
181				iiToBig(13, 13),
182				iiToBig(13, 13),
183			},
184		},
185		res)
186
187	mulRes := fq12.Mul(a, b)
188	divRes := fq12.Div(mulRes, b)
189	assert.Equal(t, a, divRes)
190}