jose 3.16.0 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +22 -114
  2. package/dist/browser/jwe/compact/decrypt.js +5 -1
  3. package/dist/browser/jwe/flattened/decrypt.js +10 -5
  4. package/dist/browser/jwe/flattened/encrypt.js +5 -2
  5. package/dist/browser/jwk/embedded.js +2 -2
  6. package/dist/browser/jwk/from_key_like.js +2 -2
  7. package/dist/browser/jwk/parse.js +2 -31
  8. package/dist/browser/jwk/thumbprint.js +1 -1
  9. package/dist/browser/jwks/remote.js +2 -2
  10. package/dist/browser/jws/compact/verify.js +5 -1
  11. package/dist/browser/jws/flattened/sign.js +5 -2
  12. package/dist/browser/jws/flattened/verify.js +7 -2
  13. package/dist/browser/jwt/decrypt.js +5 -1
  14. package/dist/browser/jwt/unsecured.js +1 -1
  15. package/dist/browser/jwt/verify.js +5 -1
  16. package/dist/browser/key/export.js +12 -0
  17. package/dist/browser/key/import.js +119 -0
  18. package/dist/browser/lib/decrypt_key_management.js +4 -4
  19. package/dist/browser/lib/encrypt_key_management.js +3 -3
  20. package/dist/browser/lib/format_pem.js +4 -0
  21. package/dist/browser/runtime/aeskw.js +1 -1
  22. package/dist/browser/runtime/asn1.js +119 -0
  23. package/dist/browser/runtime/base64url.js +12 -7
  24. package/dist/browser/runtime/decrypt.js +1 -1
  25. package/dist/browser/runtime/encrypt.js +1 -1
  26. package/dist/browser/runtime/fetch_jwks.js +2 -2
  27. package/dist/browser/runtime/generate.js +18 -2
  28. package/dist/browser/runtime/global.js +17 -0
  29. package/dist/browser/runtime/jwk_to_key.js +29 -5
  30. package/dist/browser/runtime/sign.js +1 -1
  31. package/dist/browser/runtime/subtle_dsa.js +4 -1
  32. package/dist/browser/runtime/verify.js +1 -1
  33. package/dist/node/cjs/jwe/compact/decrypt.js +5 -1
  34. package/dist/node/cjs/jwe/flattened/decrypt.js +10 -5
  35. package/dist/node/cjs/jwe/flattened/encrypt.js +5 -2
  36. package/dist/node/cjs/jwk/embedded.js +2 -2
  37. package/dist/node/cjs/jwk/from_key_like.js +2 -2
  38. package/dist/node/cjs/jwk/parse.js +2 -31
  39. package/dist/node/cjs/jwk/thumbprint.js +1 -1
  40. package/dist/node/cjs/jwks/remote.js +2 -2
  41. package/dist/node/cjs/jws/compact/verify.js +5 -1
  42. package/dist/node/cjs/jws/flattened/sign.js +5 -2
  43. package/dist/node/cjs/jws/flattened/verify.js +7 -2
  44. package/dist/node/cjs/jwt/decrypt.js +5 -1
  45. package/dist/node/cjs/jwt/unsecured.js +1 -1
  46. package/dist/node/cjs/jwt/verify.js +5 -1
  47. package/dist/node/cjs/key/export.js +18 -0
  48. package/dist/node/cjs/key/import.js +126 -0
  49. package/dist/node/cjs/lib/decrypt_key_management.js +4 -4
  50. package/dist/node/cjs/lib/encrypt_key_management.js +3 -3
  51. package/dist/node/cjs/lib/format_pem.js +6 -0
  52. package/dist/node/cjs/runtime/aeskw.js +1 -1
  53. package/dist/node/cjs/runtime/asn1.js +46 -0
  54. package/dist/node/cjs/runtime/asn1_sequence_encoder.js +1 -1
  55. package/dist/node/cjs/runtime/base64url.js +5 -1
  56. package/dist/node/cjs/runtime/decrypt.js +1 -1
  57. package/dist/node/cjs/runtime/ecdhes.js +28 -16
  58. package/dist/node/cjs/runtime/encrypt.js +1 -1
  59. package/dist/node/cjs/runtime/generate.js +2 -2
  60. package/dist/node/cjs/runtime/get_named_curve.js +12 -8
  61. package/dist/node/cjs/runtime/is_key_object.js +3 -12
  62. package/dist/node/cjs/runtime/jwk_to_key.js +1 -1
  63. package/dist/node/cjs/runtime/key_to_jwk.js +3 -3
  64. package/dist/node/cjs/runtime/webcrypto.js +12 -18
  65. package/dist/node/esm/jwe/compact/decrypt.js +5 -1
  66. package/dist/node/esm/jwe/flattened/decrypt.js +10 -5
  67. package/dist/node/esm/jwe/flattened/encrypt.js +5 -2
  68. package/dist/node/esm/jwk/embedded.js +2 -2
  69. package/dist/node/esm/jwk/from_key_like.js +2 -2
  70. package/dist/node/esm/jwk/parse.js +2 -31
  71. package/dist/node/esm/jwk/thumbprint.js +1 -1
  72. package/dist/node/esm/jwks/remote.js +2 -2
  73. package/dist/node/esm/jws/compact/verify.js +5 -1
  74. package/dist/node/esm/jws/flattened/sign.js +5 -2
  75. package/dist/node/esm/jws/flattened/verify.js +7 -2
  76. package/dist/node/esm/jwt/decrypt.js +5 -1
  77. package/dist/node/esm/jwt/unsecured.js +1 -1
  78. package/dist/node/esm/jwt/verify.js +5 -1
  79. package/dist/node/esm/key/export.js +12 -0
  80. package/dist/node/esm/key/import.js +119 -0
  81. package/dist/node/esm/lib/decrypt_key_management.js +4 -4
  82. package/dist/node/esm/lib/encrypt_key_management.js +3 -3
  83. package/dist/node/esm/lib/format_pem.js +4 -0
  84. package/dist/node/esm/runtime/aeskw.js +1 -1
  85. package/dist/node/esm/runtime/asn1.js +39 -0
  86. package/dist/node/esm/runtime/asn1_sequence_encoder.js +1 -1
  87. package/dist/node/esm/runtime/base64url.js +2 -0
  88. package/dist/node/esm/runtime/decrypt.js +1 -1
  89. package/dist/node/esm/runtime/ecdhes.js +28 -16
  90. package/dist/node/esm/runtime/encrypt.js +1 -1
  91. package/dist/node/esm/runtime/generate.js +2 -2
  92. package/dist/node/esm/runtime/get_named_curve.js +12 -8
  93. package/dist/node/esm/runtime/is_key_object.js +3 -12
  94. package/dist/node/esm/runtime/jwk_to_key.js +1 -1
  95. package/dist/node/esm/runtime/key_to_jwk.js +3 -3
  96. package/dist/node/esm/runtime/webcrypto.js +12 -18
  97. package/dist/types/jwe/compact/decrypt.d.ts +3 -2
  98. package/dist/types/jwe/flattened/decrypt.d.ts +3 -2
  99. package/dist/types/jwe/general/decrypt.d.ts +3 -2
  100. package/dist/types/jws/compact/verify.d.ts +3 -2
  101. package/dist/types/jws/flattened/verify.d.ts +3 -2
  102. package/dist/types/jws/general/verify.d.ts +3 -2
  103. package/dist/types/jwt/decrypt.d.ts +3 -2
  104. package/dist/types/jwt/verify.d.ts +3 -2
  105. package/dist/types/key/export.d.ts +5 -0
  106. package/dist/types/key/import.d.ts +9 -0
  107. package/dist/types/types.d.ts +3 -0
  108. package/package.json +18 -115
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.flattenedVerify = void 0;
4
+ const base64url_js_1 = require("../../runtime/base64url.js");
5
+ const verify_js_1 = require("../../runtime/verify.js");
4
6
  const errors_js_1 = require("../../util/errors.js");
