go-iden3-crypto/babyjub/babyjub_test.go
babyjub/babyjub_test.goRaw
1package babyjub
2
3import (
4 "encoding/hex"
5 "math/big"
6 "testing"
7
8 "github.com/iden3/go-iden3-crypto/utils"
9 "github.com/stretchr/testify/assert"
10)
11
12func TestAdd1(t *testing.T) {
13 a := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
14 b := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
15
16 c := NewPoint().Add(a, b)
17 // fmt.Printf("%v = 2 * %v", *c, *a)
18 assert.Equal(t, "0", c.X.String())
19 assert.Equal(t, "1", c.Y.String())
20}
21
22func TestAdd2(t *testing.T) {
23 aX := utils.NewIntFromString(
24 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
25 aY := utils.NewIntFromString(
26 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
27 a := &Point{X: aX, Y: aY}
28
29 bX := utils.NewIntFromString(
30 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
31 bY := utils.NewIntFromString(
32 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
33 b := &Point{X: bX, Y: bY}
34
35 c := NewPoint().Add(a, b)
36 // fmt.Printf("%v = 2 * %v", *c, *a)
37 assert.Equal(t,
38 "6890855772600357754907169075114257697580319025794532037257385534741338397365",
39 c.X.String())
40 assert.Equal(t,
41 "4338620300185947561074059802482547481416142213883829469920100239455078257889",
42 c.Y.String())
43}
44
45func TestAdd3(t *testing.T) {
46 aX := utils.NewIntFromString(
47 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
48 aY := utils.NewIntFromString(
49 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
50 a := &Point{X: aX, Y: aY}
51
52 bX := utils.NewIntFromString(
53 "16540640123574156134436876038791482806971768689494387082833631921987005038935")
54 bY := utils.NewIntFromString(
55 "20819045374670962167435360035096875258406992893633759881276124905556507972311")
56 b := &Point{X: bX, Y: bY}
57
58 c := NewPoint().Add(a, b)
59 // fmt.Printf("%v = 2 * %v", *c, *a)
60 assert.Equal(t,
61 "7916061937171219682591368294088513039687205273691143098332585753343424131937",
62 c.X.String())
63 assert.Equal(t,
64 "14035240266687799601661095864649209771790948434046947201833777492504781204499",
65 c.Y.String())
66}
67
68func TestAdd4(t *testing.T) {
69 aX := utils.NewIntFromString(
70 "0")
71 aY := utils.NewIntFromString(
72 "1")
73 a := &Point{X: aX, Y: aY}
74
75 bX := utils.NewIntFromString(
76 "16540640123574156134436876038791482806971768689494387082833631921987005038935")
77 bY := utils.NewIntFromString(
78 "20819045374670962167435360035096875258406992893633759881276124905556507972311")
79 b := &Point{X: bX, Y: bY}
80
81 c := NewPoint().Add(a, b)
82 // fmt.Printf("%v = 2 * %v", *c, *a)
83 assert.Equal(t,
84 "16540640123574156134436876038791482806971768689494387082833631921987005038935",
85 c.X.String())
86 assert.Equal(t,
87 "20819045374670962167435360035096875258406992893633759881276124905556507972311",
88 c.Y.String())
89}
90
91func TestInCurve1(t *testing.T) {
92 p := &Point{X: big.NewInt(0), Y: big.NewInt(1)}
93 assert.Equal(t, true, p.InCurve())
94}
95
96func TestInCurve2(t *testing.T) {
97 p := &Point{X: big.NewInt(1), Y: big.NewInt(0)}
98 assert.Equal(t, false, p.InCurve())
99}
100
101func TestMul0(t *testing.T) {
102 x := utils.NewIntFromString(
103 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
104 y := utils.NewIntFromString(
105 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
106 p := &Point{X: x, Y: y}
107 s := utils.NewIntFromString("3")
108
109 r2 := NewPoint().Add(p, p)
110 r2 = NewPoint().Add(r2, p)
111 r := NewPoint().Mul(s, p)
112 assert.Equal(t, r2.X.String(), r.X.String())
113 assert.Equal(t, r2.Y.String(), r.Y.String())
114
115 assert.Equal(t,
116 "19372461775513343691590086534037741906533799473648040012278229434133483800898",
117 r.X.String())
118 assert.Equal(t,
119 "9458658722007214007257525444427903161243386465067105737478306991484593958249",
120 r.Y.String())
121}
122
123func TestMul1(t *testing.T) {
124 x := utils.NewIntFromString(
125 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
126 y := utils.NewIntFromString(
127 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
128 p := &Point{X: x, Y: y}
129 s := utils.NewIntFromString(
130 "14035240266687799601661095864649209771790948434046947201833777492504781204499")
131 r := NewPoint().Mul(s, p)
132 assert.Equal(t,
133 "17070357974431721403481313912716834497662307308519659060910483826664480189605",
134 r.X.String())
135 assert.Equal(t,
136 "4014745322800118607127020275658861516666525056516280575712425373174125159339",
137 r.Y.String())
138}
139
140func TestMul2(t *testing.T) {
141 x := utils.NewIntFromString(
142 "6890855772600357754907169075114257697580319025794532037257385534741338397365")
143 y := utils.NewIntFromString(
144 "4338620300185947561074059802482547481416142213883829469920100239455078257889")
145 p := &Point{X: x, Y: y}
146 s := utils.NewIntFromString(
147 "20819045374670962167435360035096875258406992893633759881276124905556507972311")
148 r := NewPoint().Mul(s, p)
149 assert.Equal(t,
150 "13563888653650925984868671744672725781658357821216877865297235725727006259983",
151 r.X.String())
152 assert.Equal(t,
153 "8442587202676550862664528699803615547505326611544120184665036919364004251662",
154 r.Y.String())
155}
156
157func TestInCurve3(t *testing.T) {
158 x := utils.NewIntFromString(
159 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
160 y := utils.NewIntFromString(
161 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
162 p := &Point{X: x, Y: y}
163 assert.Equal(t, true, p.InCurve())
164}
165
166func TestInCurve4(t *testing.T) {
167 x := utils.NewIntFromString(
168 "6890855772600357754907169075114257697580319025794532037257385534741338397365")
169 y := utils.NewIntFromString(
170 "4338620300185947561074059802482547481416142213883829469920100239455078257889")
171 p := &Point{X: x, Y: y}
172 assert.Equal(t, true, p.InCurve())
173}
174
175func TestInSubGroup1(t *testing.T) {
176 x := utils.NewIntFromString(
177 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
178 y := utils.NewIntFromString(
179 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
180 p := &Point{X: x, Y: y}
181 assert.Equal(t, true, p.InSubGroup())
182}
183
184func TestInSubGroup2(t *testing.T) {
185 x := utils.NewIntFromString(
186 "6890855772600357754907169075114257697580319025794532037257385534741338397365")
187 y := utils.NewIntFromString(
188 "4338620300185947561074059802482547481416142213883829469920100239455078257889")
189 p := &Point{X: x, Y: y}
190 assert.Equal(t, true, p.InSubGroup())
191}
192
193func TestCompressDecompress1(t *testing.T) {
194 x := utils.NewIntFromString(
195 "17777552123799933955779906779655732241715742912184938656739573121738514868268")
196 y := utils.NewIntFromString(
197 "2626589144620713026669568689430873010625803728049924121243784502389097019475")
198 p := &Point{X: x, Y: y}
199
200 buf := p.Compress()
201 assert.Equal(t, "53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85", hex.EncodeToString(buf[:]))
202
203 p2, err := NewPoint().Decompress(buf)
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 TestCompressDecompress2(t *testing.T) {
210 x := utils.NewIntFromString(
211 "6890855772600357754907169075114257697580319025794532037257385534741338397365")
212 y := utils.NewIntFromString(
213 "4338620300185947561074059802482547481416142213883829469920100239455078257889")
214 p := &Point{X: x, Y: y}
215
216 buf := p.Compress()
217 assert.Equal(t, "e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709", 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 TestCompressDecompressRnd(t *testing.T) {
226 for i := 0; i < 64; i++ {
227 p1 := NewPoint().Mul(big.NewInt(int64(i)), B8)
228 buf := p1.Compress()
229 p2, err := NewPoint().Decompress(buf)
230 assert.Equal(t, nil, err)
231 assert.Equal(t, p1, p2)
232 }
233}