void main(){ struct POINT a; a.x = 2; a.y = 3; a = doublePoint(a); printf("x:%d y:%d\n", a.x, a.y); }
ECPoint ECCurve::addPoint(ECPoint &p, ECPoint &q) { BigInteger rx; BigInteger ry; BigInteger px = p.getX(); BigInteger py = p.getY(); BigInteger qx = q.getX(); BigInteger qy = q.getY(); // Px == Qx && Py == Qy if (p == q) { return doublePoint(p); } // Px == Qx && Py != Qy if (px == qx) { return ECPoint(); } if (p.isPointAtInfinity()) { return q; } if (q.isPointAtInfinity()) { return p; } // s = (py - qy)/(px - qx) BigInteger rise = (py - qy) % _p; BigInteger run = (px - qx) % _p; BigInteger s = (run.invm(_p) * rise) % _p; // rx = s^2 - px - qx rx = (s*s - px - qx) % _p; // ry = -py + s(px - rx) ry = (s * (px - rx) - py) % _p; return ECPoint(rx, ry); }