/* 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); }
public FP4 ComPow(BIG e, BIG r) { FP12 g1 = new FP12(0); FP12 g2 = new FP12(0); FP2 f = new FP2(new BIG(ROM.Fra), new BIG(ROM.Frb)); BIG q = new BIG(ROM.Modulus); BIG m = new BIG(q); m.Mod(r); BIG a = new BIG(e); a.Mod(m); BIG b = new BIG(e); b.Div(m); g1.Copy(this); g2.Copy(this); FP4 c = g1.Trace(); if (b.IsZilch()) { c = c.Xtr_Pow(e); return(c); } g2.Frob(f); FP4 cp = g2.Trace(); g1.Conj(); g2.mul(g1); FP4 cpm1 = g2.Trace(); g2.mul(g1); FP4 cpm2 = g2.Trace(); c = c.Xtr_Pow2(cp, cpm1, cpm2, a, b); return(c); }