|
|
package ecc
import ( "math/big" "testing"
"github.com/stretchr/testify/assert" )
func TestECC(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) p1, p1i, err := ec.At(big.NewInt(int64(7))) assert.Nil(t, err)
if !p1.Equal(Point{big.NewInt(int64(7)), big.NewInt(int64(3))}) { t.Errorf("p1!=(7, 11)") } if !p1i.Equal(Point{big.NewInt(int64(7)), big.NewInt(int64(8))}) { t.Errorf("p1i!=(7, 8)") } } func TestNeg(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) p1, p1i, err := ec.At(big.NewInt(int64(7))) assert.Nil(t, err)
p1Neg := ec.Neg(p1) if !p1Neg.Equal(p1i) { t.Errorf("p1Neg!=p1i") }
}
func TestAdd(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(7))} p2 := Point{big.NewInt(int64(2)), big.NewInt(int64(2))} q, err := ec.Add(p1, p2) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) { t.Errorf("q!=(3, 1)") }
// check that q exists on the elliptic curve
pt, pti, err := ec.At(q.X) assert.Nil(t, err)
if !q.Equal(pt) && !q.Equal(pti) { t.Errorf("q not exist on the elliptic curve") }
}
func TestAddSamePoint(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(7))} p1i := Point{big.NewInt(int64(4)), big.NewInt(int64(4))}
q, err := ec.Add(p1, p1) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(5))}) { t.Errorf(q.String() + " == q != (6, 5)") }
q_, err := ec.Add(p1i, p1i) assert.Nil(t, err)
if !q_.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(6))}) { t.Errorf(q_.String() + " == q_ != (6, 6)") }
}
func TestMulPoint1(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(29))) p := Point{big.NewInt(int64(11)), big.NewInt(int64(27))}
q, err := ec.Mul(p, big.NewInt(int64(1))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(11)), big.NewInt(int64(27))}) { t.Errorf(q.String() + " == q != (11, 27)") }
q, err = ec.Mul(p, big.NewInt(int64(2))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(12)), big.NewInt(int64(13))}) { t.Errorf(q.String() + " == q != (12, 13)") }
q, err = ec.Mul(p, big.NewInt(int64(3))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(28)), big.NewInt(int64(8))}) { t.Errorf(q.String() + " == q != (28, 8)") }
q, err = ec.Mul(p, big.NewInt(int64(4))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(22))}) { t.Errorf(q.String() + " == q != (6, 22)") } }
func TestMulPoint2(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(29))) p1 := Point{big.NewInt(int64(4)), big.NewInt(int64(19))} q3, err := ec.Mul(p1, big.NewInt(int64(3))) assert.Nil(t, err)
if !q3.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(7))}) { t.Errorf(q3.String() + " == q3 != (6, 7)") } q7, err := ec.Mul(p1, big.NewInt(int64(7))) assert.Nil(t, err)
if !q7.Equal(Point{big.NewInt(int64(19)), big.NewInt(int64(14))}) { t.Errorf(q7.String() + " == q7 != (19, 14)") }
q8, err := ec.Mul(p1, big.NewInt(int64(8))) assert.Nil(t, err)
if !q8.Equal(Point{big.NewInt(int64(19)), big.NewInt(int64(15))}) { t.Errorf(q8.String() + " == q8 != (12, 16)") } }
func TestMulPoint3(t *testing.T) { // in this test we will multiply by a high number
ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) p := Point{big.NewInt(int64(7)), big.NewInt(int64(3))}
q, err := ec.Mul(p, big.NewInt(int64(100))) assert.Nil(t, err) if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) { t.Errorf(q.String() + " == q != (3, 1)") }
q, err = ec.Mul(p, big.NewInt(int64(100))) assert.Nil(t, err) if !q.Equal(Point{big.NewInt(int64(3)), big.NewInt(int64(1))}) { t.Errorf(q.String() + " == q != (3, 1)") } }
func TestMulEqualSelfAdd(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(29))) p1 := Point{big.NewInt(int64(11)), big.NewInt(int64(27))}
p1_2, err := ec.Add(p1, p1) assert.Nil(t, err)
p1_3, err := ec.Add(p1_2, p1) assert.Nil(t, err)
// q * 3
q, err := ec.Mul(p1, big.NewInt(int64(3))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(28)), big.NewInt(int64(8))}) { t.Errorf(q.String() + " == q != (28, 8)") } if !q.Equal(p1_3) { t.Errorf("p*3 == " + q.String() + ", p+p+p == " + p1_3.String()) }
// q * 4
p1_4, err := ec.Add(p1_3, p1) assert.Nil(t, err)
q, err = ec.Mul(p1, big.NewInt(int64(4))) assert.Nil(t, err)
if !q.Equal(Point{big.NewInt(int64(6)), big.NewInt(int64(22))}) { t.Errorf(q.String() + " == q != (6, 22)") } if !q.Equal(p1_4) { t.Errorf("p*4 == " + q.String() + ", p+p+p+p == " + p1_4.String()) } }
func TestOrder(t *testing.T) { ec := NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(11))) g := Point{big.NewInt(int64(7)), big.NewInt(int64(8))} order, err := ec.Order(g) assert.Nil(t, err) assert.Equal(t, order.Int64(), int64(12))
// another test
g = Point{big.NewInt(int64(2)), big.NewInt(int64(9))} order, err = ec.Order(g) assert.Nil(t, err) assert.Equal(t, order.Int64(), int64(4))
// another test with another curve
ec = NewEC(big.NewInt(int64(0)), big.NewInt(int64(7)), big.NewInt(int64(29))) g = Point{big.NewInt(int64(6)), big.NewInt(int64(22))} order, err = ec.Order(g) assert.Nil(t, err) assert.Equal(t, order.Int64(), int64(5))
// another test
g = Point{big.NewInt(int64(23)), big.NewInt(int64(9))} order, err = ec.Order(g) assert.Nil(t, err) assert.Equal(t, order.Int64(), int64(30)) }
|