jwk-rsa-compute-primes
Version:
Compute p, q, dp, dq, and qi from e, d, and n for private JWKs without these parameters
48 lines • 1.66 kB
JavaScript
;
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var base64url = require("base64url");
var BN = require("bn.js");
var factor_1 = require("./factor");
var one = new BN(1);
function computePrimes(jwk) {
var required = ['e', 'd', 'n'].filter(function (r) { return jwk[r] == null; });
if (required.length > 0) {
throw Error('The following parameters are required: ' + required.join(', '));
}
if (jwk.kty.toUpperCase() !== 'RSA') {
throw Error('kty MUST be RSA!');
}
var d = string2bn(jwk.d);
var e = string2bn(jwk.e);
var n = string2bn(jwk.n);
var _a = factor_1.factor(e, d, n), p = _a.p, q = _a.q;
var dp = d.mod(p.sub(one));
var dq = d.mod(q.sub(one));
var qi = q.invm(p);
return __assign({}, jwk, { p: binaryToBase64Url(p), q: binaryToBase64Url(q), dp: binaryToBase64Url(dp), dq: binaryToBase64Url(dq), qi: binaryToBase64Url(qi) });
}
exports.computePrimes = computePrimes;
function pad(hex) {
return hex.length % 2 === 1 ? '0' + hex : hex;
}
function binaryToBase64Url(bn) {
return base64url(pad(bn.toString('hex')), 'hex');
}
function base64UrlToBinary(str) {
return new BN(base64url.toBuffer(str));
}
function string2bn(str) {
if (/^[0-9]+$/.test(str)) {
return new BN(str, 10);
}
return base64UrlToBinary(str);
}
//# sourceMappingURL=index.js.map