/* Multiply P by e in group G1 */ public static ECP G1mul(ECP P, BIG e) { ECP R; if (ROM.USE_GLV) { P.affine(); R = new ECP(); R.copy(P); int i, np, nn; ECP Q = new ECP(); Q.copy(P); BIG q = new BIG(ROM.CURVE_Order); FP cru = new FP(new BIG(ROM.CURVE_Cru)); BIG t = new BIG(0); BIG[] u = glv(e); Q.getx().mul(cru); np = u[0].nbits(); t.copy(BIG.modneg(u[0], q)); nn = t.nbits(); if (nn < np) { u[0].copy(t); R.neg(); } np = u[1].nbits(); t.copy(BIG.modneg(u[1], q)); nn = t.nbits(); if (nn < np) { u[1].copy(t); Q.neg(); } R = R.mul2(u[0], Q, u[1]); } else { R = P.mul(e); } return(R); }
/* Constant time select from pre-computed table */ private void select(ECP[] W, int b) { ECP MP = new ECP(); int m = b >> 31; int babs = (b ^ m) - m; babs = (babs - 1) / 2; cmove(W[0], teq(babs, 0)); // conditional move cmove(W[1], teq(babs, 1)); cmove(W[2], teq(babs, 2)); cmove(W[3], teq(babs, 3)); cmove(W[4], teq(babs, 4)); cmove(W[5], teq(babs, 5)); cmove(W[6], teq(babs, 6)); cmove(W[7], teq(babs, 7)); MP.copy(this); MP.neg(); cmove(MP, (int)(m & 1)); }
/* this-=Q */ public void sub(ECP Q) { Q.neg(); add(Q); Q.neg(); }