@blamejs/blamejs-shop 0.5.12 → 0.5.13

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 (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -68,6 +68,10 @@ var safeBuffer = lazyRequire(function () { return require("./safe-buffer"); });
68
68
  // pqc-software requires this module (b.crypto) — lazy-load to break the
69
69
  // cycle. Only the power-on self-test needs it here.
70
70
  var pqcSoftware = lazyRequire(function () { return require("./pqc-software"); });
71
+ // network-tls requires this module (b.crypto) at top-of-file — lazy-load
72
+ // to break the cycle. Only spkiPinVerifier composes its RFC 9525 strict
73
+ // hostname/SAN matcher.
74
+ var networkTls = lazyRequire(function () { return require("./network-tls"); });
71
75
 
72
76
  // Streaming-hash algorithm allowlist. Mirrors the framework's PQC-
73
77
  // first crypto policy: SHA3 / SHAKE family is the default surface;
@@ -121,13 +125,20 @@ function hmac(key, data, algorithm) {
121
125
  */
122
126
  function hashStream(readable, algorithm) {
123
127
  var alg = (algorithm || STREAM_HASH_DEFAULT).toLowerCase();
124
- var entry = STREAM_HASH_ALGORITHMS[alg];
125
- if (!entry) {
128
+ // Own-property guard, not a truthiness check: STREAM_HASH_ALGORITHMS is a
129
+ // plain object, so a name colliding with an Object.prototype member
130
+ // ("constructor" → the Object constructor, "__proto__" → Object.prototype)
131
+ // would read back a truthy inherited value, slip past `if (!entry)`, and then
132
+ // throw ERR_INVALID_ARG_TYPE synchronously at createHash(entry.algorithm ===
133
+ // undefined) — a sync throw from a Promise-returning function. Refuse it here
134
+ // as the documented Promise.reject, matching b.crypto.sri's algorithm guard.
135
+ if (!Object.prototype.hasOwnProperty.call(STREAM_HASH_ALGORITHMS, alg)) {
126
136
  return Promise.reject(new TypeError(
127
137
  "crypto.hashStream: unsupported algorithm '" + algorithm +
128
138
  "' (allowed: " + Object.keys(STREAM_HASH_ALGORITHMS).join(", ") + ")"
129
139
  ));
130
140
  }
141
+ var entry = STREAM_HASH_ALGORITHMS[alg];
131
142
  if (!readable || typeof readable.pipe !== "function") {
132
143
  return Promise.reject(new TypeError(
133
144
  "crypto.hashStream: readable must be a Readable stream"
@@ -191,19 +202,38 @@ function _hashFileMulti(filePath, algorithms, opts) {
191
202
  var st;
192
203
  try { st = nodeFs.lstatSync(filePath); }
193
204
  catch (statErr) {
194
- reject(new Error("crypto.hashFilesParallel: stat failed for '" +
195
- filePath + "': " + (statErr && statErr.message ? statErr.message : String(statErr))));
205
+ // Preserve the underlying fs error metadata (.code / .errno /
206
+ // .syscall / .path) so callers branch on ENOENT vs EACCES vs
207
+ // ELOOP rather than string-matching the wrapped message. The
208
+ // mid-read `stream.on("error", reject)` path below rejects the
209
+ // raw fs error and already carries .code; wrapping the pre-open
210
+ // stat error WITHOUT copying it forward made the observable
211
+ // failure shape nondeterministic by timing. Match atomic-file's
212
+ // posture of surfacing the raw fs code on the ENOENT-class path.
213
+ var statWrapped = new Error("crypto.hashFilesParallel: stat failed for '" +
214
+ filePath + "': " + (statErr && statErr.message ? statErr.message : String(statErr)));
215
+ if (statErr) {
216
+ statWrapped.code = statErr.code;
217
+ statWrapped.errno = statErr.errno;
218
+ statWrapped.syscall = statErr.syscall;
219
+ statWrapped.cause = statErr;
220
+ }
221
+ statWrapped.path = filePath;
222
+ reject(statWrapped);
196
223
  return;
197
224
  }
198
225
  if (st.isSymbolicLink() && !followSymlink) {
199
- reject(new Error("crypto.hashFilesParallel: refusing symlink '" +
226
+ var symErr = new Error("crypto.hashFilesParallel: refusing symlink '" +
200
227
  filePath + "' — pass {followSymlinks: true} to opt in (an attacker " +
201
228
  "with write access to the input list can otherwise direct the hasher " +
202
- "to files the caller cannot read directly)"));
229
+ "to files the caller cannot read directly)");
230
+ symErr.code = "crypto/hash-refused-symlink";
231
+ symErr.path = filePath;
232
+ reject(symErr);
203
233
  return;
204
234
  }
205
235
  if (!st.isFile() && !st.isSymbolicLink()) {
206
- reject(new Error("crypto.hashFilesParallel: refusing non-regular file '" +
236
+ var nonRegularErr = new Error("crypto.hashFilesParallel: refusing non-regular file '" +
207
237
  filePath + "' (FIFOs / sockets / character / block devices read indefinitely " +
208
238
  "or return platform-undefined bytes; hashing them is meaningless and " +
209
239
  "DoS-prone). Type: " +
@@ -211,7 +241,10 @@ function _hashFileMulti(filePath, algorithms, opts) {
211
241
  st.isSocket() ? "socket" :
212
242
  st.isBlockDevice() ? "block-device" :
213
243
  st.isCharacterDevice() ? "char-device" :
214
- st.isDirectory() ? "directory" : "unknown")));
244
+ st.isDirectory() ? "directory" : "unknown"));
245
+ nonRegularErr.code = "crypto/hash-refused-non-regular-file";
246
+ nonRegularErr.path = filePath;
247
+ reject(nonRegularErr);
215
248
  return;
216
249
  }
217
250
  var hashers = new Array(algorithms.length);
@@ -233,9 +266,12 @@ function _hashFileMulti(filePath, algorithms, opts) {
233
266
  if (maxBytes && byteLength > maxBytes) {
234
267
  aborted = true;
235
268
  try { stream.destroy(); } catch (_e) { /* best-effort */ }
236
- reject(new Error("crypto.hashFilesParallel: file '" + filePath +
269
+ var maxBytesErr = new Error("crypto.hashFilesParallel: file '" + filePath +
237
270
  "' exceeded opts.maxBytesPerFile (" + maxBytes +
238
- " bytes); refusing to continue hashing"));
271
+ " bytes); refusing to continue hashing");
272
+ maxBytesErr.code = "crypto/hash-max-bytes-exceeded";
273
+ maxBytesErr.path = filePath;
274
+ reject(maxBytesErr);
239
275
  return;
240
276
  }
241
277
  for (var j = 0; j < hashers.length; j += 1) hashers[j].update(chunk);
@@ -957,7 +993,7 @@ var SRI_ALGORITHMS = { "sha256": "sha256", "sha384": "sha384", "sha512": "sha512
957
993
  *
958
994
  * @example
959
995
  * var attr = b.crypto.sri(Buffer.from("alert(1);", "utf8"), { algorithm: "sha384" });
960
- * // → "sha384-pNdyOuHIPKgRPnYJTBxEEEZcJj1qHxJzNheCuHGRy3Cm0UpVbcnruIvMRIs5VcDb"
996
+ * // → "sha384-dnux3uAPxaf+IhCrFG1D/XVNzP1XLDNcn3Pe3jyxouEAoot5kfwC5u8rMwNhE5oi"
961
997
  *
962
998
  * var multi = b.crypto.sri(["payload-a", "payload-b"], { algorithm: "sha512" });
963
999
  * // → "sha512-... sha512-..." (two tokens, space-separated)
@@ -1369,6 +1405,24 @@ function _envU16(buf, at) {
1369
1405
  return buf.readUInt16BE(at);
1370
1406
  }
1371
1407
 
1408
+ // Read a 2-byte-length-prefixed component and bounds-check that the declared
1409
+ // body actually fits in the envelope BEFORE slicing it. Without this a
1410
+ // truncated envelope hands an under-length component (a short KEM ciphertext /
1411
+ // ephemeral public key) to Node crypto, which throws a raw
1412
+ // "Failed to perform decapsulation" / key-parse error that escapes the
1413
+ // documented "Invalid envelope: ..." contract. Returns { bytes, pos } where
1414
+ // pos is the offset past the component. A well-formed envelope always carries
1415
+ // each declared component in full, so this never rejects a valid input.
1416
+ function _envSlice(buf, at, label) {
1417
+ var len = _envU16(buf, at);
1418
+ at += 2;
1419
+ if (at + len > buf.length) {
1420
+ throw new Error("Invalid envelope: truncated (declared " + len + "-byte " +
1421
+ label + " at offset " + at + " exceeds the " + buf.length + "-byte envelope)");
1422
+ }
1423
+ return { bytes: buf.subarray(at, at + len), pos: at + len };
1424
+ }
1425
+
1372
1426
  function decryptEnvelope(packed, privateKeys, internalOpts) {
1373
1427
  if (!Buffer.isBuffer(packed) || packed.length < 4) {
1374
1428
  throw new Error("Invalid envelope: too short (need at least the 4-byte suite header)");
@@ -1388,8 +1442,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
1388
1442
  throw new Error("Invalid envelope: unsupported KDF (only SHAKE256 supported)");
1389
1443
  }
1390
1444
 
1391
- var kemCtLen = _envU16(packed, pos); pos += 2;
1392
- var kemCt = packed.subarray(pos, pos + kemCtLen); pos += kemCtLen;
1445
+ var kemSlice = _envSlice(packed, pos, "KEM ciphertext");
1446
+ var kemCt = kemSlice.bytes; pos = kemSlice.pos;
1393
1447
 
1394
1448
  var mlkemPriv = nodeCrypto.createPrivateKey(
1395
1449
  typeof privateKeys === "string" ? privateKeys : privateKeys.privateKey
@@ -1399,8 +1453,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
1399
1453
  var fixedInfo = omitFixedInfo ? Buffer.alloc(0) : _suiteFixedInfo(kemId, cipherId, kdfId);
1400
1454
 
1401
1455
  if (kemId === C.KEM_IDS.ML_KEM_1024_P384) {
1402
- var ecEphLen = _envU16(packed, pos); pos += 2;
1403
- var ecEphDer = packed.subarray(pos, pos + ecEphLen); pos += ecEphLen;
1456
+ var ecEphSlice = _envSlice(packed, pos, "EC ephemeral public key");
1457
+ var ecEphDer = ecEphSlice.bytes; pos = ecEphSlice.pos;
1404
1458
  var ecPrivPem = typeof privateKeys === "string" ? null : privateKeys.ecPrivateKey;
1405
1459
  if (!ecPrivPem) throw new Error("Hybrid KEM requires EC private key");
1406
1460
  var ecSs = nodeCrypto.diffieHellman({
@@ -1416,8 +1470,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
1416
1470
  // the correct keypair via privateKeys when the envelope was sealed
1417
1471
  // with this algorithm. Same length-prefixed shape as the P-384
1418
1472
  // hybrid: 2-byte ec-eph-len + DER X25519 pubkey + nonce + ct.
1419
- var x25519EphLen = _envU16(packed, pos); pos += 2;
1420
- var x25519EphDer = packed.subarray(pos, pos + x25519EphLen); pos += x25519EphLen;
1473
+ var x25519EphSlice = _envSlice(packed, pos, "X25519 ephemeral public key");
1474
+ var x25519EphDer = x25519EphSlice.bytes; pos = x25519EphSlice.pos;
1421
1475
  var x25519PrivPem = typeof privateKeys === "string" ? null : privateKeys.x25519PrivateKey;
1422
1476
  if (!x25519PrivPem) throw new Error("ML-KEM-768 + X25519 hybrid envelope requires x25519PrivateKey");
1423
1477
  var x25519Ss = nodeCrypto.diffieHellman({
@@ -1429,7 +1483,22 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
1429
1483
  throw new Error("Invalid envelope: unsupported KEM ID " + kemId);
1430
1484
  }
1431
1485
 
1432
- var nonce = packed.subarray(pos, pos + C.BYTES.bytes(24)); pos += C.BYTES.bytes(24);
1486
+ // Bounds-check the trailing nonce + AEAD tag before slicing them out. A
1487
+ // truncated envelope (untrusted ciphertext) that ends inside the 24-byte
1488
+ // nonce or before the 16-byte Poly1305 tag otherwise reaches the cipher as
1489
+ // an under-length nonce / ciphertext and surfaces as a raw noble
1490
+ // RangeError ("nonce"/"ciphertext" length) — escaping the documented
1491
+ // "Invalid envelope: ..." error contract exactly the way an unchecked
1492
+ // _envU16 read would (see _envU16 above). Fail with the typed envelope
1493
+ // error instead. A valid envelope always carries a full nonce and at
1494
+ // least the tag, so this never rejects a well-formed input.
1495
+ var nonceLen = C.BYTES.bytes(24);
1496
+ var tagLen = C.BYTES.bytes(16);
1497
+ if (pos + nonceLen + tagLen > packed.length) {
1498
+ throw new Error("Invalid envelope: truncated (expected a " + nonceLen +
1499
+ "-byte nonce and a " + tagLen + "-byte authentication tag at offset " + pos + ")");
1500
+ }
1501
+ var nonce = packed.subarray(pos, pos + nonceLen); pos += nonceLen;
1433
1502
  // Re-derive the 4-byte envelope-header AAD from the bytes we just
1434
1503
  // dispatched on. A tampered header (algorithm-substitution attack)
1435
1504
  // surfaces here as a Poly1305 tag verification failure.
@@ -1509,6 +1578,17 @@ function decryptPacked(packed, key, aad) {
1509
1578
  if (packed[0] !== C.FORMAT.XCHACHA20_POLY1305) {
1510
1579
  throw new Error("Invalid packed format: unsupported version");
1511
1580
  }
1581
+ // A packed blob shorter than the 1-byte format id + 24-byte nonce +
1582
+ // 16-byte Poly1305 tag is truncated / corrupt (untrusted or damaged
1583
+ // storage cell); slicing the nonce / ciphertext out of it otherwise
1584
+ // reaches the cipher as an under-length nonce and throws a raw noble
1585
+ // RangeError that escapes this function's typed error contract (mirrors
1586
+ // the envelope decrypt bounds check). A valid packet is always at least
1587
+ // this long, so this never rejects a well-formed input.
1588
+ if (packed.length < 1 + C.BYTES.bytes(24) + C.BYTES.bytes(16)) {
1589
+ throw new Error("Invalid packed format: truncated (need at least a 1-byte " +
1590
+ "version, a 24-byte nonce, and a 16-byte authentication tag)");
1591
+ }
1512
1592
  return Buffer.from(
1513
1593
  xchacha20poly1305(key, packed.subarray(1, 25), aad ? Buffer.from(aad) : undefined)
1514
1594
  .decrypt(packed.subarray(25))
@@ -1899,7 +1979,7 @@ function _pemToDer(pemOrDer) {
1899
1979
  // for mTLS bootstrap / webhook verification / peer-cert pinning.
1900
1980
  // 64 KiB caps the largest plausible PEM (a P-384 cert + chain) at
1901
1981
  // ~3× margin while refusing pathological inputs outright.
1902
- if (safeBuffer.byteLengthOf(pemOrDer) > C.BYTES.kib(64)) {
1982
+ if (safeBuffer().byteLengthOf(pemOrDer) > C.BYTES.kib(64)) {
1903
1983
  throw new TypeError(
1904
1984
  "crypto.hashCertFingerprint: PEM input exceeds 64 KiB (" +
1905
1985
  pemOrDer.length + " bytes); refuse oversized input to avoid " +
@@ -1991,6 +2071,219 @@ function isCertRevoked(pemOrDer, denyList) {
1991
2071
  return false;
1992
2072
  }
1993
2073
 
2074
+ // ---- RFC 7469 SubjectPublicKeyInfo pinning ----
2075
+ //
2076
+ // The pin is base64(SHA-256(SPKI DER)) — RFC 7469 §2.4 / HPKP. This
2077
+ // deliberately uses SHA-256, which is otherwise absent from the b.crypto
2078
+ // surface (see the @module intro): it is an interop WIRE CONSTANT, not a
2079
+ // framework hashing choice. Browsers, curl `--pinnedpubkey sha256//...`,
2080
+ // OpenSSL, and every HPKP-style pin store speak SHA-256(SPKI); a SHA3-512
2081
+ // pin would not interoperate with any of them. `hashCertFingerprint`
2082
+ // documents the same "framework-canonical hash vs interop rendering"
2083
+ // split. The pin binds the certificate's LONG-TERM SubjectPublicKeyInfo
2084
+ // (which survives certificate reissue on the same key) — it says nothing
2085
+ // about the ephemeral PQC TLS key-exchange group negotiated per
2086
+ // handshake; those are orthogonal (identity of the peer key vs secrecy
2087
+ // of the session).
2088
+ var SPKI_PIN_PREFIX = "sha256/";
2089
+
2090
+ // Decode a `sha256/<base64>` pin string into its raw 32-byte digest
2091
+ // Buffer, throwing a TypeError on any malformed entry (config-time /
2092
+ // entry-point tier — the operator catches the typo at construction).
2093
+ function _decodeSpkiPin(pinStr, ctx) {
2094
+ if (typeof pinStr !== "string" || pinStr.length === 0) {
2095
+ throw new TypeError(ctx + ": each pin must be a non-empty 'sha256/<base64>' string");
2096
+ }
2097
+ if (pinStr.indexOf(SPKI_PIN_PREFIX) !== 0) {
2098
+ throw new TypeError(ctx + ": pin '" + pinStr +
2099
+ "' must carry the RFC 7469 'sha256/' prefix");
2100
+ }
2101
+ var body = pinStr.slice(SPKI_PIN_PREFIX.length);
2102
+ var buf = Buffer.from(body, "base64");
2103
+ // SHA-256 digest = 32 bytes; require a canonical base64 round-trip so a
2104
+ // silently-truncated / non-canonical body is refused rather than
2105
+ // matching a shorter buffer.
2106
+ if (buf.length !== 32 || buf.toString("base64") !== body) {
2107
+ throw new TypeError(ctx + ": pin '" + pinStr +
2108
+ "' must be base64 of a 32-byte SHA-256 SPKI digest");
2109
+ }
2110
+ return buf;
2111
+ }
2112
+
2113
+ /**
2114
+ * @primitive b.crypto.spkiPin
2115
+ * @signature b.crypto.spkiPin(pemOrDer)
2116
+ * @since 0.17.13
2117
+ * @status stable
2118
+ * @related b.crypto.spkiPinVerifier, b.crypto.hashCertFingerprint
2119
+ *
2120
+ * Computes the RFC 7469 (HPKP §2.4) public-key pin of an X.509
2121
+ * certificate: `base64(SHA-256(SubjectPublicKeyInfo DER))`. Accepts DER
2122
+ * bytes (Buffer) or a PEM string (BEGIN/END envelope stripped, base64
2123
+ * body decoded — same 64 KiB ReDoS cap as `hashCertFingerprint`).
2124
+ * Returns `{ sha256, b64, hex }`: `sha256` is the `sha256/<base64>` wire
2125
+ * form browsers and `curl --pinnedpubkey` render, `b64` the bare base64
2126
+ * body, `hex` the lowercase-hex digest.
2127
+ *
2128
+ * Unlike `hashCertFingerprint` (SHA3-512 over the WHOLE certificate), an
2129
+ * SPKI pin binds only the public key, so it survives certificate reissue
2130
+ * on the same key pair — the property RFC 7469 pinning relies on.
2131
+ *
2132
+ * This is the one place SHA-256 appears on the b.crypto surface: it is an
2133
+ * RFC 7469 interop wire constant (browsers / curl / OpenSSL pin stores),
2134
+ * not a framework hashing default. The pin binds the peer's long-term
2135
+ * SPKI, not the ephemeral PQC key-exchange group negotiated per TLS
2136
+ * handshake.
2137
+ *
2138
+ * @example
2139
+ * var fs = require("fs");
2140
+ * var pem = fs.readFileSync("/etc/ssl/peer.cert.pem", "utf8");
2141
+ * var pin = b.crypto.spkiPin(pem);
2142
+ * pin.sha256;
2143
+ * // → "sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="
2144
+ */
2145
+ function spkiPin(pemOrDer) {
2146
+ var der = _pemToDer(pemOrDer);
2147
+ // SubjectPublicKeyInfo DER — the exact bytes RFC 7469 §2.4 hashes.
2148
+ var spkiDer = new nodeCrypto.X509Certificate(der)
2149
+ .publicKey.export({ type: "spki", format: "der" });
2150
+ var digest = nodeCrypto.createHash("sha256").update(spkiDer).digest();
2151
+ var b64 = digest.toString("base64");
2152
+ return { sha256: SPKI_PIN_PREFIX + b64, b64: b64, hex: digest.toString("hex") };
2153
+ }
2154
+
2155
+ /**
2156
+ * @primitive b.crypto.spkiPinVerifier
2157
+ * @signature b.crypto.spkiPinVerifier(opts)
2158
+ * @since 0.17.13
2159
+ * @status stable
2160
+ * @related b.crypto.spkiPin, b.network.tls.checkServerIdentity9525
2161
+ *
2162
+ * Builds a `tls.checkServerIdentity`-compatible `(host, cert) =>
2163
+ * Error | undefined` that enforces RFC 7469 public-key pinning on top of
2164
+ * RFC 9525 strict hostname verification. Pass the returned function as
2165
+ * `tls.connect({ checkServerIdentity })`.
2166
+ *
2167
+ * The verifier runs hostname/SAN identity FIRST (via
2168
+ * `b.network.tls.checkServerIdentity9525` — SAN-required, no Common Name
2169
+ * fallback), so a pin match on a certificate issued for the wrong name is
2170
+ * still refused. Only when identity passes does it derive the peer's SPKI
2171
+ * pin from the presented DER and constant-time-compare
2172
+ * (`crypto.timingSafeEqual`) it against every configured pin. Returns the
2173
+ * identity `Error` on a hostname/SAN failure, an `Error` with code
2174
+ * `crypto/spki-pin-mismatch` when no pin matches, or `undefined` when
2175
+ * both identity and pin check out.
2176
+ *
2177
+ * `opts.pins` MUST be an array of at least two `sha256/<base64>` pins:
2178
+ * RFC 7469 §4.3 requires a backup pin corresponding to a key not in the
2179
+ * current chain so key rotation does not brick the pinned endpoint. When
2180
+ * `opts.hostname` is set, the certificate identity is checked against it
2181
+ * instead of the host argument Node supplies — pin the expected name
2182
+ * explicitly. Produce pin strings with `b.crypto.spkiPin(...).sha256`.
2183
+ *
2184
+ * @opts
2185
+ * pins: string[], // required — >= 2 'sha256/<base64>' pins (RFC 7469 backup-pin rule)
2186
+ * hostname: string, // optional — verify cert identity against this name instead of the host arg
2187
+ *
2188
+ * @example
2189
+ * var tls = require("node:tls");
2190
+ * var verify = b.crypto.spkiPinVerifier({
2191
+ * pins: [
2192
+ * "sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=",
2193
+ * "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", // backup key
2194
+ * ],
2195
+ * });
2196
+ * var sock = tls.connect({
2197
+ * host: "api.example.com",
2198
+ * port: 443,
2199
+ * checkServerIdentity: verify,
2200
+ * });
2201
+ */
2202
+ function spkiPinVerifier(opts) {
2203
+ if (!opts || typeof opts !== "object") {
2204
+ throw new TypeError("crypto.spkiPinVerifier: opts is required");
2205
+ }
2206
+ if (!Array.isArray(opts.pins)) {
2207
+ throw new TypeError(
2208
+ "crypto.spkiPinVerifier: opts.pins must be an array of 'sha256/<base64>' pins"
2209
+ );
2210
+ }
2211
+ // RFC 7469 §4.3 requires a backup pin corresponding to a key NOT in the
2212
+ // current chain. Two IDENTICAL pins are not a backup (the same key repeated),
2213
+ // so require at least two DISTINCT pins — a length-only check would accept a
2214
+ // duplicate and silently leave the endpoint with no rotation key.
2215
+ var distinctPins = [];
2216
+ for (var dpi = 0; dpi < opts.pins.length; dpi += 1) {
2217
+ if (distinctPins.indexOf(opts.pins[dpi]) === -1) distinctPins.push(opts.pins[dpi]);
2218
+ }
2219
+ if (distinctPins.length < 2) {
2220
+ throw new TypeError(
2221
+ "crypto.spkiPinVerifier: opts.pins must contain at least two DISTINCT " +
2222
+ "'sha256/<base64>' pins — RFC 7469 §4.3 requires a backup pin " +
2223
+ "corresponding to a key not in the current chain so key rotation " +
2224
+ "does not brick the pinned endpoint"
2225
+ );
2226
+ }
2227
+ var pinBufs = new Array(distinctPins.length);
2228
+ for (var pi = 0; pi < distinctPins.length; pi += 1) {
2229
+ pinBufs[pi] = _decodeSpkiPin(distinctPins[pi], "crypto.spkiPinVerifier");
2230
+ }
2231
+ var expectedHost = opts.hostname;
2232
+ if (expectedHost !== undefined &&
2233
+ (typeof expectedHost !== "string" || expectedHost.length === 0)) {
2234
+ throw new TypeError(
2235
+ "crypto.spkiPinVerifier: opts.hostname must be a non-empty string when supplied"
2236
+ );
2237
+ }
2238
+ return function verifySpkiPin(host, cert) {
2239
+ // Identity (hostname / SAN) FIRST — a pin match on a cert issued for
2240
+ // the wrong name is still impersonation. checkServerIdentity9525 is
2241
+ // RFC 9525 strict (SAN-required, no CN fallback) and returns
2242
+ // Error | undefined.
2243
+ var effectiveHost = expectedHost !== undefined ? expectedHost : host;
2244
+ var identityError = networkTls().checkServerIdentity9525(effectiveHost, cert);
2245
+ if (identityError) return identityError;
2246
+ // Peer SPKI pin — hash the DER the peer actually presented. Node's
2247
+ // detailed cert object exposes the raw DER as cert.raw.
2248
+ if (!cert || !Buffer.isBuffer(cert.raw)) {
2249
+ var noDerErr = new Error(
2250
+ "crypto.spkiPinVerifier: peer cert object carries no DER `raw` bytes to pin"
2251
+ );
2252
+ noDerErr.code = "crypto/spki-pin-no-peer-der";
2253
+ return noDerErr;
2254
+ }
2255
+ var peerBuf;
2256
+ try {
2257
+ peerBuf = Buffer.from(spkiPin(cert.raw).b64, "base64");
2258
+ } catch (parseErr) {
2259
+ var peerErr = new Error(
2260
+ "crypto.spkiPinVerifier: failed to derive peer SPKI pin (" +
2261
+ (parseErr && parseErr.message ? parseErr.message : String(parseErr)) + ")"
2262
+ );
2263
+ peerErr.code = "crypto/spki-pin-peer-parse-failed";
2264
+ return peerErr;
2265
+ }
2266
+ var matched = false;
2267
+ for (var mi = 0; mi < pinBufs.length; mi += 1) {
2268
+ // No early exit — comparing against every pin keeps the match
2269
+ // timing from leaking which configured pin matched.
2270
+ if (peerBuf.length === pinBufs[mi].length &&
2271
+ nodeCrypto.timingSafeEqual(peerBuf, pinBufs[mi])) {
2272
+ matched = true;
2273
+ }
2274
+ }
2275
+ if (!matched) {
2276
+ var mismatchErr = new Error(
2277
+ "crypto.spkiPinVerifier: peer SPKI pin (" + SPKI_PIN_PREFIX +
2278
+ peerBuf.toString("base64") + ") does not match any configured pin"
2279
+ );
2280
+ mismatchErr.code = "crypto/spki-pin-mismatch";
2281
+ return mismatchErr;
2282
+ }
2283
+ return undefined;
2284
+ };
2285
+ }
2286
+
1994
2287
  var SUPPORTED_KEM_ALGORITHMS = Object.freeze([
1995
2288
  { id: "ml-kem-1024", envelopeId: C.KEM_IDS.ML_KEM_1024, description: "ML-KEM-1024 KEM-only (legacy single-component)" },
1996
2289
  { id: "ml-kem-1024-p384", envelopeId: C.KEM_IDS.ML_KEM_1024_P384, description: "ML-KEM-1024 + ECDH P-384 hybrid (framework default)" },
@@ -2140,6 +2433,8 @@ module.exports = {
2140
2433
  // Cert fingerprint helpers
2141
2434
  hashCertFingerprint: hashCertFingerprint,
2142
2435
  isCertRevoked: isCertRevoked,
2436
+ spkiPin: spkiPin,
2437
+ spkiPinVerifier: spkiPinVerifier,
2143
2438
  // Random
2144
2439
  generateBytes: generateBytes,
2145
2440
  generateToken: generateToken,
@@ -221,20 +221,28 @@ function build(directives, opts) {
221
221
  "csp.build: source '" + src + "' contains whitespace or ';' — a CSP source " +
222
222
  "must be a single token (directive-injection defense)");
223
223
  }
224
+ // A UA matches CSP source keywords ('unsafe-inline' ...) and scheme
225
+ // sources (https: / data:) ASCII case-INSENSITIVELY (CSP3 §2.3 /
226
+ // §6.7.2). Compare a lowercased copy against the (lowercase) guard sets
227
+ // so a case-variant token ("'Unsafe-Inline'" / "HTTPS:" / "DATA:") can't
228
+ // slip past and be emitted verbatim into a header the browser still
229
+ // honors. The ORIGINAL src is what gets emitted (hosts/paths stay
230
+ // case-preserved); only the guard comparison is normalized.
231
+ var srcLower = src.toLowerCase();
224
232
  if (!acknowledgeUnsafe && SCRIPT_DIRECTIVES.indexOf(name) !== -1 &&
225
- UNSAFE_KEYWORDS.indexOf(src) !== -1) {
233
+ UNSAFE_KEYWORDS.indexOf(srcLower) !== -1) {
226
234
  throw new CspError("csp/unsafe-keyword",
227
235
  "csp.build: " + name + " contains " + src + "; pass acknowledgeUnsafe:true with a " +
228
236
  "documented justification to allow it (CSP3 §6.2.5.x — unsafe keywords are a " +
229
237
  "common XSS bypass surface)");
230
238
  }
231
- if (CATCH_ALL_SOURCES.indexOf(src) !== -1) {
239
+ if (CATCH_ALL_SOURCES.indexOf(srcLower) !== -1) {
232
240
  throw new CspError("csp/catch-all-source",
233
241
  "csp.build: " + name + " contains catch-all source '" + src + "'; CSP3 best " +
234
242
  "practice refuses these (use an explicit allowlist instead)");
235
243
  }
236
244
  if (!allowDataImages && (name === "img-src" || name === "media-src" || name === "font-src") &&
237
- src === "data:") {
245
+ srcLower === "data:") {
238
246
  throw new CspError("csp/data-source",
239
247
  "csp.build: " + name + " contains 'data:'; pass allowDataImages:true with a " +
240
248
  "documented reason (data: URLs sidestep most CSP defenses)");