add method

ECPointFp add(
  1. ECPointFp b
)

Implementation

ECPointFp add(ECPointFp b) {
  if (isInfinity()) return b;
  if (b.isInfinity()) return this;
  final x1 = x!.toBigInteger();
  final y1 = y!.toBigInteger();
  final z1 = z;
  final x2 = b.x!.toBigInteger();
  final y2 = b.y!.toBigInteger();
  final z2 = b.z;
  final q = curve.q;
  final w1 = (x1 * z2) % q;
  final w2 = (x2 * z1) % q;
  final w3 = (w1 - w2) % q;
  final w4 = (y1 * z2) % q;
  final w5 = (y2 * z1) % q;
  final w6 = (w4 - w5) % q;

  if (w3 == BigInt.zero) {
    if (w6 == BigInt.zero) {
      return twice();
    }
    return curve.infinity;
  }

  final w7 = (w1 + w2) % q;
  final w8 = (z1 * z2) % q;
  final w9 = (w3 * w3) % q;
  final w10 = (w3 * w9) % q;
  final w11 = (w8 * (w6 * w6) % q - w7 * w9) % q;

  final x3 = (w3 * w11) % q;
  final y3 = (w6 * (w9 * w1 % q - w11) - w4 * w10) % q;
  final z3 = (w10 * w8) % q;

  return ECPointFp(curve, curve.fromBigInteger(x3), curve.fromBigInteger(y3), z3);
}