5
7
  const buffer_utils_js_1 = require("../../lib/buffer_utils.js");
6
8
  const is_disjoint_js_1 = require("../../lib/is_disjoint.js");
7
9
  const is_object_js_1 = require("../../lib/is_object.js");
8
10
  const check_key_type_js_1 = require("../../lib/check_key_type.js");
9
- const base64url_js_1 = require("../../runtime/base64url.js");
10
- const verify_js_1 = require("../../runtime/verify.js");
11
11
  const validate_crit_js_1 = require("../../lib/validate_crit.js");
12
12
  const validate_algorithms_js_1 = require("../../lib/validate_algorithms.js");
13
13
  const checkExtensions = validate_crit_js_1.default.bind(undefined, errors_js_1.JWSInvalid, new Map([['b64', true]]));
@@ -73,8 +73,10 @@ async function flattenedVerify(jws, key, options) {
73
73
  else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {
74
74
  throw new errors_js_1.JWSInvalid('JWS Payload must be a string or an Uint8Array instance');
75
75
  }
76
+ let resolvedKey = false;
76
77
  if (typeof key === 'function') {
77
78
  key = await key(parsedProt, jws);
79
+ resolvedKey = true;
78
80
  }
79
81
  (0, check_key_type_js_1.default)(alg, key, 'verify');
80
82
  const data = (0, buffer_utils_js_1.concat)(buffer_utils_js_1.encoder.encode((_a = jws.protected) !== null && _a !== void 0 ? _a : ''), buffer_utils_js_1.encoder.encode('.'), typeof jws.payload === 'string' ? buffer_utils_js_1.encoder.encode(jws.payload) : jws.payload);
@@ -100,6 +102,9 @@ async function flattenedVerify(jws, key, options) {
100
102
  if (jws.header !== undefined) {
101
103
  result.unprotectedHeader = jws.header;
102
104
  }
105
+ if (resolvedKey) {
106
+ return { ...result, key };
107
+ }
103
108
  return result;
104
109
  }
105
110
  exports.flattenedVerify = flattenedVerify;
@@ -18,7 +18,11 @@ async function jwtDecrypt(jwt, key, options) {
18
18
  JSON.stringify(protectedHeader.aud) !== JSON.stringify(payload.aud)) {
19
19
  throw new errors_js_1.JWTClaimValidationFailed('replicated "aud" claim header parameter mismatch', 'aud', 'mismatch');
20
20
  }
21
- return { payload, protectedHeader };
21
+ const result = { payload, protectedHeader };
22
+ if (typeof key === 'function') {
23
+ return { ...result, key: decrypted.key };
24
+ }
25
+ return result;
22
26
  }
