/* 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; }
/* 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); }
/* 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; } }
/* 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); }
/* 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; }