@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
@@ -23,6 +23,16 @@
23
23
  * - b.auth.saml.sp.create + buildAuthnRequest (HTTP-Redirect form
24
24
  * against the IdP's SAML endpoint)
25
25
  * - b.auth.saml.sp.metadata XML emit
26
+ * - b.auth.oauth.deviceAuthorization + pollDeviceCode (RFC 8628
27
+ * device grant — the poll survives the authorization_pending HTTP
28
+ * 400 rather than aborting on the first poll; provisions a
29
+ * device-grant client via the admin API)
30
+ * - b.auth.saml.sp.verifyResponse over a Keycloak-ENCRYPTED
31
+ * assertion (SAML 2.0 §2.5). Keycloak 26.0.8 emits aes128-cbc +
32
+ * rsa-oaep-mgf1p(SHA-1), which the framework refuses by design, so
33
+ * the assertion is the fail-closed refusal; the AES-GCM +
34
+ * RSA-OAEP-SHA256 positive-decrypt branch takes effect on Keycloak
35
+ * >= 26.2 (see the stage comment).
26
36
  *
27
37
  * Deferred (open-conditions noted):
28
38
  * - CIBA (Keycloak 26 supports it but requires extra realm-import
@@ -30,16 +40,21 @@
30
40
  * `attributes.cibaBackchannelTokenDeliveryMode`).
31
41
  * - OID4VCI / OID4VP (preview-only in Keycloak; re-open when the
32
42
  * `oid4vc-issuer` SPI ships in the base image).
33
- * - OpenID Federation 1.0 (no native Keycloak provider; re-open
34
- * when an entity-statement publisher ships, OR when we add a
35
- * standalone trust-anchor service to the compose stack).
43
+ * - OpenID Federation 1.0 has no native Keycloak provider; the
44
+ * trust-chain / metadata-policy path is covered in-process by
45
+ * test/integration/openid-federation-chain.test.js (three loopback
46
+ * entity-statement servers) rather than against Keycloak.
36
47
  */
37
48
 
38
49
  var helpers = require("../helpers");
39
50
  var check = helpers.check;
40
51
  var services = require("../helpers/services");
41
52
  var b = require("../../");
42
- var nodeCrypto = require("node:crypto");
53
+ var nodeCrypto = require("node:crypto");
54
+ var nodeChildProcess = require("node:child_process");
55
+ var nodeFs = require("node:fs");
56
+ var nodeOs = require("node:os");
57
+ var nodePath = require("node:path");
43
58
 
44
59
  var KEYCLOAK_BASE = "http://127.0.0.1:18080";
45
60
  var REALM = "blamejs-test";
@@ -190,6 +205,196 @@ async function _signLogoutToken(signingKid, sub, sid, jti) {
190
205
  return signingInput + "." + sig.toString("base64url");
191
206
  }
192
207
 
208
+ // ---- Keycloak Admin REST helpers ----
209
+ // The realm is imported once at container start; the device-grant and
210
+ // encrypted-SAML stages need two client shapes the base import doesn't carry
211
+ // (a device-grant client without a forced PKCE challenge, and a SAML SP with
212
+ // assertion encryption on). They're applied idempotently via the admin API so
213
+ // the test is robust against both the already-running container and a fresh
214
+ // `compose up`; the realm JSON carries the same shapes for a cold start.
215
+ var KC_ADMIN_USER = "admin";
216
+ var KC_ADMIN_PASS = "blamejs-test-admin";
217
+ var DEVICE_CLIENT_ID = "blamejs-device-oidc";
218
+ var DEVICE_SECRET = "blamejs-test-device-secret";
219
+ var SP_ENC_ENTITY_ID = "https://sp-enc.blamejs-test.example";
220
+
221
+ async function _adminToken() {
222
+ var body = new URLSearchParams();
223
+ body.set("grant_type", "password");
224
+ body.set("client_id", "admin-cli");
225
+ body.set("username", KC_ADMIN_USER);
226
+ body.set("password", KC_ADMIN_PASS);
227
+ var res = await b.httpClient.request({
228
+ method: "POST",
229
+ url: KEYCLOAK_BASE + "/realms/master/protocol/openid-connect/token",
230
+ allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
231
+ allowInternal: true,
232
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
233
+ body: body.toString(),
234
+ });
235
+ if (res.statusCode !== 200) {
236
+ throw new Error("admin token grant failed: " + res.statusCode + " " + (res.body && res.body.toString().slice(0, 200)));
237
+ }
238
+ return JSON.parse(res.body.toString("utf8")).access_token;
239
+ }
240
+
241
+ async function _kcAdmin(method, subPath, tok, jsonBody) {
242
+ var req = {
243
+ method: method,
244
+ url: KEYCLOAK_BASE + "/admin/realms/" + REALM + subPath,
245
+ allowedProtocols: b.safeUrl.ALLOW_HTTP_ALL,
246
+ allowInternal: true,
247
+ responseMode: "always-resolve",
248
+ headers: { Authorization: "Bearer " + tok },
249
+ };
250
+ if (jsonBody !== undefined) {
251
+ req.headers["Content-Type"] = "application/json";
252
+ req.body = JSON.stringify(jsonBody);
253
+ }
254
+ var res = await b.httpClient.request(req);
255
+ var json = null;
256
+ if (res.body && res.body.length) {
257
+ try { json = JSON.parse(res.body.toString("utf8")); } catch (_e) { json = null; }
258
+ }
259
+ return { statusCode: res.statusCode, json: json };
260
+ }
261
+
262
+ // Create-or-update a confidential OIDC client with the device grant enabled and
263
+ // no forced PKCE challenge (b.auth.oauth.deviceAuthorization sends no
264
+ // code_challenge, and the base blamejs-rp-oidc client forces S256).
265
+ async function _ensureDeviceClient(tok) {
266
+ var rep = {
267
+ clientId: DEVICE_CLIENT_ID,
268
+ name: "blamejs OIDC device-grant (integration test)",
269
+ enabled: true,
270
+ protocol: "openid-connect",
271
+ publicClient: false,
272
+ secret: DEVICE_SECRET,
273
+ standardFlowEnabled: false,
274
+ directAccessGrantsEnabled: false,
275
+ serviceAccountsEnabled: false,
276
+ attributes: {
277
+ "oauth2.device.authorization.grant.enabled": "true",
278
+ "pkce.code.challenge.method": "",
279
+ },
280
+ };
281
+ var listed = await _kcAdmin("GET", "/clients?clientId=" + encodeURIComponent(DEVICE_CLIENT_ID), tok);
282
+ if (Array.isArray(listed.json) && listed.json.length > 0) {
283
+ var existing = listed.json[0];
284
+ var merged = Object.assign({}, existing, rep, {
285
+ id: existing.id,
286
+ attributes: Object.assign({}, existing.attributes, rep.attributes),
287
+ });
288
+ await _kcAdmin("PUT", "/clients/" + existing.id, tok, merged);
289
+ } else {
290
+ await _kcAdmin("POST", "/clients", tok, rep);
291
+ }
292
+ }
293
+
294
+ // Generate an ephemeral SP RSA keypair + self-signed cert at runtime so no
295
+ // private key is committed. Keycloak encrypts the assertion CEK to the cert's
296
+ // RSA public key; the SP decrypts with the private key. Uses openssl (dev
297
+ // tooling — the integration runner already shells to docker); returns null when
298
+ // openssl is unavailable so the stage skips cleanly.
299
+ function _generateSpEncryptionKeypair() {
300
+ var dir = nodeFs.mkdtempSync(nodePath.join(nodeOs.tmpdir(), "blamejs-saml-sp-enc-"));
301
+ var keyPath = nodePath.join(dir, "sp-key.pem");
302
+ var certPath = nodePath.join(dir, "sp-cert.pem");
303
+ try {
304
+ var r = nodeChildProcess.spawnSync("openssl", [
305
+ "req", "-x509", "-newkey", "rsa:2048", "-keyout", keyPath, "-out", certPath,
306
+ "-days", "3650", "-nodes", "-subj", "/CN=sp-enc.blamejs-test.example", "-sha256",
307
+ ], { stdio: "ignore" });
308
+ if (!r || r.status !== 0 || !nodeFs.existsSync(certPath) || !nodeFs.existsSync(keyPath)) return null;
309
+ var keyPem = nodeFs.readFileSync(keyPath, "utf8");
310
+ var certPem = nodeFs.readFileSync(certPath, "utf8");
311
+ var certDerB64 = new nodeCrypto.X509Certificate(certPem).raw.toString("base64");
312
+ return { keyPem: keyPem, certDerB64: certDerB64 };
313
+ } catch (_e) {
314
+ return null;
315
+ } finally {
316
+ try { nodeFs.rmSync(dir, { recursive: true, force: true }); } catch (_e2) {}
317
+ }
318
+ }
319
+
320
+ // Create-or-update a SAML SP client with assertion encryption enabled, keyed to
321
+ // the supplied SP certificate. The algorithm attributes request AES-GCM +
322
+ // RSA-OAEP-SHA256 (what the framework decrypts); Keycloak < 26.2 ignores them
323
+ // and emits its aes128-cbc + rsa-oaep-mgf1p(SHA-1) defaults, which the framework
324
+ // refuses by design.
325
+ async function _ensureSamlEncClient(tok, certDerB64) {
326
+ var attrs = {
327
+ "saml.assertion.signature": "true",
328
+ "saml.server.signature": "false",
329
+ "saml.signature.algorithm": "RSA_SHA256",
330
+ "saml.client.signature": "false",
331
+ "saml.encrypt": "true",
332
+ "saml.encryption.certificate": certDerB64,
333
+ "saml.encryption.algorithm": "AES_256_GCM",
334
+ "saml.encryption.keyAlgorithm": "RSA-OAEP",
335
+ "saml.encryption.digestMethod": "SHA-256",
336
+ "saml.encryption.maskGenerationFunction": "MGF1-SHA256",
337
+ "saml.force.post.binding": "true",
338
+ "saml_assertion_consumer_url_post": SP_ACS_URL,
339
+ "saml_name_id_format": "username",
340
+ "saml.authnstatement": "true",
341
+ };
342
+ var rep = {
343
+ clientId: SP_ENC_ENTITY_ID,
344
+ name: "blamejs SAML SP encrypted (integration test)",
345
+ enabled: true,
346
+ protocol: "saml",
347
+ publicClient: true,
348
+ redirectUris: [SP_ACS_URL],
349
+ frontchannelLogout: false,
350
+ attributes: attrs,
351
+ defaultClientScopes: ["role_list"],
352
+ };
353
+ var listed = await _kcAdmin("GET", "/clients?clientId=" + encodeURIComponent(SP_ENC_ENTITY_ID), tok);
354
+ if (Array.isArray(listed.json) && listed.json.length > 0) {
355
+ var existing = listed.json[0];
356
+ var merged = Object.assign({}, existing, rep, {
357
+ id: existing.id,
358
+ attributes: Object.assign({}, existing.attributes, attrs),
359
+ });
360
+ await _kcAdmin("PUT", "/clients/" + existing.id, tok, merged);
361
+ } else {
362
+ await _kcAdmin("POST", "/clients", tok, rep);
363
+ }
364
+ }
365
+
366
+ // Drive Keycloak's login form for a SAML AuthnRequest redirect URL and return
367
+ // the base64 SAMLResponse from the auto-submit form (or null). Mirrors the
368
+ // cookie-jar + form-post steps of the plaintext SAML round-trip so the
369
+ // encrypted stage reuses the same login mechanics.
370
+ async function _driveSamlLoginCapture(authnRedirectUrl) {
371
+ var jar = _newCookieJar();
372
+ var loginPage = await _httpReq("GET", authnRedirectUrl, jar);
373
+ if (loginPage.statusCode !== 200) return null;
374
+ var actionMatch = /action="(http:\/\/[^"]+\/login-actions\/authenticate[^"]+)"/.exec(loginPage.body.toString("utf8"));
375
+ if (!actionMatch) return null;
376
+ var loginBody = new URLSearchParams();
377
+ loginBody.set("username", TEST_USERNAME);
378
+ loginBody.set("password", TEST_PASSWORD);
379
+ loginBody.set("credentialId", "");
380
+ var loginPost = await _httpReq("POST", actionMatch[1].replace(/&amp;/g, "&"), jar, {
381
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
382
+ body: loginBody.toString(),
383
+ redirect: false,
384
+ });
385
+ var responseHtml;
386
+ if (loginPost.statusCode === 200) {
387
+ responseHtml = loginPost.body.toString("utf8");
388
+ } else if (loginPost.statusCode === 302 || loginPost.statusCode === 303) {
389
+ var follow = await _httpReq("GET", loginPost.headers.location || loginPost.headers.Location, jar);
390
+ responseHtml = follow.body.toString("utf8");
391
+ } else {
392
+ return null;
393
+ }
394
+ var m = /name="SAMLResponse"\s+value="([^"]+)"/.exec(responseHtml);
395
+ return m ? m[1] : null;
396
+ }
397
+
193
398
  async function run() {
194
399
  // ---- service readiness ----
195
400
  var keycloak = await services.requireService("keycloak");
@@ -600,10 +805,113 @@ async function run() {
600
805
  check("DCR: deferred (AS doesn't advertise registration_endpoint)", true);
601
806
  }
602
807
 
808
+ // ---- OAuth Device Authorization Grant (RFC 8628) — the poll survives an
809
+ // authorization_pending HTTP 400 ----
810
+ // RFC 8628 §3.5 / RFC 6749 §5.2 deliver `authorization_pending` as an HTTP
811
+ // 400 whose body carries the OAuth `error`. Before v0.16.5 the token poll ran
812
+ // in the http client's buffering mode, which rejected the 400 before the
813
+ // pending handler read the body, so the grant aborted on the FIRST poll
814
+ // (almost always authorization_pending, since the user hasn't approved yet).
815
+ // Drive the grant against Keycloak's real device endpoint and assert the poll
816
+ // keeps going across the pending 400s to a deterministic device-poll-timeout —
817
+ // not the HTTP_ERROR abort the buffered path threw.
818
+ var adminTok = await _adminToken();
819
+ await _ensureDeviceClient(adminTok);
820
+ var deviceOauth = b.auth.oauth.create({
821
+ issuer: ISSUER,
822
+ clientId: DEVICE_CLIENT_ID,
823
+ clientSecret: DEVICE_SECRET,
824
+ redirectUri: REDIRECT_URI,
825
+ isOidc: true,
826
+ allowHttp: true,
827
+ allowInternal: true,
828
+ });
829
+ var devAuth = await deviceOauth.deviceAuthorization();
830
+ check("deviceAuthorization: device_code + user_code + verification_uri returned",
831
+ typeof devAuth.device_code === "string" && typeof devAuth.user_code === "string" &&
832
+ typeof devAuth.verification_uri === "string");
833
+ // The user never approves, so every poll returns authorization_pending (400).
834
+ // maxWaitMs spans at least two 5s poll intervals — reaching device-poll-timeout
835
+ // proves the loop survived the pending 400s rather than aborting on the first
836
+ // (which is what a reverted buffer-mode poll would do, throwing HTTP_ERROR).
837
+ var devThrew = null;
838
+ try {
839
+ await deviceOauth.pollDeviceCode(devAuth.device_code, { interval: devAuth.interval, maxWaitMs: 6000 });
840
+ } catch (e) { devThrew = e; }
841
+ check("pollDeviceCode: survives authorization_pending 400 and reaches device-poll-timeout",
842
+ !!devThrew && devThrew.code === "auth-oauth/device-poll-timeout");
843
+
844
+ // ---- SAML EncryptedAssertion decrypt interop (SAML 2.0 §2.5) ----
845
+ // Enable assertion encryption on a dedicated SP client, drive the login, and
846
+ // hand the Keycloak-encrypted SAMLResponse to verifyResponse with the SP
847
+ // private key. Keycloak 26.0.8 emits aes128-cbc content + rsa-oaep-mgf1p
848
+ // (SHA-1) key transport — both refused by the framework by design (XMLEnc CBC
849
+ // padding-oracle; SHA-1 OAEP), so against that output the assertion is that
850
+ // the framework fails CLOSED (no auth bypass). On a Keycloak that emits
851
+ // AES-GCM + RSA-OAEP-SHA256 (26.2+, where the encryption algorithm attributes
852
+ // take effect), the GCM branch asserts nameId/issuer/audience decrypt. The SP
853
+ // keypair is generated at runtime so no private key is committed.
854
+ var spEnc = _generateSpEncryptionKeypair();
855
+ if (!spEnc) {
856
+ check("SAML EncryptedAssertion: skipped — openssl unavailable for runtime SP cert (see file header)", true);
857
+ } else {
858
+ await _ensureSamlEncClient(adminTok, spEnc.certDerB64);
859
+ var spEncHandle = b.auth.saml.sp.create({
860
+ entityId: SP_ENC_ENTITY_ID,
861
+ assertionConsumerServiceUrl: SP_ACS_URL,
862
+ idpEntityId: ISSUER,
863
+ idpSsoUrl: IDP_SSO_URL,
864
+ idpCertPem: idpSigningCertPem,
865
+ });
866
+ var arEnc = spEncHandle.buildAuthnRequest();
867
+ var encRespB64 = await _driveSamlLoginCapture(arEnc.redirectUrl);
868
+ check("SAML EncryptedAssertion: login round-trip captured a SAMLResponse",
869
+ typeof encRespB64 === "string" && encRespB64.length > 0);
870
+ if (encRespB64) {
871
+ var encXml = Buffer.from(encRespB64, "base64").toString("utf8");
872
+ check("SAML EncryptedAssertion: Keycloak returned an <EncryptedAssertion>",
873
+ encXml.indexOf("EncryptedAssertion") !== -1);
874
+ var contentAlgMatch = /EncryptedData\b[\s\S]*?EncryptionMethod Algorithm="([^"]+)"/.exec(encXml);
875
+ var keyAlgMatch = /EncryptedKey\b[\s\S]*?EncryptionMethod Algorithm="([^"]+)"/.exec(encXml);
876
+ var contentAlg = contentAlgMatch ? contentAlgMatch[1] : "";
877
+ var keyAlg = keyAlgMatch ? keyAlgMatch[1] : "";
878
+ var gcmContent = /aes(?:128|192|256)-gcm/.test(contentAlg);
879
+ var sha256Oaep = /xmlenc(?:11)?#sha(?:256|384|512)/.test(encXml);
880
+ if (gcmContent && sha256Oaep) {
881
+ // Keycloak >= 26.2 path: the framework decrypts the assertion.
882
+ var encInfo = spEncHandle.verifyResponse(encRespB64, {
883
+ spPrivateKeyPem: spEnc.keyPem,
884
+ expectedInResponseTo: arEnc.id,
885
+ });
886
+ check("SAML EncryptedAssertion: decrypted nameId is alice",
887
+ encInfo && (encInfo.nameId === TEST_USERNAME || encInfo.nameId === "alice@example.com"));
888
+ check("SAML EncryptedAssertion: decrypted issuer matches IdP entityID",
889
+ encInfo && encInfo.issuer === ISSUER);
890
+ check("SAML EncryptedAssertion: decrypted audience matches SP entityID",
891
+ encInfo && encInfo.audience === SP_ENC_ENTITY_ID);
892
+ } else {
893
+ // Keycloak 26.0.8 path: aes128-cbc + rsa-oaep-mgf1p(SHA-1). The framework
894
+ // refuses both by design; assert the fail-closed refusal against the real
895
+ // IdP output. Positive decrypt is pending a Keycloak >= 26.2 image.
896
+ var encThrew = null;
897
+ try {
898
+ spEncHandle.verifyResponse(encRespB64, {
899
+ spPrivateKeyPem: spEnc.keyPem,
900
+ expectedInResponseTo: arEnc.id,
901
+ });
902
+ } catch (e) { encThrew = e; }
903
+ check("SAML EncryptedAssertion: framework fails closed on Keycloak 26.0.8 weak-crypto envelope (" +
904
+ contentAlg + " / " + keyAlg + ")",
905
+ !!encThrew &&
906
+ /^auth-saml\/encrypted-(weak-oaep-digest|unsupported-content-alg|unsupported-key-alg)$/.test(encThrew.code || ""));
907
+ }
908
+ }
909
+ }
910
+
603
911
  // ---- Federation primitives — deferred, document the open conditions ----
