rsaes.js 2.1 KB

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