/* 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 * q.NBits(); 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 a1, BIG m) { BIG a = new BIG(a1); a.Mod(m); DBIG d = Sqr(a); return(d.Mod(m)); }
/* return a*b mod m */ public static BIG ModMul(BIG a1, BIG b1, BIG m) { BIG a = new BIG(a1); BIG b = new BIG(b1); a.Mod(m); b.Mod(m); DBIG d = Mul(a, b); return(d.Mod(m)); }