604
912
  check("OID4VCI: deferred (Keycloak oid4vc-issuer SPI is preview-only)", true);
605
913
  check("OID4VP: deferred (no wallet harness in the test stack)", true);
606
- check("OpenID Federation: deferred (no entity-statement publisher in the test stack)", true);
914
+ check("OpenID Federation: covered by openid-federation-chain.test.js (loopback trust-chain, no Keycloak provider)", true);
607
915
  check("OIDC Native SSO: deferred (Keycloak's device_secret support is preview-only)", true);
608
916
  }
609
917
 
@@ -11,6 +11,12 @@
11
11
  * Covers both signature algorithms the framework supports: rsa-sha256
12
12
  * (RFC 6376) and ed25519-sha256 (RFC 8463). PQC DKIM is forward-looking
13
13
  * — the framework's dkim docstring carries that intent already.
14
+ *
15
+ * The simple/simple canonicalization stage goes further than header
16
+ * presence: it fetches the RAW captured source back out of mailpit and
17
+ * cryptographically verifies the signature over the bytes that actually
18
+ * traversed the SMTP wire — simple canonicalization tolerates zero byte
19
+ * drift, so any framing change between sign and capture fails it.
14
20
  */
15
21
  var fs = require("node:fs");
16
22
  var http = require("node:http");