23
27
  exports.jwtDecrypt = jwtDecrypt;
24
28
  exports.default = jwtDecrypt;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UnsecuredJWT = void 0;
4
- const buffer_utils_js_1 = require("../lib/buffer_utils.js");
5
4
  const base64url = require("../runtime/base64url.js");
5
+ const buffer_utils_js_1 = require("../lib/buffer_utils.js");
6
6
  const errors_js_1 = require("../util/errors.js");
7
7
  const jwt_claims_set_js_1 = require("../lib/jwt_claims_set.js");
8
8
  const jwt_producer_js_1 = require("../lib/jwt_producer.js");
@@ -11,7 +11,11 @@ async function jwtVerify(jwt, key, options) {
11
11
  throw new errors_js_1.JWTInvalid('JWTs MUST NOT use unencoded payload');
12
12
  }
13
13
  const payload = (0, jwt_claims_set_js_1.default)(verified.protectedHeader, verified.payload, options);
14
- return { payload, protectedHeader: verified.protectedHeader };
14
+ const result = { payload, protectedHeader: verified.protectedHeader };
15
+ if (typeof key === 'function') {
16
+ return { ...result, key: verified.key };
17
+ }
18
+ return result;
15
19
  }
16
20
  exports.jwtVerify = jwtVerify;
17
21
  exports.default = jwtVerify;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportJWK = exports.exportPKCS8 = exports.exportSPKI = void 0;
