jose 6.2.10 → 6.2.12

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 (89) hide show
  1. package/dist/types/index.d.ts +1 -2
  2. package/dist/types/jwe/compact/decrypt.d.ts +12 -25
  3. package/dist/types/jwe/compact/encrypt.d.ts +18 -32
  4. package/dist/types/jwe/flattened/decrypt.d.ts +12 -25
  5. package/dist/types/jwe/flattened/encrypt.d.ts +24 -50
  6. package/dist/types/jwe/general/decrypt.d.ts +15 -30
  7. package/dist/types/jwe/general/encrypt.d.ts +29 -52
  8. package/dist/types/jwk/embedded.d.ts +5 -8
  9. package/dist/types/jwk/thumbprint.d.ts +7 -9
  10. package/dist/types/jwks/local.d.ts +10 -13
  11. package/dist/types/jwks/remote.d.ts +29 -41
  12. package/dist/types/jws/compact/sign.d.ts +8 -13
  13. package/dist/types/jws/compact/verify.d.ts +14 -26
  14. package/dist/types/jws/flattened/sign.d.ts +10 -19
  15. package/dist/types/jws/flattened/verify.d.ts +14 -26
  16. package/dist/types/jws/general/sign.d.ts +19 -33
  17. package/dist/types/jws/general/verify.d.ts +17 -32
  18. package/dist/types/jwt/decrypt.d.ts +20 -27
  19. package/dist/types/jwt/encrypt.d.ts +30 -35
  20. package/dist/types/jwt/sign.d.ts +8 -13
  21. package/dist/types/jwt/unsecured.d.ts +10 -19
  22. package/dist/types/jwt/verify.d.ts +19 -22
  23. package/dist/types/key/export.d.ts +10 -10
  24. package/dist/types/key/generate_key_pair.d.ts +15 -22
  25. package/dist/types/key/generate_secret.d.ts +12 -19
  26. package/dist/types/key/import.d.ts +25 -31
  27. package/dist/types/types.d.ts +184 -319
  28. package/dist/types/util/base64url.d.ts +7 -7
  29. package/dist/types/util/decode_jwt.d.ts +5 -7
  30. package/dist/types/util/decode_protected_header.d.ts +6 -5
  31. package/dist/types/util/errors.d.ts +50 -88
  32. package/dist/webapi/index.js +70 -32
  33. package/dist/webapi/jwe/compact/decrypt.js +6 -8
  34. package/dist/webapi/jwe/compact/encrypt.js +25 -48
  35. package/dist/webapi/jwe/flattened/decrypt.js +14 -14
  36. package/dist/webapi/jwe/flattened/encrypt.js +34 -64
  37. package/dist/webapi/jwe/general/decrypt.js +38 -49
  38. package/dist/webapi/jwe/general/encrypt.js +100 -172
  39. package/dist/webapi/jwk/embedded.js +29 -32
  40. package/dist/webapi/jwk/thumbprint.js +51 -70
  41. package/dist/webapi/jwks/local.js +53 -64
  42. package/dist/webapi/jwks/remote.js +88 -136
  43. package/dist/webapi/jws/compact/sign.js +19 -21
  44. package/dist/webapi/jws/compact/verify.js +7 -8
  45. package/dist/webapi/jws/flattened/sign.js +22 -31
  46. package/dist/webapi/jws/flattened/verify.js +11 -24
  47. package/dist/webapi/jws/general/sign.js +55 -73
  48. package/dist/webapi/jws/general/verify.js +43 -69
  49. package/dist/webapi/jwt/decrypt.js +12 -20
  50. package/dist/webapi/jwt/encrypt.js +43 -70
  51. package/dist/webapi/jwt/sign.js +17 -16
  52. package/dist/webapi/jwt/unsecured.js +31 -40
  53. package/dist/webapi/jwt/verify.js +12 -14
  54. package/dist/webapi/key/export.js +32 -41
  55. package/dist/webapi/key/generate_key_pair.js +32 -49
  56. package/dist/webapi/key/generate_secret.js +35 -40
  57. package/dist/webapi/key/import.js +48 -56
  58. package/dist/webapi/lib/asn1.js +128 -169
  59. package/dist/webapi/lib/buffer_utils.js +72 -41
  60. package/dist/webapi/lib/content_encryption.js +75 -119
  61. package/dist/webapi/lib/deflate.js +35 -47
  62. package/dist/webapi/lib/jwe_algorithms.js +102 -93
  63. package/dist/webapi/lib/jwe_decrypt.js +178 -234
  64. package/dist/webapi/lib/jwe_encrypt.js +71 -138
  65. package/dist/webapi/lib/jws_algorithms.js +62 -61
  66. package/dist/webapi/lib/jws_sign.js +43 -82
  67. package/dist/webapi/lib/jws_verify.js +78 -131
  68. package/dist/webapi/lib/jwt_claims_set.js +123 -209
  69. package/dist/webapi/lib/key.js +147 -139
  70. package/dist/webapi/lib/key_algorithm.js +13 -8
  71. package/dist/webapi/lib/key_descriptor.js +8 -6
  72. package/dist/webapi/lib/key_management.js +169 -235
  73. package/dist/webapi/lib/validate.js +122 -0
  74. package/dist/webapi/util/base64url.js +14 -37
  75. package/dist/webapi/util/decode_jwt.js +32 -31
  76. package/dist/webapi/util/decode_protected_header.js +18 -23
  77. package/dist/webapi/util/errors.js +94 -84
  78. package/package.json +17 -81
  79. package/dist/webapi/lib/base64.js +0 -22
  80. package/dist/webapi/lib/crypto_key.js +0 -28
  81. package/dist/webapi/lib/helpers.js +0 -42
  82. package/dist/webapi/lib/invalid_key_input.js +0 -26
  83. package/dist/webapi/lib/is_key_like.js +0 -17
  84. package/dist/webapi/lib/jwk_metadata.js +0 -20
  85. package/dist/webapi/lib/jwk_to_key.js +0 -17
  86. package/dist/webapi/lib/key_options.js +0 -6
  87. package/dist/webapi/lib/options.js +0 -74
  88. package/dist/webapi/lib/signing.js +0 -26
  89. package/dist/webapi/lib/type_checks.js +0 -33
