1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2016 Sergey Matveev <stargrave@stargrave.org>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
25 zero *big.Int = big.NewInt(0)
26 bigInt1 *big.Int = big.NewInt(1)
27 bigInt2 *big.Int = big.NewInt(2)
28 bigInt3 *big.Int = big.NewInt(3)
37 // Basic point X and Y coordinates
41 // Temporary variable for the add method
47 func NewCurve(p, q, a, b, bx, by []byte) (*Curve, error) {
68 if r2.Cmp(big.NewInt(0)) == -1 {
72 return nil, errors.New("Invalid curve parameters")
77 func (c *Curve) pos(v *big.Int) {
83 func (c *Curve) add(p1x, p1y, p2x, p2y *big.Int) {
84 if p1x.Cmp(p2x) == 0 && p1y.Cmp(p2y) == 0 {
89 c.tx.Mul(bigInt2, p1y)
90 c.tx.ModInverse(c.tx, c.P)
100 c.t.ModInverse(c.tx, c.P)
118 func (c *Curve) Exp(degree, xS, yS *big.Int) (*big.Int, *big.Int, error) {
119 dg := big.NewInt(0).Sub(degree, bigInt1)
120 tx := big.NewInt(0).Set(xS)
121 ty := big.NewInt(0).Set(yS)
122 cx := big.NewInt(0).Set(xS)
123 cy := big.NewInt(0).Set(yS)
124 if dg.Cmp(zero) == 0 {
125 return nil, nil, errors.New("Bad degree value")
127 for dg.Cmp(zero) != 0 {
129 c.add(tx, ty, cx, cy)
132 c.add(cx, cy, cx, cy)