@suveren/gateway 0.7.4 → 0.8.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 (264) hide show
  1. package/content/integrations/mollie.json +103 -28
  2. package/dist/control-plane/index.mjs +248 -58
  3. package/dist/mcp-server/http.mjs +577 -124
  4. package/dist/ui/assets/index-BFnSVa9N.js +110 -0
  5. package/dist/ui/assets/{index-CkWaRck1.css → index-BYVb_0oG.css} +1 -1
  6. package/dist/ui/index.html +2 -2
  7. package/node_modules/@hap/core/dist/index.d.mts +285 -13
  8. package/node_modules/@hap/core/dist/index.d.ts +285 -13
  9. package/node_modules/@hap/core/dist/index.js +281 -13
  10. package/node_modules/@hap/core/dist/index.mjs +266 -12
  11. package/node_modules/@hap/core/package.json +4 -2
  12. package/node_modules/@hap/core/src/did-key.ts +126 -0
  13. package/node_modules/@hap/core/src/frame.ts +115 -14
  14. package/node_modules/@hap/core/src/gatekeeper.ts +26 -0
  15. package/node_modules/@hap/core/src/identity.ts +21 -5
  16. package/node_modules/@hap/core/src/index.ts +3 -0
  17. package/node_modules/@hap/core/src/mandate.ts +207 -0
  18. package/node_modules/@hap/core/src/receipt.ts +74 -0
  19. package/node_modules/@hap/core/src/types.ts +87 -5
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/accept.js +54 -0
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/charset.js +10 -34
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/encoding.js +9 -30
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/language.js +15 -36
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/mediaType.js +16 -134
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/LICENSE +22 -0
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/README.md +71 -0
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.d.ts +46 -0
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js +176 -0
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js.map +1 -0
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/package.json +52 -0
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/package.json +16 -10
  32. package/node_modules/@types/node/README.md +1 -1
  33. package/node_modules/@types/node/buffer.buffer.d.ts +10 -5
  34. package/node_modules/@types/node/crypto.d.ts +2 -4
  35. package/node_modules/@types/node/dgram.d.ts +119 -4
  36. package/node_modules/@types/node/ffi.d.ts +1 -1
  37. package/node_modules/@types/node/fs/promises.d.ts +61 -65
  38. package/node_modules/@types/node/fs.d.ts +86 -76
  39. package/node_modules/@types/node/http.d.ts +17 -1
  40. package/node_modules/@types/node/http2.d.ts +12 -4
  41. package/node_modules/@types/node/index.d.ts +1 -0
  42. package/node_modules/@types/node/inspector.d.ts +2 -1
  43. package/node_modules/@types/node/net.d.ts +108 -16
  44. package/node_modules/@types/node/package.json +2 -2
  45. package/node_modules/@types/node/process.d.ts +52 -0
  46. package/node_modules/@types/node/quic.d.ts +246 -38
  47. package/node_modules/@types/node/sqlite.d.ts +6 -2
  48. package/node_modules/@types/node/stream/iter.d.ts +4 -4
  49. package/node_modules/@types/node/test.d.ts +36 -0
  50. package/node_modules/@types/node/tls.d.ts +24 -0
  51. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
  52. package/node_modules/@types/node/ts5.6/index.d.ts +1 -0
  53. package/node_modules/@types/node/ts5.7/index.d.ts +1 -0
  54. package/node_modules/@types/node/tty.d.ts +4 -3
  55. package/node_modules/@types/node/vfs.d.ts +210 -0
  56. package/node_modules/@types/node/vm.d.ts +1 -1
  57. package/node_modules/express-rate-limit/dist/index.cjs +6 -3
  58. package/node_modules/express-rate-limit/dist/index.d.cts +11 -0
  59. package/node_modules/express-rate-limit/dist/index.d.mts +11 -0
  60. package/node_modules/express-rate-limit/dist/index.d.ts +11 -0
  61. package/node_modules/express-rate-limit/dist/index.mjs +6 -3
  62. package/node_modules/express-rate-limit/{license.md → license} +7 -6
  63. package/node_modules/express-rate-limit/package.json +5 -5
  64. package/node_modules/express-rate-limit/readme.md +1 -0
  65. package/node_modules/fast-uri/index.js +215 -47
  66. package/node_modules/fast-uri/lib/schemes.js +9 -4
  67. package/node_modules/fast-uri/lib/utils.js +396 -92
  68. package/node_modules/fast-uri/package.json +1 -1
  69. package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  70. package/node_modules/fast-uri/test/equal.test.js +31 -3
  71. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  72. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  73. package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  74. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  75. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  76. package/node_modules/fast-uri/test/parse.test.js +7 -3
  77. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  78. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  79. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  80. package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  81. package/node_modules/fast-uri/test/security.test.js +75 -3
  82. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  83. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  84. package/node_modules/hono/dist/cjs/client/client.js +25 -11
  85. package/node_modules/hono/dist/cjs/client/utils.js +4 -1
  86. package/node_modules/hono/dist/cjs/context.js +4 -0
  87. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  88. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  89. package/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  90. package/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  91. package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
  92. package/node_modules/hono/dist/cjs/middleware/cors/index.js +1 -1
  93. package/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  94. package/node_modules/hono/dist/cjs/middleware/etag/digest.js +1 -1
  95. package/node_modules/hono/dist/cjs/middleware/etag/index.js +3 -3
  96. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  97. package/node_modules/hono/dist/cjs/request.js +8 -4
  98. package/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  99. package/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  100. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +10 -3
  101. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +47 -83
  102. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +2 -1
  103. package/node_modules/hono/dist/cjs/router/trie-router/node.js +46 -69
  104. package/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  105. package/node_modules/hono/dist/cjs/router/utils.js +27 -0
  106. package/node_modules/hono/dist/cjs/utils/body.js +15 -3
  107. package/node_modules/hono/dist/cjs/utils/cookie.js +1 -1
  108. package/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  109. package/node_modules/hono/dist/cjs/utils/stream.js +7 -1
  110. package/node_modules/hono/dist/cjs/utils/url.js +9 -1
  111. package/node_modules/hono/dist/client/client.js +25 -11
  112. package/node_modules/hono/dist/client/utils.js +4 -1
  113. package/node_modules/hono/dist/context.js +4 -0
  114. package/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  115. package/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  116. package/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  117. package/node_modules/hono/dist/jsx/dom/render.js +2 -0
  118. package/node_modules/hono/dist/middleware/cache/index.js +1 -1
  119. package/node_modules/hono/dist/middleware/cors/index.js +1 -1
  120. package/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  121. package/node_modules/hono/dist/middleware/etag/digest.js +1 -1
  122. package/node_modules/hono/dist/middleware/etag/index.js +3 -3
  123. package/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  124. package/node_modules/hono/dist/request.js +8 -4
  125. package/node_modules/hono/dist/router/linear-router/router.js +7 -2
  126. package/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  127. package/node_modules/hono/dist/router/reg-exp-router/node.js +6 -2
  128. package/node_modules/hono/dist/router/reg-exp-router/router.js +53 -84
  129. package/node_modules/hono/dist/router/reg-exp-router/trie.js +2 -1
  130. package/node_modules/hono/dist/router/trie-router/node.js +46 -69
  131. package/node_modules/hono/dist/router/trie-router/router.js +3 -11
  132. package/node_modules/hono/dist/router/utils.js +5 -0
  133. package/node_modules/hono/dist/types/context.d.ts +4 -0
  134. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -0
  135. package/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  136. package/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  137. package/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  138. package/node_modules/hono/dist/types/utils/url.d.ts +4 -0
  139. package/node_modules/hono/dist/utils/body.js +15 -3
  140. package/node_modules/hono/dist/utils/cookie.js +1 -1
  141. package/node_modules/hono/dist/utils/ipaddr.js +5 -3
  142. package/node_modules/hono/dist/utils/stream.js +7 -1
  143. package/node_modules/hono/dist/utils/url.js +9 -1
  144. package/node_modules/hono/package.json +1 -1
  145. package/node_modules/ip-address/README.md +92 -82
  146. package/node_modules/ip-address/dist/common.d.ts +20 -0
  147. package/node_modules/ip-address/dist/common.js +36 -0
  148. package/node_modules/ip-address/dist/common.js.map +1 -1
  149. package/node_modules/ip-address/dist/ipv4.d.ts +50 -0
  150. package/node_modules/ip-address/dist/ipv4.js +75 -0
  151. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  152. package/node_modules/ip-address/dist/ipv6.d.ts +79 -10
  153. package/node_modules/ip-address/dist/ipv6.js +120 -30
  154. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  155. package/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  156. package/node_modules/ip-address/dist/v4/constants.js +40 -1
  157. package/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  158. package/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  159. package/node_modules/ip-address/dist/v6/constants.js +47 -1
  160. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  161. package/node_modules/ip-address/package.json +1 -1
  162. package/node_modules/is-plain-object/README.md +39 -95
  163. package/node_modules/is-plain-object/dist/is-plain-object.js +0 -2
  164. package/node_modules/is-plain-object/is-plain-object.d.ts +6 -1
  165. package/node_modules/is-plain-object/package.json +8 -34
  166. package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -16
  167. package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +10 -20
  168. package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -16
  169. package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +16 -38
  170. package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +7 -16
  171. package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +19 -38
  172. package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -8
  173. package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +5 -5
  174. package/node_modules/jose/dist/types/jwks/local.d.ts +6 -10
  175. package/node_modules/jose/dist/types/jwks/remote.d.ts +17 -28
  176. package/node_modules/jose/dist/types/jws/compact/sign.d.ts +5 -10
  177. package/node_modules/jose/dist/types/jws/compact/verify.d.ts +9 -18
  178. package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +7 -16
  179. package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +9 -18
  180. package/node_modules/jose/dist/types/jws/general/sign.d.ts +11 -21
  181. package/node_modules/jose/dist/types/jws/general/verify.d.ts +12 -21
  182. package/node_modules/jose/dist/types/jwt/decrypt.d.ts +10 -20
  183. package/node_modules/jose/dist/types/jwt/encrypt.d.ts +17 -29
  184. package/node_modules/jose/dist/types/jwt/sign.d.ts +12 -19
  185. package/node_modules/jose/dist/types/jwt/unsecured.d.ts +17 -28
  186. package/node_modules/jose/dist/types/jwt/verify.d.ts +9 -19
  187. package/node_modules/jose/dist/types/key/export.d.ts +4 -4
  188. package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +6 -8
  189. package/node_modules/jose/dist/types/key/generate_secret.d.ts +4 -11
  190. package/node_modules/jose/dist/types/key/import.d.ts +10 -17
  191. package/node_modules/jose/dist/types/types.d.ts +48 -86
  192. package/node_modules/jose/dist/types/util/base64url.d.ts +2 -2
  193. package/node_modules/jose/dist/types/util/decode_jwt.d.ts +3 -10
  194. package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -4
  195. package/node_modules/jose/dist/types/util/errors.d.ts +26 -53
  196. package/node_modules/jose/dist/webapi/index.js +70 -32
  197. package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +7 -8
  198. package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +42 -26
  199. package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +14 -10
  200. package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +53 -71
  201. package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +38 -49
  202. package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +121 -158
  203. package/node_modules/jose/dist/webapi/jwk/embedded.js +30 -18
  204. package/node_modules/jose/dist/webapi/jwk/thumbprint.js +54 -64
  205. package/node_modules/jose/dist/webapi/jwks/local.js +49 -74
  206. package/node_modules/jose/dist/webapi/jwks/remote.js +91 -160
  207. package/node_modules/jose/dist/webapi/jws/compact/sign.js +21 -20
  208. package/node_modules/jose/dist/webapi/jws/compact/verify.js +7 -8
  209. package/node_modules/jose/dist/webapi/jws/flattened/sign.js +29 -30
  210. package/node_modules/jose/dist/webapi/jws/flattened/verify.js +21 -23
  211. package/node_modules/jose/dist/webapi/jws/general/sign.js +61 -70
  212. package/node_modules/jose/dist/webapi/jws/general/verify.js +47 -41
  213. package/node_modules/jose/dist/webapi/jwt/decrypt.js +13 -22
  214. package/node_modules/jose/dist/webapi/jwt/encrypt.js +58 -100
  215. package/node_modules/jose/dist/webapi/jwt/sign.js +18 -50
  216. package/node_modules/jose/dist/webapi/jwt/unsecured.js +34 -63
  217. package/node_modules/jose/dist/webapi/jwt/verify.js +12 -14
  218. package/node_modules/jose/dist/webapi/key/export.js +32 -37
  219. package/node_modules/jose/dist/webapi/key/generate_key_pair.js +40 -44
  220. package/node_modules/jose/dist/webapi/key/generate_secret.js +35 -39
  221. package/node_modules/jose/dist/webapi/key/import.js +52 -52
  222. package/node_modules/jose/dist/webapi/lib/asn1.js +130 -164
  223. package/node_modules/jose/dist/webapi/lib/base64.js +18 -20
  224. package/node_modules/jose/dist/webapi/lib/buffer_utils.js +34 -38
  225. package/node_modules/jose/dist/webapi/lib/content_encryption.js +79 -123
  226. package/node_modules/jose/dist/webapi/lib/crypto_key.js +24 -25
  227. package/node_modules/jose/dist/webapi/lib/deflate.js +46 -40
  228. package/node_modules/jose/dist/webapi/lib/helpers.js +40 -37
  229. package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +10 -24
  230. package/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -15
  231. package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +106 -93
  232. package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +210 -176
  233. package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +105 -107
  234. package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +19 -0
  235. package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +9 -16
  236. package/node_modules/jose/dist/webapi/lib/jws_algorithms.js +62 -61
  237. package/node_modules/jose/dist/webapi/lib/jws_sign.js +58 -72
  238. package/node_modules/jose/dist/webapi/lib/jws_verify.js +90 -103
  239. package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +134 -185
  240. package/node_modules/jose/dist/webapi/lib/key.js +84 -121
  241. package/node_modules/jose/dist/webapi/lib/key_algorithm.js +13 -8
  242. package/node_modules/jose/dist/webapi/lib/key_descriptor.js +8 -6
  243. package/node_modules/jose/dist/webapi/lib/key_management.js +200 -225
  244. package/node_modules/jose/dist/webapi/lib/key_options.js +8 -0
  245. package/node_modules/jose/dist/webapi/lib/options.js +57 -44
  246. package/node_modules/jose/dist/webapi/lib/signing.js +18 -22
  247. package/node_modules/jose/dist/webapi/lib/type_checks.js +28 -33
  248. package/node_modules/jose/dist/webapi/util/base64url.js +26 -35
  249. package/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -31
  250. package/node_modules/jose/dist/webapi/util/decode_protected_header.js +18 -23
  251. package/node_modules/jose/dist/webapi/util/errors.js +94 -84
  252. package/node_modules/jose/package.json +17 -81
  253. package/package.json +2 -2
  254. package/profiles/calendar/0.5.profile.json +190 -0
  255. package/profiles/charge/0.5.profile.json +210 -0
  256. package/profiles/customers/0.7.profile.json +157 -0
  257. package/profiles/deploy/0.9.profile.json +176 -0
  258. package/profiles/email/0.6.profile.json +208 -0
  259. package/profiles/index.json +9 -1
  260. package/profiles/publish/0.5.profile.json +186 -0
  261. package/profiles/purchase/0.5.profile.json +231 -0
  262. package/profiles/records/0.5.profile.json +117 -0
  263. package/dist/ui/assets/index-0Q2eNytX.js +0 -110
  264. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/HISTORY.md +0 -114