4
+ const asn1_js_1 = require("../runtime/asn1.js");
5
+ const asn1_js_2 = require("../runtime/asn1.js");
6
+ const key_to_jwk_js_1 = require("../runtime/key_to_jwk.js");
7
+ async function exportSPKI(key) {
8
+ return (0, asn1_js_1.toSPKI)(key);
9
+ }
10
+ exports.exportSPKI = exportSPKI;
11
+ async function exportPKCS8(key) {
12
+ return (0, asn1_js_2.toPKCS8)(key);
13
+ }
14
+ exports.exportPKCS8 = exportPKCS8;
15
+ async function exportJWK(key) {
16
+ return (0, key_to_jwk_js_1.default)(key);
17
+ }
18
+ exports.exportJWK = exportJWK;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importJWK = exports.importPKCS8 = exports.importX509 = exports.importSPKI = void 0;
4
+ const base64url_js_1 = require("../runtime/base64url.js");
5
+ const asn1_js_1 = require("../runtime/asn1.js");
6
+ const asn1_js_2 = require("../runtime/asn1.js");
7
+ const jwk_to_key_js_1 = require("../runtime/jwk_to_key.js");
8
+ const errors_js_1 = require("../util/errors.js");
9
+ const format_pem_js_1 = require("../lib/format_pem.js");
10
+ const is_object_js_1 = require("../lib/is_object.js");
11
+ function getElement(seq) {
12
+ let result = [];
13
+ let next = 0;
14
+ while (next < seq.length) {
15
+ let nextPart = parseElement(seq.subarray(next));
16
+ result.push(nextPart);
17
+ next += nextPart.byteLength;
18
+ }
19
+ return result;
20
+ }
21
+ function parseElement(bytes) {
22
+ let position = 0;
23
+ let tag = bytes[0] & 0x1f;
24
+ position++;
25
+ if (tag === 0x1f) {
26
+ tag = 0;
27
+ while (bytes[position] >= 0x80) {
28
+ tag = tag * 128 + bytes[position] - 0x80;
29
+ position++;
30
+ }
31
+ tag = tag * 128 + bytes[position] - 0x80;
32
+ position++;
33
+ }
34
+ let length = 0;
35
+ if (bytes[position] < 0x80) {
36
+ length = bytes[position];
37
+ position++;
38
+ }
39
+ else {
40
+ let numberOfDigits = bytes[position] & 0x7f;
41
+ position++;
42
+ length = 0;
43
+ for (let i = 0; i < numberOfDigits; i++) {
44
+ length = length * 256 + bytes[position];
45
+ position++;
46
+ }
47
+ }
48
+ if (length === 0x80) {
49
+ length = 0;
50
+ while (bytes[position + length] !== 0 || bytes[position + length + 1] !== 0) {
51
+ length++;
52
+ }
53
+ const byteLength = position + length + 2;
54
+ return {
55
+ byteLength,
56
+ contents: bytes.subarray(position, position + length),
57
+ raw: bytes.subarray(0, byteLength),
58
+ };
59
+ }
60
+ const byteLength = position + length;
61
+ return {
62
+ byteLength,
63
+ contents: bytes.subarray(position, byteLength),
64
+ raw: bytes.subarray(0, byteLength),
65
+ };
66
+ }
67
+ function spkiFromX509(buf) {
68
+ return (0, base64url_js_1.encodeBase64)(getElement(getElement(parseElement(buf).contents)[0].contents)[6].raw);
69
+ }
70
+ function getSPKI(x509) {
71
+ const pem = x509.replace(/(?:-----(?:BEGIN|END) CERTIFICATE-----|\s)/g, '');
72
+ const raw = (0, base64url_js_1.decodeBase64)(pem);
73
+ return (0, format_pem_js_1.default)(spkiFromX509(raw), 'PUBLIC KEY');
74
+ }
75
+ async function importSPKI(spki, alg, options) {
76
+ if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {
77
+ throw new TypeError('"spki" must be SPKI formatted string');
78
+ }
79
+ return (0, asn1_js_1.fromSPKI)(spki, alg, options);
80
+ }
81
+ exports.importSPKI = importSPKI;
82
+ async function importX509(x509, alg, options) {
83
+ if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {
84
+ throw new TypeError('"x509" must be X.509 formatted string');
85
+ }
86
+ const spki = getSPKI(x509);
87
+ return (0, asn1_js_1.fromSPKI)(spki, alg, options);
88
+ }
89
+ exports.importX509 = importX509;
90
+ async function importPKCS8(pkcs8, alg, options) {
91
+ if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {
92
+ throw new TypeError('"pkcs8" must be PCKS8 formatted string');
93
+ }
94
+ return (0, asn1_js_2.fromPKCS8)(pkcs8, alg, options);
95
+ }
96
+ exports.importPKCS8 = importPKCS8;
97
+ async function importJWK(jwk, alg, octAsKeyObject) {
98
+ if (!(0, is_object_js_1.default)(jwk)) {
99
+ throw new TypeError('JWK must be an object');
100
+ }
101
+ alg || (alg = jwk.alg);
102
+ if (typeof alg !== 'string' || !alg) {
103
+ throw new TypeError('"alg" argument is required when "jwk.alg" is not present');
104
+ }
105
+ switch (jwk.kty) {
106
+ case 'oct':
107
+ if (typeof jwk.k !== 'string' || !jwk.k) {
108
+ throw new TypeError('missing "k" (Key Value) Parameter value');
109
+ }
110
+ octAsKeyObject !== null && octAsKeyObject !== void 0 ? octAsKeyObject : (octAsKeyObject = jwk.ext !== true);
111
+ if (octAsKeyObject) {
112
+ return (0, jwk_to_key_js_1.default)({ ...jwk, alg, ext: false });
113
+ }
114
+ return (0, base64url_js_1.decode)(jwk.k);
115
+ case 'RSA':
116
+ if (jwk.oth !== undefined) {
117
+ throw new errors_js_1.JOSENotSupported('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');
118
+ }
119
+ case 'EC':
120
+ case 'OKP':
121
+ return (0, jwk_to_key_js_1.default)({ ...jwk, alg });
122
+ default:
123
+ throw new errors_js_1.JOSENotSupported('Unsupported "kty" (Key Type) Parameter value');
124
+ }
125
+ }
126
+ exports.importJWK = importJWK;
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const errors_js_1 = require("../util/errors.js");
4
3
  const aeskw_js_1 = require("../runtime/aeskw.js");
5
4
  const ECDH = require("../runtime/ecdhes.js");
6
5
  const pbes2kw_js_1 = require("../runtime/pbes2kw.js");
7
6
  const rsaes_js_1 = require("../runtime/rsaes.js");
8
7
  const aesgcmkw_js_1 = require("../runtime/aesgcmkw.js");
9
8
  const base64url_js_1 = require("../runtime/base64url.js");
9
+ const errors_js_1 = require("../util/errors.js");
10
10
  const cek_js_1 = require("../lib/cek.js");
11
- const parse_js_1 = require("../jwk/parse.js");
11
+ const import_js_1 = require("../key/import.js");
12
12
  const check_key_type_js_1 = require("./check_key_type.js");
13
13
  function assertEnryptedKey(encryptedKey) {
14
14
  if (!encryptedKey) {
@@ -40,7 +40,7 @@ async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
40
40
  if (!ECDH.ecdhAllowed(key)) {
41
41
  throw new errors_js_1.JOSENotSupported('ECDH-ES with the provided key is not allowed or not supported by your javascript runtime');
42
42
  }
43
- const epk = await (0, parse_js_1.parseJwk)(joseHeader.epk, alg);
43
+ const epk = await (0, import_js_1.importJWK)(joseHeader.epk, alg);
44
44
  let partyUInfo;
45
45
  let partyVInfo;
46
46
  if (joseHeader.apu !== undefined)
@@ -90,7 +90,7 @@ async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
90
90
  return (0, aesgcmkw_js_1.unwrap)(alg, key, encryptedKey, iv, tag);
91
91
  }
92
92
  default: {
93
- throw new errors_js_1.JOSENotSupported('unsupported or invalid "alg" (JWE Algorithm) header value');
93
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported "alg" (JWE Algorithm) header value');
94
94
  }
95
95
  }
