@zuplo/cli 7.4.5 → 7.4.7

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 (198) hide show
  1. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwks/remote.d.ts +4 -4
  2. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jws/general/verify.d.ts +3 -3
  3. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/encrypt.d.ts +8 -14
  4. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/sign.d.ts +8 -14
  5. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/unsecured.d.ts +9 -15
  6. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +30 -8
  7. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +8 -4
  8. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +6 -13
  9. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/general/decrypt.js +19 -19
  10. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/general/encrypt.js +27 -20
  11. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwk/embedded.js +15 -1
  12. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwk/thumbprint.js +11 -5
  13. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwks/local.js +45 -53
  14. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwks/remote.js +82 -103
  15. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/compact/sign.js +10 -9
  16. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/flattened/sign.js +2 -1
  17. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/flattened/verify.js +8 -7
  18. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/general/sign.js +5 -3
  19. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/general/verify.js +51 -21
  20. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/decrypt.js +7 -9
  21. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/encrypt.js +21 -50
  22. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/sign.js +8 -41
  23. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/unsecured.js +21 -42
  24. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/generate_key_pair.js +6 -2
  25. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/generate_secret.js +7 -6
  26. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/import.js +16 -12
  27. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/asn1.js +7 -2
  28. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/content_encryption.js +7 -15
  29. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/deflate.js +8 -0
  30. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/helpers.js +1 -1
  31. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +85 -28
  32. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +40 -12
  33. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwk_metadata.js +20 -0
  34. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jws_sign.js +47 -36
  35. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jws_verify.js +77 -45
  36. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +82 -47
  37. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key.js +24 -9
  38. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key_management.js +10 -4
  39. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key_options.js +6 -0
  40. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/options.js +26 -0
  41. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/type_checks.js +11 -13
  42. package/node_modules/@modelcontextprotocol/client/node_modules/jose/package.json +1 -1
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwks/remote.d.ts +4 -4
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jws/general/verify.d.ts +3 -3
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/encrypt.d.ts +8 -14
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/sign.d.ts +8 -14
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/unsecured.d.ts +9 -15
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +30 -8
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +8 -4
  50. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +6 -13
  51. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/general/decrypt.js +19 -19
  52. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/general/encrypt.js +27 -20
  53. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwk/embedded.js +15 -1
  54. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwk/thumbprint.js +11 -5
  55. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/local.js +45 -53
  56. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +82 -103
  57. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/compact/sign.js +10 -9
  58. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/flattened/sign.js +2 -1
  59. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/flattened/verify.js +8 -7
  60. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/general/sign.js +5 -3
  61. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/general/verify.js +51 -21
  62. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/decrypt.js +7 -9
  63. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/encrypt.js +21 -50
  64. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/sign.js +8 -41
  65. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/unsecured.js +21 -42
  66. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/generate_key_pair.js +6 -2
  67. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/generate_secret.js +7 -6
  68. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/import.js +16 -12
  69. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/asn1.js +7 -2
  70. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/content_encryption.js +7 -15
  71. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +8 -0
  72. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/helpers.js +1 -1
  73. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +85 -28
  74. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +40 -12
  75. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwk_metadata.js +20 -0
  76. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jws_sign.js +47 -36
  77. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jws_verify.js +77 -45
  78. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +82 -47
  79. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key.js +24 -9
  80. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key_management.js +10 -4
  81. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key_options.js +6 -0
  82. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/options.js +26 -0
  83. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/type_checks.js +11 -13
  84. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
  85. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.d.ts +35 -0
  86. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.d.ts.map +1 -0
  87. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.js +352 -0
  88. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.mjs +294 -0
  89. package/node_modules/@posthog/core/dist/index.d.ts +2 -0
  90. package/node_modules/@posthog/core/dist/index.d.ts.map +1 -1
  91. package/node_modules/@posthog/core/dist/index.js +164 -79
  92. package/node_modules/@posthog/core/dist/index.mjs +2 -1
  93. package/node_modules/@posthog/core/dist/posthog-core-stateless.d.ts +12 -18
  94. package/node_modules/@posthog/core/dist/posthog-core-stateless.d.ts.map +1 -1
  95. package/node_modules/@posthog/core/dist/posthog-core-stateless.js +15 -47
  96. package/node_modules/@posthog/core/dist/posthog-core-stateless.mjs +15 -47
  97. package/node_modules/@posthog/core/dist/surveys/index.d.ts +1 -0
  98. package/node_modules/@posthog/core/dist/surveys/index.d.ts.map +1 -1
  99. package/node_modules/@posthog/core/dist/surveys/index.js +13 -0
  100. package/node_modules/@posthog/core/dist/surveys/index.mjs +2 -1
  101. package/node_modules/@posthog/core/dist/surveys/property-matching.d.ts +11 -0
  102. package/node_modules/@posthog/core/dist/surveys/property-matching.d.ts.map +1 -0
  103. package/node_modules/@posthog/core/dist/surveys/property-matching.js +89 -0
  104. package/node_modules/@posthog/core/dist/surveys/property-matching.mjs +46 -0
  105. package/node_modules/@posthog/core/dist/types.d.ts +15 -4
  106. package/node_modules/@posthog/core/dist/types.d.ts.map +1 -1
  107. package/node_modules/@posthog/core/package.json +2 -2
  108. package/node_modules/@posthog/core/src/featureFlagLocalEvaluation.ts +375 -0
  109. package/node_modules/@posthog/core/src/index.ts +19 -0
  110. package/node_modules/@posthog/core/src/logs/index.spec.ts +77 -0
  111. package/node_modules/@posthog/core/src/logs/index.ts +1 -1
  112. package/node_modules/@posthog/core/src/posthog-core-stateless.ts +40 -65
  113. package/node_modules/@posthog/core/src/surveys/index.ts +1 -0
  114. package/node_modules/@posthog/core/src/surveys/property-matching.spec.ts +174 -0
  115. package/node_modules/@posthog/core/src/surveys/property-matching.ts +75 -0
  116. package/node_modules/@posthog/core/src/types.ts +20 -4
  117. package/node_modules/@posthog/types/dist/index.d.ts +1 -1
  118. package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
  119. package/node_modules/@posthog/types/dist/posthog-config.d.ts +20 -5
  120. package/node_modules/@posthog/types/dist/posthog-config.d.ts.map +1 -1
  121. package/node_modules/@posthog/types/package.json +1 -1
  122. package/node_modules/@posthog/types/src/index.ts +1 -0
  123. package/node_modules/@posthog/types/src/posthog-config.ts +21 -5
  124. package/node_modules/@zuplo/core/customer.cli.minified.js +269 -269
  125. package/node_modules/@zuplo/core/index.minified.js +276 -276
  126. package/node_modules/@zuplo/core/package.json +1 -1
  127. package/node_modules/@zuplo/graphql/package.json +1 -1
  128. package/node_modules/@zuplo/openapi-tools/package.json +1 -1
  129. package/node_modules/@zuplo/otel/package.json +1 -1
  130. package/node_modules/@zuplo/runtime/out/esm/{chunk-IZE65N7D.js → chunk-CUK3VROF.js} +2 -2
  131. package/node_modules/@zuplo/runtime/out/esm/{chunk-4CDML74A.js → chunk-K4TBJG47.js} +2 -2
  132. package/node_modules/@zuplo/runtime/out/esm/{chunk-4VE55TG3.js → chunk-S4EBLGSU.js} +2 -2
  133. package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js → chunk-XF3IIUDX.js} +4 -4
  134. package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js.map → chunk-XF3IIUDX.js.map} +1 -1
  135. package/node_modules/@zuplo/runtime/out/esm/chunk-XIFGUD6K.js +403 -0
  136. package/node_modules/@zuplo/runtime/out/esm/chunk-XIFGUD6K.js.map +1 -0
  137. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  138. package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
  139. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  140. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  141. package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
  142. package/node_modules/@zuplo/runtime/package.json +1 -1
  143. package/node_modules/fast-uri/index.js +201 -48
  144. package/node_modules/fast-uri/lib/schemes.js +9 -4
  145. package/node_modules/fast-uri/lib/utils.js +388 -91
  146. package/node_modules/fast-uri/package.json +1 -1
  147. package/node_modules/fast-uri/test/component-safe-serialization.test.js +105 -0
  148. package/node_modules/fast-uri/test/equal.test.js +31 -3
  149. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  150. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  151. package/node_modules/fast-uri/test/ipv6-validation.test.js +90 -0
  152. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  153. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  154. package/node_modules/fast-uri/test/parse.test.js +7 -3
  155. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  156. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  157. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  158. package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  159. package/node_modules/fast-uri/test/security.test.js +75 -3
  160. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  161. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  162. package/node_modules/hono/dist/cjs/client/client.js +25 -11
  163. package/node_modules/hono/dist/cjs/client/utils.js +3 -0
  164. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  165. package/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  166. package/node_modules/hono/dist/cjs/middleware/etag/index.js +1 -1
  167. package/node_modules/hono/dist/cjs/request.js +8 -4
  168. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +10 -3
  169. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +47 -83
  170. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +2 -1
  171. package/node_modules/hono/dist/cjs/router/trie-router/node.js +4 -3
  172. package/node_modules/hono/dist/cjs/router/utils.js +27 -0
  173. package/node_modules/hono/dist/cjs/utils/cookie.js +1 -1
  174. package/node_modules/hono/dist/cjs/utils/stream.js +7 -1
  175. package/node_modules/hono/dist/client/client.js +25 -11
  176. package/node_modules/hono/dist/client/utils.js +3 -0
  177. package/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  178. package/node_modules/hono/dist/jsx/dom/render.js +2 -0
  179. package/node_modules/hono/dist/middleware/etag/index.js +1 -1
  180. package/node_modules/hono/dist/request.js +8 -4
  181. package/node_modules/hono/dist/router/reg-exp-router/node.js +6 -2
  182. package/node_modules/hono/dist/router/reg-exp-router/router.js +53 -84
  183. package/node_modules/hono/dist/router/reg-exp-router/trie.js +2 -1
  184. package/node_modules/hono/dist/router/trie-router/node.js +4 -3
  185. package/node_modules/hono/dist/router/utils.js +5 -0
  186. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -0
  187. package/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  188. package/node_modules/hono/dist/utils/cookie.js +1 -1
  189. package/node_modules/hono/dist/utils/stream.js +7 -1
  190. package/node_modules/hono/package.json +1 -1
  191. package/package.json +11 -11
  192. package/node_modules/@zuplo/runtime/out/esm/chunk-4SX4HBWT.js +0 -409
  193. package/node_modules/@zuplo/runtime/out/esm/chunk-4SX4HBWT.js.map +0 -1
  194. /package/node_modules/@zuplo/runtime/out/esm/{chunk-IZE65N7D.js.map → chunk-CUK3VROF.js.map} +0 -0
  195. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4CDML74A.js.map → chunk-K4TBJG47.js.map} +0 -0
  196. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4VE55TG3.js.map → chunk-S4EBLGSU.js.map} +0 -0
  197. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js.LEGAL.txt → chunk-XF3IIUDX.js.LEGAL.txt} +0 -0
  198. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4SX4HBWT.js.LEGAL.txt → chunk-XIFGUD6K.js.LEGAL.txt} +0 -0