@@ -1,166 +1,129 @@
1
- import { FlattenedEncrypt } from '../flattened/encrypt.js';
2
- import { assertNotSet } from '../../lib/helpers.js';
3
- import { JWEInvalid } from '../../util/errors.js';
4
- import { generateCek } from '../../lib/content_encryption.js';
5
- import { encryptKeyManagement } from '../../lib/key_management.js';
6
- import { encode as b64u } from '../../util/base64url.js';
7
- import { validateCritDuplicates } from '../../lib/options.js';
8
- import { checkEncryptHeaders, encryptJWE } from '../../lib/jwe_encrypt.js';
9
- import { prepareKey } from '../../lib/key.js';
10
- import { jweAlgorithm } from '../../lib/jwe_algorithms.js';
1
+ import { assertNotSet } from "../../lib/helpers.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, createJWE, encryptJWE, transportCek } from "../../lib/jwe_encrypt.js";
6
+ import { JWE, isJWECEKTransport, jweAlgorithm } from "../../lib/jwe_algorithms.js";
7
+ import { assertUint8Array } from "../../lib/type_checks.js";
11
8
  class IndividualRecipient {
12
- #parent;
13
- state;
14
- constructor(enc, key, crit) {
15
- this.#parent = enc;
16
- this.state = [undefined, undefined, key, crit];
17
- }
18
- setUnprotectedHeader(unprotectedHeader) {
19
- assertNotSet(this.state[0], 'setUnprotectedHeader');
20
- this.state[0] = unprotectedHeader;
21
- return this;
22
- }
23
- setKeyManagementParameters(parameters) {
24
- assertNotSet(this.state[1], 'setKeyManagementParameters');
25
- this.state[1] = parameters;
26
- return this;
27
- }
28
- addRecipient(...args) {
29
- return this.#parent.addRecipient(...args);
30
- }
31
- encrypt(...args) {
32
- return this.#parent.encrypt(...args);
33
- }
34
- done() {
35
- return this.#parent;
36
- }
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
+ }
37
29
  }