96
96
  }
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const cek_js_1 = require("../lib/cek.js");
4
- const errors_js_1 = require("../util/errors.js");
5
3
  const random_js_1 = require("../runtime/random.js");
6
4
  const aeskw_js_1 = require("../runtime/aeskw.js");
7
5
  const ECDH = require("../runtime/ecdhes.js");
@@ -9,6 +7,8 @@ const pbes2kw_js_1 = require("../runtime/pbes2kw.js");
9
7
  const rsaes_js_1 = require("../runtime/rsaes.js");
10
8
  const aesgcmkw_js_1 = require("../runtime/aesgcmkw.js");
11
9
  const base64url_js_1 = require("../runtime/base64url.js");
10
+ const cek_js_1 = require("../lib/cek.js");
11
+ const errors_js_1 = require("../util/errors.js");
12
12
  const from_key_like_js_1 = require("../jwk/from_key_like.js");
13
13
  const check_key_type_js_1 = require("./check_key_type.js");
14
14
  const generateCek = (0, cek_js_1.default)(random_js_1.default);
@@ -81,7 +81,7 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
81
81
  break;
82
82
  }
83
83
  default: {
84
- throw new errors_js_1.JOSENotSupported('unsupported or invalid "alg" (JWE Algorithm) header value');
84
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported "alg" (JWE Algorithm) header value');
85
85
  }
86
86
  }
87
87
  return { cek, encryptedKey, parameters };
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = (b64, descriptor) => {
4
+ const newlined = (b64.match(/.{1,64}/g) || []).join('\n');
5
+ return `-----BEGIN ${descriptor}-----\n${newlined}\n-----END ${descriptor}-----`;
6
+ };
@@ -11,7 +11,7 @@ const invalid_key_input_js_1 = require("./invalid_key_input.js");
11
11
  const ciphers_js_1 = require("./ciphers.js");
12
12
  function checkKeySize(key, alg) {
13
13
  if (key.symmetricKeySize << 3 !== parseInt(alg.substr(1, 3), 10)) {
14
- throw new TypeError(`invalid key size for alg: ${alg}`);
14
+ throw new TypeError(`Invalid key size for alg: ${alg}`);
15
15
  }
16
16
  }
