secp256k1GejAddGeVar static method
Implementation
static void secp256k1GejAddGeVar(
Secp256k1Gej r, Secp256k1Gej a, Secp256k1Ge b, Secp256k1Fe? rzr) {
/// Operations: 8 mul, 3 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases)
Secp256k1Fe z12 = Secp256k1Fe(),
u1 = Secp256k1Fe(),
u2 = Secp256k1Fe(),
s1 = Secp256k1Fe(),
s2 = Secp256k1Fe(),
h = Secp256k1Fe(),
i = Secp256k1Fe(),
h2 = Secp256k1Fe(),
h3 = Secp256k1Fe(),
t = Secp256k1Fe();
if (a.infinity.toBool) {
(rzr == null);
secp256k1GejSetGe(r, b);
return;
}
if (b.infinity.toBool) {
if (rzr != null) {
secp256k1FeSetInt(rzr, 1);
}
r.set(a);
return;
}
secp256k1FeSqr(z12, a.z);
u1 = a.x.clone();
secp256k1FeMul(u2, b.x, z12);
s1 = a.y.clone();
secp256k1FeMul(s2, b.y, z12);
secp256k1FeMul(s2, s2, a.z);
secp256k1FeNegate(h, u1, Secp256k1Const.secp256k1GejXMagnitudeMax);
secp256k1FeAdd(h, u2);
secp256k1FeNegate(i, s2, 1);
secp256k1FeAdd(i, s1);
if (secp256k1FeNormalizesToZeroVar(h).toBool) {
if (secp256k1FeNormalizesToZeroVar(i).toBool) {
secp256k1GejDoubleVar(r, a, rzr);
} else {
if (rzr != null) {
secp256k1FeSetInt(rzr, 0);
}
secp256k1GejSetInfinity(r);
}
return;
}
r.infinity = 0;
if (rzr != null) {
rzr.set(h);
}
secp256k1FeMul(r.z, a.z, h);
secp256k1FeSqr(h2, h);
secp256k1FeNegate(h2, h2, 1);
secp256k1FeMul(h3, h2, h);
secp256k1FeMul(t, u1, h2);
secp256k1FeSqr(r.x, i);
secp256k1FeAdd(r.x, h3);
secp256k1FeAdd(r.x, t);
secp256k1FeAdd(r.x, t);
secp256k1FeAdd(t, r.x);
secp256k1FeMul(r.y, t, i);
secp256k1FeMul(h3, h3, s1);
secp256k1FeAdd(r.y, h3);
}