jose 4.2.0 → 4.3.3

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 (64) hide show
  1. package/README.md +15 -0
  2. package/dist/browser/jwe/general/encrypt.js +33 -23
  3. package/dist/browser/jwks/remote.js +16 -12
  4. package/dist/browser/jws/general/sign.js +25 -29
  5. package/dist/browser/lib/cek.js +5 -6
  6. package/dist/browser/lib/decrypt_key_management.js +1 -1
  7. package/dist/browser/lib/encrypt_key_management.js +1 -1
  8. package/dist/browser/lib/iv.js +4 -11
  9. package/dist/browser/runtime/aeskw.js +2 -1
  10. package/dist/browser/runtime/asn1.js +2 -1
  11. package/dist/browser/runtime/decrypt.js +2 -1
  12. package/dist/browser/runtime/ecdhes.js +5 -4
  13. package/dist/browser/runtime/encrypt.js +2 -1
  14. package/dist/browser/runtime/get_sign_verify_key.js +3 -2
  15. package/dist/browser/runtime/key_to_jwk.js +2 -1
  16. package/dist/browser/runtime/pbes2kw.js +2 -1
  17. package/dist/browser/runtime/rsaes.js +3 -2
  18. package/dist/node/cjs/jwe/general/encrypt.js +33 -23
  19. package/dist/node/cjs/jwks/remote.js +16 -12
  20. package/dist/node/cjs/jws/general/sign.js +25 -29
  21. package/dist/node/cjs/lib/cek.js +5 -6
  22. package/dist/node/cjs/lib/decrypt_key_management.js +1 -1
  23. package/dist/node/cjs/lib/encrypt_key_management.js +1 -1
  24. package/dist/node/cjs/lib/iv.js +4 -11
  25. package/dist/node/cjs/runtime/aeskw.js +4 -3
  26. package/dist/node/cjs/runtime/asn1.js +2 -1
  27. package/dist/node/cjs/runtime/decrypt.js +5 -4
  28. package/dist/node/cjs/runtime/ecdhes.js +5 -4
  29. package/dist/node/cjs/runtime/encrypt.js +5 -4
  30. package/dist/node/cjs/runtime/get_named_curve.js +2 -1
  31. package/dist/node/cjs/runtime/get_sign_verify_key.js +3 -2
  32. package/dist/node/cjs/runtime/key_to_jwk.js +2 -1
  33. package/dist/node/cjs/runtime/pbes2kw.js +2 -1
  34. package/dist/node/cjs/runtime/rsaes.js +4 -3
  35. package/dist/node/esm/jwe/general/encrypt.js +33 -23
  36. package/dist/node/esm/jwks/remote.js +16 -12
  37. package/dist/node/esm/jws/general/sign.js +25 -29
  38. package/dist/node/esm/lib/cek.js +5 -6
  39. package/dist/node/esm/lib/decrypt_key_management.js +1 -1
  40. package/dist/node/esm/lib/encrypt_key_management.js +1 -1
  41. package/dist/node/esm/lib/iv.js +4 -11
  42. package/dist/node/esm/runtime/aeskw.js +4 -3
  43. package/dist/node/esm/runtime/asn1.js +2 -1
  44. package/dist/node/esm/runtime/decrypt.js +5 -4
  45. package/dist/node/esm/runtime/ecdhes.js +5 -4
  46. package/dist/node/esm/runtime/encrypt.js +5 -4
  47. package/dist/node/esm/runtime/get_named_curve.js +2 -1
  48. package/dist/node/esm/runtime/get_sign_verify_key.js +3 -2
  49. package/dist/node/esm/runtime/key_to_jwk.js +2 -1
  50. package/dist/node/esm/runtime/pbes2kw.js +2 -1
  51. package/dist/node/esm/runtime/rsaes.js +4 -3
  52. package/dist/types/index.d.ts +1 -1
  53. package/dist/types/jwe/compact/decrypt.d.ts +2 -2
  54. package/dist/types/jwe/compact/encrypt.d.ts +2 -2
  55. package/dist/types/jwe/general/encrypt.d.ts +3 -0
  56. package/dist/types/jws/compact/sign.d.ts +2 -2
  57. package/dist/types/jws/compact/verify.d.ts +2 -2
  58. package/dist/types/jws/general/sign.d.ts +3 -0
  59. package/dist/types/jwt/decrypt.d.ts +2 -2
  60. package/dist/types/jwt/encrypt.d.ts +2 -2
  61. package/dist/types/jwt/sign.d.ts +2 -2
  62. package/dist/types/jwt/verify.d.ts +2 -2
  63. package/dist/types/types.d.ts +19 -17
  64. package/package.json +1 -1
@@ -8,20 +8,27 @@ const is_disjoint_js_1 = require("../../lib/is_disjoint.js");
8
8
  const encrypt_key_management_js_1 = require("../../lib/encrypt_key_management.js");
9
9
  const base64url_js_1 = require("../../runtime/base64url.js");
10
10
  const validate_crit_js_1 = require("../../lib/validate_crit.js");
