]> Cypherpunks.ru repositories - gogost.git/blobdiff - gost3410/curve.go
Raise copyright years
[gogost.git] / gost3410 / curve.go
index 47f964b583a66bf9b735b73c671b0ca0e97873e3..9ec14ded1de85e6760d63f3f7cfb9f7b965eaeab 100644 (file)
@@ -1,5 +1,5 @@
 // GoGOST -- Pure Go GOST cryptographic functions library
-// Copyright (C) 2015-2019 Sergey Matveev <stargrave@stargrave.org>
+// Copyright (C) 2015-2021 Sergey Matveev <stargrave@stargrave.org>
 //
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@ var (
        bigInt1 *big.Int = big.NewInt(1)
        bigInt2 *big.Int = big.NewInt(2)
        bigInt3 *big.Int = big.NewInt(3)
+       bigInt4 *big.Int = big.NewInt(4)
 )
 
 type Curve struct {
@@ -33,6 +34,8 @@ type Curve struct {
        P *big.Int // Characteristic of the underlying prime field
        Q *big.Int // Elliptic curve subgroup order
 
+       Co *big.Int // Cofactor
+
        // Equation coefficients of the elliptic curve in canonical form
        A *big.Int
        B *big.Int
@@ -55,7 +58,7 @@ type Curve struct {
        edT *big.Int
 }
 
-func NewCurve(p, q, a, b, x, y, e, d *big.Int) (*Curve, error) {
+func NewCurve(p, q, a, b, x, y, e, d, co *big.Int) (*Curve, error) {
        c := Curve{
                Name: "unknown",
                P:    p,
@@ -79,15 +82,24 @@ func NewCurve(p, q, a, b, x, y, e, d *big.Int) (*Curve, error) {
        r2.Mod(r2, c.P)
        c.pos(r2)
        if r1.Cmp(r2) != 0 {
-               return nil, errors.New("Invalid curve parameters")
+               return nil, errors.New("gogost/gost3410: invalid curve parameters")
        }
        if e != nil && d != nil {
                c.E = e
                c.D = d
        }
+       if co == nil {
+               c.Co = bigInt1
+       } else {
+               c.Co = co
+       }
        return &c, nil
 }
 
+func (c *Curve) PointSize() int {
+       return PointSize(c.P)
+}
+
 func (c *Curve) pos(v *big.Int) {
        if v.Cmp(zero) < 0 {
                v.Add(v, c.P)
@@ -131,7 +143,7 @@ func (c *Curve) add(p1x, p1y, p2x, p2y *big.Int) {
 
 func (c *Curve) Exp(degree, xS, yS *big.Int) (*big.Int, *big.Int, error) {
        if degree.Cmp(zero) == 0 {
-               return nil, nil, errors.New("Bad degree value")
+               return nil, nil, errors.New("gogost/gost3410: zero degree value")
        }
        dg := big.NewInt(0).Sub(degree, bigInt1)
        tx := big.NewInt(0).Set(xS)