public static void secp256k1_gej_add_ge_var(GeJ r, GeJ a, Ge b, Fe rzr) { if (a.Infinity) { Group.secp256k1_gej_set_ge(r, b); } else if (b.Infinity) { if (rzr != null) { Field.SetInt(rzr, 1U); } r = a.Clone(); } else { r.Infinity = false; Fe fe1 = new Fe(); Field.Sqr(fe1, a.Z); Fe fe2 = a.X.Clone(); Field.NormalizeWeak(fe2); Fe fe3 = new Fe(); Field.Mul(fe3, b.X, fe1); Fe fe4 = a.Y.Clone(); Field.NormalizeWeak(fe4); Fe fe5 = new Fe(); Field.Mul(fe5, b.Y, fe1); Field.Mul(fe5, fe5, a.Z); Fe fe6 = new Fe(); Field.Negate(fe6, fe2, 1U); Field.Add(fe6, fe3); Fe fe7 = new Fe(); Field.Negate(fe7, fe4, 1U); Field.Add(fe7, fe5); if (Field.NormalizesToZeroVar(fe6)) { if (Field.NormalizesToZeroVar(fe7)) { Group.secp256k1_gej_double_var(r, a, rzr); } else { if (rzr != null) { Field.SetInt(rzr, 0U); } r.Infinity = true; } } else { Fe fe8 = new Fe(); Field.Sqr(fe8, fe7); Fe fe9 = new Fe(); Field.Sqr(fe9, fe6); Fe fe10 = new Fe(); Field.Mul(fe10, fe6, fe9); if (rzr != null) { rzr = fe6.Clone(); } Field.Mul(r.Z, a.Z, fe6); Fe fe11 = new Fe(); Field.Mul(fe11, fe2, fe9); r.X = fe11.Clone(); Field.MulInt(r.X, 2U); Field.Add(r.X, fe10); Field.Negate(r.X, r.X, 3U); Field.Add(r.X, fe8); Field.Negate(r.Y, r.X, 5U); Field.Add(r.Y, fe11); Field.Mul(r.Y, r.Y, fe7); Field.Mul(fe10, fe10, fe4); Field.Negate(fe10, fe10, 1U); Field.Add(r.Y, fe10); } } }