jose 4.15.4 → 5.0.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 (155) hide show
  1. package/README.md +2 -1
  2. package/dist/browser/index.js +2 -4
  3. package/dist/browser/jwe/flattened/decrypt.js +13 -22
  4. package/dist/browser/jwe/flattened/encrypt.js +3 -18
  5. package/dist/browser/jwe/general/decrypt.js +1 -1
  6. package/dist/browser/jwe/general/encrypt.js +8 -13
  7. package/dist/browser/jwk/embedded.js +2 -2
  8. package/dist/browser/jwk/thumbprint.js +2 -2
  9. package/dist/browser/jwks/local.js +2 -2
  10. package/dist/browser/jwks/remote.js +4 -4
  11. package/dist/browser/jws/flattened/sign.js +1 -1
  12. package/dist/browser/jws/flattened/verify.js +6 -7
  13. package/dist/browser/jws/general/verify.js +1 -1
  14. package/dist/browser/jwt/produce.js +19 -4
  15. package/dist/browser/jwt/sign.js +1 -2
  16. package/dist/browser/jwt/unsecured.js +1 -1
  17. package/dist/browser/jwt/verify.js +1 -2
  18. package/dist/browser/key/import.js +1 -6
  19. package/dist/browser/lib/decrypt_key_management.js +6 -6
  20. package/dist/browser/lib/jwt_claims_set.js +1 -1
  21. package/dist/browser/runtime/asn1.js +1 -2
  22. package/dist/browser/runtime/base64url.js +1 -1
  23. package/dist/browser/runtime/decrypt.js +3 -3
  24. package/dist/browser/runtime/fetch_jwks.js +1 -1
  25. package/dist/browser/runtime/generate.js +5 -8
  26. package/dist/browser/runtime/jwk_to_key.js +2 -45
  27. package/dist/browser/runtime/verify.js +1 -1
  28. package/dist/browser/util/decode_jwt.js +2 -2
  29. package/dist/browser/util/decode_protected_header.js +1 -1
  30. package/dist/browser/util/errors.js +1 -2
  31. package/dist/node/cjs/jwe/compact/encrypt.js +1 -0
  32. package/dist/node/cjs/jwe/flattened/decrypt.js +7 -16
  33. package/dist/node/cjs/jwe/flattened/encrypt.js +12 -19
  34. package/dist/node/cjs/jwe/general/encrypt.js +16 -13
  35. package/dist/node/cjs/jwk/embedded.js +2 -2
  36. package/dist/node/cjs/jwk/thumbprint.js +2 -2
  37. package/dist/node/cjs/jwks/local.js +3 -2
  38. package/dist/node/cjs/jwks/remote.js +13 -6
  39. package/dist/node/cjs/jws/compact/sign.js +1 -0
  40. package/dist/node/cjs/jws/flattened/sign.js +4 -1
  41. package/dist/node/cjs/jws/flattened/verify.js +3 -4
  42. package/dist/node/cjs/jws/general/sign.js +7 -1
  43. package/dist/node/cjs/jwt/encrypt.js +7 -0
  44. package/dist/node/cjs/jwt/produce.js +20 -4
  45. package/dist/node/cjs/jwt/sign.js +2 -2
  46. package/dist/node/cjs/jwt/verify.js +1 -2
  47. package/dist/node/cjs/key/import.js +2 -7
  48. package/dist/node/cjs/lib/aesgcmkw.js +1 -1
  49. package/dist/node/cjs/lib/decrypt_key_management.js +1 -1
  50. package/dist/node/cjs/lib/encrypt_key_management.js +1 -1
  51. package/dist/node/cjs/runtime/aeskw.js +6 -6
  52. package/dist/node/cjs/runtime/asn1.js +8 -8
  53. package/dist/node/cjs/runtime/base64url.js +6 -11
  54. package/dist/node/cjs/runtime/cbc_tag.js +2 -2
  55. package/dist/node/cjs/runtime/check_key_length.js +8 -0
  56. package/dist/node/cjs/runtime/ciphers.js +2 -2
  57. package/dist/node/cjs/runtime/decrypt.js +4 -4
  58. package/dist/node/cjs/runtime/digest.js +2 -2
  59. package/dist/node/cjs/runtime/ecdhes.js +7 -7
  60. package/dist/node/cjs/runtime/encrypt.js +4 -4
  61. package/dist/node/cjs/runtime/fetch_jwks.js +4 -4
  62. package/dist/node/cjs/runtime/generate.js +7 -11
  63. package/dist/node/cjs/runtime/get_named_curve.js +7 -45
  64. package/dist/node/cjs/runtime/get_sign_verify_key.js +4 -4
  65. package/dist/node/cjs/runtime/is_key_like.js +1 -1
  66. package/dist/node/cjs/runtime/is_key_object.js +2 -5
  67. package/dist/node/cjs/runtime/jwk_to_key.js +2 -113
  68. package/dist/node/cjs/runtime/key_to_jwk.js +6 -130
  69. package/dist/node/cjs/runtime/node_key.js +9 -18
  70. package/dist/node/cjs/runtime/pbes2kw.js +4 -4
  71. package/dist/node/cjs/runtime/random.js +2 -2
  72. package/dist/node/cjs/runtime/rsaes.js +8 -8
  73. package/dist/node/cjs/runtime/sign.js +3 -9
  74. package/dist/node/cjs/runtime/timing_safe_equal.js +2 -2
  75. package/dist/node/cjs/runtime/verify.js +3 -10
  76. package/dist/node/cjs/runtime/webcrypto.js +4 -6
  77. package/dist/node/cjs/util/errors.js +26 -59
  78. package/dist/node/esm/jwe/compact/encrypt.js +1 -0
  79. package/dist/node/esm/jwe/flattened/decrypt.js +7 -16
  80. package/dist/node/esm/jwe/flattened/encrypt.js +12 -19
  81. package/dist/node/esm/jwe/general/encrypt.js +17 -14
  82. package/dist/node/esm/jwk/embedded.js +2 -2
  83. package/dist/node/esm/jwk/thumbprint.js +2 -2
  84. package/dist/node/esm/jwks/local.js +3 -2
  85. package/dist/node/esm/jwks/remote.js +13 -6
  86. package/dist/node/esm/jws/compact/sign.js +1 -0
  87. package/dist/node/esm/jws/flattened/sign.js +4 -1
  88. package/dist/node/esm/jws/flattened/verify.js +3 -4
  89. package/dist/node/esm/jws/general/sign.js +7 -1
  90. package/dist/node/esm/jwt/encrypt.js +7 -0
  91. package/dist/node/esm/jwt/produce.js +20 -4
  92. package/dist/node/esm/jwt/sign.js +2 -2
  93. package/dist/node/esm/jwt/verify.js +1 -2
  94. package/dist/node/esm/key/import.js +2 -7
  95. package/dist/node/esm/lib/aesgcmkw.js +1 -1
  96. package/dist/node/esm/lib/decrypt_key_management.js +1 -1
  97. package/dist/node/esm/lib/encrypt_key_management.js +1 -1
  98. package/dist/node/esm/runtime/aeskw.js +2 -2
  99. package/dist/node/esm/runtime/asn1.js +2 -2
  100. package/dist/node/esm/runtime/base64url.js +4 -10
  101. package/dist/node/esm/runtime/cbc_tag.js +1 -1
  102. package/dist/node/esm/runtime/check_key_length.js +6 -0
  103. package/dist/node/esm/runtime/ciphers.js +2 -2
  104. package/dist/node/esm/runtime/decrypt.js +1 -1
  105. package/dist/node/esm/runtime/digest.js +1 -1
  106. package/dist/node/esm/runtime/ecdhes.js +2 -2
  107. package/dist/node/esm/runtime/encrypt.js +1 -1
  108. package/dist/node/esm/runtime/fetch_jwks.js +3 -3
  109. package/dist/node/esm/runtime/generate.js +5 -9
  110. package/dist/node/esm/runtime/get_named_curve.js +5 -42
  111. package/dist/node/esm/runtime/get_sign_verify_key.js +1 -1
  112. package/dist/node/esm/runtime/is_key_like.js +1 -1
  113. package/dist/node/esm/runtime/is_key_object.js +2 -5
  114. package/dist/node/esm/runtime/jwk_to_key.js +2 -113
  115. package/dist/node/esm/runtime/key_to_jwk.js +5 -129
  116. package/dist/node/esm/runtime/node_key.js +7 -16
  117. package/dist/node/esm/runtime/pbes2kw.js +2 -2
  118. package/dist/node/esm/runtime/random.js +1 -1
  119. package/dist/node/esm/runtime/rsaes.js +3 -3
  120. package/dist/node/esm/runtime/sign.js +3 -9
  121. package/dist/node/esm/runtime/timing_safe_equal.js +1 -1
  122. package/dist/node/esm/runtime/verify.js +3 -10
  123. package/dist/node/esm/runtime/webcrypto.js +3 -6
  124. package/dist/node/esm/util/errors.js +26 -59
  125. package/dist/types/index.d.ts +1 -1
  126. package/dist/types/jwe/compact/decrypt.d.ts +1 -1
  127. package/dist/types/jwe/flattened/decrypt.d.ts +1 -1
  128. package/dist/types/jwe/general/decrypt.d.ts +1 -1
  129. package/dist/types/jwe/general/encrypt.d.ts +3 -7
  130. package/dist/types/jwk/embedded.d.ts +1 -1
  131. package/dist/types/jwks/local.d.ts +3 -3
  132. package/dist/types/jwks/remote.d.ts +1 -1
  133. package/dist/types/jws/compact/verify.d.ts +1 -1
  134. package/dist/types/jws/flattened/verify.d.ts +1 -1
  135. package/dist/types/jws/general/verify.d.ts +1 -1
  136. package/dist/types/jwt/decrypt.d.ts +3 -3
  137. package/dist/types/jwt/produce.d.ts +12 -12
  138. package/dist/types/jwt/unsecured.d.ts +3 -3
  139. package/dist/types/jwt/verify.d.ts +3 -3
  140. package/dist/types/key/generate_key_pair.d.ts +7 -5
  141. package/dist/types/key/generate_secret.d.ts +1 -1
  142. package/dist/types/key/import.d.ts +4 -6
  143. package/dist/types/types.d.ts +13 -50
  144. package/package.json +1 -1
  145. package/dist/browser/runtime/zlib.js +0 -7
  146. package/dist/node/cjs/runtime/asn1_sequence_decoder.js +0 -47
  147. package/dist/node/cjs/runtime/asn1_sequence_encoder.js +0 -91
  148. package/dist/node/cjs/runtime/check_modulus_length.js +0 -52
  149. package/dist/node/cjs/runtime/flags.js +0 -8
  150. package/dist/node/cjs/runtime/zlib.js +0 -11
  151. package/dist/node/esm/runtime/asn1_sequence_decoder.js +0 -44
  152. package/dist/node/esm/runtime/asn1_sequence_encoder.js +0 -88
  153. package/dist/node/esm/runtime/check_modulus_length.js +0 -48
  154. package/dist/node/esm/runtime/flags.js +0 -5
  155. package/dist/node/esm/runtime/zlib.js +0 -6
