jwk-rsa-compute-primes
Version:
Compute p, q, dp, dq, and qi from e, d, and n for private JWKs without these parameters
59 lines • 1.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var BN = require("bn.js");
var crypto = require("crypto");
var zero = new BN(0);
var one = new BN(1);
var two = new BN(2);
function rand(low, high) {
var b;
do {
b = new BN(crypto.randomBytes(high.byteLength()));
} while (b.cmp(low) <= 0 || b.cmp(high) >= 0);
return b;
}
function odd(n) {
if (n.cmp(zero) === 0) {
return zero;
}
var r = n;
while (r.isEven()) {
r = r.div(two);
}
return r;
}
function rootOne(x, r, n) {
var i = x.toRed(BN.red(n)).redPow(r).fromRed();
var o = zero;
while (i.cmp(one) !== 0) {
o = i;
i = i.mul(i).mod(n);
}
if (o.cmp(n.sub(one)) === 0) {
return zero;
}
return o;
}
/**
* Calculate primes using e, d, and n.
* @param e
* @param d
* @param n
* @return the two primes used. p will be greater than q.
*/
function factor(e, d, n) {
var k = e.mul(d).sub(one);
var r = odd(k);
var y;
do {
y = rootOne(rand(two, n), r, n);
} while (y.cmp(zero) === 0);
var p = y.sub(one).gcd(n);
var q = n.div(p);
return {
p: p.gt(q) ? p : q,
q: p.gt(q) ? q : p,
};
}
exports.factor = factor;
//# sourceMappingURL=factor.js.map