X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=gost3410%2Fcurve.go;h=50d00719df9d2ac22c372efca96dfa9d31a9b081;hb=cd1b35daa4b2db076ed1613fc16b7341ca0f2c52;hp=6cc113548e3d6fff5a0d851408ad4a70dd8f434d;hpb=36499b404629e5bbc4969b2ccdb71eed8bbc64d8;p=gogost.git diff --git a/gost3410/curve.go b/gost3410/curve.go index 6cc1135..50d0071 100644 --- a/gost3410/curve.go +++ b/gost3410/curve.go @@ -63,17 +63,7 @@ func NewCurve(p, q, a, b, x, y, e, d, co *big.Int) (*Curve, error) { X: x, Y: y, } - r1 := big.NewInt(0) - r2 := big.NewInt(0) - r1.Mul(c.Y, c.Y) - r1.Mod(r1, c.P) - r2.Mul(c.X, c.X) - r2.Add(r2, c.A) - r2.Mul(r2, c.X) - r2.Add(r2, c.B) - r2.Mod(r2, c.P) - c.pos(r2) - if r1.Cmp(r2) != 0 { + if !c.Contains(c.X, c.Y) { return nil, errors.New("gogost/gost3410: invalid curve parameters") } if e != nil && d != nil { @@ -88,6 +78,21 @@ func NewCurve(p, q, a, b, x, y, e, d, co *big.Int) (*Curve, error) { return &c, nil } +// Is point on curve? +func (c *Curve) Contains(x, y *big.Int) bool { + r1 := big.NewInt(0) + r2 := big.NewInt(0) + r1.Mul(y, y) + r1.Mod(r1, c.P) + r2.Mul(x, x) + r2.Add(r2, c.A) + r2.Mul(r2, x) + r2.Add(r2, c.B) + r2.Mod(r2, c.P) + c.pos(r2) + return r1.Cmp(r2) == 0 +} + // Get the size of the point's coordinate in bytes. // 32 for 256-bit curves, 64 for 512-bit ones. func (c *Curve) PointSize() int {