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}