17
17
  function ensureKeyObject(key, alg, usage) {
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fromSPKI = exports.fromPKCS8 = exports.toPKCS8 = exports.toSPKI = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const webcrypto_js_1 = require("./webcrypto.js");
6
+ const is_key_object_js_1 = require("./is_key_object.js");
7
+ const invalid_key_input_js_1 = require("./invalid_key_input.js");
8
+ const genericExport = (keyType, keyFormat, key) => {
9
+ let keyObject;
10
+ if ((0, webcrypto_js_1.isCryptoKey)(key)) {
11
+ if (!key.extractable) {
12
+ throw new TypeError('CryptoKey is not extractable');
13
+ }
14
+ keyObject = (0, webcrypto_js_1.getKeyObject)(key);
15
+ }
16
+ else if ((0, is_key_object_js_1.default)(key)) {
17
+ keyObject = key;
18
+ }
19
+ else {
20
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
21
+ }
22
+ if (keyObject.type !== keyType) {
23
+ throw new TypeError(`key is not a ${keyType} key`);
24
+ }
25
+ return keyObject.export({ format: 'pem', type: keyFormat });
26
+ };
27
+ const toSPKI = (key) => {
28
+ return genericExport('public', 'spki', key);
29
+ };
30
+ exports.toSPKI = toSPKI;
31
+ const toPKCS8 = (key) => {
32
+ return genericExport('private', 'pkcs8', key);
33
+ };
34
+ exports.toPKCS8 = toPKCS8;
35
+ const fromPKCS8 = (pem) => (0, crypto_1.createPrivateKey)({
36
+ key: Buffer.from(pem.replace(/(?:-----(?:BEGIN|END) PRIVATE KEY-----|\s)/g, ''), 'base64'),
37
+ type: 'pkcs8',
38
+ format: 'der',
39
+ });
40
+ exports.fromPKCS8 = fromPKCS8;
41
+ const fromSPKI = (pem) => (0, crypto_1.createPublicKey)({
42
+ key: Buffer.from(pem.replace(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\s)/g, ''), 'base64'),
43
+ type: 'spki',
44
+ format: 'der',
45
+ });
46
+ exports.fromSPKI = fromSPKI;
@@ -40,7 +40,7 @@ class DumbAsn1Encoder {
40
40
  oidFor(oid) {
41
41
  const bOid = oids.get(oid);
42
42
  if (!bOid) {
43
- throw new errors_js_1.JOSENotSupported('unsupported or invalid OID');
43
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported OID');
44
44
  }
45
45
  this.elements.push(bOid);
46
46
  this.length += bOid.length;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decode = exports.encode = void 0;
3
+ exports.decode = exports.encode = exports.encodeBase64 = exports.decodeBase64 = void 0;
4
4
  const buffer_utils_js_1 = require("../lib/buffer_utils.js");
5
5
  let encodeImpl;
6
6
  function normalize(input) {
@@ -16,6 +16,10 @@ if (Buffer.isEncoding('base64url')) {
16
16
  else {
17
17
  encodeImpl = (input) => Buffer.from(input).toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
18
18
  }
19
+ const decodeBase64 = (input) => Buffer.from(input, 'base64');
20
+ exports.decodeBase64 = decodeBase64;
21
+ const encodeBase64 = (input) => Buffer.from(input).toString('base64');
22
+ exports.encodeBase64 = encodeBase64;
19
23
  exports.encode = encodeImpl;
20
24
  const decode = (input) => Buffer.from(normalize(input), 'base64');
21
25
  exports.decode = decode;
@@ -86,7 +86,7 @@ const decrypt = async (enc, cek, ciphertext, iv, tag, aad) => {
86
86
  case 'A256GCM':
87
87
  return gcmDecrypt(enc, key, ciphertext, iv, tag, aad);
88
88
  default:
89
- throw new errors_js_1.JOSENotSupported('unsupported JWE Content Encryption Algorithm');
89
+ throw new errors_js_1.JOSENotSupported('Unsupported JWE Content Encryption Algorithm');
90
90
  }
91
91
  };
92
92
  exports.default = decrypt;
@@ -11,30 +11,42 @@ const webcrypto_js_1 = require("./webcrypto.js");
11
11
  const is_key_object_js_1 = require("./is_key_object.js");
12
12
  const invalid_key_input_js_1 = require("./invalid_key_input.js");
13
13
  const generateKeyPair = (0, util_1.promisify)(crypto_1.generateKeyPair);
14
- const deriveKey = async (publicKey, privateKey, algorithm, keyLength, apu = new Uint8Array(0), apv = new Uint8Array(0)) => {
15
- const value = (0, buffer_utils_js_1.concat)((0, buffer_utils_js_1.lengthAndInput)(buffer_utils_js_1.encoder.encode(algorithm)), (0, buffer_utils_js_1.lengthAndInput)(apu), (0, buffer_utils_js_1.lengthAndInput)(apv), (0, buffer_utils_js_1.uint32be)(keyLength));
16
- if ((0, webcrypto_js_1.isCryptoKey)(publicKey)) {
17
- publicKey = (0, webcrypto_js_1.getKeyObject)(publicKey, 'ECDH-ES');
14
+ const deriveKey = async (publicKee, privateKee, algorithm, keyLength, apu = new Uint8Array(0), apv = new Uint8Array(0)) => {
15
+ let publicKey;
16
+ if ((0, webcrypto_js_1.isCryptoKey)(publicKee)) {
17
+ publicKey = (0, webcrypto_js_1.getKeyObject)(publicKee, 'ECDH-ES');
18
+ }
19
+ else if ((0, is_key_object_js_1.default)(publicKee)) {
20
+ publicKey = publicKee;
21
+ }
22
+ else {
23
+ throw new TypeError((0, invalid_key_input_js_1.default)(publicKee, 'KeyObject', 'CryptoKey'));
18
24
  }
19
- if (!(0, is_key_object_js_1.default)(publicKey)) {
20
- throw new TypeError((0, invalid_key_input_js_1.default)(publicKey, 'KeyObject', 'CryptoKey'));
25
+ let privateKey;
26
+ if ((0, webcrypto_js_1.isCryptoKey)(privateKee)) {
27
+ privateKey = (0, webcrypto_js_1.getKeyObject)(privateKee, 'ECDH-ES', new Set(['deriveBits', 'deriveKey']));
21
28
  }
22
- if ((0, webcrypto_js_1.isCryptoKey)(privateKey)) {
23
- privateKey = (0, webcrypto_js_1.getKeyObject)(privateKey, 'ECDH-ES', new Set(['deriveBits', 'deriveKey']));
29
+ else if ((0, is_key_object_js_1.default)(privateKee)) {
30
+ privateKey = privateKee;
24
31
  }
25
- if (!(0, is_key_object_js_1.default)(privateKey)) {
26
- throw new TypeError((0, invalid_key_input_js_1.default)(privateKey, 'KeyObject', 'CryptoKey'));
32
+ else {
33
+ throw new TypeError((0, invalid_key_input_js_1.default)(privateKee, 'KeyObject', 'CryptoKey'));
27
34
  }
35
+ const value = (0, buffer_utils_js_1.concat)((0, buffer_utils_js_1.lengthAndInput)(buffer_utils_js_1.encoder.encode(algorithm)), (0, buffer_utils_js_1.lengthAndInput)(apu), (0, buffer_utils_js_1.lengthAndInput)(apv), (0, buffer_utils_js_1.uint32be)(keyLength));
28
36
  const sharedSecret = (0, crypto_1.diffieHellman)({ privateKey, publicKey });
29
37
  return (0, buffer_utils_js_1.concatKdf)(digest_js_1.default, sharedSecret, keyLength, value);
30
38
  };
31
39
  exports.deriveKey = deriveKey;
32
- const generateEpk = async (key) => {
33
- if ((0, webcrypto_js_1.isCryptoKey)(key)) {
34
- key = (0, webcrypto_js_1.getKeyObject)(key);
40
+ const generateEpk = async (kee) => {
41
+ let key;
42
+ if ((0, webcrypto_js_1.isCryptoKey)(kee)) {
43
+ key = (0, webcrypto_js_1.getKeyObject)(kee);
44
+ }
45
+ else if ((0, is_key_object_js_1.default)(kee)) {
46
+ key = kee;
35
47
  }
36
- if (!(0, is_key_object_js_1.default)(key)) {
37
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
48
+ else {
49
+ throw new TypeError((0, invalid_key_input_js_1.default)(kee, 'KeyObject', 'CryptoKey'));
38
50
  }
39
51
  switch (key.asymmetricKeyType) {
40
52
  case 'x25519':
@@ -47,7 +59,7 @@ const generateEpk = async (key) => {
47
59
  return (await generateKeyPair('ec', { namedCurve })).privateKey;
48
60
  }
49
61
  default:
50
- throw new errors_js_1.JOSENotSupported('unsupported or invalid EPK');
62
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported EPK');
51
63
  }
52
64
  };
53
65
  exports.generateEpk = generateEpk;
@@ -64,7 +64,7 @@ const encrypt = async (enc, plaintext, cek, iv, aad) => {
64
64
  case 'A256GCM':
65
65
  return gcmEncrypt(enc, plaintext, key, iv, aad);
66
66
  default:
67
- throw new errors_js_1.JOSENotSupported('unsupported JWE Content Encryption Algorithm');
67
+ throw new errors_js_1.JOSENotSupported('Unsupported JWE Content Encryption Algorithm');
68
68
  }
69
69
  };
70
70
  exports.default = encrypt;
@@ -30,7 +30,7 @@ async function generateSecret(alg, options) {
30
30
  length = parseInt(alg.substring(1, 4), 10);
31
31
  break;
32
32
  default:
33
- throw new errors_js_1.JOSENotSupported('unsupported or invalid JWK "alg" (Algorithm) Parameter value');
33
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
34
34
  }
35
35
  return (0, crypto_1.createSecretKey)((0, random_js_1.default)(new Uint8Array(length >> 3)));
36
36
  }
@@ -98,7 +98,7 @@ async function generateKeyPair(alg, options) {
98
98
  throw new errors_js_1.JOSENotSupported('Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, X25519, and X448');
99
99
  }
100
100
  default:
101
- throw new errors_js_1.JOSENotSupported('unsupported or invalid JWK "alg" (Algorithm) Parameter value');
101
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
102
102
  }
103
103
  }
104
104
  exports.generateKeyPair = generateKeyPair;
@@ -20,18 +20,22 @@ const namedCurveToJOSE = (namedCurve) => {
20
20
  case 'secp521r1':
21
21
  return 'P-521';
22
22
  case 'secp256k1':
23
- return namedCurve;
23
+ return 'secp256k1';
24
24
  default:
25
- throw new errors_js_1.JOSENotSupported('unsupported key curve for this operation');
25
+ throw new errors_js_1.JOSENotSupported('Unsupported key curve for this operation');
26
26
  }
27
27
  };
28
- const getNamedCurve = (key, raw) => {
28
+ const getNamedCurve = (kee, raw) => {
29
29
  var _a;
30
- if ((0, webcrypto_js_1.isCryptoKey)(key)) {
31
- key = (0, webcrypto_js_1.getKeyObject)(key);
30
+ let key;
31
+ if ((0, webcrypto_js_1.isCryptoKey)(kee)) {
32
+ key = (0, webcrypto_js_1.getKeyObject)(kee);
32
33
  }
33
- if (!(0, is_key_object_js_1.default)(key)) {
34
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
34
+ else if ((0, is_key_object_js_1.default)(kee)) {
35
+ key = kee;
36
+ }
37
+ else {
38
+ throw new TypeError((0, invalid_key_input_js_1.default)(kee, 'KeyObject', 'CryptoKey'));
35
39
  }
36
40
  if (key.type === 'secret') {
37
41
  throw new TypeError('only "private" or "public" type keys can be used for this operation');
@@ -69,7 +73,7 @@ const getNamedCurve = (key, raw) => {
69
73
  namedCurve = 'secp256k1';
70
74
  }
71
75
  else {
72
- throw new errors_js_1.JOSENotSupported('unsupported key curve for this operation');
76
+ throw new errors_js_1.JOSENotSupported('Unsupported key curve for this operation');
73
77
  }
74
78
  }
75
79
  if (raw)
@@ -2,15 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const crypto_1 = require("crypto");
4
4
  const util = require("util");
5
- let impl;
6
- if (util.types.isKeyObject) {
7
- impl = function isKeyObject(obj) {
8
- return util.types.isKeyObject(obj);
9
- };
10
- }
11
- else {
12
- impl = function isKeyObject(obj) {
13
- return obj != null && obj instanceof crypto_1.KeyObject;
14
- };
15
- }
16
- exports.default = impl;
5
+ exports.default = util.types.isKeyObject
6
+ ? (obj) => util.types.isKeyObject(obj)
7
+ : (obj) => obj != null && obj instanceof crypto_1.KeyObject;
@@ -115,7 +115,7 @@ const parse = (jwk) => {
115
115
  return (0, crypto_1.createPublicKey)({ key: der, format: 'der', type: 'spki' });
116
116
  }
117
117
  default:
118
- throw new errors_js_1.JOSENotSupported('unsupported or invalid JWK "kty" (Key Type) Parameter value');
118
+ throw new errors_js_1.JOSENotSupported('Invalid or unsupported JWK "kty" (Key Type) Parameter value');
119
119
  }
120
120
  };
121
121
  exports.default = parse;
@@ -94,7 +94,7 @@ const keyToJWK = (key) => {
94
94
  correction = -3;
95
95
  break;
96
96
  default:
97
- throw new errors_js_1.JOSENotSupported('unsupported curve');
97
+ throw new errors_js_1.JOSENotSupported('Unsupported curve');
98
98
  }
99
99
  if (keyObject.type === 'public') {
100
100
  const der = keyObject.export({ type: 'spki', format: 'der' });
@@ -149,11 +149,11 @@ const keyToJWK = (key) => {
149
149
  };
150
150
  }
151
151
  default:
152
- throw new errors_js_1.JOSENotSupported('unsupported key asymmetricKeyType');
152
+ throw new errors_js_1.JOSENotSupported('Unsupported key asymmetricKeyType');
153
153
  }
154
154
  }
155
155
  default:
156
- throw new errors_js_1.JOSENotSupported('unsupported key type');
156
+ throw new errors_js_1.JOSENotSupported('Unsupported key type');
157
157
  }
158
158
  };
159
159
  exports.default = keyToJWK;
@@ -5,21 +5,10 @@ const crypto = require("crypto");
5
5
  const util = require("util");
6
6
  const webcrypto = crypto.webcrypto;
7
7
  exports.default = webcrypto;
8
- let impl;
9
- exports.isCryptoKey = impl;
10
- if (util.types.isCryptoKey) {
11
- exports.isCryptoKey = impl = function isCryptoKey(obj) {
12
- return util.types.isCryptoKey(obj);
13
- };
14
- }
15
- else if (webcrypto) {
16
- exports.isCryptoKey = impl = function isCryptoKey(obj) {
17
- return obj != null && obj instanceof webcrypto.CryptoKey;
18
- };
19
- }
20
- else {
21
- exports.isCryptoKey = impl = (obj) => false;
22
- }
8
+ exports.isCryptoKey = util.types.isCryptoKey
9
+ ? (obj) => util.types.isCryptoKey(obj)
10
+ :
11
+ (obj) => false;
23
12
  function getHashLength(hash) {
24
13
  return parseInt(hash === null || hash === void 0 ? void 0 : hash.name.substr(4), 10);
25
14
  }
@@ -34,10 +23,9 @@ function getNamedCurve(alg) {
34
23
  }
35
24
  }
36
25
  function getKeyObject(key, alg, usage) {
37
- if (!alg) {
38
- return crypto.KeyObject.from(key);
39
- }
40
26
  switch (alg) {
27
+ case undefined:
28
+ break;
41
29
  case 'HS256':
42
30
  case 'HS384':
43
31
  case 'HS512': {
@@ -77,6 +65,12 @@ function getKeyObject(key, alg, usage) {
77
65
  }
78
66
  break;
79
67
  }
68
+ case 'EdDSA': {
69
+ if (key.algorithm.name !== 'NODE-ED25519' && key.algorithm.name !== 'NODE-ED448') {
70
+ throw new TypeError(`CryptoKey does not support this operation, its algorithm.name must be NODE-ED25519 or NODE-ED448.`);
71
+ }
72
+ break;
73
+ }
80
74
  case 'ES256':
81
75
  case 'ES384':
82
76
  case 'ES512': {
@@ -19,7 +19,11 @@ async function compactDecrypt(jwe, key, options) {
19
19
  tag: (tag || undefined),
20
20
  encrypted_key: encryptedKey || undefined,
21
21
  }, key, options);
22
- return { plaintext: decrypted.plaintext, protectedHeader: decrypted.protectedHeader };
22
+ const result = { plaintext: decrypted.plaintext, protectedHeader: decrypted.protectedHeader };
23
+ if (typeof key === 'function') {
24
+ return { ...result, key: decrypted.key };
25
+ }
26
+ return result;
23
27
  }
24
28
  export { compactDecrypt };
25
29
  export default compactDecrypt;