private static Fp12 MillerLoop(BN128G1 g1, BN128G2 g2) { // convert to affine coordinates g1 = g1.ToAffineBN128G1(); g2 = g2.ToAffineBN128G2(); // calculate Ell coefficients List <EllCoeffs> coeffs = CalcEllCoeffs(g2); Fp12 f = Fp12._1; int idx = 0; EllCoeffs c; // for each bit except most significant one for (int i = LOOP_COUNT.BitLength - 2; i >= 0; i--) { c = coeffs[idx++]; f = f.Squared(); f = f.MulBy024(c.ell0, g1.y.Mul(c.ellVW), g1.x.Mul(c.ellVV)); if (LOOP_COUNT.TestBit(i)) { c = coeffs[idx++]; f = f.MulBy024(c.ell0, g1.y.Mul(c.ellVW), g1.x.Mul(c.ellVV)); } } c = coeffs[idx++]; f = f.MulBy024(c.ell0, g1.y.Mul(c.ellVW), g1.x.Mul(c.ellVV)); c = coeffs[idx]; f = f.MulBy024(c.ell0, g1.y.Mul(c.ellVW), g1.x.Mul(c.ellVV)); return(f); }
public Pair(BN128G1 g1, BN128G2 g2) { this.g1 = g1; this.g2 = g2; }
public void AddPair(BN128G1 g1, BN128G2 g2) { pairs.Add(Pair.Of(g1, g2)); }
public static Pair Of(BN128G1 g1, BN128G2 g2) { return(new Pair(g1, g2)); }