secp256k1GejAddGe static method

void secp256k1GejAddGe(
  1. Secp256k1Gej r,
  2. Secp256k1Gej a,
  3. Secp256k1Ge b
)

Implementation

static void secp256k1GejAddGe(Secp256k1Gej r, Secp256k1Gej a, Secp256k1Ge b) {
  /// Operations: 7 mul, 5 sqr, 21 add/cmov/half/mul_int/negate/normalizes_to_zero
  Secp256k1Fe zz = Secp256k1Fe(),
      u1 = Secp256k1Fe(),
      u2 = Secp256k1Fe(),
      s1 = Secp256k1Fe(),
      s2 = Secp256k1Fe(),
      t = Secp256k1Fe(),
      tt = Secp256k1Fe(),
      m = Secp256k1Fe(),
      n = Secp256k1Fe(),
      q = Secp256k1Fe(),
      rr = Secp256k1Fe();
  Secp256k1Fe mAlt = Secp256k1Fe(), rrAlt = Secp256k1Fe();
  int degenerate;
  _cond(b.infinity == 0, "secp256k1GejAddGe");

  secp256k1FeSqr(zz, a.z);
  u1 = a.x.clone();
  secp256k1FeMul(u2, b.x, zz);
  s1 = a.y.clone();
  secp256k1FeMul(s2, b.y, zz);
  secp256k1FeMul(s2, s2, a.z);
  t = u1.clone();
  secp256k1FeAdd(t, u2);
  m = s1.clone();
  secp256k1FeAdd(m, s2);
  secp256k1FeSqr(rr, t);
  secp256k1FeNegate(mAlt, u2, 1);
  secp256k1FeMul(tt, u1, mAlt);
  secp256k1FeAdd(rr, tt);

  degenerate = secp256k1FeNormalizesToZero(m);

  rrAlt = s1.clone();
  secp256k1FeMulInt(rrAlt, 2);
  secp256k1FeAdd(mAlt, u1);

  secp256k1FeCmov(rrAlt, rr, (!degenerate.toBool).toInt);
  secp256k1FeCmov(mAlt, m, (!degenerate.toBool).toInt);

  secp256k1FeSqr(n, mAlt);
  secp256k1FeNegate(q, t, Secp256k1Const.secp256k1GejXMagnitudeMax + 1);
  secp256k1FeMul(q, q, n);

  secp256k1FeSqr(n, n);
  secp256k1FeCmov(n, m, degenerate);
  secp256k1FeSqr(t, rrAlt);
  secp256k1FeMul(r.z, a.z, mAlt);
  secp256k1FeAdd(t, q);
  r.x = t.clone();
  secp256k1FeMulInt(t, 2);
  secp256k1FeAdd(t, q);
  secp256k1FeMul(t, t, rrAlt);
  secp256k1FeAdd(t, n);
  secp256k1FeNegate(r.y, t, Secp256k1Const.secp256k1GejYMagnitudeMax + 2);
  secp256k1FeHalf(r.y);

  /// In case a.infinity == 1, replace r with (b.x, b.y, 1).
  secp256k1FeCmov(r.x, b.x, a.infinity);
  secp256k1FeCmov(r.y, b.y, a.infinity);
  secp256k1FeCmov(r.z, Secp256k1Const.secp256k1FeOne, a.infinity);
  r.infinity = secp256k1FeNormalizesToZero(r.z);
}