arnaucube
arnaucube/cryptofunPublic Self-hosted repository
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}