rsaes.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.decrypt = exports.encrypt = void 0;
  4. const crypto_1 = require("crypto");
  5. const check_modulus_length_js_1 = require("./check_modulus_length.js");
  6. const webcrypto_js_1 = require("./webcrypto.js");
  7. const crypto_key_js_1 = require("../lib/crypto_key.js");
  8. const is_key_object_js_1 = require("./is_key_object.js");
  9. const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
  10. const is_key_like_js_1 = require("./is_key_like.js");
  11. const checkKey = (key, alg) => {
  12. if (key.asymmetricKeyType !== 'rsa') {
  13. throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
  14. }
  15. (0, check_modulus_length_js_1.default)(key, alg);
  16. };
  17. const resolvePadding = (alg) => {
  18. switch (alg) {
  19. case 'RSA-OAEP':
  20. case 'RSA-OAEP-256':
  21. case 'RSA-OAEP-384':
  22. case 'RSA-OAEP-512':
  23. return crypto_1.constants.RSA_PKCS1_OAEP_PADDING;
  24. case 'RSA1_5':
  25. return crypto_1.constants.RSA_PKCS1_PADDING;
  26. default:
  27. return undefined;
  28. }
  29. };
  30. const resolveOaepHash = (alg) => {
  31. switch (alg) {
  32. case 'RSA-OAEP':
  33. return 'sha1';
  34. case 'RSA-OAEP-256':
  35. return 'sha256';
  36. case 'RSA-OAEP-384':
  37. return 'sha384';
  38. case 'RSA-OAEP-512':
  39. return 'sha512';
  40. default:
  41. return undefined;
  42. }
  43. };
  44. function ensureKeyObject(key, alg, ...usages) {
  45. if ((0, is_key_object_js_1.default)(key)) {
  46. return key;
  47. }
  48. if ((0, webcrypto_js_1.isCryptoKey)(key)) {
  49. (0, crypto_key_js_1.checkEncCryptoKey)(key, alg, ...usages);
  50. return crypto_1.KeyObject.from(key);
  51. }
  52. throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types));
  53. }
  54. const encrypt = (alg, key, cek) => {
  55. const padding = resolvePadding(alg);
  56. const oaepHash = resolveOaepHash(alg);
  57. const keyObject = ensureKeyObject(key, alg, 'wrapKey', 'encrypt');
  58. checkKey(keyObject, alg);
  59. return (0, crypto_1.publicEncrypt)({ key: keyObject, oaepHash, padding }, cek);
  60. };
  61. exports.encrypt = encrypt;
  62. const decrypt = (alg, key, encryptedKey) => {
  63. const padding = resolvePadding(alg);
  64. const oaepHash = resolveOaepHash(alg);
  65. const keyObject = ensureKeyObject(key, alg, 'unwrapKey', 'decrypt');
  66. checkKey(keyObject, alg);
  67. return (0, crypto_1.privateDecrypt)({ key: keyObject, oaepHash, padding }, encryptedKey);
  68. };
  69. exports.decrypt = decrypt;