UNPKG

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