@@ -109,6 +115,77 @@ async function _runWithAlgorithm(algorithm, privateKey, label) {
109
115
  /b=[A-Za-z0-9+/=\s]+/.test(raw));
110
116
  }
111
117
 
118
+ // Sign with simple/simple canonicalization, deliver through the live SMTP
119
+ // transport, then VERIFY the signature on the raw bytes mailpit captured.
120
+ // Simple canonicalization signs the headers and body verbatim (RFC 6376
121
+ // sections 3.4.1 and 3.4.3), so this only passes when the exact signed
122
+ // bytes survive smtpTransport framing, the SMTP hop, and mailpit capture.
123
+ async function _runSimpleCanonWireVerify() {
124
+ await _httpDelete("http://127.0.0.1:8025/api/v1/messages");
125
+
126
+ var caPem = fs.readFileSync(process.env.BLAMEJS_TEST_CA_PATH, "utf8");
127
+ var kp = crypto.generateKeyPairSync("rsa", {
128
+ modulusLength: 2048,
129
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
130
+ publicKeyEncoding: { type: "spki", format: "pem" },
131
+ });
132
+ var signer = b.mail.dkim.create({
133
+ domain: "example.com",
134
+ selector: "test",
135
+ privateKey: kp.privateKey,
136
+ canonicalization: "simple/simple",
137
+ headersToSign: ["From", "To", "Subject", "Date"],
138
+ });
139
+ var transport = b.mail.transports.smtp({
140
+ host: "localhost",
141
+ port: 1025,
142
+ ehloName: "blamejs-test",
143
+ timeoutMs: 5000,
144
+ ca: caPem,
145
+ dkimSigner: signer,
146
+ });
147
+
148
+ await transport.send({
149
+ from: "test@example.com",
150
+ to: ["dkim-simple@blamejs.local"],
151
+ subject: "dkim-simple-simple-" + Date.now(),
152
+ text: "Simple-canon wire-interop body line one.\r\nLine two.",
153
+ });
154
+
155
+ var listing = await _httpJson("http://127.0.0.1:8025/api/v1/messages");
156
+ check("[simple/simple] mailpit captured the dkim-signed message",
157
+ listing.messages.length === 1);
158
+ var captured = listing.messages[0];
159
+ var raw = await new Promise(function (resolve, reject) {
160
+ http.get("http://127.0.0.1:8025/api/v1/message/" + captured.ID + "/raw", function (res) {
161
+ var chunks = [];
162
+ res.on("data", function (c) { chunks.push(c); });
163
+ res.on("end", function () { resolve(Buffer.concat(chunks).toString("utf8")); });
164
+ }).once("error", reject);
165
+ });
166
+ check("[simple/simple] captured signature declares c=simple/simple",
167
+ /c=simple\/simple/.test(raw));
168
+
169
+ var pubB64 = kp.publicKey.replace(/-----[A-Z ]+-----/g, "").replace(/\s+/g, "");
170
+ var dnsLookup = async function () { return [["v=DKIM1; k=rsa; p=" + pubB64]]; };
171
+ b.mail.dkim._resetDkimKeyCacheForTest();
172
+ var rv = await b.mail.dkim.verify(raw, { dnsLookup: dnsLookup });
173
+ check("[simple/simple] wire-captured message verifies: result pass",
174
+ Array.isArray(rv) && rv.length === 1 && rv[0].result === "pass");
175
+ check("[simple/simple] wire verify reports zero errors",
176
+ rv[0] && Array.isArray(rv[0].errors) && rv[0].errors.length === 0);
177
+
178
+ // Control: the pass above is cryptographic, not vacuous — one flipped
179
+ // body byte in the captured source must flip the verdict to fail.
180
+ var tampered = raw.replace("wire-interop body line one", "wire-interop body line 0ne");
181
+ check("[simple/simple] tamper control mutated the captured body",
182
+ tampered !== raw);
183
+ b.mail.dkim._resetDkimKeyCacheForTest();
184
+ var rvTampered = await b.mail.dkim.verify(tampered, { dnsLookup: dnsLookup });
185
+ check("[simple/simple] tampered wire body fails verification",
186
+ rvTampered[0] && rvTampered[0].result === "fail");
187
+ }
188
+
112
189
  async function run() {
113
190
  var svc = await services.requireService("mailpit");
114
191
  if (!svc.ok) throw new Error("mailpit unreachable: " + svc.reason);
@@ -128,6 +205,9 @@ async function run() {
128
205
  });
129
206
  await _runWithAlgorithm("ed25519-sha256", ed.privateKey, "ed25519");
130
207
 
208
+ // ---- simple/simple canonicalization verified on the wire bytes ----
209
+ await _runSimpleCanonWireVerify();
210
+
131
211
  // ---- bad algorithm rejected at signer build time ----
132
212
  var threw = null;
133
213
  try {