@@ -1,8 +1,15 @@
1
1
  import epoch from '../lib/epoch.js';
2
2
  import isObject from '../lib/is_object.js';
3
3
  import secs from '../lib/secs.js';
4
+ function validateInput(label, input) {
5
+ if (!Number.isFinite(input)) {
6
+ throw new TypeError(`Invalid ${label} input`);
7
+ }
8
+ return input;
9
+ }
4
10
  export class ProduceJWT {
5
- constructor(payload) {
11
+ _payload;
12
+ constructor(payload = {}) {
6
13
  if (!isObject(payload)) {
7
14
  throw new TypeError('JWT Claims Set MUST be an object');
8
15
  }
@@ -26,7 +33,10 @@ export class ProduceJWT {
26
33
  }
27
34
  setNotBefore(input) {
28
35
  if (typeof input === 'number') {
29
- this._payload = { ...this._payload, nbf: input };
36
+ this._payload = { ...this._payload, nbf: validateInput('setNotBefore', input) };
37
+ }
38
+ else if (input instanceof Date) {
39
+ this._payload = { ...this._payload, nbf: validateInput('setNotBefore', epoch(input)) };
30
40
  }
31
41
  else {
32
42
  this._payload = { ...this._payload, nbf: epoch(new Date()) + secs(input) };
@@ -35,7 +45,10 @@ export class ProduceJWT {
35
45
  }
36
46
  setExpirationTime(input) {
37
47
  if (typeof input === 'number') {
38
- this._payload = { ...this._payload, exp: input };
48
+ this._payload = { ...this._payload, exp: validateInput('setExpirationTime', input) };
49
+ }
50
+ else if (input instanceof Date) {
51
+ this._payload = { ...this._payload, exp: validateInput('setExpirationTime', epoch(input)) };
39
52
  }
40
53
  else {
41
54
  this._payload = { ...this._payload, exp: epoch(new Date()) + secs(input) };
@@ -46,8 +59,11 @@ export class ProduceJWT {
46
59
  if (typeof input === 'undefined') {
47
60
  this._payload = { ...this._payload, iat: epoch(new Date()) };
48
61
  }
62
+ else if (input instanceof Date) {
63
+ this._payload = { ...this._payload, iat: validateInput('setIssuedAt', epoch(input)) };
64
+ }
49
65
  else {
50
- this._payload = { ...this._payload, iat: input };
66
+ this._payload = { ...this._payload, iat: validateInput('setIssuedAt', input) };
51
67
  }
52
68
  return this;
53
69
  }
@@ -3,15 +3,15 @@ import { JWTInvalid } from '../util/errors.js';
3
3
  import { encoder } from '../lib/buffer_utils.js';
4
4
  import { ProduceJWT } from './produce.js';
5
5
  export class SignJWT extends ProduceJWT {
6
+ _protectedHeader;
6
7
  setProtectedHeader(protectedHeader) {
7
8
  this._protectedHeader = protectedHeader;
8
9
  return this;
9
10
  }
10
11
  async sign(key, options) {
11
- var _a;
12
12
  const sig = new CompactSign(encoder.encode(JSON.stringify(this._payload)));
13
13
  sig.setProtectedHeader(this._protectedHeader);
14
- if (Array.isArray((_a = this._protectedHeader) === null || _a === void 0 ? void 0 : _a.crit) &&
14
+ if (Array.isArray(this._protectedHeader?.crit) &&
15
15
  this._protectedHeader.crit.includes('b64') &&
16
16
  this._protectedHeader.b64 === false) {
17
17
  throw new JWTInvalid('JWTs MUST NOT use unencoded payload');
@@ -2,9 +2,8 @@ import { compactVerify } from '../jws/compact/verify.js';
2
2
  import jwtPayload from '../lib/jwt_claims_set.js';
3
3
  import { JWTInvalid } from '../util/errors.js';
4
4
  export async function jwtVerify(jwt, key, options) {
5
- var _a;
6
5
  const verified = await compactVerify(jwt, key, options);
7
- if (((_a = verified.protectedHeader.crit) === null || _a === void 0 ? void 0 : _a.includes('b64')) && verified.protectedHeader.b64 === false) {
6
+ if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {
8
7
  throw new JWTInvalid('JWTs MUST NOT use unencoded payload');
9
8
  }
10
9
  const payload = jwtPayload(verified.protectedHeader, verified.payload, options);
@@ -21,21 +21,16 @@ export async function importPKCS8(pkcs8, alg, options) {
21
21
  }
22
22
  return fromPKCS8(pkcs8, alg, options);
23
23
  }
24
- export async function importJWK(jwk, alg, octAsKeyObject) {
25
- var _a;
24
+ export async function importJWK(jwk, alg) {
26
25
  if (!isObject(jwk)) {
27
26
  throw new TypeError('JWK must be an object');
28
27
  }
29
- alg || (alg = jwk.alg);
28
+ alg ||= jwk.alg;
30
29
  switch (jwk.kty) {
31
30
  case 'oct':
32
31
  if (typeof jwk.k !== 'string' || !jwk.k) {
33
32
  throw new TypeError('missing "k" (Key Value) Parameter value');
34
33
  }
35
- octAsKeyObject !== null && octAsKeyObject !== void 0 ? octAsKeyObject : (octAsKeyObject = jwk.ext !== true);
36
- if (octAsKeyObject) {
37
- return asKeyObject({ ...jwk, alg, ext: (_a = jwk.ext) !== null && _a !== void 0 ? _a : false });
38
- }
39
34
  return decodeBase64URL(jwk.k);
40
35
  case 'RSA':
41
36
  if (jwk.oth !== undefined) {
@@ -4,7 +4,7 @@ import generateIv from './iv.js';
4
4
  import { encode as base64url } from '../runtime/base64url.js';
5
5
  export async function wrap(alg, key, cek, iv) {
6
6
  const jweAlgorithm = alg.slice(0, 7);
7
- iv || (iv = generateIv(jweAlgorithm));
7
+ iv ||= generateIv(jweAlgorithm);
8
8
  const { ciphertext: encryptedKey, tag } = await encrypt(jweAlgorithm, cek, key, iv, new Uint8Array(0));
9
9
  return { encryptedKey, iv: base64url(iv), tag: base64url(tag) };
10
10
  }
@@ -73,7 +73,7 @@ async function decryptKeyManagement(alg, key, encryptedKey, joseHeader, options)
73
73
  throw new JWEInvalid('JWE Encrypted Key missing');
74
74
  if (typeof joseHeader.p2c !== 'number')
75
75
  throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) missing or invalid`);
76
- const p2cLimit = (options === null || options === void 0 ? void 0 : options.maxPBES2Count) || 10000;
76
+ const p2cLimit = options?.maxPBES2Count || 10000;
77
77
  if (joseHeader.p2c > p2cLimit)
78
78
  throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) out is of acceptable bounds`);
79
79
  if (typeof joseHeader.p2s !== 'string')
@@ -27,7 +27,7 @@ async function encryptKeyManagement(alg, enc, key, providedCek, providedParamete
27
27
  }
28
28
  const { apu, apv } = providedParameters;
29
29
  let { epk: ephemeralKey } = providedParameters;
30
- ephemeralKey || (ephemeralKey = (await ECDH.generateEpk(key)).privateKey);
30
+ ephemeralKey ||= (await ECDH.generateEpk(key)).privateKey;
31
31
  const { x, y, crv, kty } = await exportJWK(ephemeralKey);
32
32
  const sharedSecret = await ECDH.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, alg === 'ECDH-ES' ? cekLength(enc) : parseInt(alg.slice(-5, -2), 10), apu, apv);
33
33
  parameters = { epk: { x, crv, kty } };
@@ -1,5 +1,5 @@
1
- import { Buffer } from 'buffer';
2
- import { KeyObject, createDecipheriv, createCipheriv, createSecretKey } from 'crypto';
1
+ import { Buffer } from 'node:buffer';
2
+ import { KeyObject, createDecipheriv, createCipheriv, createSecretKey } from 'node:crypto';
3
3
  import { JOSENotSupported } from '../util/errors.js';
4
4
  import { concat } from '../lib/buffer_utils.js';
5
5
  import { isCryptoKey } from './webcrypto.js';
@@ -1,5 +1,5 @@
1
- import { createPrivateKey, createPublicKey, KeyObject } from 'crypto';
2
- import { Buffer } from 'buffer';
1
+ import { createPrivateKey, createPublicKey, KeyObject } from 'node:crypto';
2
+ import { Buffer } from 'node:buffer';
3
3
  import { isCryptoKey } from './webcrypto.js';
4
4
  import isKeyObject from './is_key_object.js';
5
5
  import invalidKeyInput from '../lib/invalid_key_input.js';
@@ -1,6 +1,5 @@
1
- import { Buffer } from 'buffer';
1
+ import { Buffer } from 'node:buffer';
2
2
  import { decoder } from '../lib/buffer_utils.js';
3
- let encode;
4
3
  function normalize(input) {
5
4
  let encoded = input;
6
5
  if (encoded instanceof Uint8Array) {
@@ -8,13 +7,8 @@ function normalize(input) {
8
7
  }
9
8
  return encoded;
10
9
  }
11
- if (Buffer.isEncoding('base64url')) {
12
- encode = (input) => Buffer.from(input).toString('base64url');
13
- }
14
- else {
15
- encode = (input) => Buffer.from(input).toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
16
- }
17
- export const decodeBase64 = (input) => Buffer.from(input, 'base64');
10
+ const encode = (input) => Buffer.from(input).toString('base64url');
11
+ export const decodeBase64 = (input) => new Uint8Array(Buffer.from(input, 'base64'));
18
12
  export const encodeBase64 = (input) => Buffer.from(input).toString('base64');
19
13
  export { encode };
20
- export const decode = (input) => Buffer.from(normalize(input), 'base64');
14
+ export const decode = (input) => new Uint8Array(Buffer.from(normalize(input), 'base64'));
@@ -1,4 +1,4 @@
1
- import { createHmac } from 'crypto';
1
+ import { createHmac } from 'node:crypto';
2
2
  import { concat, uint64be } from '../lib/buffer_utils.js';
3
3
  export default function cbcTag(aad, iv, ciphertext, macSize, macKey, keySize) {
4
4
  const macData = concat(aad, iv, ciphertext, uint64be(aad.length << 3));
@@ -0,0 +1,6 @@
1
+ export default (key, alg) => {
2
+ const { modulusLength } = key.asymmetricKeyDetails;
3
+ if (typeof modulusLength !== 'number' || modulusLength < 2048) {
4
+ throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);
5
+ }
6
+ };
@@ -1,6 +1,6 @@
1
- import { getCiphers } from 'crypto';
1
+ import { getCiphers } from 'node:crypto';
2
2
  let ciphers;
3
3
  export default (algorithm) => {
4
- ciphers || (ciphers = new Set(getCiphers()));
4
+ ciphers ||= new Set(getCiphers());
5
5
  return ciphers.has(algorithm);
6
6
  };
@@ -1,4 +1,4 @@
1
- import { createDecipheriv, KeyObject } from 'crypto';
1
+ import { createDecipheriv, KeyObject } from 'node:crypto';
2
2
  import checkIvLength from '../lib/check_iv_length.js';
3
3
  import checkCekLength from './check_cek_length.js';
4
4
  import { concat } from '../lib/buffer_utils.js';
@@ -1,3 +1,3 @@
1
- import { createHash } from 'crypto';
1
+ import { createHash } from 'node:crypto';
2
2
  const digest = (algorithm, data) => createHash(algorithm).update(data).digest();
3
3
  export default digest;
@@ -1,5 +1,5 @@
1
- import { diffieHellman, generateKeyPair as generateKeyPairCb, KeyObject } from 'crypto';
2
- import { promisify } from 'util';
1
+ import { diffieHellman, generateKeyPair as generateKeyPairCb, KeyObject } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
3
  import getNamedCurve from './get_named_curve.js';
4
4
  import { encoder, concat, uint32be, lengthAndInput, concatKdf } from '../lib/buffer_utils.js';
5
5
  import { JOSENotSupported } from '../util/errors.js';
@@ -1,4 +1,4 @@
1
- import { createCipheriv, KeyObject } from 'crypto';
1
+ import { createCipheriv, KeyObject } from 'node:crypto';
2
2
  import checkIvLength from '../lib/check_iv_length.js';
3
3
  import checkCekLength from './check_cek_length.js';
4
4
  import { concat } from '../lib/buffer_utils.js';
@@ -1,6 +1,6 @@
1
- import * as http from 'http';
2
- import * as https from 'https';
3
- import { once } from 'events';
1
+ import * as http from 'node:http';
2
+ import * as https from 'node:https';
3
+ import { once } from 'node:events';
4
4
  import { JOSEError, JWKSTimeout } from '../util/errors.js';
5
5
  import { concat, decoder } from '../lib/buffer_utils.js';
6
6
  const fetchJwks = async (url, timeout, options) => {
@@ -1,7 +1,6 @@
1
- import { createSecretKey, generateKeyPair as generateKeyPairCb } from 'crypto';
2
- import { promisify } from 'util';
1
+ import { createSecretKey, generateKeyPair as generateKeyPairCb } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
3
  import random from './random.js';
4
- import { setModulusLength } from './check_modulus_length.js';
5
4
  import { JOSENotSupported } from '../util/errors.js';
6
5
  const generate = promisify(generateKeyPairCb);
7
6
  export async function generateSecret(alg, options) {
@@ -32,7 +31,6 @@ export async function generateSecret(alg, options) {
32
31
  return createSecretKey(random(new Uint8Array(length >> 3)));
33
32
  }
34
33
  export async function generateKeyPair(alg, options) {
35
- var _a, _b;
36
34
  switch (alg) {
37
35
  case 'RS256':
38
36
  case 'RS384':
@@ -45,7 +43,7 @@ export async function generateKeyPair(alg, options) {
45
43
  case 'RSA-OAEP-384':
46
44
  case 'RSA-OAEP-512':
47
45
  case 'RSA1_5': {
48
- const modulusLength = (_a = options === null || options === void 0 ? void 0 : options.modulusLength) !== null && _a !== void 0 ? _a : 2048;
46
+ const modulusLength = options?.modulusLength ?? 2048;
49
47
  if (typeof modulusLength !== 'number' || modulusLength < 2048) {
50
48
  throw new JOSENotSupported('Invalid or unsupported modulusLength option provided, 2048 bits or larger keys must be used');
51
49
  }
@@ -53,8 +51,6 @@ export async function generateKeyPair(alg, options) {
53
51
  modulusLength,
54
52
  publicExponent: 0x10001,
55
53
  });
56
- setModulusLength(keypair.privateKey, modulusLength);
57
- setModulusLength(keypair.publicKey, modulusLength);
58
54
  return keypair;
59
55
  }
60
56
  case 'ES256':
@@ -66,7 +62,7 @@ export async function generateKeyPair(alg, options) {
66
62
  case 'ES512':
67
63
  return generate('ec', { namedCurve: 'P-521' });
68
64
  case 'EdDSA': {
69
- switch (options === null || options === void 0 ? void 0 : options.crv) {
65
+ switch (options?.crv) {
70
66
  case undefined:
71
67
  case 'Ed25519':
72
68
  return generate('ed25519');
@@ -80,7 +76,7 @@ export async function generateKeyPair(alg, options) {
80
76
  case 'ECDH-ES+A128KW':
81
77
  case 'ECDH-ES+A192KW':
82
78
  case 'ECDH-ES+A256KW':
83
- const crv = (_b = options === null || options === void 0 ? void 0 : options.crv) !== null && _b !== void 0 ? _b : 'P-256';
79
+ const crv = options?.crv ?? 'P-256';
84
80
  switch (crv) {
85
81
  case undefined:
86
82
  case 'P-256':
@@ -1,14 +1,9 @@
1
- import { Buffer } from 'buffer';
2
- import { createPublicKey, KeyObject } from 'crypto';
1
+ import { KeyObject } from 'node:crypto';
3
2
  import { JOSENotSupported } from '../util/errors.js';
4
3
  import { isCryptoKey } from './webcrypto.js';
5
4
  import isKeyObject from './is_key_object.js';
6
5
  import invalidKeyInput from '../lib/invalid_key_input.js';
7
6
  import { types } from './is_key_like.js';
8
- const p256 = Buffer.from([42, 134, 72, 206, 61, 3, 1, 7]);
9
- const p384 = Buffer.from([43, 129, 4, 0, 34]);
10
- const p521 = Buffer.from([43, 129, 4, 0, 35]);
11
- const secp256k1 = Buffer.from([43, 129, 4, 0, 10]);
12
7
  export const weakMap = new WeakMap();
13
8
  const namedCurveToJOSE = (namedCurve) => {
14
9
  switch (namedCurve) {
@@ -25,7 +20,6 @@ const namedCurveToJOSE = (namedCurve) => {
25
20
  }
26
21
  };
27
22
  const getNamedCurve = (kee, raw) => {
28
- var _a;
29
23
  let key;
30
24
  if (isCryptoKey(kee)) {
31
25
  key = KeyObject.from(kee);
@@ -47,45 +41,14 @@ const getNamedCurve = (kee, raw) => {
47
41
  case 'x448':
48
42
  return `X${key.asymmetricKeyType.slice(1)}`;
49
43
  case 'ec': {
50
- if (weakMap.has(key)) {
51
- return weakMap.get(key);
52
- }
53
- let namedCurve = (_a = key.asymmetricKeyDetails) === null || _a === void 0 ? void 0 : _a.namedCurve;
54
- if (!namedCurve && key.type === 'private') {
55
- namedCurve = getNamedCurve(createPublicKey(key), true);
56
- }
57
- else if (!namedCurve) {
58
- const buf = key.export({ format: 'der', type: 'spki' });
59
- const i = buf[1] < 128 ? 14 : 15;
60
- const len = buf[i];
61
- const curveOid = buf.slice(i + 1, i + 1 + len);
62
- if (curveOid.equals(p256)) {
63
- namedCurve = 'prime256v1';
64
- }
65
- else if (curveOid.equals(p384)) {
66
- namedCurve = 'secp384r1';
67
- }
68
- else if (curveOid.equals(p521)) {
69
- namedCurve = 'secp521r1';
70
- }
71
- else if (curveOid.equals(secp256k1)) {
72
- namedCurve = 'secp256k1';
73
- }
74
- else {
75
- throw new JOSENotSupported('Unsupported key curve for this operation');
76
- }
77
- }
78
- if (raw)
44
+ let namedCurve = key.asymmetricKeyDetails.namedCurve;
45
+ if (raw) {
79
46
  return namedCurve;
80
- const curve = namedCurveToJOSE(namedCurve);
81
- weakMap.set(key, curve);
82
- return curve;
47
+ }
48
+ return namedCurveToJOSE(namedCurve);
83
49
  }
84
50
  default:
85
51
  throw new TypeError('Invalid asymmetric key type for this operation');
86
52
  }
87
53
  };
88
- export function setCurve(keyObject, curve) {
89
- weakMap.set(keyObject, curve);
90
- }
91
54
  export default getNamedCurve;
@@ -1,4 +1,4 @@
1
- import { KeyObject, createSecretKey } from 'crypto';
1
+ import { KeyObject, createSecretKey } from 'node:crypto';
2
2
  import { isCryptoKey } from './webcrypto.js';
3
3
  import { checkSigCryptoKey } from '../lib/crypto_key.js';
4
4
  import invalidKeyInput from '../lib/invalid_key_input.js';
@@ -2,7 +2,7 @@ import webcrypto, { isCryptoKey } from './webcrypto.js';
2
2
  import isKeyObject from './is_key_object.js';
3
3
  export default (key) => isKeyObject(key) || isCryptoKey(key);
4
4
  const types = ['KeyObject'];
5
- if (globalThis.CryptoKey || (webcrypto === null || webcrypto === void 0 ? void 0 : webcrypto.CryptoKey)) {
5
+ if (globalThis.CryptoKey || webcrypto?.CryptoKey) {
6
6
  types.push('CryptoKey');
7
7
  }
8
8
  export { types };
@@ -1,5 +1,2 @@
1
- import { KeyObject } from 'crypto';
2
- import * as util from 'util';
3
- export default util.types.isKeyObject
4
- ? (obj) => util.types.isKeyObject(obj)
5
- : (obj) => obj != null && obj instanceof KeyObject;
1
+ import * as util from 'node:util';
2
+ export default (obj) => util.types.isKeyObject(obj);
@@ -1,116 +1,5 @@
1
- import { Buffer } from 'buffer';
2
- import { createPrivateKey, createPublicKey, createSecretKey } from 'crypto';
3
- import { decode as base64url } from './base64url.js';
4
- import { JOSENotSupported } from '../util/errors.js';
5
- import { setCurve } from './get_named_curve.js';
6
- import { setModulusLength } from './check_modulus_length.js';
7
- import Asn1SequenceEncoder from './asn1_sequence_encoder.js';
8
- import { jwkImport } from './flags.js';
1
+ import { createPrivateKey, createPublicKey } from 'node:crypto';
9
2
  const parse = (jwk) => {
10
- if (jwkImport && jwk.kty !== 'oct') {
11
- return jwk.d
12
- ? createPrivateKey({ format: 'jwk', key: jwk })
13
- : createPublicKey({ format: 'jwk', key: jwk });
14
- }
15
- switch (jwk.kty) {
16
- case 'oct': {
17
- return createSecretKey(base64url(jwk.k));
18
- }
19
- case 'RSA': {
20
- const enc = new Asn1SequenceEncoder();
21
- const isPrivate = jwk.d !== undefined;
22
- const modulus = Buffer.from(jwk.n, 'base64');
23
- const exponent = Buffer.from(jwk.e, 'base64');
24
- if (isPrivate) {
25
- enc.zero();
26
- enc.unsignedInteger(modulus);
27
- enc.unsignedInteger(exponent);
28
- enc.unsignedInteger(Buffer.from(jwk.d, 'base64'));
29
- enc.unsignedInteger(Buffer.from(jwk.p, 'base64'));
30
- enc.unsignedInteger(Buffer.from(jwk.q, 'base64'));
31
- enc.unsignedInteger(Buffer.from(jwk.dp, 'base64'));
32
- enc.unsignedInteger(Buffer.from(jwk.dq, 'base64'));
33
- enc.unsignedInteger(Buffer.from(jwk.qi, 'base64'));
34
- }
35
- else {
36
- enc.unsignedInteger(modulus);
37
- enc.unsignedInteger(exponent);
38
- }
39
- const der = enc.end();
40
- const createInput = {
41
- key: der,
42
- format: 'der',
43
- type: 'pkcs1',
44
- };
45
- const keyObject = isPrivate ? createPrivateKey(createInput) : createPublicKey(createInput);
46
- setModulusLength(keyObject, modulus.length << 3);
47
- return keyObject;
48
- }
49
- case 'EC': {
50
- const enc = new Asn1SequenceEncoder();
51
- const isPrivate = jwk.d !== undefined;
52
- const pub = Buffer.concat([
53
- Buffer.alloc(1, 4),
54
- Buffer.from(jwk.x, 'base64'),
55
- Buffer.from(jwk.y, 'base64'),
56
- ]);
57
- if (isPrivate) {
58
- enc.zero();
59
- const enc$1 = new Asn1SequenceEncoder();
60
- enc$1.oidFor('ecPublicKey');
61
- enc$1.oidFor(jwk.crv);
62
- enc.add(enc$1.end());
63
- const enc$2 = new Asn1SequenceEncoder();
64
- enc$2.one();
65
- enc$2.octStr(Buffer.from(jwk.d, 'base64'));
66
- const enc$3 = new Asn1SequenceEncoder();
67
- enc$3.bitStr(pub);
68
- const f2 = enc$3.end(Buffer.from([0xa1]));
69
- enc$2.add(f2);
70
- const f = enc$2.end();
71
- const enc$4 = new Asn1SequenceEncoder();
72
- enc$4.add(f);
73
- const f3 = enc$4.end(Buffer.from([0x04]));
74
- enc.add(f3);
75
- const der = enc.end();
76
- const keyObject = createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
77
- setCurve(keyObject, jwk.crv);
78
- return keyObject;
79
- }
80
- const enc$1 = new Asn1SequenceEncoder();
81
- enc$1.oidFor('ecPublicKey');
82
- enc$1.oidFor(jwk.crv);
83
- enc.add(enc$1.end());
84
- enc.bitStr(pub);
85
- const der = enc.end();
86
- const keyObject = createPublicKey({ key: der, format: 'der', type: 'spki' });
87
- setCurve(keyObject, jwk.crv);
88
- return keyObject;
89
- }
90
- case 'OKP': {
91
- const enc = new Asn1SequenceEncoder();
92
- const isPrivate = jwk.d !== undefined;
93
- if (isPrivate) {
94
- enc.zero();
95
- const enc$1 = new Asn1SequenceEncoder();
96
- enc$1.oidFor(jwk.crv);
97
- enc.add(enc$1.end());
98
- const enc$2 = new Asn1SequenceEncoder();
99
- enc$2.octStr(Buffer.from(jwk.d, 'base64'));
100
- const f = enc$2.end(Buffer.from([0x04]));
101
- enc.add(f);
102
- const der = enc.end();
103
- return createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
104
- }
105
- const enc$1 = new Asn1SequenceEncoder();
106
- enc$1.oidFor(jwk.crv);
107
- enc.add(enc$1.end());
108
- enc.bitStr(Buffer.from(jwk.x, 'base64'));
109
- const der = enc.end();
110
- return createPublicKey({ key: der, format: 'der', type: 'spki' });
111
- }
112
- default:
113
- throw new JOSENotSupported('Invalid or unsupported JWK "kty" (Key Type) Parameter value');
114
- }
3
+ return (jwk.d ? createPrivateKey : createPublicKey)({ format: 'jwk', key: jwk });
115
4
  };
116
5
  export default parse;