38
30
  function copyOptionalMembers(flattened, jwe, recipient) {
39
- const { aad, protected: protectedHeader, unprotected, header } = flattened;
40
- if (aad)
41
- jwe.aad = aad;
42
- if (protectedHeader)
43
- jwe.protected = protectedHeader;
44
- if (unprotected)
45
- jwe.unprotected = unprotected;
46
- if (header)
47
- recipient.header = header;
31
+ const { aad, protected: protectedHeader, unprotected, header } = flattened;
32
+ aad && (jwe.aad = aad), protectedHeader && (jwe.protected = protectedHeader), unprotected && (jwe.unprotected = unprotected), header && (recipient.header = header);
48
33
  }
49
- export class GeneralEncrypt {
50
- #plaintext;
51
- #recipients = [];
52
- #protectedHeader;
53
- #unprotectedHeader;
54
- #aad;
55
- constructor(plaintext) {
56
- this.#plaintext = plaintext;
57
- }
58
- addRecipient(key, options) {
59
- const recipient = new IndividualRecipient(this, key, options?.crit);
60
- this.#recipients.push(recipient);
61
- return recipient;
62
- }
63
- setProtectedHeader(protectedHeader) {
64
- assertNotSet(this.#protectedHeader, 'setProtectedHeader');
65
- this.#protectedHeader = protectedHeader;
66
- return this;
67
- }
68
- setSharedUnprotectedHeader(sharedUnprotectedHeader) {
69
- assertNotSet(this.#unprotectedHeader, 'setSharedUnprotectedHeader');
70
- this.#unprotectedHeader = sharedUnprotectedHeader;
71
- return this;
34
+ class GeneralEncrypt {
35
+ #plaintext;
36
+ #recipients = [];
37
+ #protectedHeader;
38
+ #unprotectedHeader;
39
+ #aad;
40
+ constructor(plaintext) {
41
+ this.#plaintext = plaintext;
42
+ }
43
+ addRecipient(key, options) {
44
+ const recipient = new IndividualRecipient(this, key, options?.crit);
45
+ return this.#recipients.push(recipient), recipient;
46
+ }
47
+ setProtectedHeader(protectedHeader) {
48
+ return assertNotSet(this.#protectedHeader, "setProtectedHeader"), this.#protectedHeader = protectedHeader, this;
49
+ }
50
+ setSharedUnprotectedHeader(sharedUnprotectedHeader) {
51
+ return assertNotSet(this.#unprotectedHeader, "setSharedUnprotectedHeader"), this.#unprotectedHeader = sharedUnprotectedHeader, this;
52
+ }
53
+ setAdditionalAuthenticatedData(aad) {
54
+ return this.#aad = aad, this;
55
+ }
56
+ async encrypt() {
57
+ if (!this.#recipients.length)
58
+ throw new JWEInvalid("at least one recipient must be added");
59
+ if (assertUint8Array(this.#plaintext, "plaintext"), this.#recipients.length === 1) {
60
+ const [unprotectedHeader, keyManagementParameters, key, crit] = this.#recipients[0].state, flattened = await createJWE([
61
+ this.#plaintext,
62
+ this.#protectedHeader,
63
+ unprotectedHeader,
64
+ this.#unprotectedHeader,
65
+ this.#aad,
66
+ void 0,
67
+ void 0,
68
+ keyManagementParameters,
69
+ crit,
70
+ !1
71
+ ], key), jwe2 = {
72
+ ciphertext: flattened.ciphertext,
73
+ recipients: [{}]
74
+ };
75
+ return flattened.iv && (jwe2.iv = flattened.iv), flattened.tag && (jwe2.tag = flattened.tag), flattened.encrypted_key && (jwe2.recipients[0].encrypted_key = flattened.encrypted_key), copyOptionalMembers(flattened, jwe2, jwe2.recipients[0]), jwe2;
72
76
  }
73
- setAdditionalAuthenticatedData(aad) {
74
- this.#aad = aad;
75
- return this;
77
+ let enc, protectedHeader = this.#protectedHeader, sharedUnprotectedHeader = this.#unprotectedHeader;
78
+ const inputs = [], checked = [];
79
+ for (let i = 0; i < this.#recipients.length; i++) {
80
+ const recipient = this.#recipients[i], [unprotectedHeader, keyManagementParameters, , crit] = recipient.state, input = [
81
+ this.#plaintext,
82
+ protectedHeader,
83
+ unprotectedHeader,
84
+ sharedUnprotectedHeader,
85
+ this.#aad,
86
+ void 0,
87
+ void 0,
88
+ keyManagementParameters,
89
+ crit,
90
+ !0
91
+ ], headers = checkEncryptHeaders(input);
92
+ inputs.push(input), checked.push(headers), i === 0 && (protectedHeader = input[1], sharedUnprotectedHeader = input[3]);
93
+ const algEntry = JWE[headers[1]];
94
+ if (algEntry && !isJWECEKTransport(algEntry))
95
+ throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
96
+ if (!enc)
97
+ enc = headers[2];
98
+ else if (enc !== headers[2])
99
+ throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
76
100
  }
77
- async encrypt() {
78
- if (!this.#recipients.length) {
79
- throw new JWEInvalid('at least one recipient must be added');
80
- }
81
- if (!(this.#plaintext instanceof Uint8Array)) {
82
- throw new TypeError('plaintext must be an instance of Uint8Array');
83
- }
84
- if (this.#recipients.length === 1) {
85
- const [recipient] = this.#recipients;
86
- const [unprotectedHeader, keyManagementParameters, key, crit] = recipient.state;
87
- const flattened = await new FlattenedEncrypt(this.#plaintext)
88
- .setAdditionalAuthenticatedData(this.#aad)
89
- .setProtectedHeader(this.#protectedHeader)
90
- .setSharedUnprotectedHeader(this.#unprotectedHeader)
91
- .setUnprotectedHeader(unprotectedHeader)
92
- .setKeyManagementParameters(keyManagementParameters)
93
- .encrypt(key, { crit });
94
- const jwe = {
95
- ciphertext: flattened.ciphertext,
96
- iv: flattened.iv,
97
- recipients: [{}],
98
- tag: flattened.tag,
99
- };
100
- if (flattened.encrypted_key)
101
- jwe.recipients[0].encrypted_key = flattened.encrypted_key;
102
- copyOptionalMembers(flattened, jwe, jwe.recipients[0]);
103
- return jwe;
104
- }
105
- validateCritDuplicates(JWEInvalid, this.#protectedHeader);
106
- let enc;
107
- const inputs = [];
108
- const checked = [];
109
- for (let i = 0; i < this.#recipients.length; i++) {
110
- const recipient = this.#recipients[i];
111
- const [unprotectedHeader, keyManagementParameters, , crit] = recipient.state;
112
- const input = [
113
- this.#plaintext,
114
- this.#protectedHeader,
115
- unprotectedHeader,
116
- this.#unprotectedHeader,
117
- this.#aad,
118
- undefined,
119
- undefined,
120
- keyManagementParameters,
121
- crit,
122
- true,
123
- ];
124
- const headers = checkEncryptHeaders(input);
125
- inputs.push(input);
126
- checked.push(headers);
127
- if (headers[1] === 'dir' || headers[1] === 'ECDH-ES') {
128
- throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
129
- }
130
- if (!enc) {
131
- enc = headers[2];
132
- }
133
- else if (enc !== headers[2]) {
134
- throw new JWEInvalid('JWE "enc" (Encryption Algorithm) Header Parameter must be the same for all recipients');
135
- }
136
- }
137
- const cek = generateCek(checked[0][3]);
138
- const jwe = {
139
- ciphertext: '',
140
- recipients: [],
141
- };
142
- for (let i = 0; i < this.#recipients.length; i++) {
143
- const recipient = this.#recipients[i];
144
- const [unprotectedHeader, keyManagementParameters, key] = recipient.state;
145
- const target = {};
146
- jwe.recipients.push(target);
147
- if (i === 0) {
148
- inputs[0][5] = cek;
149
- const flattened = await encryptJWE(inputs[0], checked[0], key);
150
- jwe.ciphertext = flattened.ciphertext;
151
- jwe.iv = flattened.iv;
152
- jwe.tag = flattened.tag;
153
- target.encrypted_key = flattened.encrypted_key;
154
- copyOptionalMembers(flattened, jwe, target);
155
- continue;
156
- }
157
- const [, alg, , encEntry] = checked[i];
158
- const k = await prepareKey(jweAlgorithm(alg), key, 'encrypt');
159
- const [, encryptedKey, parameters] = await encryptKeyManagement(alg, encEntry, k, cek, keyManagementParameters);
160
- target.encrypted_key = b64u(encryptedKey);
161
- if (unprotectedHeader || parameters)
162
- target.header = { ...unprotectedHeader, ...parameters };
163
- }
164
- return jwe;
101
+ const algEntries = checked.map(([, alg]) => {
102
+ const algEntry = jweAlgorithm(alg);
103
+ if (!isJWECEKTransport(algEntry))
104
+ throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
105
+ return algEntry;
106
+ }), cek = generateCek(checked[0][3]), jwe = {
107
+ ciphertext: "",
108
+ recipients: []
109
+ };
110
+ for (let i = 0; i < this.#recipients.length; i++) {
111
+ const recipient = this.#recipients[i], [, keyManagementParameters, key] = recipient.state, target = {};
112
+ if (jwe.recipients.push(target), i === 0) {
113
+ inputs[0][5] = cek;
114
+ const flattened = await encryptJWE(inputs[0], checked[0], key, algEntries[0]);
115
+ jwe.ciphertext = flattened.ciphertext, flattened.iv && (jwe.iv = flattened.iv), flattened.tag && (jwe.tag = flattened.tag), flattened.encrypted_key && (target.encrypted_key = flattened.encrypted_key), copyOptionalMembers(flattened, jwe, target);
116
+ continue;
117
+ }
118
+ const [joseHeader, , , encEntry] = checked[i], unprotectedHeader = inputs[i][2], [, encryptedKey, parameters] = await transportCek(algEntries[i], encEntry, key, cek, joseHeader, keyManagementParameters);
119
+ if (target.encrypted_key = b64u(encryptedKey), unprotectedHeader || parameters) {
120
+ const header = { ...unprotectedHeader, ...parameters };
121
+ parameters && checkDisjoint(inputs[i][1], header, inputs[i][3]), target.header = header;
122
+ }
165
123
  }
124
+ return jwe;
125
+ }
166
126
  }
127
+ export {
128
+ GeneralEncrypt
129
+ };
@@ -1,19 +1,31 @@
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
- export 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
- }
13
- const entry = jwsAlgorithm(joseHeader.alg);
14
- const key = await jwkToKey(entry, { ...joseHeader.jwk, ext: true });
15
- if (key.type !== 'public') {
16
- throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
17
- }
18
- return key;
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
+ 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
+ let jwk;
14
+ try {
15
+ jwk = normalizeJwk(joseHeader.jwk);
16
+ } catch (cause) {
17
+ throw new JWSInvalid("Invalid Embedded JWK", { cause });
18
+ }
19
+ const entry = jwsAlgorithm(joseHeader.alg);
20
+ if (jwk.use !== void 0 && jwk.use !== "sig")
21
+ throw new JWSInvalid('Invalid Embedded JWK, its "use" must be "sig" when present');
22
+ if (jwk.alg !== void 0 && jwk.alg !== entry.alg)
23
+ throw new JWSInvalid(`Invalid Embedded JWK, its "alg" must be "${entry.alg}" when present`);
24
+ const key = await jwkToKey(entry, { ...jwk, ext: !0 });
25
+ if (key.type !== "public")
26
+ throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
27
+ return key;
19
28
  }
29
+ export {
30
+ EmbeddedJWK
31
+ };
@@ -1,68 +1,58 @@
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 { isJWK } from '../lib/type_checks.js';
7
- import { exportJWK } from '../key/export.js';
8
- import { invalidKeyInput } from '../lib/invalid_key_input.js';
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";
9
10
  const check = (value, description) => {
10
- if (typeof value !== 'string' || !value) {
11
- throw new JWKInvalid(`${description} missing or invalid`);
12
- }
11
+ if (typeof value != "string" || !value)
12
+ throw new JWKInvalid(`${description} missing or invalid`);
13
13
  };
14
- export async function calculateJwkThumbprint(key, digestAlgorithm) {
15
- let jwk;
16
- if (isJWK(key)) {
17
- jwk = key;
18
- }
19
- else if (isKeyLike(key)) {
20
- jwk = await exportJWK(key);
21
- }
22
- else {
23
- throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
24
- }
25
- digestAlgorithm ??= 'sha256';
26
- if (digestAlgorithm !== 'sha256' &&
27
- digestAlgorithm !== 'sha384' &&
28
- digestAlgorithm !== 'sha512') {
29
- throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"');
30
- }
31
- let components;
32
- switch (jwk.kty) {
33
- case 'AKP':
34
- check(jwk.alg, '"alg" (Algorithm) Parameter');
35
- check(jwk.pub, '"pub" (Public key) Parameter');
36
- components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };
37
- break;
38
- case 'EC':
39
- check(jwk.crv, '"crv" (Curve) Parameter');
40
- check(jwk.x, '"x" (X Coordinate) Parameter');
41
- check(jwk.y, '"y" (Y Coordinate) Parameter');
42
- components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
43
- break;
44
- case 'OKP':
45
- check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter');
46
- check(jwk.x, '"x" (Public Key) Parameter');
47
- components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
48
- break;
49
- case 'RSA':
50
- check(jwk.e, '"e" (Exponent) Parameter');
51
- check(jwk.n, '"n" (Modulus) Parameter');
52
- components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
53
- break;
54
- case 'oct':
55
- check(jwk.k, '"k" (Key Value) Parameter');
56
- components = { k: jwk.k, kty: jwk.kty };
57
- break;
58
- default:
59
- throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
60
- }
61
- const data = encode(JSON.stringify(components));
62
- return b64u(await digest(digestAlgorithm, data));
14
+ async function calculateJwkThumbprint(key, digestAlgorithm) {
15
+ let jwk;
16
+ if (isObject(key)) {
17
+ if (jwk = snapshotJwk(key), typeof jwk.kty != "string")
18
+ throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
19
+ } else if (isKeyLike(key))
20
+ jwk = snapshotJwk(await exportJWK(key));
21
+ else
22
+ throw new TypeError(invalidKeyInput(key, "CryptoKey", "KeyObject", "JSON Web Key"));
23
+ if (digestAlgorithm ??= "sha256", digestAlgorithm !== "sha256" && digestAlgorithm !== "sha384" && digestAlgorithm !== "sha512")
24
+ throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"');
25
+ let components;
26
+ switch (jwk.kty) {
27
+ case "AKP":
28
+ check(jwk.alg, '"alg" (Algorithm) Parameter'), check(jwk.pub, '"pub" (Public key) Parameter'), components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };
29
+ break;
30
+ case "EC":
31
+ 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 };
32
+ break;
33
+ case "OKP":
34
+ 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 };
35
+ break;
36
+ case "RSA":
37
+ check(jwk.e, '"e" (Exponent) Parameter'), check(jwk.n, '"n" (Modulus) Parameter'), components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
38
+ break;
39
+ case "oct":
40
+ if (typeof jwk.k != "string")
41
+ throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
42
+ components = { k: jwk.k, kty: jwk.kty };
43
+ break;
44
+ default:
45
+ throw new JOSENotSupported('"kty" (Key Type) Parameter missing or unsupported');
46
+ }
47
+ const data = encode(JSON.stringify(components));
48
+ return b64u(await digest(digestAlgorithm, data));
63
49
  }
64
- export async function calculateJwkThumbprintUri(key, digestAlgorithm) {
65
- digestAlgorithm ??= 'sha256';
66
- const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);
67
- return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;
50
+ async function calculateJwkThumbprintUri(key, digestAlgorithm) {
51
+ digestAlgorithm ??= "sha256";
52
+ const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);
53
+ return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;
68
54
  }
55
+ export {
56
+ calculateJwkThumbprint,
57
+ calculateJwkThumbprintUri
58
+ };
@@ -1,78 +1,53 @@
1
- import { jwkToKey } from '../lib/jwk_to_key.js';
2
- import { JWS } from '../lib/jws_algorithms.js';
3
- import { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';
4
- import { isObject } from '../lib/type_checks.js';
5
- function signatureAlgorithm(alg) {
6
- const entry = typeof alg === 'string' ? JWS[alg] : undefined;
7
- if (!entry || entry.secret) {
8
- throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
9
- }
10
- return entry;
11
- }
12
- function isJWKSLike(jwks) {
13
- if (!jwks || typeof jwks !== 'object') {
14
- return false;
15
- }
16
- const { keys } = jwks;
17
- return Array.isArray(keys) && keys.every((isObject));
18
- }
19
- class LocalJWKSetImpl {
20
- #jwks;
21
- #cached = new WeakMap();
22
- constructor(jwks) {
23
- if (!isJWKSLike(jwks)) {
24
- throw new JWKSInvalid('JSON Web Key Set malformed');
25
- }
26
- this.#jwks = structuredClone(jwks);
27
- }
28
- jwks() {
29
- return this.#jwks;
30
- }
31
- async getKey(protectedHeader, token) {
32
- const { alg, kid } = { ...protectedHeader, ...token?.header };
33
- const entry = signatureAlgorithm(alg);
34
- const candidates = this.#jwks.keys.filter((jwk) => entry.kty.includes(jwk.kty) &&
35
- (typeof kid !== 'string' || kid === jwk.kid) &&
36
- (!(typeof jwk.alg === 'string' || jwk.kty === 'AKP') || alg === jwk.alg) &&
37
- (typeof jwk.use !== 'string' || jwk.use === 'sig') &&
38
- (!Array.isArray(jwk.key_ops) || jwk.key_ops.includes('verify')) &&
39
- (!entry.crv || jwk.crv === entry.crv));
40
- const { 0: jwk, length } = candidates;
41
- if (length === 0) {
42
- throw new JWKSNoMatchingKey();
43
- }
44
- if (length !== 1) {
45
- const error = new JWKSMultipleMatchingKeys();
46
- const _cached = this.#cached;
47
- error[Symbol.asyncIterator] = async function* () {
48
- for (const jwk of candidates) {
49
- try {
50
- yield await importWithAlgCache(_cached, jwk, entry);
51
- }
52
- catch { }
53
- }
54
- };
55
- throw error;
56
- }
57
- return importWithAlgCache(this.#cached, jwk, entry);
58
- }
1
+ import { jwkToKey } from "../lib/jwk_to_key.js";
2
+ import { JWS } from "../lib/jws_algorithms.js";
3
+ import { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys } from "../util/errors.js";
4
+ import { isJwkSet } from "../lib/type_checks.js";
5
+ import { snapshotJwk } from "../lib/jwk_metadata.js";
6
+ function isUsableJWK(jwk, entry, alg, kid) {
7
+ const { kty, key_ops, ext, kid: jwkKid, alg: jwkAlg, use, crv } = snapshotJwk(jwk), keyOps = Array.isArray(key_ops) ? [...key_ops] : key_ops;
8
+ return (ext === void 0 || typeof ext == "boolean") && (keyOps === void 0 || Array.isArray(keyOps) && keyOps.every((operation, index) => typeof operation == "string" && keyOps.indexOf(operation) === index) && keyOps.includes("verify")) && entry.kty.includes(kty) && (kid === void 0 || typeof kid == "string" && kid === jwkKid) && (jwkAlg === void 0 ? kty !== "AKP" : alg === jwkAlg) && (use === void 0 || use === "sig") && (!entry.crv || crv === entry.crv);
59
9
  }
60
10
  async function importWithAlgCache(cache, jwk, entry) {
61
- const cached = cache.get(jwk) || cache.set(jwk, { __proto__: null }).get(jwk);
62
- if (cached[entry.alg] === undefined) {
63
- const key = await jwkToKey(entry, { ...jwk, alg: entry.alg, ext: true });
64
- if (key.type !== 'public') {
65
- throw new JWKSInvalid('JSON Web Key Set members must be public keys');
66
- }
67
- cached[entry.alg] = key;
68
- }
69
- return cached[entry.alg];
11
+ const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk), { alg } = entry;
12
+ if (cached[alg] === void 0) {
13
+ const key = await jwkToKey(entry, { ...jwk, alg, ext: !0 });
14
+ if (key.type !== "public")
15
+ throw new JWKSInvalid("JSON Web Key Set members must be public keys");
16
+ cached[alg] = key;
17
+ }
18
+ return cached[alg];
70
19
  }
71
- export function createLocalJWKSet(jwks) {
72
- const set = new LocalJWKSetImpl(jwks);
73
- const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);
74
- Object.defineProperty(localJWKSet, 'jwks', {
75
- value: () => structuredClone(set.jwks()),
76
- });
77
- return localJWKSet;
20
+ function createLocalJWKSet(jwks) {
21
+ let snapshot;
22
+ try {
23
+ snapshot = structuredClone(jwks);
24
+ } catch {
25
+ }
26
+ if (!isJwkSet(snapshot))
27
+ throw new JWKSInvalid("JSON Web Key Set malformed");
28
+ const cached = /* @__PURE__ */ new WeakMap();
29
+ return Object.defineProperty(async (protectedHeader, token) => {
30
+ const { alg, kid } = { ...protectedHeader, ...token?.header }, entry = typeof alg == "string" ? JWS[alg] : void 0;
31
+ if (!entry || entry.secret)
32
+ throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
33
+ const candidates = snapshot.keys.filter((jwk2) => isUsableJWK(jwk2, entry, alg, kid)), { 0: jwk, length } = candidates;
34
+ if (!length)
35
+ throw new JWKSNoMatchingKey();
36
+ if (length !== 1) {
37
+ const error = new JWKSMultipleMatchingKeys();
38
+ throw error[Symbol.asyncIterator] = async function* () {
39
+ for (const jwk2 of candidates)
40
+ try {
41
+ yield await importWithAlgCache(cached, jwk2, entry);
42
+ } catch {
43
+ }
44
+ }, error;
45
+ }
46
+ return importWithAlgCache(cached, jwk, entry);
47
+ }, "jwks", {
48
+ value: () => structuredClone(snapshot)
49
+ });
78
50
  }
51
+ export {
52
+ createLocalJWKSet
53
+ };