X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost3410%2Fcurve.go;h=9ec14ded1de85e6760d63f3f7cfb9f7b965eaeab;hb=6d9056bfe4a2d69469a1e70f3bf08f89b377b06e;hp=47f964b583a66bf9b735b73c671b0ca0e97873e3;hpb=c07494bbd559b9d00f391e28cfd070e18afe9900;p=gogost.git diff --git a/gost3410/curve.go b/gost3410/curve.go index 47f964b..9ec14de 100644 --- a/gost3410/curve.go +++ b/gost3410/curve.go @@ -1,5 +1,5 @@ // GoGOST -- Pure Go GOST cryptographic functions library -// Copyright (C) 2015-2019 Sergey Matveev +// Copyright (C) 2015-2021 Sergey Matveev // // 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)