generate.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.generateKeyPair = exports.generateSecret = void 0;
  4. const crypto_1 = require("crypto");
  5. const util_1 = require("util");
  6. const random_js_1 = require("./random.js");
  7. const check_modulus_length_js_1 = require("./check_modulus_length.js");
  8. const errors_js_1 = require("../util/errors.js");
  9. const generate = (0, util_1.promisify)(crypto_1.generateKeyPair);
  10. async function generateSecret(alg, options) {
  11. let length;
  12. switch (alg) {
  13. case 'HS256':
  14. case 'HS384':
  15. case 'HS512':
  16. case 'A128CBC-HS256':
  17. case 'A192CBC-HS384':
  18. case 'A256CBC-HS512':
  19. length = parseInt(alg.slice(-3), 10);
  20. break;
  21. case 'A128KW':
  22. case 'A192KW':
  23. case 'A256KW':
  24. case 'A128GCMKW':
  25. case 'A192GCMKW':
  26. case 'A256GCMKW':
  27. case 'A128GCM':
  28. case 'A192GCM':
  29. case 'A256GCM':
  30. length = parseInt(alg.slice(1, 4), 10);
  31. break;
  32. default:
  33. throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
  34. }
  35. return (0, crypto_1.createSecretKey)((0, random_js_1.default)(new Uint8Array(length >> 3)));
  36. }
  37. exports.generateSecret = generateSecret;
  38. async function generateKeyPair(alg, options) {
  39. var _a, _b;
  40. switch (alg) {
  41. case 'RS256':
  42. case 'RS384':
  43. case 'RS512':
  44. case 'PS256':
  45. case 'PS384':
  46. case 'PS512':
  47. case 'RSA-OAEP':
  48. case 'RSA-OAEP-256':
  49. case 'RSA-OAEP-384':
  50. case 'RSA-OAEP-512':
  51. case 'RSA1_5': {
  52. const modulusLength = (_a = options === null || options === void 0 ? void 0 : options.modulusLength) !== null && _a !== void 0 ? _a : 2048;
  53. if (typeof modulusLength !== 'number' || modulusLength < 2048) {
  54. throw new errors_js_1.JOSENotSupported('Invalid or unsupported modulusLength option provided, 2048 bits or larger keys must be used');
  55. }
  56. const keypair = await generate('rsa', {
  57. modulusLength,
  58. publicExponent: 0x10001,
  59. });
  60. (0, check_modulus_length_js_1.setModulusLength)(keypair.privateKey, modulusLength);
  61. (0, check_modulus_length_js_1.setModulusLength)(keypair.publicKey, modulusLength);
  62. return keypair;
  63. }
  64. case 'ES256':
  65. return generate('ec', { namedCurve: 'P-256' });
  66. case 'ES256K':
  67. return generate('ec', { namedCurve: 'secp256k1' });
  68. case 'ES384':
  69. return generate('ec', { namedCurve: 'P-384' });
  70. case 'ES512':
  71. return generate('ec', { namedCurve: 'P-521' });
  72. case 'EdDSA': {
  73. switch (options === null || options === void 0 ? void 0 : options.crv) {
  74. case undefined:
  75. case 'Ed25519':
  76. return generate('ed25519');
  77. case 'Ed448':
  78. return generate('ed448');
  79. default:
  80. throw new errors_js_1.JOSENotSupported('Invalid or unsupported crv option provided, supported values are Ed25519 and Ed448');
  81. }
  82. }
  83. case 'ECDH-ES':
  84. case 'ECDH-ES+A128KW':
  85. case 'ECDH-ES+A192KW':
  86. case 'ECDH-ES+A256KW':
  87. const crv = (_b = options === null || options === void 0 ? void 0 : options.crv) !== null && _b !== void 0 ? _b : 'P-256';
  88. switch (crv) {
  89. case undefined:
  90. case 'P-256':
  91. case 'P-384':
  92. case 'P-521':
  93. return generate('ec', { namedCurve: crv });
  94. case 'X25519':
  95. return generate('x25519');
  96. case 'X448':
  97. return generate('x448');
  98. default:
  99. throw new errors_js_1.JOSENotSupported('Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, X25519, and X448');
  100. }
  101. default:
  102. throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
  103. }
  104. }
  105. exports.generateKeyPair = generateKeyPair;