/* Create random BIG in portable way, one bit at a time */ public static BIG randomnum(BIG q, RAND rng) { DBIG d = new DBIG(0); int i, b, j = 0, r = 0; for (i = 0; i < 2 * ROM.MODBITS; i++) { if (j == 0) { r = rng.Byte; } else { r >>= 1; } b = r & 1; d.shl(1); d.w[0] += b; // m.inc(b); j++; j &= 7; } BIG m = d.mod(q); return(m); }
/* return a^2 mod m */ public static BIG modsqr(BIG a, BIG m) { a.mod(m); DBIG d = sqr(a); return(d.mod(m)); }
/* this*=c mod Modulus, where c is a small int */ public void imul(int c) { norm(); bool s = false; if (c < 0) { c = -c; s = true; } long afx = (BIG.EXCESS(x) + 1) * (c + 1) + 1; if (c < ROM.NEXCESS && afx < ROM.FEXCESS) { x.imul(c); } else { if (afx < ROM.FEXCESS) { x.pmul(c); } else { DBIG d = x.pxmul(c); x.copy(d.mod(p)); } } if (s) { neg(); } norm(); }
/* return a*b mod m */ public static BIG modmul(BIG a, BIG b, BIG m) { a.mod(m); b.mod(m); DBIG d = mul(a, b); return(d.mod(m)); }
/* convert to Montgomery n-residue form */ public void nres() { if (ROM.MODTYPE != ROM.PSEUDO_MERSENNE) { DBIG d = new DBIG(x); d.shl(ROM.NLEN * ROM.BASEBITS); x.copy(d.mod(p)); } }