@@ -1,51 +1,40 @@
1
- import { prepareDecrypt, shareJWE, decryptRecipient, decryptResult, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE, } from '../../lib/jwe_decrypt.js';
2
- import { JWEDecryptionFailed, JWEInvalid } from '../../util/errors.js';
3
- import { isObject } from '../../lib/type_checks.js';
4
- export async function generalDecrypt(jwe, key, options) {
5
- if (!isObject(jwe)) {
6
- throw new JWEInvalid('General JWE must be an object');
7
- }
8
- const inputRecipients = jwe.recipients;
9
- if (!Array.isArray(inputRecipients)) {
10
- throw new JWEInvalid('JWE Recipients missing or incorrect type');
11
- }
12
- const recipients = Array.from(inputRecipients);
13
- if (!recipients.every(isObject)) {
14
- throw new JWEInvalid('JWE Recipients missing or incorrect type');
15
- }
16
- if (!recipients.length) {
17
- throw new JWEInvalid('JWE Recipients has no members');
18
- }
19
- let shared;
20
- let sharedJwe;
21
- let token;
22
- try {
23
- shared = prepareDecrypt(options);
24
- sharedJwe = snapshotSharedJWE(jwe);
25
- token = shareJWE(sharedJwe);
26
- }
27
- catch {
28
- throw new JWEDecryptionFailed();
29
- }
30
- const recipientSnapshots = recipients.map((recipient) => snapshotRecipientJWE(recipient));
31
- if (recipients.length > 1) {
32
- for (const [, headerAlg] of recipientSnapshots) {
33
- const alg = token[0]?.alg ?? headerAlg ?? sharedJwe.unprotected?.alg;
34
- if (alg === 'dir' || alg === 'ECDH-ES') {
35
- throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
36
- }
37
- }
38
- }
39
- for (const [recipient] of recipientSnapshots) {
40
- if (!recipient)
41
- continue;
42
- try {
43
- const flattened = { ...sharedJwe, ...recipient };
44
- checkRecipient(flattened);
45
- return decryptResult(flattened, await decryptRecipient(flattened, token, shared, key));
46
- }
47
- catch {
48
- }
49
- }
1
+ import { prepareDecrypt, shareJWE, decryptJWE, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE } from "../../lib/jwe_decrypt.js";
2
+ import { JWEDecryptionFailed, JWEInvalid } from "../../util/errors.js";
3
+ import { isObject } from "../../lib/validate.js";
4
+ import { JWE, isJWECEKTransport } from "../../lib/jwe_algorithms.js";
5
+ async function generalDecrypt(jwe, key, options) {
6
+ if (!isObject(jwe))
7
+ throw new JWEInvalid("General JWE must be an object");
8
+ const inputRecipients = jwe.recipients;
9
+ if (!Array.isArray(inputRecipients))
10
+ throw new JWEInvalid("JWE Recipients missing or incorrect type");
11
+ const recipients = Array.from(inputRecipients);
12
+ if (!recipients.every(isObject))
13
+ throw new JWEInvalid("JWE Recipients missing or incorrect type");
14
+ if (!recipients.length)
15
+ throw new JWEInvalid("JWE Recipients has no members");
16
+ let shared, sharedJwe, token;
17
+ try {
18
+ shared = prepareDecrypt(options), sharedJwe = snapshotSharedJWE(jwe), token = shareJWE(sharedJwe);
19
+ } catch {
50
20
  throw new JWEDecryptionFailed();
21
+ }
22
+ const recipientSnapshots = recipients.map((recipient) => snapshotRecipientJWE(recipient));
23
+ if (recipients.length > 1)
24
+ for (const [, headerAlg] of recipientSnapshots) {
25
+ const alg = token[0]?.alg ?? headerAlg ?? sharedJwe.unprotected?.alg, algEntry = typeof alg == "string" ? JWE[alg] : void 0;
26
+ if (algEntry && !isJWECEKTransport(algEntry))
27
+ throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
28
+ }
29
+ for (const [recipient] of recipientSnapshots)
30
+ if (recipient)
31
+ try {
32
+ const flattened = { ...sharedJwe, ...recipient };
33
+ return checkRecipient(flattened), await decryptJWE(flattened, shared, key, token);
34
+ } catch {
35
+ }
36
+ throw new JWEDecryptionFailed();
51
37
  }
38
+ export {
39
+ generalDecrypt
40
+ };
@@ -1,177 +1,105 @@
1
- import { assertNotSet } from '../../lib/helpers.js';
2
- import { JWEInvalid } from '../../util/errors.js';
3
- import { generateCek } from '../../lib/content_encryption.js';
4
- import { encryptKeyManagement } from '../../lib/key_management.js';
5
- import { encode as b64u } from '../../util/base64url.js';
6
- import { checkDisjoint, checkEncryptHeaders, createJWE, encryptJWE } from '../../lib/jwe_encrypt.js';
7
- import { prepareKey } from '../../lib/key.js';
8
- import { jweAlgorithm } from '../../lib/jwe_algorithms.js';
9
- import { assertUint8Array } from '../../lib/type_checks.js';
1
+ import { assertNotSet, assertUint8Array } from "../../lib/validate.js";
2
+ import { JWEInvalid } from "../../util/errors.js";
3
+ import { generateCek } from "../../lib/content_encryption.js";
4
+ import { encode as b64u } from "../../util/base64url.js";
5
+ import { checkDisjoint, checkEncryptHeaders, encryptJWE } from "../../lib/jwe_encrypt.js";
6
+ import { encryptKeyManagement } from "../../lib/key_management.js";
7
+ import { isJWECEKTransport, jweAlgorithm } from "../../lib/jwe_algorithms.js";
10
8
  class IndividualRecipient {
11
- #parent;
12
- state;
13
- constructor(enc, key, crit) {
14
- this.#parent = enc;
15
- this.state = [undefined, undefined, key, crit];
16
- }
17
- setUnprotectedHeader(unprotectedHeader) {
18
- assertNotSet(this.state[0], 'setUnprotectedHeader');
19
- this.state[0] = unprotectedHeader;
20
- return this;
21
- }
22
- setKeyManagementParameters(parameters) {
23
- assertNotSet(this.state[1], 'setKeyManagementParameters');
24
- this.state[1] = parameters;
25
- return this;
26
- }
27
- addRecipient(...args) {
28
- return this.#parent.addRecipient(...args);
29
- }
30
- encrypt(...args) {
31
- return this.#parent.encrypt(...args);
32
- }
33
- done() {
34
- return this.#parent;
35
- }
9
+ #parent;
10
+ state;
11
+ constructor(enc, key, crit) {
12
+ this.#parent = enc, this.state = [void 0, void 0, key, crit];
13
+ }
14
+ setUnprotectedHeader(unprotectedHeader) {
15
+ return assertNotSet(this.state[0], "setUnprotectedHeader"), this.state[0] = unprotectedHeader, this;
16
+ }
17
+ setKeyManagementParameters(parameters) {
18
+ return assertNotSet(this.state[1], "setKeyManagementParameters"), this.state[1] = parameters, this;
19
+ }
20
+ addRecipient(...args) {
21
+ return this.#parent.addRecipient(...args);
22
+ }
23
+ encrypt(...args) {
24
+ return this.#parent.encrypt(...args);
25
+ }
26
+ done() {
27
+ return this.#parent;
28
+ }
36
29
  }
37
- function copyOptionalMembers(flattened, jwe, recipient) {
38
- const { aad, protected: protectedHeader, unprotected, header } = flattened;
39
- if (aad)
40
- jwe.aad = aad;
41
- if (protectedHeader)
42
- jwe.protected = protectedHeader;
43
- if (unprotected)
44
- jwe.unprotected = unprotected;
45
- if (header)
46
- recipient.header = header;
47
- }
48
- export class GeneralEncrypt {
49
- #plaintext;
50
- #recipients = [];
51
- #protectedHeader;
52
- #unprotectedHeader;
53
- #aad;
54
- constructor(plaintext) {
55
- this.#plaintext = plaintext;
56
- }
57
- addRecipient(key, options) {
58
- const recipient = new IndividualRecipient(this, key, options?.crit);
59
- this.#recipients.push(recipient);
60
- return recipient;
61
- }
62
- setProtectedHeader(protectedHeader) {
63
- assertNotSet(this.#protectedHeader, 'setProtectedHeader');
64
- this.#protectedHeader = protectedHeader;
65
- return this;
66
- }
67
- setSharedUnprotectedHeader(sharedUnprotectedHeader) {
68
- assertNotSet(this.#unprotectedHeader, 'setSharedUnprotectedHeader');
69
- this.#unprotectedHeader = sharedUnprotectedHeader;
70
- return this;
71
- }
72
- setAdditionalAuthenticatedData(aad) {
73
- this.#aad = aad;
74
- return this;
30
+ class GeneralEncrypt {
31
+ #plaintext;
32
+ #recipients = [];
33
+ #protectedHeader;
34
+ #unprotectedHeader;
35
+ #aad;
36
+ constructor(plaintext) {
37
+ this.#plaintext = plaintext;
38
+ }
39
+ addRecipient(key, options) {
40
+ const recipient = new IndividualRecipient(this, key, options?.crit);
41
+ return this.#recipients.push(recipient), recipient;
42
+ }
43
+ setProtectedHeader(protectedHeader) {
44
+ return assertNotSet(this.#protectedHeader, "setProtectedHeader"), this.#protectedHeader = protectedHeader, this;
45
+ }
46
+ setSharedUnprotectedHeader(sharedUnprotectedHeader) {
47
+ return assertNotSet(this.#unprotectedHeader, "setSharedUnprotectedHeader"), this.#unprotectedHeader = sharedUnprotectedHeader, this;
48
+ }
49
+ setAdditionalAuthenticatedData(aad) {
50
+ return this.#aad = aad, this;
51
+ }
52
+ async encrypt() {
53
+ if (!this.#recipients.length)
54
+ throw new JWEInvalid("at least one recipient must be added");
55
+ assertUint8Array(this.#plaintext, "plaintext");
56
+ const multiple = this.#recipients.length > 1;
57
+ let enc, protectedHeader = this.#protectedHeader, sharedUnprotectedHeader = this.#unprotectedHeader;
58
+ const recipients = [];
59
+ for (const recipient of this.#recipients) {
60
+ const [unprotectedHeader, keyManagementParameters, key, crit] = recipient.state, input = [
61
+ this.#plaintext,
62
+ protectedHeader,
63
+ unprotectedHeader,
64
+ sharedUnprotectedHeader,
65
+ this.#aad,
66
+ void 0,
67
+ void 0,
68
+ keyManagementParameters,
69
+ crit,
70
+ multiple
71
+ ], headers = checkEncryptHeaders(input, void 0, recipients.length > 0);
72
+ recipients.length || (protectedHeader = input[1], sharedUnprotectedHeader = input[3]), recipients.push([input, headers, key]);
73
+ const [{ alg, enc: recipientEnc }, , algEntry] = headers;
74
+ if (multiple && algEntry && !isJWECEKTransport(algEntry))
75
+ throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
76
+ if (!enc)
77
+ enc = recipientEnc;
78
+ else if (enc !== recipientEnc)
79
+ throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
75
80
  }
76
- async encrypt() {
77
- if (!this.#recipients.length) {
78
- throw new JWEInvalid('at least one recipient must be added');
79
- }
80
- assertUint8Array(this.#plaintext, 'plaintext');
81
- if (this.#recipients.length === 1) {
82
- const [unprotectedHeader, keyManagementParameters, key, crit] = this.#recipients[0].state;
83
- const flattened = await createJWE([
84
- this.#plaintext,
85
- this.#protectedHeader,
86
- unprotectedHeader,
87
- this.#unprotectedHeader,
88
- this.#aad,
89
- undefined,
90
- undefined,
91
- keyManagementParameters,
92
- crit,
93
- false,
94
- ], key);
95
- const jwe = {
96
- ciphertext: flattened.ciphertext,
97
- iv: flattened.iv,
98
- recipients: [{}],
99
- tag: flattened.tag,
100
- };
101
- if (flattened.encrypted_key)
102
- jwe.recipients[0].encrypted_key = flattened.encrypted_key;
103
- copyOptionalMembers(flattened, jwe, jwe.recipients[0]);
104
- return jwe;
105
- }
106
- let enc;
107
- let protectedHeader = this.#protectedHeader;
108
- let sharedUnprotectedHeader = this.#unprotectedHeader;
109
- const inputs = [];
110
- const checked = [];
111
- for (let i = 0; i < this.#recipients.length; i++) {
112
- const recipient = this.#recipients[i];
113
- const [unprotectedHeader, keyManagementParameters, , crit] = recipient.state;
114
- const input = [
115
- this.#plaintext,
116
- protectedHeader,
117
- unprotectedHeader,
118
- sharedUnprotectedHeader,
119
- this.#aad,
120
- undefined,
121
- undefined,
122
- keyManagementParameters,
123
- crit,
124
- true,
125
- ];
126
- const headers = checkEncryptHeaders(input);
127
- inputs.push(input);
128
- checked.push(headers);
129
- if (i === 0) {
130
- protectedHeader = input[1];
131
- sharedUnprotectedHeader = input[3];
132
- }
133
- if (headers[1] === 'dir' || headers[1] === 'ECDH-ES') {
134
- throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
135
- }
136
- if (!enc) {
137
- enc = headers[2];
138
- }
139
- else if (enc !== headers[2]) {
140
- throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
141
- }
142
- }
143
- const cek = generateCek(checked[0][3]);
144
- const jwe = {
145
- ciphertext: '',
146
- recipients: [],
147
- };
148
- for (let i = 0; i < this.#recipients.length; i++) {
149
- const recipient = this.#recipients[i];
150
- const [, keyManagementParameters, key] = recipient.state;
151
- const target = {};
152
- jwe.recipients.push(target);
153
- if (i === 0) {
154
- inputs[0][5] = cek;
155
- const flattened = await encryptJWE(inputs[0], checked[0], key);
156
- jwe.ciphertext = flattened.ciphertext;
157
- jwe.iv = flattened.iv;
158
- jwe.tag = flattened.tag;
159
- target.encrypted_key = flattened.encrypted_key;
160
- copyOptionalMembers(flattened, jwe, target);
161
- continue;
162
- }
163
- const [, alg, , encEntry] = checked[i];
164
- const unprotectedHeader = inputs[i][2];
165
- const k = await prepareKey(jweAlgorithm(alg), key, 'encrypt');
166
- const [, encryptedKey, parameters] = await encryptKeyManagement(alg, encEntry, k, cek, keyManagementParameters);
167
- target.encrypted_key = b64u(encryptedKey);
168
- if (unprotectedHeader || parameters) {
169
- const header = { ...unprotectedHeader, ...parameters };
170
- if (parameters)
171
- checkDisjoint(inputs[i][1], header, inputs[i][3]);
172
- target.header = header;
173
- }
174
- }
175
- return jwe;
81
+ for (const [, headers] of recipients)
82
+ headers[2] ??= jweAlgorithm(headers[0].alg);
83
+ const [firstInput, firstHeaders, firstKey] = recipients[0], cek = multiple ? generateCek(firstHeaders[1]) : void 0;
84
+ firstInput[5] = cek;
85
+ const { encrypted_key, header, ...shared } = await encryptJWE(firstInput, firstHeaders, firstKey), jwe = {
86
+ ...shared,
87
+ recipients: [{}]
88
+ };
89
+ encrypted_key && (jwe.recipients[0].encrypted_key = encrypted_key), header && (jwe.recipients[0].header = header);
90
+ for (let i = 1; i < recipients.length; i++) {
91
+ const [input, [joseHeader, encEntry, algEntry], key] = recipients[i], unprotectedHeader = input[2], [, encryptedKey, parameters] = await encryptKeyManagement(algEntry, encEntry, key, joseHeader, cek, input[7]), target = {
92
+ encrypted_key: b64u(encryptedKey)
93
+ };
94
+ if (unprotectedHeader || parameters) {
95
+ const header2 = { ...unprotectedHeader, ...parameters };
96
+ parameters && checkDisjoint(input[1], header2, input[3]), target.header = header2;
97
+ }
98
+ jwe.recipients.push(target);
176
99
  }
100
+ return jwe;
101
+ }
177
102
  }
103
+ export {
104
+ GeneralEncrypt
105
+ };
@@ -1,33 +1,30 @@
1
- import { jwkToKey } from '../lib/jwk_to_key.js';
2
- import { jwsAlgorithm } from '../lib/jws_algorithms.js';
3
- import { isObject } from '../lib/type_checks.js';
4
- import { JWSInvalid } from '../util/errors.js';
5
- import { normalizeJwk } from '../lib/jwk_metadata.js';
6
- export async function EmbeddedJWK(protectedHeader, token) {
7
- const joseHeader = {
8
- ...protectedHeader,
9
- ...token?.header,
10
- };
11
- if (!isObject(joseHeader.jwk)) {
12
- throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
13
- }
14
- let jwk;
15
- try {
16
- jwk = normalizeJwk(joseHeader.jwk);
17
- }
18
- catch (cause) {
19
- throw new JWSInvalid('Invalid Embedded JWK', { cause });
20
- }
21
- const entry = jwsAlgorithm(joseHeader.alg);
22
- if (jwk.use !== undefined && jwk.use !== 'sig') {
23
- throw new JWSInvalid('Invalid Embedded JWK, its "use" must be "sig" when present');
24
- }
25
- if (jwk.alg !== undefined && jwk.alg !== entry.alg) {
26
- throw new JWSInvalid(`Invalid Embedded JWK, its "alg" must be "${entry.alg}" when present`);
27
- }
28
- const key = await jwkToKey(entry, { ...jwk, ext: true });
29
- if (key.type !== 'public') {
30
- throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
31
- }
32
- return key;
1
+ import { jwkToKey, normalizeJwk } from "../lib/key.js";
2
+ import { jwsAlgorithm } from "../lib/jws_algorithms.js";
3
+ import { isObject } from "../lib/validate.js";
4
+ import { JWSInvalid } from "../util/errors.js";
5
+ async function EmbeddedJWK(protectedHeader, token) {
6
+ const joseHeader = {
7
+ ...protectedHeader,
8
+ ...token?.header
9
+ };
10
+ if (!isObject(joseHeader.jwk))
11
+ throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
12
+ let jwk;
13
+ try {
14
+ jwk = normalizeJwk(joseHeader.jwk);
15
+ } catch (cause) {
16
+ throw new JWSInvalid("Invalid Embedded JWK", { cause });
17
+ }
18
+ const entry = jwsAlgorithm(joseHeader.alg);
19
+ if (jwk.use !== void 0 && jwk.use !== "sig")
20
+ throw new JWSInvalid('Invalid Embedded JWK, its "use" must be "sig" when present');
21
+ if (jwk.alg !== void 0 && jwk.alg !== entry.alg)
22
+ throw new JWSInvalid(`Invalid Embedded JWK, its "alg" must be "${entry.alg}" when present`);
23
+ const key = await jwkToKey(entry, jwk, !0);
24
+ if (key.type !== "public")
25
+ throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
26
+ return key;
33
27
  }
28
+ export {
29
+ EmbeddedJWK
30
+ };
@@ -1,74 +1,55 @@
1
- import { digest } from '../lib/helpers.js';
2
- import { encode as b64u } from '../util/base64url.js';
3
- import { JOSENotSupported, JWKInvalid } from '../util/errors.js';
4
- import { encode } from '../lib/buffer_utils.js';
5
- import { isKeyLike } from '../lib/is_key_like.js';
6
- import { isObject } from '../lib/type_checks.js';
7
- import { exportJWK } from '../key/export.js';
8
- import { invalidKeyInput } from '../lib/invalid_key_input.js';
9
- import { snapshotJwk } from '../lib/jwk_metadata.js';
1
+ import { digest, encode } from "../lib/buffer_utils.js";
2
+ import { encode as b64u } from "../util/base64url.js";
3
+ import { JOSENotSupported, JWKInvalid } from "../util/errors.js";
4
+ import { isKeyLike, invalidKeyInput, snapshotJwk } from "../lib/key.js";
5
+ import { isObject } from "../lib/validate.js";
6
+ import { exportJWK } from "../key/export.js";
10
7
  const check = (value, description) => {
11
- if (typeof value !== 'string' || !value) {
12
- throw new JWKInvalid(`${description} missing or invalid`);
13
- }
8
+ if (typeof value != "string" || !value)
9
+ throw new JWKInvalid(`${description} missing or invalid`);
14
10
  };
15
- export async function calculateJwkThumbprint(key, digestAlgorithm) {
16
- let jwk;
17
- if (isObject(key)) {
18
- jwk = snapshotJwk(key);
19
- if (typeof jwk.kty !== 'string') {
20
- throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
21
- }
22
- }
23
- else if (isKeyLike(key)) {
24
- jwk = snapshotJwk(await exportJWK(key));
25
- }
26
- else {
27
- throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
28
- }
29
- digestAlgorithm ??= 'sha256';
30
- if (digestAlgorithm !== 'sha256' &&
31
- digestAlgorithm !== 'sha384' &&
32
- digestAlgorithm !== 'sha512') {
33
- throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"');
34
- }
35
- let components;
36
- switch (jwk.kty) {
37
- case 'AKP':
38
- check(jwk.alg, '"alg" (Algorithm) Parameter');
39
- check(jwk.pub, '"pub" (Public key) Parameter');
40
- components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };
41
- break;
42
- case 'EC':
43
- check(jwk.crv, '"crv" (Curve) Parameter');
44
- check(jwk.x, '"x" (X Coordinate) Parameter');
45
- check(jwk.y, '"y" (Y Coordinate) Parameter');
46
- components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
47
- break;
48
- case 'OKP':
49
- check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter');
50
- check(jwk.x, '"x" (Public Key) Parameter');
51
- components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
52
- break;
53
- case 'RSA':
54
- check(jwk.e, '"e" (Exponent) Parameter');
55
- check(jwk.n, '"n" (Modulus) Parameter');
56
- components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
57
- break;
58
- case 'oct':
59
- if (typeof jwk.k !== 'string') {
60
- throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
61
- }
62
- components = { k: jwk.k, kty: jwk.kty };
63
- break;
64
- default:
65
- throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
66
- }
67
- const data = encode(JSON.stringify(components));
68
- return b64u(await digest(digestAlgorithm, data));
11
+ async function calculateJwkThumbprint(key, digestAlgorithm) {
12
+ let jwk;
13
+ if (isObject(key)) {
14
+ if (jwk = snapshotJwk(key), typeof jwk.kty != "string")
15
+ throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
16
+ } else if (isKeyLike(key))
17
+ jwk = snapshotJwk(await exportJWK(key));
18
+ else
19
+ throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
20
+ if (digestAlgorithm ??= "sha256", digestAlgorithm !== "sha256" && digestAlgorithm !== "sha384" && digestAlgorithm !== "sha512")
21
+ throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"');
22
+ let components;
23
+ switch (jwk.kty) {
24
+ case "AKP":
25
+ check(jwk.alg, '"alg" (Algorithm) Parameter'), check(jwk.pub, '"pub" (Public key) Parameter'), components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };
26
+ break;
27
+ case "EC":
28
+ check(jwk.crv, '"crv" (Curve) Parameter'), check(jwk.x, '"x" (X Coordinate) Parameter'), check(jwk.y, '"y" (Y Coordinate) Parameter'), components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
29
+ break;
30
+ case "OKP":
31
+ check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter'), check(jwk.x, '"x" (Public Key) Parameter'), components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
32
+ break;
33
+ case "RSA":
34
+ check(jwk.e, '"e" (Exponent) Parameter'), check(jwk.n, '"n" (Modulus) Parameter'), components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
35
+ break;
36
+ case "oct":
37
+ if (typeof jwk.k != "string")
38
+ throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
39
+ components = { k: jwk.k, kty: jwk.kty };
40
+ break;
41
+ default:
42
+ throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
43
+ }
44
+ const data = encode(JSON.stringify(components));
45
+ return b64u(await digest(digestAlgorithm, data));
69
46
  }
70
- export async function calculateJwkThumbprintUri(key, digestAlgorithm) {
71
- digestAlgorithm ??= 'sha256';
72
- const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);
73
- return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;
47
+ async function calculateJwkThumbprintUri(key, digestAlgorithm) {
48
+ digestAlgorithm ??= "sha256";
49
+ const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);
50
+ return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;
74
51
  }
52
+ export {
53
+ calculateJwkThumbprint,
54
+ calculateJwkThumbprintUri
55
+ };