示例#1
0
        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);
        }
示例#2
0
 public Pair(BN128G1 g1, BN128G2 g2)
 {
     this.g1 = g1;
     this.g2 = g2;
 }
示例#3
0
 public void AddPair(BN128G1 g1, BN128G2 g2)
 {
     pairs.Add(Pair.Of(g1, g2));
 }
示例#4
0
 public static Pair Of(BN128G1 g1, BN128G2 g2)
 {
     return(new Pair(g1, g2));
 }