Пример #1
0
        /* this*=b mod Modulus */
        public void Mul(FP b)
        {
            if ((long)XES * b.XES > (long)FEXCESS)
            {
                Reduce();
            }

            DBIG d = BIG.Mul(x, b.x);

            x.Copy(Mod(d));
            XES = 2;
        }
Пример #2
0
        /* Galbraith & Scott Method */
        public static BIG[] GS(BIG e)
        {
            BIG[] u = new BIG[4];
            if (ECP.CURVE_PAIRING_TYPE == ECP.BN)
            {
                int   i, j;
                BIG   t = new BIG(0);
                BIG   q = new BIG(ROM.CURVE_Order);
                BIG[] v = new BIG[4];
                for (i = 0; i < 4; i++)
                {
                    t.Copy(new BIG(ROM.CURVE_WB[i]));
                    DBIG d = BIG.Mul(t, e);
                    v[i] = new BIG(d.Div(q));
                    u[i] = new BIG(0);
                }

                u[0].Copy(e);
                for (i = 0; i < 4; i++)
                {
                    for (j = 0; j < 4; j++)
                    {
                        t.Copy(new BIG(ROM.CURVE_BB[j][i]));
                        t.Copy(BIG.ModMul(v[j], t, q));
                        u[i].Add(q);
                        u[i].Sub(t);
                        u[i].Mod(q);
                    }
                }
            }
            else
            {
                BIG q = new BIG(ROM.CURVE_Order);
                BIG x = new BIG(ROM.CURVE_Bnx);
                BIG w = new BIG(e);
                for (int i = 0; i < 3; i++)
                {
                    u[i] = new BIG(w);
                    u[i].Mod(x);
                    w.Div(x);
                }

                u[3] = new BIG(w);
                if (ECP.SIGN_OF_X == ECP.NEGATIVEX)
                {
                    u[1].Copy(BIG.ModNeg(u[1], q));
                    u[3].Copy(BIG.ModNeg(u[3], q));
                }
            }

            return(u);
        }
Пример #3
0
 /* convert to Montgomery n-residue form */
 public void NRes()
 {
     if (MODTYPE != PSEUDO_MERSENNE && MODTYPE != GENERALISED_MERSENNE)
     {
         DBIG d = BIG.Mul(x, new BIG(ROM.R2modp));                //** Change **
         x.Copy(Mod(d));
         XES = 2;
     }
     else
     {
         XES = 1;
     }
 }
Пример #4
0
        /* GLV method */
        public static BIG[] Glv(BIG e)
        {
            BIG[] u = new BIG[2];
            if (ECP.CURVE_PAIRING_TYPE == ECP.BN)
            {
                int i, j;
                BIG t = new BIG(0);
                BIG q = new BIG(ROM.CURVE_Order);

                BIG[] v = new BIG[2];
                for (i = 0; i < 2; i++)
                {
                    t.Copy(new BIG(ROM.CURVE_W[i])); // why not just t=new BIG(ROM.CURVE_W[i]);
                    DBIG d = BIG.Mul(t, e);
                    v[i] = new BIG(d.Div(q));
                    u[i] = new BIG(0);
                }

                u[0].Copy(e);
                for (i = 0; i < 2; i++)
                {
                    for (j = 0; j < 2; j++)
                    {
                        t.Copy(new BIG(ROM.CURVE_SB[j][i]));
                        t.Copy(BIG.ModMul(v[j], t, q));
                        u[i].Add(q);
                        u[i].Sub(t);
                        u[i].Mod(q);
                    }
                }
            }
            else
            {
                // -(x^2).P = (Beta.x,y)
                BIG q  = new BIG(ROM.CURVE_Order);
                BIG x  = new BIG(ROM.CURVE_Bnx);
                BIG x2 = BIG.SMul(x, x);
                u[0] = new BIG(e);
                u[0].Mod(x2);
                u[1] = new BIG(e);
                u[1].Div(x2);
                u[1].RSub(q);
            }

            return(u);
        }
Пример #5
0
        /* this*=y */
        /* Now uses Lazy reduction */
        public void Mul(FP2 y)
        {
            if ((long)(a.XES + b.XES) * (y.a.XES + y.b.XES) > (long)FP.FEXCESS)
            {
                if (a.XES > 1)
                {
                    a.Reduce();
                }
                if (b.XES > 1)
                {
                    b.Reduce();
                }
            }

            DBIG pR = new DBIG(0);
            BIG  C  = new BIG(a.x);
            BIG  D  = new BIG(y.a.x);

            pR.UCopy(new BIG(ROM.Modulus));

            DBIG A = BIG.Mul(a.x, y.a.x);
            DBIG B = BIG.Mul(b.x, y.b.x);

            C.Add(b.x);
            C.Norm();
            D.Add(y.b.x);
            D.Norm();

            DBIG E = BIG.Mul(C, D);
            DBIG F = new DBIG(A);

            F.Add(B);
            B.RSub(pR);

            A.Add(B);
            A.Norm();
            E.Sub(F);
            E.Norm();

            a.x.Copy(FP.Mod(A));
            a.XES = 3;
            b.x.Copy(FP.Mod(E));
            b.XES = 2;
        }