11
- const recipientRef = new WeakMap();
12
11
  class IndividualRecipient {
12
+ constructor(enc, key, options) {
13
+ this.parent = enc;
14
+ this.key = key;
15
+ this.options = options;
16
+ }
13
17
  setUnprotectedHeader(unprotectedHeader) {
14
- if (this._unprotectedHeader) {
18
+ if (this.unprotectedHeader) {
15
19
  throw new TypeError('setUnprotectedHeader can only be called once');
16
20
  }
17
- this._unprotectedHeader = unprotectedHeader;
21
+ this.unprotectedHeader = unprotectedHeader;
18
22
  return this;
19
23
  }
20
- set _unprotectedHeader(value) {
21
- recipientRef.get(this).unprotectedHeader = value;
24
+ addRecipient(...args) {
25
+ return this.parent.addRecipient(...args);
26
+ }
27
+ encrypt(...args) {
28
+ return this.parent.encrypt(...args);
22
29
  }
23
- get _unprotectedHeader() {
24
- return recipientRef.get(this).unprotectedHeader;
30
+ done() {
31
+ return this.parent;
25
32
  }
26
33
  }
27
34
  class GeneralEncrypt {
@@ -30,8 +37,7 @@ class GeneralEncrypt {
30
37
  this._plaintext = plaintext;
31
38
  }
32
39
  addRecipient(key, options) {
33
- const recipient = new IndividualRecipient();
34
- recipientRef.set(recipient, { key, options: { crit: options === null || options === void 0 ? void 0 : options.crit } });
40
+ const recipient = new IndividualRecipient(this, key, { crit: options === null || options === void 0 ? void 0 : options.crit });
35
41
  this._recipients.push(recipient);
36
42
  return recipient;
37
43
  }
@@ -54,19 +60,19 @@ class GeneralEncrypt {
54
60
  return this;
55
61
  }
56
62
  async encrypt(options) {
57
- var _a, _b;
63
+ var _a, _b, _c;
58
64
  if (!this._recipients.length) {
59
65
  throw new errors_js_1.JWEInvalid('at least one recipient must be added');
60
66
  }
61
67
  options = { deflateRaw: options === null || options === void 0 ? void 0 : options.deflateRaw };
62
68
  if (this._recipients.length === 1) {
63
- const { unprotectedHeader, options: recipientOpts, key, } = recipientRef.get(this._recipients[0]);
69
+ const [recipient] = this._recipients;
64
70
  const flattened = await new encrypt_js_1.FlattenedEncrypt(this._plaintext)
65
71
  .setAdditionalAuthenticatedData(this._aad)
66
72
  .setProtectedHeader(this._protectedHeader)
67
73
  .setSharedUnprotectedHeader(this._unprotectedHeader)
68
- .setUnprotectedHeader(unprotectedHeader)
69
- .encrypt(key, { ...recipientOpts, ...options });
74
+ .setUnprotectedHeader(recipient.unprotectedHeader)
75
+ .encrypt(recipient.key, { ...recipient.options, ...options });
70
76
  let jwe = {
71
77
  ciphertext: flattened.ciphertext,
72
78
  iv: flattened.iv,
@@ -88,14 +94,13 @@ class GeneralEncrypt {
88
94
  let enc;
89
95
  for (let i = 0; i < this._recipients.length; i++) {
90
96
  const recipient = this._recipients[i];
91
- const { unprotectedHeader, options: recipientOpts } = recipientRef.get(recipient);
92
- if (!(0, is_disjoint_js_1.default)(this._protectedHeader, this._unprotectedHeader, unprotectedHeader)) {
97
+ if (!(0, is_disjoint_js_1.default)(this._protectedHeader, this._unprotectedHeader, recipient.unprotectedHeader)) {
93
98
  throw new errors_js_1.JWEInvalid('JWE Protected, JWE Shared Unprotected and JWE Per-Recipient Header Parameter names must be disjoint');
94
99
  }
95
100
  const joseHeader = {
96
101
  ...this._protectedHeader,
97
102
  ...this._unprotectedHeader,
98
- ...unprotectedHeader,
103
+ ...recipient.unprotectedHeader,
99
104
  };
100
105
  const { alg } = joseHeader;
101
106
  if (typeof alg !== 'string' || !alg) {
@@ -113,7 +118,7 @@ class GeneralEncrypt {
113
118
  else if (enc !== joseHeader.enc) {
114
119
  throw new errors_js_1.JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
115
120
  }
116
- (0, validate_crit_js_1.default)(errors_js_1.JWEInvalid, new Map(), recipientOpts === null || recipientOpts === void 0 ? void 0 : recipientOpts.crit, this._protectedHeader, joseHeader);
121
+ (0, validate_crit_js_1.default)(errors_js_1.JWEInvalid, new Map(), recipient.options.crit, this._protectedHeader, joseHeader);
117
122
  if (joseHeader.zip !== undefined) {
118
123
  if (!this._protectedHeader || !this._protectedHeader.zip) {
119
124
  throw new errors_js_1.JWEInvalid('JWE "zip" (Compression Algorithm) Header MUST be integrity protected');
@@ -131,15 +136,18 @@ class GeneralEncrypt {
131
136
  const recipient = this._recipients[i];
132
137
  const target = {};
133
138
  jwe.recipients.push(target);
134
- const { unprotectedHeader, options: recipientOpts, key } = recipientRef.get(recipient);
135
139
  if (i === 0) {
136
140
  const flattened = await new encrypt_js_1.FlattenedEncrypt(this._plaintext)
137
141
  .setAdditionalAuthenticatedData(this._aad)
138
142
  .setContentEncryptionKey(cek)
139
143
  .setProtectedHeader(this._protectedHeader)
140
144
  .setSharedUnprotectedHeader(this._unprotectedHeader)
141
- .setUnprotectedHeader(unprotectedHeader)
142
- .encrypt(key, { ...recipientOpts, ...options, [encrypt_js_1.unprotected]: true });
145
+ .setUnprotectedHeader(recipient.unprotectedHeader)
146
+ .encrypt(recipient.key, {
147
+ ...recipient.options,
148
+ ...options,
149
+ [encrypt_js_1.unprotected]: true,
150
+ });
143
151
  jwe.ciphertext = flattened.ciphertext;
144
152
  jwe.iv = flattened.iv;
145
153
  jwe.tag = flattened.tag;
@@ -154,10 +162,12 @@ class GeneralEncrypt {
154
162
  target.header = flattened.header;
155
163
  continue;
156
164
  }
157
- const { encryptedKey, parameters } = await (0, encrypt_key_management_js_1.default)((unprotectedHeader === null || unprotectedHeader === void 0 ? void 0 : unprotectedHeader.alg) || ((_a = this._protectedHeader) === null || _a === void 0 ? void 0 : _a.alg) || ((_b = this._unprotectedHeader) === null || _b === void 0 ? void 0 : _b.alg), enc, key, cek);
165
+ const { encryptedKey, parameters } = await (0, encrypt_key_management_js_1.default)(((_a = recipient.unprotectedHeader) === null || _a === void 0 ? void 0 : _a.alg) ||
166
+ ((_b = this._protectedHeader) === null || _b === void 0 ? void 0 : _b.alg) ||
167
+ ((_c = this._unprotectedHeader) === null || _c === void 0 ? void 0 : _c.alg), enc, recipient.key, cek);
158
168
  target.encrypted_key = (0, base64url_js_1.encode)(encryptedKey);
159
- if (unprotectedHeader || parameters)
160
- target.header = { ...unprotectedHeader, ...parameters };
169
+ if (recipient.unprotectedHeader || parameters)
170
+ target.header = { ...recipient.unprotectedHeader, ...parameters };
161
171
  }
162
172
  return jwe;
163
173
  }
@@ -40,17 +40,21 @@ class RemoteJWKSet {
40
40
  }
41
41
  return Date.now() < this._cooldownStarted + this._cooldownDuration;
42
42
  }
43
- async getKey(protectedHeader) {
43
+ async getKey(protectedHeader, token) {
44
+ const joseHeader = {
45
+ ...protectedHeader,
46
+ ...token.header,
47
+ };
44
48
  if (!this._jwks) {
45
49
  await this.reload();
46
50
  }
47
51
  const candidates = this._jwks.keys.filter((jwk) => {
48
- let candidate = jwk.kty === getKtyFromAlg(protectedHeader.alg);
49
- if (candidate && typeof protectedHeader.kid === 'string') {
50
- candidate = protectedHeader.kid === jwk.kid;
52
+ let candidate = jwk.kty === getKtyFromAlg(joseHeader.alg);
53
+ if (candidate && typeof joseHeader.kid === 'string') {
54
+ candidate = joseHeader.kid === jwk.kid;
51
55
  }
52
56
  if (candidate && typeof jwk.alg === 'string') {
53
- candidate = protectedHeader.alg === jwk.alg;
57
+ candidate = joseHeader.alg === jwk.alg;
54
58
  }
55
59
  if (candidate && typeof jwk.use === 'string') {
56
60
  candidate = jwk.use === 'sig';
@@ -58,11 +62,11 @@ class RemoteJWKSet {
58
62
  if (candidate && Array.isArray(jwk.key_ops)) {
59
63
  candidate = jwk.key_ops.includes('verify');
60
64
  }
61
- if (candidate && protectedHeader.alg === 'EdDSA') {
65
+ if (candidate && joseHeader.alg === 'EdDSA') {
62
66
  candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';
63
67
  }
64
68
  if (candidate) {
65
- switch (protectedHeader.alg) {
69
+ switch (joseHeader.alg) {
66
70
  case 'ES256':
67
71
  candidate = jwk.crv === 'P-256';
68
72
  break;
@@ -84,7 +88,7 @@ class RemoteJWKSet {
84
88
  if (length === 0) {
85
89
  if (this.coolingDown() === false) {
86
90
  await this.reload();
87
- return this.getKey(protectedHeader);
91
+ return this.getKey(protectedHeader, token);
88
92
  }
89
93
  throw new errors_js_1.JWKSNoMatchingKey();
90
94
  }
@@ -92,14 +96,14 @@ class RemoteJWKSet {
92
96
  throw new errors_js_1.JWKSMultipleMatchingKeys();
93
97
  }
94
98
  const cached = this._cached.get(jwk) || this._cached.set(jwk, {}).get(jwk);
95
- if (cached[protectedHeader.alg] === undefined) {
96
- const keyObject = await (0, import_js_1.importJWK)({ ...jwk, ext: true }, protectedHeader.alg);
99
+ if (cached[joseHeader.alg] === undefined) {
100
+ const keyObject = await (0, import_js_1.importJWK)({ ...jwk, ext: true }, joseHeader.alg);
97
101
  if (keyObject instanceof Uint8Array || keyObject.type !== 'public') {
98
102
  throw new errors_js_1.JWKSInvalid('JSON Web Key Set members must be public keys');
99
103
  }
100
- cached[protectedHeader.alg] = keyObject;
104
+ cached[joseHeader.alg] = keyObject;
101
105
  }
102
- return cached[protectedHeader.alg];
106
+ return cached[joseHeader.alg];
103
107
  }
104
108
  async reload() {
105
109
  if (!this._pendingFetch) {
@@ -3,33 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GeneralSign = void 0;
4
4
  const sign_js_1 = require("../flattened/sign.js");
5
5
  const errors_js_1 = require("../../util/errors.js");
6
- const signatureRef = new WeakMap();
7
6
  class IndividualSignature {
7
+ constructor(sig, key, options) {
8
+ this.parent = sig;
9
+ this.key = key;
10
+ this.options = options;
11
+ }
8
12
  setProtectedHeader(protectedHeader) {
9
- if (this._protectedHeader) {
13
+ if (this.protectedHeader) {
10
14
  throw new TypeError('setProtectedHeader can only be called once');
11
15
  }
12
- this._protectedHeader = protectedHeader;
16
+ this.protectedHeader = protectedHeader;
13
17
  return this;
14
18
  }
15
19
  setUnprotectedHeader(unprotectedHeader) {
16
- if (this._unprotectedHeader) {
20
+ if (this.unprotectedHeader) {
17
21
  throw new TypeError('setUnprotectedHeader can only be called once');
18
22
  }
19
- this._unprotectedHeader = unprotectedHeader;
23
+ this.unprotectedHeader = unprotectedHeader;
20
24
  return this;
21
25
  }
22
- set _protectedHeader(value) {
23
- signatureRef.get(this).protectedHeader = value;
24
- }
25
- get _protectedHeader() {
26
- return signatureRef.get(this).protectedHeader;
26
+ addSignature(...args) {
27
+ return this.parent.addSignature(...args);
27
28
  }
28
- set _unprotectedHeader(value) {
29
- signatureRef.get(this).unprotectedHeader = value;
29
+ sign(...args) {
30
+ return this.parent.sign(...args);
30
31
  }
31
- get _unprotectedHeader() {
32
- return signatureRef.get(this).unprotectedHeader;
32
+ done() {
33
+ return this.parent;
33
34
  }
34
35
  }
35
36
  class GeneralSign {
@@ -38,8 +39,7 @@ class GeneralSign {
38
39
  this._payload = payload;
39
40
  }
40
41
  addSignature(key, options) {
41
- const signature = new IndividualSignature();
42
- signatureRef.set(signature, { key, options });
42
+ const signature = new IndividualSignature(this, key, options);
43
43
  this._signatures.push(signature);
44
44
  return signature;
45
45
  }
@@ -51,23 +51,19 @@ class GeneralSign {
51
51
  signatures: [],
52
52
  payload: '',
53
53
  };
54
- let payloads = new Set();
55
- await Promise.all(this._signatures.map(async (sig) => {
56
- const { protectedHeader, unprotectedHeader, options, key } = signatureRef.get(sig);
54
+ for (let i = 0; i < this._signatures.length; i++) {
55
+ const signature = this._signatures[i];
57
56
  const flattened = new sign_js_1.FlattenedSign(this._payload);
58
- if (protectedHeader) {
59
- flattened.setProtectedHeader(protectedHeader);
57
+ flattened.setProtectedHeader(signature.protectedHeader);
58
+ flattened.setUnprotectedHeader(signature.unprotectedHeader);
59
+ const { payload, ...rest } = await flattened.sign(signature.key, signature.options);
60
+ if (i === 0) {
61
+ jws.payload = payload;
60
62
  }
61
- if (unprotectedHeader) {
62
- flattened.setUnprotectedHeader(unprotectedHeader);
63
+ else if (jws.payload !== payload) {
64
+ throw new errors_js_1.JWSInvalid('inconsistent use of JWS Unencoded Payload Option (RFC7797)');
63
65
  }
64
- const { payload, ...rest } = await flattened.sign(key, options);
65
- payloads.add(payload);
66
- jws.payload = payload;
67
66
  jws.signatures.push(rest);
68
- }));
69
- if (payloads.size !== 1) {
70
- throw new errors_js_1.JWSInvalid('inconsistent use of JWS Unencoded Payload Option (RFC7797)');
71
67
  }
72
68
  return jws;
73
69
  }
@@ -5,18 +5,17 @@ const errors_js_1 = require("../util/errors.js");
5
5
  const random_js_1 = require("../runtime/random.js");
6
6
  function bitLength(alg) {
7
7
  switch (alg) {
8
- case 'A128CBC-HS256':
9
- return 256;
10
- case 'A192CBC-HS384':
11
- return 384;
12
- case 'A256CBC-HS512':
13
- return 512;
14
8
  case 'A128GCM':
15
9
  return 128;
16
10
  case 'A192GCM':
17
11
  return 192;
18
12
  case 'A256GCM':
13
+ case 'A128CBC-HS256':
19
14
  return 256;
15
+ case 'A192CBC-HS384':
16
+ return 384;
17
+ case 'A256CBC-HS512':
18
+ return 512;
20
19
  default:
21
20
  throw new errors_js_1.JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);
22
21
  }
@@ -42,7 +42,7 @@ async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) {
42
42
  throw new errors_js_1.JWEInvalid(`JOSE Header "apv" (Agreement PartyVInfo) invalid`);
43
43
  partyVInfo = (0, base64url_js_1.decode)(joseHeader.apv);
44
44
  }
45
- const sharedSecret = await ECDH.deriveKey(epk, key, alg === 'ECDH-ES' ? joseHeader.enc : alg, parseInt(alg.substr(-5, 3), 10) || (0, cek_js_1.bitLength)(joseHeader.enc), partyUInfo, partyVInfo);
45
+ const sharedSecret = await ECDH.deriveKey(epk, key, alg === 'ECDH-ES' ? joseHeader.enc : alg, alg === 'ECDH-ES' ? (0, cek_js_1.bitLength)(joseHeader.enc) : parseInt(alg.substr(-5, 3), 10), partyUInfo, partyVInfo);
46
46
  if (alg === 'ECDH-ES')
47
47
  return sharedSecret;
48
48
  if (encryptedKey === undefined)
@@ -31,7 +31,7 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
31
31
  let { epk: ephemeralKey } = providedParameters;
32
32
  ephemeralKey || (ephemeralKey = await ECDH.generateEpk(key));
33
33
  const { x, y, crv, kty } = await (0, export_js_1.exportJWK)(ephemeralKey);
34
- const sharedSecret = await ECDH.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, parseInt(alg.substr(-5, 3), 10) || (0, cek_js_1.bitLength)(enc), apu, apv);
34
+ const sharedSecret = await ECDH.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, alg === 'ECDH-ES' ? (0, cek_js_1.bitLength)(enc) : parseInt(alg.substr(-5, 3), 10), apu, apv);
35
35
  parameters = { epk: { x, y, crv, kty } };
36
36
  if (apu)
37
37
  parameters.apu = (0, base64url_js_1.encode)(apu);
@@ -5,24 +5,17 @@ const errors_js_1 = require("../util/errors.js");
5
5
  const random_js_1 = require("../runtime/random.js");
6
6
  function bitLength(alg) {
7
7
  switch (alg) {
8
- case 'A128CBC-HS256':
9
- return 128;
10
8
  case 'A128GCM':
11
- return 96;
12
9
  case 'A128GCMKW':
13
- return 96;
14
- case 'A192CBC-HS384':
15
- return 128;
16
10
  case 'A192GCM':
17
- return 96;
18
11
  case 'A192GCMKW':
19
- return 96;
20
- case 'A256CBC-HS512':
21
- return 128;
22
12
  case 'A256GCM':
23
- return 96;
24
13
  case 'A256GCMKW':
25
14
  return 96;
15
+ case 'A128CBC-HS256':
16
+ case 'A192CBC-HS384':
17
+ case 'A256CBC-HS512':
18
+ return 128;
26
19
  default:
27
20
  throw new errors_js_1.JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);
28
21
  }
@@ -11,6 +11,7 @@ const crypto_key_js_1 = require("../lib/crypto_key.js");
11
11
  const is_key_object_js_1 = require("./is_key_object.js");
12
12
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
13
13
  const ciphers_js_1 = require("./ciphers.js");
14
+ const is_key_like_js_1 = require("./is_key_like.js");
14
15
  function checkKeySize(key, alg) {
15
16
  if (key.symmetricKeySize << 3 !== parseInt(alg.substr(1, 3), 10)) {
16
17
  throw new TypeError(`Invalid key size for alg: ${alg}`);
@@ -27,9 +28,9 @@ function ensureKeyObject(key, alg, usage) {
27
28
  (0, crypto_key_js_1.checkEncCryptoKey)(key, alg, usage);
28
29
  return crypto_1.KeyObject.from(key);
29
30
  }
30
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
31
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types, 'Uint8Array'));
31
32
  }
32
- const wrap = async (alg, key, cek) => {
33
+ const wrap = (alg, key, cek) => {
33
34
  const size = parseInt(alg.substr(1, 3), 10);
34
35
  const algorithm = `aes${size}-wrap`;
35
36
  if (!(0, ciphers_js_1.default)(algorithm)) {
@@ -41,7 +42,7 @@ const wrap = async (alg, key, cek) => {
41
42
  return (0, buffer_utils_js_1.concat)(cipher.update(cek), cipher.final());
42
43
  };
43
44
  exports.wrap = wrap;
44
- const unwrap = async (alg, key, encryptedKey) => {
45
+ const unwrap = (alg, key, encryptedKey) => {
45
46
  const size = parseInt(alg.substr(1, 3), 10);
46
47
  const algorithm = `aes${size}-wrap`;
47
48
  if (!(0, ciphers_js_1.default)(algorithm)) {
@@ -6,6 +6,7 @@ const buffer_1 = require("buffer");
6
6
  const webcrypto_js_1 = require("./webcrypto.js");
7
7
  const is_key_object_js_1 = require("./is_key_object.js");
8
8
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
9
+ const is_key_like_js_1 = require("./is_key_like.js");
9
10
  const genericExport = (keyType, keyFormat, key) => {
10
11
  let keyObject;
11
12
  if ((0, webcrypto_js_1.isCryptoKey)(key)) {
@@ -18,7 +19,7 @@ const genericExport = (keyType, keyFormat, key) => {
18
19
  keyObject = key;
19
20
  }
20
21
  else {
21
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
22
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types));
22
23
  }
23
24
  if (keyObject.type !== keyType) {
24
25
  throw new TypeError(`key is not a ${keyType} key`);
@@ -12,7 +12,8 @@ const crypto_key_js_1 = require("../lib/crypto_key.js");
12
12
  const is_key_object_js_1 = require("./is_key_object.js");
13
13
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
14
14
  const ciphers_js_1 = require("./ciphers.js");
15
- async function cbcDecrypt(enc, cek, ciphertext, iv, tag, aad) {
15
+ const is_key_like_js_1 = require("./is_key_like.js");
16
+ function cbcDecrypt(enc, cek, ciphertext, iv, tag, aad) {
16
17
  const keySize = parseInt(enc.substr(1, 3), 10);
17
18
  if ((0, is_key_object_js_1.default)(cek)) {
18
19
  cek = cek.export();
@@ -46,7 +47,7 @@ async function cbcDecrypt(enc, cek, ciphertext, iv, tag, aad) {
46
47
  }
47
48
  return plaintext;
48
49
  }
49
- async function gcmDecrypt(enc, cek, ciphertext, iv, tag, aad) {
50
+ function gcmDecrypt(enc, cek, ciphertext, iv, tag, aad) {
50
51
  const keySize = parseInt(enc.substr(1, 3), 10);
51
52
  const algorithm = `aes-${keySize}-gcm`;
52
53
  if (!(0, ciphers_js_1.default)(algorithm)) {
@@ -66,7 +67,7 @@ async function gcmDecrypt(enc, cek, ciphertext, iv, tag, aad) {
66
67
  throw new errors_js_1.JWEDecryptionFailed();
67
68
  }
68
69
  }
69
- const decrypt = async (enc, cek, ciphertext, iv, tag, aad) => {
70
+ const decrypt = (enc, cek, ciphertext, iv, tag, aad) => {
70
71
  let key;
71
72
  if ((0, webcrypto_js_1.isCryptoKey)(cek)) {
72
73
  (0, crypto_key_js_1.checkEncCryptoKey)(cek, enc, 'decrypt');
@@ -76,7 +77,7 @@ const decrypt = async (enc, cek, ciphertext, iv, tag, aad) => {
76
77
  key = cek;
77
78
  }
78
79
  else {
79
- throw new TypeError((0, invalid_key_input_js_1.default)(cek, 'KeyObject', 'CryptoKey', 'Uint8Array'));
80
+ throw new TypeError((0, invalid_key_input_js_1.default)(cek, ...is_key_like_js_1.types, 'Uint8Array'));
80
81
  }
81
82
  (0, check_cek_length_js_1.default)(enc, key);
82
83
  (0, check_iv_length_js_1.default)(enc, iv);
@@ -11,8 +11,9 @@ const webcrypto_js_1 = require("./webcrypto.js");
11
11
  const crypto_key_js_1 = require("../lib/crypto_key.js");
12
12
  const is_key_object_js_1 = require("./is_key_object.js");
13
13
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
14
+ const is_key_like_js_1 = require("./is_key_like.js");
14
15
  const generateKeyPair = (0, util_1.promisify)(crypto_1.generateKeyPair);
15
- const deriveKey = async (publicKee, privateKee, algorithm, keyLength, apu = new Uint8Array(0), apv = new Uint8Array(0)) => {
16
+ const deriveKey = (publicKee, privateKee, algorithm, keyLength, apu = new Uint8Array(0), apv = new Uint8Array(0)) => {
16
17
  let publicKey;
17
18
  if ((0, webcrypto_js_1.isCryptoKey)(publicKee)) {
18
19
  (0, crypto_key_js_1.checkEncCryptoKey)(publicKee, 'ECDH-ES');
@@ -22,7 +23,7 @@ const deriveKey = async (publicKee, privateKee, algorithm, keyLength, apu = new
22
23
  publicKey = publicKee;
23
24
  }
24
25
  else {
25
- throw new TypeError((0, invalid_key_input_js_1.default)(publicKee, 'KeyObject', 'CryptoKey'));
26
+ throw new TypeError((0, invalid_key_input_js_1.default)(publicKee, ...is_key_like_js_1.types));
26
27
  }
27
28
  let privateKey;
28
29
  if ((0, webcrypto_js_1.isCryptoKey)(privateKee)) {
@@ -33,7 +34,7 @@ const deriveKey = async (publicKee, privateKee, algorithm, keyLength, apu = new
33
34
  privateKey = privateKee;
34
35
  }
35
36
  else {
36
- throw new TypeError((0, invalid_key_input_js_1.default)(privateKee, 'KeyObject', 'CryptoKey'));
37
+ throw new TypeError((0, invalid_key_input_js_1.default)(privateKee, ...is_key_like_js_1.types));
37
38
  }
38
39
  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));
39
40
  const sharedSecret = (0, crypto_1.diffieHellman)({ privateKey, publicKey });
@@ -49,7 +50,7 @@ const generateEpk = async (kee) => {
49
50
  key = kee;
50
51
  }
51
52
  else {
52
- throw new TypeError((0, invalid_key_input_js_1.default)(kee, 'KeyObject', 'CryptoKey'));
53
+ throw new TypeError((0, invalid_key_input_js_1.default)(kee, ...is_key_like_js_1.types));
53
54
  }
54
55
  switch (key.asymmetricKeyType) {
55
56
  case 'x25519':
@@ -11,7 +11,8 @@ const is_key_object_js_1 = require("./is_key_object.js");
11
11
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
12
12
  const errors_js_1 = require("../util/errors.js");
13
13
  const ciphers_js_1 = require("./ciphers.js");
14
- async function cbcEncrypt(enc, plaintext, cek, iv, aad) {
14
+ const is_key_like_js_1 = require("./is_key_like.js");
15
+ function cbcEncrypt(enc, plaintext, cek, iv, aad) {
15
16
  const keySize = parseInt(enc.substr(1, 3), 10);
16
17
  if ((0, is_key_object_js_1.default)(cek)) {
17
18
  cek = cek.export();
@@ -28,7 +29,7 @@ async function cbcEncrypt(enc, plaintext, cek, iv, aad) {
28
29
  const tag = (0, cbc_tag_js_1.default)(aad, iv, ciphertext, macSize, macKey, keySize);
29
30
  return { ciphertext, tag };
30
31
  }
31
- async function gcmEncrypt(enc, plaintext, cek, iv, aad) {
32
+ function gcmEncrypt(enc, plaintext, cek, iv, aad) {
32
33
  const keySize = parseInt(enc.substr(1, 3), 10);
33
34
  const algorithm = `aes-${keySize}-gcm`;
34
35
  if (!(0, ciphers_js_1.default)(algorithm)) {
@@ -43,7 +44,7 @@ async function gcmEncrypt(enc, plaintext, cek, iv, aad) {
43
44
  const tag = cipher.getAuthTag();
44
45
  return { ciphertext, tag };
45
46
  }
46
- const encrypt = async (enc, plaintext, cek, iv, aad) => {
47
+ const encrypt = (enc, plaintext, cek, iv, aad) => {
47
48
  let key;
48
49
  if ((0, webcrypto_js_1.isCryptoKey)(cek)) {
49
50
  (0, crypto_key_js_1.checkEncCryptoKey)(cek, enc, 'encrypt');
@@ -53,7 +54,7 @@ const encrypt = async (enc, plaintext, cek, iv, aad) => {
53
54
  key = cek;
54
55
  }
55
56
  else {
56
- throw new TypeError((0, invalid_key_input_js_1.default)(cek, 'KeyObject', 'CryptoKey', 'Uint8Array'));
57
+ throw new TypeError((0, invalid_key_input_js_1.default)(cek, ...is_key_like_js_1.types, 'Uint8Array'));
57
58
  }
58
59
  (0, check_cek_length_js_1.default)(enc, key);
59
60
  (0, check_iv_length_js_1.default)(enc, iv);
@@ -7,6 +7,7 @@ const errors_js_1 = require("../util/errors.js");
7
7
  const webcrypto_js_1 = require("./webcrypto.js");
8
8
  const is_key_object_js_1 = require("./is_key_object.js");
9
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");
10
11
  const p256 = buffer_1.Buffer.from([42, 134, 72, 206, 61, 3, 1, 7]);
11
12
  const p384 = buffer_1.Buffer.from([43, 129, 4, 0, 34]);
12
13
  const p521 = buffer_1.Buffer.from([43, 129, 4, 0, 35]);
@@ -36,7 +37,7 @@ const getNamedCurve = (kee, raw) => {
36
37
  key = kee;
37
38
  }
38
39
  else {
39
- throw new TypeError((0, invalid_key_input_js_1.default)(kee, 'KeyObject', 'CryptoKey'));
40
+ throw new TypeError((0, invalid_key_input_js_1.default)(kee, ...is_key_like_js_1.types));
40
41
  }
41
42
  if (key.type === 'secret') {
42
43
  throw new TypeError('only "private" or "public" type keys can be used for this operation');
@@ -5,10 +5,11 @@ const webcrypto_js_1 = require("./webcrypto.js");
5
5
  const crypto_key_js_1 = require("../lib/crypto_key.js");
6
6
  const secret_key_js_1 = require("./secret_key.js");
7
7
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
8
+ const is_key_like_js_1 = require("./is_key_like.js");
8
9
  function getSignVerifyKey(alg, key, usage) {
9
10
  if (key instanceof Uint8Array) {
10
11
  if (!alg.startsWith('HS')) {
11
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
12
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types));
12
13
  }
13
14
  return (0, secret_key_js_1.default)(key);
14
15
  }
@@ -19,6 +20,6 @@ function getSignVerifyKey(alg, key, usage) {
19
20
  (0, crypto_key_js_1.checkSigCryptoKey)(key, alg, usage);
20
21
  return crypto_1.KeyObject.from(key);
21
22
  }
22
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
23
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types, 'Uint8Array'));
23
24
  }
24
25
  exports.default = getSignVerifyKey;
@@ -8,6 +8,7 @@ const get_named_curve_js_1 = require("./get_named_curve.js");
8
8
  const webcrypto_js_1 = require("./webcrypto.js");
9
9
  const is_key_object_js_1 = require("./is_key_object.js");
10
10
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
11
+ const is_key_like_js_1 = require("./is_key_like.js");
11
12
  const [major, minor] = process.version
12
13
  .substr(1)
13
14
  .split('.')
@@ -31,7 +32,7 @@ const keyToJWK = (key) => {
31
32
  };
32
33
  }
33
34
  else {
34
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
35
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types, 'Uint8Array'));
35
36
  }
36
37
  if (jwkExportSupported) {
37
38
  return keyObject.export({ format: 'jwk' });
@@ -12,6 +12,7 @@ const webcrypto_js_1 = require("./webcrypto.js");
12
12
  const crypto_key_js_1 = require("../lib/crypto_key.js");
13
13
  const is_key_object_js_1 = require("./is_key_object.js");
14
14
  const invalid_key_input_js_1 = require("../lib/invalid_key_input.js");
15
+ const is_key_like_js_1 = require("./is_key_like.js");
15
16
  const pbkdf2 = (0, util_1.promisify)(crypto_1.pbkdf2);
16
17
  function getPassword(key, alg) {
17
18
  if ((0, is_key_object_js_1.default)(key)) {
@@ -24,7 +25,7 @@ function getPassword(key, alg) {
24
25
  (0, crypto_key_js_1.checkEncCryptoKey)(key, alg, 'deriveBits', 'deriveKey');
25
26
  return crypto_1.KeyObject.from(key).export();
26
27
  }
27
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey', 'Uint8Array'));
28
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types, 'Uint8Array'));
28
29
  }
29
30
  const encrypt = async (alg, key, cek, p2c = Math.floor(Math.random() * 2049) + 2048, p2s = (0, random_js_1.default)(new Uint8Array(16))) => {
30
31
  (0, check_p2s_js_1.default)(p2s);
@@ -7,6 +7,7 @@ const webcrypto_js_1 = require("./webcrypto.js");
7
7
  const crypto_key_js_1 = require("../lib/crypto_key.js");
8
8
  const is_key_object_js_1 = require("./is_key_object.js");
9
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");
10
11
  const checkKey = (key, alg) => {
11
12
  if (key.asymmetricKeyType !== 'rsa') {
12
13
  throw new TypeError('Invalid key for this operation, its asymmetricKeyType must be rsa');
@@ -48,9 +49,9 @@ function ensureKeyObject(key, alg, ...usages) {
48
49
  (0, crypto_key_js_1.checkEncCryptoKey)(key, alg, ...usages);
49
50
  return crypto_1.KeyObject.from(key);
50
51
  }
51
- throw new TypeError((0, invalid_key_input_js_1.default)(key, 'KeyObject', 'CryptoKey'));
52
+ throw new TypeError((0, invalid_key_input_js_1.default)(key, ...is_key_like_js_1.types));
52
53
  }
53
- const encrypt = async (alg, key, cek) => {
54
+ const encrypt = (alg, key, cek) => {
54
55
  const padding = resolvePadding(alg);
55
56
  const oaepHash = resolveOaepHash(alg);
56
57
  const keyObject = ensureKeyObject(key, alg, 'wrapKey', 'encrypt');
@@ -58,7 +59,7 @@ const encrypt = async (alg, key, cek) => {
58
59
  return (0, crypto_1.publicEncrypt)({ key: keyObject, oaepHash, padding }, cek);
59
60
  };
60
61
  exports.encrypt = encrypt;
61
- const decrypt = async (alg, key, encryptedKey) => {
62
+ const decrypt = (alg, key, encryptedKey) => {
62
63
  const padding = resolvePadding(alg);
63
64
  const oaepHash = resolveOaepHash(alg);
64
65
  const keyObject = ensureKeyObject(key, alg, 'unwrapKey', 'decrypt');