Пример #1
0
        /* r=x^n using XTR method on traces of FP12s */
        public FP4 Xtr_Pow(BIG n)
        {
            FP4 a = new FP4(3);
            FP4 b = new FP4(this);
            FP4 c = new FP4(b);

            c.Xtr_D();
            FP4 t = new FP4(0);
            FP4 r = new FP4(0);

            n.Norm();
            int par = n.Parity();
            BIG v   = new BIG(n);

            v.FShr(1);
            if (par == 0)
            {
                v.Dec(1);
                v.Norm();
            }

            int nb = v.NBits();

            for (int i = nb - 1; i >= 0; i--)
            {
                if (v.Bit(i) != 1)
                {
                    t.Copy(b);
                    Conj();
                    c.Conj();
                    b.Xtr_A(a, this, c);
                    Conj();
                    c.Copy(t);
                    c.Xtr_D();
                    a.Xtr_D();
                }
                else
                {
                    t.Copy(a);
                    t.Conj();
                    a.Copy(b);
                    a.Xtr_D();
                    b.Xtr_A(c, this, t);
                    c.Xtr_D();
                }
            }
            if (par == 0)
            {
                r.Copy(c);
            }
            else
            {
                r.Copy(b);
            }
            r.Reduce();
            return(r);
        }
Пример #2
0
        /* this=this^e */
        /* Note this is simple square and multiply, so not side-channel safe */
        public FP12 Pow(BIG e)
        {
            Norm();
            e.Norm();
            BIG e3 = new BIG(e);

            e3.PMul(3);
            e3.Norm();

            FP12 w = new FP12(this);

            int nb = e3.NBits();

            for (int i = nb - 2; i >= 1; i--)
            {
                w.USqr();
                int bt = e3.Bit(i) - e.Bit(i);
                if (bt == 1)
                {
                    w.mul(this);
                }
                if (bt == -1)
                {
                    Conj();
                    w.mul(this);
                    Conj();
                }
            }
            w.Reduce();
            return(w);


            /*
             *              BIG z=new BIG(e);
             *              FP12 r=new FP12(1);
             *
             *              while (true)
             *              {
             *                      int bt=z.parity();
             *                      z.fshr(1);
             *                      if (bt==1) r.mul(w);
             *                      if (z.iszilch()) break;
             *                      w.usqr();
             *              }
             *              r.reduce();
             *              return r; */
        }
Пример #3
0
        /* Optimal R-ate double pairing e(P,Q).e(R,S) */
        public static FP12 Ate2(ECP2 P1, ECP Q1, ECP2 R1, ECP S1)
        {
            FP2  f;
            BIG  x = new BIG(ROM.CURVE_Bnx);
            BIG  n = new BIG(x);
            ECP2 K = new ECP2();
            FP12 lv;
            int  bt;

            ECP2 P = new ECP2(P1);
            ECP  Q = new ECP(Q1);

            P.Affine();
            Q.Affine();

            ECP2 R = new ECP2(R1);
            ECP  S = new ECP(S1);

            R.Affine();
            S.Affine();

            if (ECP.CURVE_PAIRING_TYPE == ECP.BN)
            {
                f = new FP2(new BIG(ROM.Fra), new BIG(ROM.Frb));
                if (ECP.SEXTIC_TWIST == ECP.M_TYPE)
                {
                    f.Inverse();
                    f.Norm();
                }

                n.PMul(6);
                if (ECP.SIGN_OF_X == ECP.POSITIVEX)
                {
                    n.Inc(2);
                }
                else
                {
                    n.Dec(2);
                }
            }
            else
            {
                n.Copy(x);
            }

            n.Norm();

            BIG n3 = new BIG(n);

            n3.PMul(3);
            n3.Norm();

            FP Qx = new FP(Q.GetX());
            FP Qy = new FP(Q.GetY());
            FP Sx = new FP(S.GetX());
            FP Sy = new FP(S.GetY());

            ECP2 A = new ECP2();
            ECP2 B = new ECP2();
            FP12 r = new FP12(1);

            A.Copy(P);
            B.Copy(R);

            ECP2 MP = new ECP2();

            MP.Copy(P);
            MP.Neg();
            ECP2 MR = new ECP2();

            MR.Copy(R);
            MR.Neg();


            int nb = n3.NBits();

            for (int i = nb - 2; i >= 1; i--)
            {
                r.Sqr();
                lv = Line(A, A, Qx, Qy);
                r.SMul(lv, ECP.SEXTIC_TWIST);

                lv = Line(B, B, Sx, Sy);
                r.SMul(lv, ECP.SEXTIC_TWIST);

                bt = n3.Bit(i) - n.Bit(i); // bt=n.bit(i);
                if (bt == 1)
                {
                    lv = Line(A, P, Qx, Qy);
                    r.SMul(lv, ECP.SEXTIC_TWIST);
                    lv = Line(B, R, Sx, Sy);
                    r.SMul(lv, ECP.SEXTIC_TWIST);
                }

                if (bt == -1)
                {
                    //P.neg();
                    lv = Line(A, MP, Qx, Qy);
                    r.SMul(lv, ECP.SEXTIC_TWIST);
                    //P.neg();
                    //R.neg();
                    lv = Line(B, MR, Sx, Sy);
                    r.SMul(lv, ECP.SEXTIC_TWIST);
                    //R.neg();
                }
            }

            if (ECP.SIGN_OF_X == ECP.NEGATIVEX)
            {
                r.Conj();
            }

            /* R-ate fixup required for BN curves */
            if (ECP.CURVE_PAIRING_TYPE == ECP.BN)
            {
                if (ECP.SIGN_OF_X == ECP.NEGATIVEX)
                {
                    //	r.conj();
                    A.Neg();
                    B.Neg();
                }

                K.Copy(P);
                K.Frob(f);

                lv = Line(A, K, Qx, Qy);
                r.SMul(lv, ECP.SEXTIC_TWIST);
                K.Frob(f);
                K.Neg();
                lv = Line(A, K, Qx, Qy);
                r.SMul(lv, ECP.SEXTIC_TWIST);
                K.Copy(R);
                K.Frob(f);
                lv = Line(B, K, Sx, Sy);
                r.SMul(lv, ECP.SEXTIC_TWIST);
                K.Frob(f);
                K.Neg();
                lv = Line(B, K, Sx, Sy);
                r.SMul(lv, ECP.SEXTIC_TWIST);
            }

            return(r);
        }