cryptofun/ecc/ecc_test.go
ecc/ecc_test.goRaw
1package ecc
2
3import (
4 "math/big"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8)
9
10func TestECC(t *testing.T) {
11 ec := NewEC(0, 7, 11)
12 p1, p1i, err := ec.At(big.NewInt(int64(7)))
13 assert.Nil(t, err)
14
15 if !p1.Equal(Point{big.NewInt(int64(7)), big.NewInt(int64(3))}) {
16 t.Errorf("p1!=(7, 11)")
17 }
18 if !p1i.Equal(Point{big.NewInt(int64(7)), big.NewInt(int64(8))}) {
19 t.Errorf("p1i!=(7, 8)")
20 }
21}
22func TestNeg(t *testing.T) {
23 ec := NewEC(0, 7, 11)
24 p1, p1i, err := ec.At(big.NewInt(int64(7)))
25 assert.Nil(t, err)
26
27 p1Neg := ec.Neg(p1)
28 if !p1Neg.Equal(p1i) {
29 t.Errorf("p1Neg!=p1i")
30 }
31
32}
33
34func TestAdd(t *testing.T) {
35 ec := NewEC(0, 7, 11)
36 p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(7))}
37 p2 := Point{big.NewInt(int64(2)), big.NewInt(int64(2))}
38 q, err := ec.Add(p1, p2)
39 assert.Nil(t, err)
40
41 if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) {
42 t.Errorf("q!=(3, 1)")
43 }
44
45 // check that q exists on the elliptic curve
46 pt, pti, err := ec.At(q.X)
47 assert.Nil(t, err)
48
49 if !q.Equal(pt) && !q.Equal(pti) {
50 t.Errorf("q not exist on the elliptic curve")
51 }
52
53}
54
55func TestAddSamePoint(t *testing.T) {
56 ec := NewEC(0, 7, 11)
57 p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(7))}
58 p1i := Point{big.NewInt(int64(4)), big.NewInt(int64(4))}
59
60 q, err := ec.Add(p1, p1)
61 assert.Nil(t, err)
62
63 if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(5))}) {
64 t.Errorf(q.String() + " == q != (6, 5)")
65 }
66
67 q_, err := ec.Add(p1i, p1i)
68 assert.Nil(t, err)
69
70 if !q_.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(6))}) {
71 t.Errorf(q_.String() + " == q_ != (6, 6)")
72 }
73
74}
75
76func TestMulPoint1(t *testing.T) {
77 ec := NewEC(0, 7, 29)
78 p := Point{big.NewInt(int64(11)), big.NewInt(int64(27))}
79
80 q, err := ec.Mul(p, big.NewInt(int64(1)))
81 assert.Nil(t, err)
82
83 if !q.Equal(Point{big.NewInt(int64(11)), big.NewInt(int64(27))}) {
84 t.Errorf(q.String() + " == q != (11, 27)")
85 }
86
87 q, err = ec.Mul(p, big.NewInt(int64(2)))
88 assert.Nil(t, err)
89
90 if !q.Equal(Point{big.NewInt(int64(12)), big.NewInt(int64(13))}) {
91 t.Errorf(q.String() + " == q != (12, 13)")
92 }
93
94 q, err = ec.Mul(p, big.NewInt(int64(3)))
95 assert.Nil(t, err)
96
97 if !q.Equal(Point{big.NewInt(int64(28)), big.NewInt(int64(8))}) {
98 t.Errorf(q.String() + " == q != (28, 8)")
99 }
100
101 q, err = ec.Mul(p, big.NewInt(int64(4)))
102 assert.Nil(t, err)
103
104 if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(22))}) {
105 t.Errorf(q.String() + " == q != (6, 22)")
106 }
107}
108
109func TestMulPoint2(t *testing.T) {
110 ec := NewEC(0, 7, 29)
111 p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(19))}
112 q3, err := ec.Mul(p1, big.NewInt(int64(3)))
113 assert.Nil(t, err)
114
115 if !q3.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(7))}) {
116 t.Errorf(q3.String() + " == q3 != (6, 7)")
117 }
118 q7, err := ec.Mul(p1, big.NewInt(int64(7)))
119 assert.Nil(t, err)
120
121 if !q7.Equal(Point{big.NewInt(int64(19)), big.NewInt(int64(14))}) {
122 t.Errorf(q7.String() + " == q7 != (19, 14)")
123 }
124
125 q8, err := ec.Mul(p1, big.NewInt(int64(8)))
126 assert.Nil(t, err)
127
128 if !q8.Equal(Point{big.NewInt(int64(19)), big.NewInt(int64(15))}) {
129 t.Errorf(q8.String() + " == q8 != (12, 16)")
130 }
131}
132
133func TestMulPoint3(t *testing.T) {
134 // in this test we will multiply by a high number
135 ec := NewEC(0, 7, 11)
136 p := Point{big.NewInt(int64(7)), big.NewInt(int64(3))}
137
138 q, err := ec.Mul(p, big.NewInt(int64(100)))
139 assert.Nil(t, err)
140 if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) {
141 t.Errorf(q.String() + " == q != (3, 1)")
142 }
143
144 q, err = ec.Mul(p, big.NewInt(int64(100)))
145 assert.Nil(t, err)
146 if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) {
147 t.Errorf(q.String() + " == q != (3, 1)")
148 }
149}
150
151func TestMulEqualSelfAdd(t *testing.T) {
152 ec := NewEC(0, 7, 29)
153 p1 := Point{big.NewInt(int64(11)), big.NewInt(int64(27))}
154
155 p1_2, err := ec.Add(p1, p1)
156 assert.Nil(t, err)
157
158 p1_3, err := ec.Add(p1_2, p1)
159 assert.Nil(t, err)
160
161 // q * 3
162 q, err := ec.Mul(p1, big.NewInt(int64(3)))
163 assert.Nil(t, err)
164
165 if !q.Equal(Point{big.NewInt(int64(28)), big.NewInt(int64(8))}) {
166 t.Errorf(q.String() + " == q != (28, 8)")
167 }
168 if !q.Equal(p1_3) {
169 t.Errorf("p*3 == " + q.String() + ", p+p+p == " + p1_3.String())
170 }
171
172 // q * 4
173 p1_4, err := ec.Add(p1_3, p1)
174 assert.Nil(t, err)
175
176 q, err = ec.Mul(p1, big.NewInt(int64(4)))
177 assert.Nil(t, err)
178
179 if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(22))}) {
180 t.Errorf(q.String() + " == q != (6, 22)")
181 }
182 if !q.Equal(p1_4) {
183 t.Errorf("p*4 == " + q.String() + ", p+p+p+p == " + p1_4.String())
184 }
185}
186
187func TestOrder(t *testing.T) {
188 ec := NewEC(0, 7, 11)
189 g := Point{big.NewInt(int64(7)), big.NewInt(int64(8))}
190 order, err := ec.Order(g)
191 assert.Nil(t, err)
192 assert.Equal(t, order.Int64(), int64(12))
193
194 // another test
195 g = Point{big.NewInt(int64(2)), big.NewInt(int64(9))}
196 order, err = ec.Order(g)
197 assert.Nil(t, err)
198 assert.Equal(t, order.Int64(), int64(4))
199
200 // another test with another curve
201 ec = NewEC(0, 7, 29)
202 g = Point{big.NewInt(int64(6)), big.NewInt(int64(22))}
203 order, err = ec.Order(g)
204 assert.Nil(t, err)
205 assert.Equal(t, order.Int64(), int64(5))
206
207 // another test
208 g = Point{big.NewInt(int64(23)), big.NewInt(int64(9))}
209 order, err = ec.Order(g)
210 assert.Nil(t, err)
211 assert.Equal(t, order.Int64(), int64(30))
212}