asn1.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { createPrivateKey, createPublicKey, KeyObject } from 'crypto';
  2. import { Buffer } from 'buffer';
  3. import { isCryptoKey } from './webcrypto.js';
  4. import isKeyObject from './is_key_object.js';
  5. import invalidKeyInput from '../lib/invalid_key_input.js';
  6. import { types } from './is_key_like.js';
  7. const genericExport = (keyType, keyFormat, key) => {
  8. let keyObject;
  9. if (isCryptoKey(key)) {
  10. if (!key.extractable) {
  11. throw new TypeError('CryptoKey is not extractable');
  12. }
  13. keyObject = KeyObject.from(key);
  14. }
  15. else if (isKeyObject(key)) {
  16. keyObject = key;
  17. }
  18. else {
  19. throw new TypeError(invalidKeyInput(key, ...types));
  20. }
  21. if (keyObject.type !== keyType) {
  22. throw new TypeError(`key is not a ${keyType} key`);
  23. }
  24. return keyObject.export({ format: 'pem', type: keyFormat });
  25. };
  26. export const toSPKI = (key) => {
  27. return genericExport('public', 'spki', key);
  28. };
  29. export const toPKCS8 = (key) => {
  30. return genericExport('private', 'pkcs8', key);
  31. };
  32. export const fromPKCS8 = (pem) => createPrivateKey({
  33. key: Buffer.from(pem.replace(/(?:-----(?:BEGIN|END) PRIVATE KEY-----|\s)/g, ''), 'base64'),
  34. type: 'pkcs8',
  35. format: 'der',
  36. });
  37. export const fromSPKI = (pem) => createPublicKey({
  38. key: Buffer.from(pem.replace(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\s)/g, ''), 'base64'),
  39. type: 'spki',
  40. format: 'der',
  41. });
  42. export const fromX509 = (pem) => createPublicKey({
  43. key: pem,
  44. type: 'spki',
  45. format: 'pem',
  46. });