in src/rsa.js [167:240]
KEY_PAIR: function(rng, e, PRIV, PUB) { /* IEEE1363 A16.11/A16.12 more or less */
var n = PUB.n.length >> 1,
t = new ctx.FF(n),
p1 = new ctx.FF(n),
q1 = new ctx.FF(n);
for (;;) {
PRIV.p.random(rng);
while (PRIV.p.lastbits(2) != 3) {
PRIV.p.inc(1);
}
while (!ctx.FF.prime(PRIV.p, rng)) {
PRIV.p.inc(4);
}
p1.copy(PRIV.p);
p1.dec(1);
if (p1.cfactor(e)) {
continue;
}
break;
}
for (;;) {
PRIV.q.random(rng);
while (PRIV.q.lastbits(2) != 3) {
PRIV.q.inc(1);
}
while (!ctx.FF.prime(PRIV.q, rng)) {
PRIV.q.inc(4);
}
q1.copy(PRIV.q);
q1.dec(1);
if (q1.cfactor(e)) {
continue;
}
break;
}
PUB.n = ctx.FF.mul(PRIV.p, PRIV.q);
PUB.e = e;
t.copy(p1);
t.shr();
PRIV.dp.set(e);
PRIV.dp.invmodp(t);
if (PRIV.dp.parity() === 0) {
PRIV.dp.add(t);
}
PRIV.dp.norm();
t.copy(q1);
t.shr();
PRIV.dq.set(e);
PRIV.dq.invmodp(t);
if (PRIV.dq.parity() === 0) {
PRIV.dq.add(t);
}
PRIV.dq.norm();
PRIV.c.copy(PRIV.p);
PRIV.c.invmodp(PRIV.q);
return;
},