- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
void EllipticPoint::Add(const EllipticPoint &b, const EllipticCoord &a, const EllipticCoord &p, EllipticPoint &res) {
if (!x.IsNotZero() && !y.IsNotZero()) {
res = b;
} else if (!b.x.IsNotZero() && !b.y.IsNotZero()) {
res = *this;
} else if (x.Compare(b.x)!=0) {
EllipticCoord tmp1, tmp2, lambda;
b.x.Sub(x,p,tmp1); tmp1.Invert(p,tmp2);
b.y.Sub(y,p,tmp1); tmp1.Mul(tmp2,p,lambda);
lambda.Mul(lambda,p,tmp1);
tmp1.Sub(x,p,tmp2); tmp2.Sub(b.x,p,res.x);
x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp2); tmp2.Sub(y,p,res.y);
} else if (y.Compare(b.y)==0) {
EllipticCoord tmp1, tmp2, tmp3, lambda;
x.Mul(x,p,tmp1); tmp1.Add(tmp1,p,tmp3); tmp1.Add(tmp3,p,tmp2); tmp2.Add(a,p,tmp1);
y.Add(y,p,tmp2); tmp2.Invert(p,tmp3); tmp1.Mul(tmp3,p,lambda);
lambda.Mul(lambda,p,tmp1); tmp1.Sub(x,p,tmp2); tmp2.Sub(x,p,res.x);
x.Sub(res.x,p,tmp1); lambda.Mul(tmp1,p,tmp3); tmp3.Sub(y,p,res.y);
} else {
res.x.SetZero();
res.y.SetZero();
}
}
Из моего велосипеда четырехлетней давности.
Кусочек реализации ГОСТ Р 34.10-2001.