]> Cypherpunks.ru repositories - gogost.git/blobdiff - src/cypherpunks.ru/gogost/gost3410/curve.go
Forbid any later GNU GPL versions autousage
[gogost.git] / src / cypherpunks.ru / gogost / gost3410 / curve.go
index d253d8eea61adea237e7f7dfb63ad249cdd80c4b..47f964b583a66bf9b735b73c671b0ca0e97873e3 100644 (file)
@@ -1,10 +1,9 @@
 // GoGOST -- Pure Go GOST cryptographic functions library
-// Copyright (C) 2015-2017 Sergey Matveev <stargrave@stargrave.org>
+// Copyright (C) 2015-2019 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
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
+// the Free Software Foundation, version 3 of the License.
 //
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,48 +28,63 @@ var (
 )
 
 type Curve struct {
-       P *big.Int
-       Q *big.Int
+       Name string // Just simple identifier
+
+       P *big.Int // Characteristic of the underlying prime field
+       Q *big.Int // Elliptic curve subgroup order
+
+       // Equation coefficients of the elliptic curve in canonical form
        A *big.Int
        B *big.Int
 
+       // Equation coefficients of the elliptic curve in twisted Edwards form
+       E *big.Int
+       D *big.Int
+
        // Basic point X and Y coordinates
-       Bx *big.Int
-       By *big.Int
+       X *big.Int
+       Y *big.Int
 
        // Temporary variable for the add method
        t  *big.Int
        tx *big.Int
        ty *big.Int
+
+       // Cached s/t parameters for Edwards curve points conversion
+       edS *big.Int
+       edT *big.Int
 }
 
-func NewCurve(p, q, a, b, bx, by []byte) (*Curve, error) {
+func NewCurve(p, q, a, b, x, y, e, d *big.Int) (*Curve, error) {
        c := Curve{
-               P:  bytes2big(p[:]),
-               Q:  bytes2big(q[:]),
-               A:  bytes2big(a[:]),
-               B:  bytes2big(b[:]),
-               Bx: bytes2big(bx[:]),
-               By: bytes2big(by[:]),
-               t:  big.NewInt(0),
-               tx: big.NewInt(0),
-               ty: big.NewInt(0),
+               Name: "unknown",
+               P:    p,
+               Q:    q,
+               A:    a,
+               B:    b,
+               X:    x,
+               Y:    y,
+               t:    big.NewInt(0),
+               tx:   big.NewInt(0),
+               ty:   big.NewInt(0),
        }
        r1 := big.NewInt(0)
        r2 := big.NewInt(0)
-       r1.Mul(c.By, c.By)
+       r1.Mul(c.Y, c.Y)
        r1.Mod(r1, c.P)
-       r2.Mul(c.Bx, c.Bx)
+       r2.Mul(c.X, c.X)
        r2.Add(r2, c.A)
-       r2.Mul(r2, c.Bx)
+       r2.Mul(r2, c.X)
        r2.Add(r2, c.B)
        r2.Mod(r2, c.P)
-       if r2.Cmp(big.NewInt(0)) == -1 {
-               r2.Add(r2, c.P)
-       }
+       c.pos(r2)
        if r1.Cmp(r2) != 0 {
                return nil, errors.New("Invalid curve parameters")
        }
+       if e != nil && d != nil {
+               c.E = e
+               c.D = d
+       }
        return &c, nil
 }