@@ -4,15 +4,37 @@ import { jwsAlgorithm } from './jws_algorithms.js';
4
4
  import { isDisjoint } from './type_checks.js';
5
5
  import { JWSInvalid } from '../util/errors.js';
6
6
  import { concat, encode } from './buffer_utils.js';
7
- import { validateCrit, validateCritDuplicates, JWS_RECOGNIZED } from './options.js';
7
+ import { serializeJoseHeader, validateB64, validateCrit, validateCritDuplicates, JWS_RECOGNIZED, } from './options.js';
8
8
  import { prepareKey } from './key.js';
9
- export function unencodedPayload(protectedHeader) {
10
- return (protectedHeader?.b64 === false &&
11
- Array.isArray(protectedHeader.crit) &&
12
- protectedHeader.crit.includes('b64'));
9
+ function serializeProtectedHeader(protectedHeader) {
10
+ if (protectedHeader === undefined)
11
+ return [undefined, ''];
12
+ const normalized = serializeJoseHeader(JWSInvalid, protectedHeader);
13
+ return [normalized[0], b64u(normalized[1])];
13
14
  }
14
- export async function createSignature(input, key) {
15
- const { protectedHeader, unprotectedHeader } = input;
15
+ function validateSignatureHeader(protectedHeader, joseHeader, crit) {
16
+ validateCritDuplicates(JWSInvalid, protectedHeader);
17
+ return validateB64(protectedHeader, validateCrit(JWSInvalid, JWS_RECOGNIZED, crit, protectedHeader, joseHeader));
18
+ }
19
+ function signatureAlgorithm(joseHeader) {
20
+ const alg = joseHeader.alg;
21
+ if (typeof alg !== 'string' || !alg) {
22
+ throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
23
+ }
24
+ return jwsAlgorithm(alg);
25
+ }
26
+ async function signSignature(protectedHeader, payload, entry, key) {
27
+ const data = concat(encode(protectedHeader), encode('.'), payload);
28
+ const k = await prepareKey(entry, key, 'sign');
29
+ return b64u(await sign(entry, k, data));
30
+ }
31
+ export async function createSignature(input, key, assertB64) {
32
+ let { protectedHeader, unprotectedHeader } = input;
33
+ let protectedHeaderString;
34
+ [protectedHeader, protectedHeaderString] = serializeProtectedHeader(protectedHeader);
35
+ if (unprotectedHeader !== undefined) {
36
+ unprotectedHeader = serializeJoseHeader(JWSInvalid, unprotectedHeader)[0];
37
+ }
16
38
  if (!protectedHeader && !unprotectedHeader) {
17
39
  throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');
18
40
  }
@@ -20,20 +42,9 @@ export async function createSignature(input, key) {
20
42
  throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');
21
43
  }
22
44
  const joseHeader = { ...protectedHeader, ...unprotectedHeader };
23
- validateCritDuplicates(JWSInvalid, protectedHeader);
24
- const extensions = validateCrit(JWSInvalid, JWS_RECOGNIZED, input.crit, protectedHeader, joseHeader);
25
- let b64 = true;
26
- if (extensions.includes('b64')) {
27
- b64 = protectedHeader.b64;
28
- if (typeof b64 !== 'boolean') {
29
- throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
30
- }
31
- }
32
- const { alg } = joseHeader;
33
- if (typeof alg !== 'string' || !alg) {
34
- throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
35
- }
36
- const entry = jwsAlgorithm(alg);
45
+ const b64 = validateSignatureHeader(protectedHeader, joseHeader, input.crit);
46
+ assertB64?.(b64);
47
+ const entry = signatureAlgorithm(joseHeader);
37
48
  let payloadS;
38
49
  let payloadB;
39
50
  if (b64) {
@@ -47,21 +58,8 @@ export async function createSignature(input, key) {
47
58
  payloadB = input.payload;
48
59
  payloadS = '';
49
60
  }
50
- let protectedHeaderString;
51
- let protectedHeaderBytes;
52
- if (protectedHeader) {
53
- protectedHeaderString = b64u(JSON.stringify(protectedHeader));
54
- protectedHeaderBytes = encode(protectedHeaderString);
55
- }
56
- else {
57
- protectedHeaderString = '';
58
- protectedHeaderBytes = new Uint8Array();
59
- }
60
- const data = concat(protectedHeaderBytes, encode('.'), payloadB);
61
- const k = await prepareKey(entry, key, 'sign');
62
- const signature = await sign(entry, k, data);
63
61
  const jws = {
64
- signature: b64u(signature),
62
+ signature: await signSignature(protectedHeaderString, payloadB, entry, key),
65
63
  payload: payloadS,
66
64
  };
67
65
  if (protectedHeader) {
@@ -70,5 +68,18 @@ export async function createSignature(input, key) {
70
68
  if (unprotectedHeader) {
71
69
  jws.header = unprotectedHeader;
72
70
  }
73
- return jws;
71
+ return [jws, b64];
72
+ }
73
+ export async function createCompactSignature(payload, inputProtectedHeader, inputCrit, key, rejectUnencoded) {
74
+ const [protectedHeader, protectedHeaderString] = serializeProtectedHeader(inputProtectedHeader);
75
+ if (!protectedHeader) {
76
+ throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');
77
+ }
78
+ const b64 = validateSignatureHeader(protectedHeader, protectedHeader, inputCrit);
79
+ if (!b64)
80
+ rejectUnencoded();
81
+ const entry = signatureAlgorithm(protectedHeader);
82
+ const encodedPayload = b64u(payload);
83
+ const signature = await signSignature(protectedHeaderString, encode(encodedPayload), entry, key);
84
+ return `${protectedHeaderString}.${encodedPayload}.${signature}`;
74
85
  }
@@ -3,9 +3,25 @@ import { jwsAlgorithm } from './jws_algorithms.js';
3
3
  import { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../util/errors.js';
4
4
  import { concat, decoder, encoder, encode } from './buffer_utils.js';
5
5
  import { decodeBase64url, encodeBase64url, parseJoseHeader } from './helpers.js';
6
- import { isDisjoint } from './type_checks.js';
7
- import { validateCrit, validateAlgorithms, JWS_RECOGNIZED } from './options.js';
6
+ import { isDisjoint, isObject } from './type_checks.js';
7
+ import { validateB64, validateCrit, validateAlgorithms, JWS_RECOGNIZED } from './options.js';
8
8
  import { prepareKey } from './key.js';
9
+ export function snapshotJws(jws, sharedPayload) {
10
+ const encodedProtected = jws.protected;
11
+ const inputHeader = jws.header;
12
+ const header = isObject(inputHeader) ? { ...inputHeader } : inputHeader;
13
+ let payload = sharedPayload ? sharedPayload[0] : jws.payload;
14
+ if (!sharedPayload && payload instanceof Uint8Array) {
15
+ payload = new Uint8Array(payload);
16
+ }
17
+ const signature = jws.signature;
18
+ const snapshot = { payload, signature };
19
+ if (encodedProtected !== undefined)
20
+ snapshot.protected = encodedProtected;
21
+ if (inputHeader !== undefined)
22
+ snapshot.header = header;
23
+ return snapshot;
24
+ }
9
25
  export function verifyResult(jws, verified) {
10
26
  const [payload, parsedProt, , key, resolvedKey] = verified;
11
27
  const result = { payload };
@@ -23,12 +39,24 @@ export function verifyResult(jws, verified) {
23
39
  export function prepareVerify(options) {
24
40
  return [options && validateAlgorithms('algorithms', options.algorithms), options?.crit];
25
41
  }
26
- export async function verifySignature(jws, shared, key) {
27
- const { protected: encodedProtected, header, payload: inputPayload } = jws;
28
- let parsedProt = {};
29
- if (encodedProtected) {
30
- parsedProt = parseJoseHeader(encodedProtected, JWSInvalid, 'JWS Protected Header is invalid');
42
+ export function parseProtectedHeader(encodedProtected, parsedProtected = encodedProtected === undefined
43
+ ? {}
44
+ : parseJoseHeader(encodedProtected, JWSInvalid, 'JWS Protected Header is invalid')) {
45
+ return parsedProtected;
46
+ }
47
+ function validateJwsHeaders(parsedProt, joseHeader, shared) {
48
+ const b64 = validateB64(parsedProt, validateCrit(JWSInvalid, JWS_RECOGNIZED, shared[1], parsedProt, joseHeader));
49
+ const alg = joseHeader.alg;
50
+ if (typeof alg !== 'string' || !alg) {
51
+ throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
31
52
  }
53
+ if (shared[0] && !shared[0].has(alg)) {
54
+ throw new JOSEAlgNotAllowed('"alg" (Algorithm) Header Parameter value not allowed');
55
+ }
56
+ return [b64, alg];
57
+ }
58
+ export function parseJwsHeaders(encodedProtected, header, shared, parsedProtected) {
59
+ const parsedProt = parseProtectedHeader(encodedProtected, parsedProtected);
32
60
  let joseHeader;
33
61
  if (header !== undefined) {
34
62
  if (!isDisjoint(parsedProt, header)) {
@@ -39,58 +67,58 @@ export async function verifySignature(jws, shared, key) {
39
67
  else {
40
68
  joseHeader = parsedProt;
41
69
  }
42
- const extensions = validateCrit(JWSInvalid, JWS_RECOGNIZED, shared[1], parsedProt, joseHeader);
43
- let b64 = true;
44
- if (extensions.includes('b64')) {
45
- b64 = parsedProt.b64;
46
- if (typeof b64 !== 'boolean') {
47
- throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
48
- }
49
- }
50
- const { alg } = joseHeader;
51
- if (typeof alg !== 'string' || !alg) {
52
- throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
53
- }
54
- if (shared[0] && !shared[0].has(alg)) {
55
- throw new JOSEAlgNotAllowed('"alg" (Algorithm) Header Parameter value not allowed');
56
- }
57
- if (b64) {
58
- if (typeof inputPayload !== 'string') {
59
- throw new JWSInvalid('JWS Payload must be a string');
60
- }
70
+ return [parsedProt, joseHeader, ...validateJwsHeaders(parsedProt, joseHeader, shared)];
71
+ }
72
+ export function encodeJsonUnencodedPayload(payload) {
73
+ const invalid = /[\p{Cs}\p{Cn}]/u.exec(payload)?.[0];
74
+ if (invalid !== undefined) {
75
+ throw new JWSInvalid(/\p{Cs}/u.test(invalid)
76
+ ? 'JWS Payload must be a well-formed Unicode string'
77
+ : 'JWS Payload must not contain unassigned Unicode code points');
78
+ }
79
+ return encoder.encode(payload);
80
+ }
81
+ function encodeCompactUnencodedPayload(payload) {
82
+ try {
83
+ return encode(payload);
61
84
  }
62
- else if (typeof inputPayload !== 'string' && !(inputPayload instanceof Uint8Array)) {
63
- throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');
85
+ catch {
86
+ throw new JWSInvalid('JWS Compact Serialization payload must use only ASCII characters');
64
87
  }
88
+ }
89
+ async function verifyPrepared(jws, shared, key, encodedProtected, parsedProt, alg, signingPayload) {
65
90
  let resolvedKey = false;
66
91
  if (typeof key === 'function') {
67
92
  key = await key(parsedProt, jws);
68
93
  resolvedKey = true;
69
94
  }
95
+ const b64 = typeof signingPayload === 'string';
70
96
  const entry = jwsAlgorithm(alg);
71
- const data = concat(encodedProtected !== undefined ? encode(encodedProtected) : new Uint8Array(), encode('.'), typeof inputPayload === 'string'
72
- ? b64
73
- ?
74
- (shared[2] ??= encodeBase64url(inputPayload, 'payload', JWSInvalid))
75
- : encoder.encode(inputPayload)
76
- : inputPayload);
97
+ const data = concat(encodedProtected !== undefined ? encode(encodedProtected) : new Uint8Array(), encode('.'), b64
98
+ ?
99
+ (shared[2] ??= encodeBase64url(signingPayload, 'payload', JWSInvalid))
100
+ : signingPayload);
77
101
  const signature = decodeBase64url(jws.signature, 'signature', JWSInvalid);
78
102
  const k = await prepareKey(entry, key, 'verify');
79
- const verified = await verify(entry, k, signature, data);
80
- if (!verified) {
103
+ if (!(await verify(entry, k, signature, data))) {
81
104
  throw new JWSSignatureVerificationFailed();
82
105
  }
83
- let payload;
106
+ const payload = b64 ? decodeBase64url(signingPayload, 'payload', JWSInvalid) : signingPayload;
107
+ return [payload, parsedProt, b64, k, resolvedKey];
108
+ }
109
+ export async function verifySignature(jws, shared, key, encodeUnencodedPayload, parsedProtected) {
110
+ const { protected: encodedProtected, header, payload: inputPayload } = jws;
111
+ const [parsedProt, , b64, alg] = parseJwsHeaders(encodedProtected, header, shared, parsedProtected);
84
112
  if (b64) {
85
- payload = decodeBase64url(inputPayload, 'payload', JWSInvalid);
86
- }
87
- else if (typeof inputPayload === 'string') {
88
- payload = encoder.encode(inputPayload);
113
+ if (typeof inputPayload !== 'string') {
114
+ throw new JWSInvalid('JWS Payload must be a string');
115
+ }
89
116
  }
90
- else {
91
- payload = inputPayload;
117
+ else if (typeof inputPayload !== 'string' && !(inputPayload instanceof Uint8Array)) {
118
+ throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');
92
119
  }
93
- return [payload, parsedProt, b64, k, resolvedKey];
120
+ const signingPayload = b64 || typeof inputPayload !== 'string' ? inputPayload : encodeUnencodedPayload(inputPayload);
121
+ return verifyPrepared(jws, shared, key, encodedProtected, parsedProt, alg, signingPayload);
94
122
  }
95
123
  export async function verifyCompact(jws, shared, key) {
96
124
  if (jws instanceof Uint8Array) {
@@ -103,5 +131,9 @@ export async function verifyCompact(jws, shared, key) {
103
131
  if (length !== 3) {
104
132
  throw new JWSInvalid('Invalid Compact JWS');
105
133
  }
106
- return verifySignature({ payload, protected: protectedHeader, signature }, shared, key);
134
+ const compactJws = { payload, protected: protectedHeader, signature };
135
+ const parsedProt = parseProtectedHeader(protectedHeader);
136
+ const [b64, alg] = validateJwsHeaders(parsedProt, parsedProt, shared);
137
+ const signingPayload = b64 ? payload : encodeCompactUnencodedPayload(payload);
138
+ return verifyPrepared(compactJws, shared, key, protectedHeader, parsedProt, alg, signingPayload);
107
139
  }
@@ -12,13 +12,22 @@ const multipliers = {
12
12
  };
13
13
  const REGEX = /^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;
14
14
  const checkFailed = 'check_failed';
15
+ function invalidDuration() {
16
+ throw new TypeError('Invalid time period format');
17
+ }
15
18
  export function secs(str) {
19
+ if (typeof str !== 'string') {
20
+ invalidDuration();
21
+ }
16
22
  const matched = REGEX.exec(str);
17
23
  if (!matched || (matched[4] && matched[1])) {
18
- throw new TypeError('Invalid time period format');
24
+ invalidDuration();
19
25
  }
20
26
  const value = parseFloat(matched[2]);
21
27
  const numericDate = Math.round(value * multipliers[matched[3][0].toLowerCase()]);
28
+ if (!Number.isFinite(numericDate)) {
29
+ invalidDuration();
30
+ }
22
31
  if (matched[1] === '-' || matched[4] === 'ago') {
23
32
  return -numericDate;
24
33
  }
@@ -30,6 +39,17 @@ function validateInput(label, input) {
30
39
  }
31
40
  return input;
32
41
  }
42
+ function validateStringClaim(claim, value) {
43
+ if (typeof value !== 'string') {
44
+ throw new TypeError(`"${claim}" claim must be a string`);
45
+ }
46
+ }
47
+ function validateAudienceClaim(value) {
48
+ if (typeof value !== 'string' &&
49
+ (!Array.isArray(value) || Array.from(value).some((member) => typeof member !== 'string'))) {
50
+ throw new TypeError('"aud" claim must be a string or an array of strings');
51
+ }
52
+ }
33
53
  function numericDate(value, label) {
34
54
  if (typeof value === 'number')
35
55
  return validateInput(label, value);
@@ -38,10 +58,8 @@ function numericDate(value, label) {
38
58
  return epoch(new Date()) + secs(value);
39
59
  }
40
60
  const normalizeTyp = (value) => {
41
- if (value.includes('/')) {
42
- return value.toLowerCase();
43
- }
44
- return `application/${value.toLowerCase()}`;
61
+ const normalized = value.toLowerCase();
62
+ return value.includes('/') ? normalized : `application/${normalized}`;
45
63
  };
46
64
  const checkAudiencePresence = (audPayload, audOption) => {
47
65
  if (typeof audPayload === 'string') {
@@ -75,7 +93,7 @@ export function validateClaimsSet(protectedHeader, encodedPayload, options = {})
75
93
  throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');
76
94
  }
77
95
  const { typ } = options;
78
- if (typ &&
96
+ if (typ !== undefined &&
79
97
  (typeof protectedHeader.typ !== 'string' ||
80
98
  normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {
81
99
  throw new JWTClaimValidationFailed('unexpected "typ" JWT header value', payload, 'typ', checkFailed);
@@ -119,7 +137,7 @@ export function validateClaimsSet(protectedHeader, encodedPayload, options = {})
119
137
  }
120
138
  validateInput('clockTolerance option', tolerance);
121
139
  const { currentDate } = options;
122
- const now = validateInput('currentDate option', epoch(currentDate || new Date()));
140
+ const now = validateInput('currentDate option', epoch(currentDate === undefined ? new Date() : currentDate));
123
141
  const iat = validateNumericDate(payload, 'iat', maxTokenAge !== undefined);
124
142
  const nbf = validateNumericDate(payload, 'nbf');
125
143
  if (nbf !== undefined) {
@@ -135,63 +153,80 @@ export function validateClaimsSet(protectedHeader, encodedPayload, options = {})
135
153
  }
136
154
  if (maxTokenAge !== undefined) {
137
155
  const age = now - iat;
138
- const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);
156
+ const max = validateInput('maxTokenAge option', typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge));
139
157
  if (age - tolerance > max) {
140
158
  throw new JWTExpired('"iat" claim timestamp check failed (too far in the past)', payload, 'iat', checkFailed);
141
159
  }
142
- if (age < 0 - tolerance) {
160
+ if (age < -tolerance) {
143
161
  throw new JWTClaimValidationFailed('"iat" claim timestamp check failed (it should be in the past)', payload, 'iat', checkFailed);
144
162
  }
145
163
  }
146
164
  return payload;
147
165
  }
166
+ let producerPayloads;
167
+ function producerPayload(producer) {
168
+ return producerPayloads.get(producer);
169
+ }
170
+ export function jwtData(producer) {
171
+ const payload = producerPayload(producer);
172
+ for (const claim of ['iat', 'nbf', 'exp']) {
173
+ const value = payload[claim];
174
+ if (typeof value === 'number' && !Number.isFinite(value)) {
175
+ throw new TypeError(`"${claim}" claim must be a finite number`);
176
+ }
177
+ }
178
+ return encoder.encode(JSON.stringify(payload));
179
+ }
180
+ export function jwtClaim(producer, claim) {
181
+ return producerPayload(producer)[claim];
182
+ }
148
183
  export class JWTClaimsBuilder {
149
- #payload;
150
- constructor(payload) {
184
+ constructor(payload = {}) {
151
185
  if (!isObject(payload)) {
152
186
  throw new TypeError('JWT Claims Set MUST be an object');
153
187
  }
154
- this.#payload = structuredClone(payload);
155
- }
156
- data() {
157
- return encoder.encode(JSON.stringify(this.#payload));
158
- }
159
- get iss() {
160
- return this.#payload.iss;
161
- }
162
- set iss(value) {
163
- this.#payload.iss = value;
164
- }
165
- get sub() {
166
- return this.#payload.sub;
167
- }
168
- set sub(value) {
169
- this.#payload.sub = value;
170
- }
171
- get aud() {
172
- return this.#payload.aud;
173
- }
174
- set aud(value) {
175
- this.#payload.aud = value;
176
- }
177
- set jti(value) {
178
- this.#payload.jti = value;
179
- }
180
- set nbf(value) {
181
- this.#payload.nbf = numericDate(value, 'setNotBefore');
182
- }
183
- set exp(value) {
184
- this.#payload.exp = numericDate(value, 'setExpirationTime');
185
- }
186
- set iat(value) {
188
+ ;
189
+ (producerPayloads ||= new WeakMap()).set(this, structuredClone(payload));
190
+ }
191
+ setIssuer(value) {
192
+ validateStringClaim('iss', value);
193
+ producerPayload(this).iss = value;
194
+ return this;
195
+ }
196
+ setSubject(value) {
197
+ validateStringClaim('sub', value);
198
+ producerPayload(this).sub = value;
199
+ return this;
200
+ }
201
+ setAudience(value) {
202
+ validateAudienceClaim(value);
203
+ producerPayload(this).aud = value;
204
+ return this;
205
+ }
206
+ setJti(value) {
207
+ validateStringClaim('jti', value);
208
+ producerPayload(this).jti = value;
209
+ return this;
210
+ }
211
+ setNotBefore(value) {
212
+ producerPayload(this).nbf = numericDate(value, 'setNotBefore');
213
+ return this;
214
+ }
215
+ setExpirationTime(value) {
216
+ producerPayload(this).exp = numericDate(value, 'setExpirationTime');
217
+ return this;
218
+ }
219
+ setIssuedAt(value) {
220
+ const payload = producerPayload(this);
187
221
  if (value === undefined) {
188
- this.#payload.iat = epoch(new Date());
222
+ payload.iat = epoch(new Date());
189
223
  }
190
224
  else if (typeof value === 'string') {
191
- this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));
225
+ payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));
192
226
  }
193
227
  else {
194
- this.#payload.iat = numericDate(value, 'setIssuedAt');
228
+ payload.iat = numericDate(value, 'setIssuedAt');
195
229
  }
230
+ return this;
196
231
  }
197
232
  }
@@ -1,8 +1,9 @@
1
1
  import { withAlg as invalidKeyInput } from './invalid_key_input.js';
2
2
  import { isKeyLike, isCryptoKey } from './is_key_like.js';
3
- import * as jwk from './type_checks.js';
3
+ import { isObject } from './type_checks.js';
4
4
  import { decode } from '../util/base64url.js';
5
5
  import { jwkToKey } from './jwk_to_key.js';
6
+ import { normalizeJwk } from './jwk_metadata.js';
6
7
  const tag = (key) => key[Symbol.toStringTag];
7
8
  const jwkMatchesOp = (entry, key, usage) => {
8
9
  const { alg } = entry;
@@ -27,14 +28,27 @@ export function checkKeyType(entry, key, usage) {
27
28
  const privateKey = usage === 'decrypt' || usage === 'sign';
28
29
  if (secret && key instanceof Uint8Array)
29
30
  return [BYTES, key];
30
- if (jwk.isJWK(key)) {
31
- if (secret ? !jwk.isSecretJWK(key) : !(privateKey ? jwk.isPrivateJWK(key) : jwk.isPublicJWK(key))) {
31
+ if (isObject(key)) {
32
+ const normalized = normalizeJwk(key);
33
+ if (typeof normalized.kty !== 'string') {
34
+ throw new TypeError(secret
35
+ ? invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array')
36
+ : invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
37
+ }
38
+ const valid = secret
39
+ ? normalized.kty === 'oct' && typeof normalized.k === 'string'
40
+ : normalized.kty !== 'oct' &&
41
+ (privateKey
42
+ ? (normalized.kty === 'AKP' && typeof normalized.priv === 'string') ||
43
+ typeof normalized.d === 'string'
44
+ : normalized.d === undefined && normalized.priv === undefined);
45
+ if (!valid) {
32
46
  throw new TypeError(secret
33
47
  ? `JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present`
34
48
  : `JSON Web Key for this operation must be a ${privateKey ? 'private' : 'public'} JWK`);
35
49
  }
36
- jwkMatchesOp(entry, key, usage);
37
- return [JWK, key];
50
+ jwkMatchesOp(entry, normalized, usage);
51
+ return [JWK, key, normalized];
38
52
  }
39
53
  if (!isKeyLike(key)) {
40
54
  throw new TypeError(secret
@@ -81,7 +95,7 @@ function cached(key, alg, value) {
81
95
  entry[alg] = value;
82
96
  }
83
97
  else {
84
- cache.set(key, { __proto__: null, [alg]: value });
98
+ cache.set(key, { [alg]: value });
85
99
  }
86
100
  }
87
101
  return value ?? entry?.[alg];
@@ -107,8 +121,9 @@ export async function prepareKey(entry, key, usage) {
107
121
  return tagged[1];
108
122
  case JWK: {
109
123
  const key = tagged[1];
110
- if (key.k) {
111
- return decode(key.k);
124
+ const normalized = tagged[2];
125
+ if (normalized.kty === 'oct') {
126
+ return decode(normalized.k);
112
127
  }
113
128
  if (!Object.isFrozen(key)) {
114
129
  const { key_ops } = key;
@@ -116,7 +131,7 @@ export async function prepareKey(entry, key, usage) {
116
131
  Object.freeze(key_ops);
117
132
  Object.freeze(key);
118
133
  }
119
- return handleJWK(key, key, entry);
134
+ return handleJWK(key, normalized, entry);
120
135
  }
121
136
  case KEYOBJECT: {
122
137
  const keyObject = tagged[1];
@@ -5,7 +5,7 @@ import { jweAlgorithm, jweEncryption } from './jwe_algorithms.js';
5
5
  import { JOSENotSupported, JWEInvalid } from '../util/errors.js';
6
6
  import { decodeBase64url, digest } from './helpers.js';
7
7
  import { generateCek, encrypt, decrypt } from './content_encryption.js';
8
- import { isObject } from './type_checks.js';
8
+ import { assertUint8Array, isObject } from './type_checks.js';
9
9
  import { checkCryptoKey, checkModulusLength, checkUsage } from './crypto_key.js';
10
10
  import { concat, encode, uint32be } from './buffer_utils.js';
11
11
  import { assertCryptoKey } from './is_key_like.js';
@@ -110,7 +110,7 @@ function assertNoEncryptedKey(encryptedKey) {
110
110
  if (encryptedKey !== undefined)
111
111
  throw new JWEInvalid('Encountered unexpected JWE Encrypted Key');
112
112
  }
113
- export async function decryptKeyManagement(alg, enc, key, encryptedKey, joseHeader, options) {
113
+ export async function decryptKeyManagement(alg, enc, key, encryptedKey, joseHeader, maxPBES2Count) {
114
114
  const entry = jweAlgorithm(alg);
115
115
  if (alg === 'dir') {
116
116
  assertNoEncryptedKey(encryptedKey);
@@ -152,7 +152,7 @@ export async function decryptKeyManagement(alg, enc, key, encryptedKey, joseHead
152
152
  assertEncryptedKey(encryptedKey);
153
153
  if (typeof joseHeader.p2c !== 'number')
154
154
  throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) missing or invalid`);
155
- const p2cLimit = options?.maxPBES2Count || 10_000;
155
+ const p2cLimit = maxPBES2Count || 10_000;
156
156
  if (joseHeader.p2c > p2cLimit)
157
157
  throw new JWEInvalid(`JOSE Header "p2c" (PBES2 Count) out is of acceptable bounds`);
158
158
  if (typeof joseHeader.p2s !== 'string')
@@ -190,8 +190,14 @@ export async function encryptKeyManagement(alg, enc, key, providedCek, providedP
190
190
  case 'ECDH': {
191
191
  assertEcdhKey(key);
192
192
  const { apu, apv } = providedParameters;
193
+ if (apu !== undefined) {
194
+ assertUint8Array(apu, '"apu"');
195
+ }
196
+ if (apv !== undefined) {
197
+ assertUint8Array(apv, '"apv"');
198
+ }
193
199
  let ephemeralKey;
194
- if (providedParameters.epk) {
200
+ if (providedParameters.epk !== undefined) {
195
201
  ephemeralKey = (await prepareKey(entry, providedParameters.epk, 'decrypt'));
196
202
  }
197
203
  else {
@@ -0,0 +1,6 @@
1
+ export function validateExtractableOption(extractable) {
2
+ if (extractable !== undefined && typeof extractable !== 'boolean') {
3
+ throw new TypeError('"extractable" option must be a boolean');
4
+ }
5
+ return extractable;
6
+ }
@@ -1,4 +1,5 @@
1
1
  import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';
2
+ import { isObject } from './type_checks.js';
2
3
  export const JWS_RECOGNIZED = { __proto__: null, b64: true };
3
4
  export const JWE_RECOGNIZED = { __proto__: null };
4
5
  export function validateAlgorithms(option, algorithms) {
@@ -46,3 +47,28 @@ export function validateCrit(Err, recognizedDefault, recognizedOption, protected
46
47
  }
47
48
  return protectedHeader.crit;
48
49
  }
50
+ export function validateB64(protectedHeader, extensions) {
51
+ if (extensions.includes('b64')) {
52
+ const b64 = protectedHeader.b64;
53
+ if (typeof b64 !== 'boolean') {
54
+ throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
55
+ }
56
+ return b64;
57
+ }
58
+ return true;
59
+ }
60
+ export function serializeJoseHeader(Err, header) {
61
+ let serialized;
62
+ let parsed;
63
+ try {
64
+ serialized = JSON.stringify(header);
65
+ parsed = JSON.parse(serialized);
66
+ }
67
+ catch (cause) {
68
+ throw new Err('JOSE Header is not valid JSON', { cause });
69
+ }
70
+ if (!isObject(parsed)) {
71
+ throw new Err('JOSE Header is not a JSON object');
72
+ }
73
+ return [parsed, serialized];
74
+ }