UNPKG

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
"use strict"; 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