@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
@@ -20,6 +20,7 @@ var nodeCrypto = require("crypto");
20
20
 
21
21
  var mailCrypto = require("../../lib/mail-crypto");
22
22
  var pgp = mailCrypto.pgp;
23
+ var pq = require("../../lib/pqc-software");
23
24
 
24
25
  // ---- Keypair fixtures (one per algorithm) ----
25
26
 
@@ -354,7 +355,724 @@ function testWkdComputeUrlPunycodeAccepted() {
354
355
  check("Punycode produces direct URL", urls.direct.indexOf("/.well-known/openpgpkey/hu/") !== -1);
355
356
  }
356
357
 
357
- function run() {
358
+ // ============================================================================
359
+ // Uncovered error / adversarial / defensive branch coverage
360
+ // ----------------------------------------------------------------------------
361
+ // The round-trip tests above exercise the happy path. The following drive the
362
+ // malformed-packet, key-resolution, and defensive-guard branches through the
363
+ // real consumer path (pgp.sign / pgp.verify / pgp.encrypt / pgp.decrypt /
364
+ // pgp.wkd.*), plus the exported dearmor hook for the ASCII-armor parser.
365
+ // ============================================================================
366
+
367
+ // Shared keypairs — reused across the crafted-packet tests to avoid repeated
368
+ // keygen. Ed25519 keygen is cheap; one RSA-2048 keygen amortizes across tests.
369
+ var _edKp = _ed25519Keypair();
370
+ var _rsaKp = _rsaKeypair(2048);
371
+
372
+ // ---- New-format OpenPGP packet builders (RFC 9580 §4.2 / §5.2) ----
373
+
374
+ function _u16(n) { var buf = Buffer.alloc(2); buf.writeUInt16BE(n, 0); return buf; }
375
+
376
+ function _encLen(n) {
377
+ if (n < 192) return Buffer.from([n]);
378
+ if (n < 8384) return Buffer.from([((n - 192) >> 8) + 192, (n - 192) & 0xff]);
379
+ var b = Buffer.alloc(4); b.writeUInt32BE(n >>> 0, 0);
380
+ return Buffer.concat([Buffer.from([0xff]), b]);
381
+ }
382
+
383
+ // New-format Signature packet (tag 2) wrapper around a body buffer.
384
+ function _sigPacket(body) {
385
+ return Buffer.concat([Buffer.from([0xc2]), _encLen(body.length), body]);
386
+ }
387
+
388
+ // A v4 signature-packet body with per-field control.
389
+ function _sigBody(f) {
390
+ var hashedSub = f.hashedSub || Buffer.alloc(0);
391
+ var unhashedSub = f.unhashedSub || Buffer.alloc(0);
392
+ var hashLeft16 = f.hashLeft16 || Buffer.from([0x00, 0x00]);
393
+ var sigMpis = f.sigMpis || Buffer.alloc(0);
394
+ return Buffer.concat([
395
+ Buffer.from([4, f.sigType, f.pubAlg, f.hashAlg]),
396
+ _u16(hashedSub.length), hashedSub,
397
+ _u16(unhashedSub.length), unhashedSub,
398
+ hashLeft16, sigMpis,
399
+ ]);
400
+ }
401
+
402
+ // Take a real armored signature, split it into (everything up to and
403
+ // including hashLeft16) + (the signature-MPI tail). The header carries the
404
+ // signed-section and issuer-fingerprint subpacket, so a rebuilt packet with a
405
+ // mutated MPI tail still passes the leading-hash fast-fail and the fingerprint
406
+ // check — letting the crypto-verify and MPI-decode branches be exercised.
407
+ function _dissect(armored) {
408
+ var pkt = pgp._dearmorForTest(armored);
409
+ var idx = 1;
410
+ var l0 = pkt[idx];
411
+ if (l0 < 192) idx += 1;
412
+ else if (l0 < 224) idx += 2;
413
+ else if (l0 === 0xff) idx += 5;
414
+ else idx += 1;
415
+ var body = pkt.slice(idx);
416
+ var hashedSubLen = body.readUInt16BE(4);
417
+ var p = 6 + hashedSubLen;
418
+ var unhashedSubLen = body.readUInt16BE(p);
419
+ p += 2 + unhashedSubLen;
420
+ return { headerToHashLeft: body.slice(0, p + 2), sigMpis: body.slice(p + 2) };
421
+ }
422
+
423
+ function _rebuild(headerToHashLeft, sigTail) {
424
+ return pgp._armorForTest(_sigPacket(Buffer.concat([headerToHashLeft, sigTail])));
425
+ }
426
+
427
+ // ---- sign: unsupported key type + passphrase-protected key ----
428
+
429
+ function testPgpSignRejectsUnsupportedKeyType() {
430
+ var ec = nodeCrypto.generateKeyPairSync("ec", {
431
+ namedCurve: "P-256",
432
+ publicKeyEncoding: { type: "spki", format: "pem" },
433
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
434
+ });
435
+ var threw = null;
436
+ try { pgp.sign({ message: "hi", privateKeyPem: ec.privateKey }); } catch (e) { threw = e; }
437
+ check("sign: EC (unsupported) key type → bad-key-type",
438
+ threw && threw.code === "mail-crypto/pgp/bad-key-type");
439
+ }
440
+
441
+ function testPgpSignWithPassphraseProtectedKey() {
442
+ var kp = nodeCrypto.generateKeyPairSync("ed25519", {
443
+ publicKeyEncoding: { type: "spki", format: "pem" },
444
+ privateKeyEncoding: { type: "pkcs8", format: "pem",
445
+ cipher: "aes-256-cbc", passphrase: "s3cret-pass" },
446
+ });
447
+ var rv = pgp.sign({ message: "hi", privateKeyPem: kp.privateKey, passphrase: "s3cret-pass" });
448
+ check("sign: passphrase-protected key signs", typeof rv.armored === "string");
449
+ var v = pgp.verify({ message: "hi", armored: rv.armored, publicKeyPem: kp.publicKey });
450
+ check("sign: passphrase-protected key round-trips verify", v.ok === true);
451
+
452
+ var threw = null;
453
+ try { pgp.sign({ message: "hi", privateKeyPem: kp.privateKey, passphrase: "wrong-pass" }); }
454
+ catch (e) { threw = e; }
455
+ check("sign: wrong passphrase → bad-key", threw && threw.code === "mail-crypto/pgp/bad-key");
456
+ }
457
+
458
+ // ---- audit hot-path is drop-silent even when the sink throws ----
459
+
460
+ function testPgpAuditHandleThatThrows() {
461
+ var throwingAudit = { safeEmit: function () { throw new Error("audit sink down"); } };
462
+ var rv = pgp.sign({ message: "hi", privateKeyPem: _edKp.privateKey, audit: throwingAudit });
463
+ check("sign: throwing audit sink does not crash sign", typeof rv.armored === "string");
464
+ var v = pgp.verify({ message: "hi", armored: rv.armored,
465
+ publicKeyPem: _edKp.publicKey, audit: throwingAudit });
466
+ check("verify: throwing audit sink does not crash verify", v.ok === true);
467
+ }
468
+
469
+ // ---- ASCII-armor (dearmor) parser error paths ----
470
+
471
+ function testDearmorErrorPaths() {
472
+ function de(label, input, re) {
473
+ var threw = null;
474
+ try { pgp._dearmorForTest(input); } catch (e) { threw = e; }
475
+ check("dearmor: " + label,
476
+ threw && re.test(String(threw.code) + " " + String(threw.message)));
477
+ }
478
+ de("non-string input refused", 12345, /bad-armor/);
479
+ de("missing BEGIN/END framing refused", "no armor here at all", /bad-armor/);
480
+
481
+ var good = pgp.sign({ message: "m", privateKeyPem: _edKp.privateKey }).armored;
482
+
483
+ // Strip the CRC-24 trailer line (starts with '=').
484
+ var noCrc = good.split("\r\n").filter(function (l) { return l.charAt(0) !== "="; }).join("\r\n");
485
+ de("missing CRC-24 trailer refused", noCrc, /bad-armor/);
486
+
487
+ // Corrupt one base64 body character → recomputed CRC-24 mismatches.
488
+ var lines = good.split("\r\n");
489
+ for (var i = 0; i < lines.length; i += 1) {
490
+ if (lines[i].length > 20 && lines[i].charAt(0) !== "=" && lines[i].indexOf("-----") === -1) {
491
+ lines[i] = (lines[i].charAt(0) === "A" ? "B" : "A") + lines[i].slice(1);
492
+ break;
493
+ }
494
+ }
495
+ de("corrupt-body CRC-24 mismatch refused", lines.join("\r\n"), /bad-armor/);
496
+
497
+ // CRC-24 trailer that base64-decodes to the wrong byte length.
498
+ var badCrcLen = good.replace(/\r\n=[^\r\n]+/, "\r\n=AA"); // "AA" → 1 byte, not 3
499
+ de("CRC-24 trailer wrong byte length refused", badCrcLen, /bad-armor/);
500
+
501
+ // A well-formed armor carrying an RFC 9580 §6.2 header line (Comment:)
502
+ // before the blank separator must parse — exercises the header-skip path.
503
+ var withHeader = good.replace("-----BEGIN PGP SIGNATURE-----\r\n",
504
+ "-----BEGIN PGP SIGNATURE-----\r\nComment: test header\r\n");
505
+ var parsed = pgp._dearmorForTest(withHeader);
506
+ check("dearmor: armor with a header line parses to packet bytes",
507
+ Buffer.isBuffer(parsed) && parsed.length > 0);
508
+ }
509
+
510
+ // ---- verify: malformed signature packets (structural parse branches) ----
511
+
512
+ function testVerifyMalformedPackets() {
513
+ function vf(label, packetBytes, codeRe) {
514
+ var armored = pgp._armorForTest(packetBytes);
515
+ var rv = null, threw = null;
516
+ try { rv = pgp.verify({ message: "m", armored: armored, publicKeyPem: _edKp.publicKey }); }
517
+ catch (e) { threw = e; }
518
+ check("verify malformed: " + label,
519
+ threw === null && rv && rv.ok === false &&
520
+ codeRe.test(String(rv.code) + " " + String(rv.reason)));
521
+ }
522
+ vf("packet too short", Buffer.from([0xc2]), /bad-packet/);
523
+ vf("legacy/old-format header refused", Buffer.from([0x80, 0x00]), /bad-packet/);
524
+ vf("wrong tag (not Signature)", Buffer.from([0xc1, 0x00]), /bad-packet/);
525
+ vf("truncated 2-octet length", Buffer.from([0xc2, 192]), /bad-packet/);
526
+ vf("truncated 5-octet length", Buffer.from([0xc2, 0xff, 0x00]), /bad-packet/);
527
+ vf("partial-body length refused", Buffer.from([0xc2, 0xe0, 0x00]), /bad-packet/);
528
+ vf("packet body truncated", Buffer.from([0xc2, 10, 4, 0, 22, 10]), /bad-packet/);
529
+ vf("5-octet length then bad version",
530
+ Buffer.concat([Buffer.from([0xc2, 0xff, 0, 0, 0, 6]), Buffer.from([5, 0, 22, 10, 0, 0])]),
531
+ /bad-version/);
532
+ vf("bad version (not v4)", _sigPacket(Buffer.from([5, 0, 22, 10, 0, 0])), /bad-version/);
533
+ vf("non-binary signature type refused", _sigPacket(Buffer.from([4, 1, 22, 10, 0, 0])), /bad-sig-type/);
534
+ vf("SHA-1 hash algorithm refused", _sigPacket(Buffer.from([4, 0, 22, 2, 0, 0])), /bad-hash/);
535
+ vf("hashed-subpacket length overflow", _sigPacket(Buffer.from([4, 0, 22, 10, 0xff, 0xff])), /bad-packet/);
536
+ vf("missing unhashed-subpacket length", _sigPacket(Buffer.from([4, 0, 22, 10, 0, 0])), /bad-packet/);
537
+ vf("unhashed-subpacket length overflow",
538
+ _sigPacket(Buffer.from([4, 0, 22, 10, 0, 0, 0xff, 0xff])), /bad-packet/);
539
+ }
540
+
541
+ // ---- verify: subpacket length-octet decoding (2-octet + 5-octet forms) ----
542
+
543
+ function testVerifySubpacketLengthEncodings() {
544
+ // 2-octet subpacket length (first octet in [192,255)) that overruns the
545
+ // hashed area → decoded then bounded.
546
+ var hs2 = Buffer.from([200, 5]);
547
+ var pkt2 = _sigPacket(_sigBody({ sigType: 0, pubAlg: 22, hashAlg: 8, hashedSub: hs2 }));
548
+ var r2 = pgp.verify({ message: "x", armored: pgp._armorForTest(pkt2), publicKeyPem: _edKp.publicKey });
549
+ check("verify: 2-octet subpacket length decoded then bounded", r2.ok === false);
550
+
551
+ // 5-octet subpacket length (first octet === 255).
552
+ var hs5 = Buffer.from([255, 0, 0, 0, 3, 2, 0, 0]);
553
+ var pkt5 = _sigPacket(_sigBody({ sigType: 0, pubAlg: 22, hashAlg: 8, hashedSub: hs5 }));
554
+ var r5 = pgp.verify({ message: "x", armored: pgp._armorForTest(pkt5), publicKeyPem: _edKp.publicKey });
555
+ check("verify: 5-octet subpacket length decoded", r5.ok === false);
556
+
557
+ // 2-octet length header itself truncated (only the first octet present).
558
+ var hs2t = Buffer.from([200]);
559
+ var pkt2t = _sigPacket(_sigBody({ sigType: 0, pubAlg: 22, hashAlg: 8, hashedSub: hs2t }));
560
+ var r2t = pgp.verify({ message: "x", armored: pgp._armorForTest(pkt2t), publicKeyPem: _edKp.publicKey });
561
+ check("verify: truncated 2-octet subpacket header bounded", r2t.ok === false);
562
+
563
+ // 5-octet length header itself truncated.
564
+ var hs5t = Buffer.from([255, 0, 0]);
565
+ var pkt5t = _sigPacket(_sigBody({ sigType: 0, pubAlg: 22, hashAlg: 8, hashedSub: hs5t }));
566
+ var r5t = pgp.verify({ message: "x", armored: pgp._armorForTest(pkt5t), publicKeyPem: _edKp.publicKey });
567
+ check("verify: truncated 5-octet subpacket header bounded", r5t.ok === false);
568
+ }
569
+
570
+ // ---- verify: key resolution + algorithm-mismatch branches ----
571
+
572
+ function testVerifyKeyResolution() {
573
+ var msg = "key-resolution-probe";
574
+ var edSig = pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey });
575
+ var rsaSig = pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey });
576
+
577
+ var r1 = pgp.verify({ message: msg, armored: edSig.armored,
578
+ publicKeyPem: "-----BEGIN PUBLIC KEY-----\nnope\n-----END PUBLIC KEY-----" });
579
+ check("verify: unparseable publicKeyPem → bad-key",
580
+ r1.ok === false && r1.code === "mail-crypto/pgp/bad-key");
581
+
582
+ var r2 = pgp.verify({ message: msg, armored: rsaSig.armored, publicKeyPem: _edKp.publicKey });
583
+ check("verify: RSA signature + Ed25519 key → key-alg-mismatch",
584
+ r2.ok === false && r2.code === "mail-crypto/pgp/key-alg-mismatch");
585
+
586
+ var r3 = pgp.verify({ message: msg, armored: edSig.armored, publicKeyPem: _rsaKp.publicKey });
587
+ check("verify: Ed25519 signature + RSA key → key-alg-mismatch",
588
+ r3.ok === false && r3.code === "mail-crypto/pgp/key-alg-mismatch");
589
+
590
+ var smallRsa = _rsaKeypair(1024);
591
+ var r4 = pgp.verify({ message: msg, armored: rsaSig.armored, publicKeyPem: smallRsa.publicKey });
592
+ check("verify: RSA signature verified against <2048-bit key → rsa-too-small",
593
+ r4.ok === false && r4.code === "mail-crypto/pgp/rsa-too-small");
594
+
595
+ // Packet claims an unsupported public-key algorithm (id 3).
596
+ var badAlg = _sigPacket(_sigBody({ sigType: 0, pubAlg: 3, hashAlg: 8,
597
+ hashLeft16: Buffer.from([0xab, 0xcd]) }));
598
+ var r5 = pgp.verify({ message: msg, armored: pgp._armorForTest(badAlg), publicKeyPem: _edKp.publicKey });
599
+ check("verify: unsupported public-key algorithm → bad-pubalg",
600
+ r5.ok === false && r5.code === "mail-crypto/pgp/bad-pubalg");
601
+ }
602
+
603
+ // ---- verify: a valid-algorithm packet with no creation-time subpacket ----
604
+ //
605
+ // Exercises the `subs.signedAt === undefined ? 0` fallback in the fingerprint
606
+ // recompute for both the RSA and Ed25519 branches (with real public keys).
607
+
608
+ function testVerifyNoCreationTimeSubpacket() {
609
+ var edPkt = _sigPacket(_sigBody({ sigType: 0, pubAlg: 22, hashAlg: 8 }));
610
+ var rvE = pgp.verify({ message: "x", armored: pgp._armorForTest(edPkt), publicKeyPem: _edKp.publicKey });
611
+ check("verify: Ed25519 packet without creation-time subpacket rejected cleanly",
612
+ rvE.ok === false);
613
+
614
+ var rsaPkt = _sigPacket(_sigBody({ sigType: 0, pubAlg: 1, hashAlg: 8 }));
615
+ var rvR = pgp.verify({ message: "x", armored: pgp._armorForTest(rsaPkt), publicKeyPem: _rsaKp.publicKey });
616
+ check("verify: RSA packet without creation-time subpacket rejected cleanly",
617
+ rvR.ok === false);
618
+ }
619
+
620
+ // ---- verify: crypto rejects a mutated (but structurally valid) signature ----
621
+ //
622
+ // hashLeft16 + signed-section preserved → the leading-hash fast-fail passes and
623
+ // the asymmetric verify is what rejects (the `!ok → bad-signature` branch).
624
+
625
+ function testVerifyCryptoRejectsMutatedSignature() {
626
+ var msg = "mutate-sig-probe";
627
+
628
+ var edSig = pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey });
629
+ var de = _dissect(edSig.armored);
630
+ var em = Buffer.from(de.sigMpis); em[em.length - 1] ^= 0xff;
631
+ var rvE = pgp.verify({ message: msg, armored: _rebuild(de.headerToHashLeft, em),
632
+ publicKeyPem: _edKp.publicKey });
633
+ check("verify: mutated Ed25519 signature → bad-signature (crypto reject)",
634
+ rvE.ok === false && rvE.code === "mail-crypto/pgp/bad-signature");
635
+
636
+ var rsaSig = pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey });
637
+ var dr = _dissect(rsaSig.armored);
638
+ var rm = Buffer.from(dr.sigMpis); rm[rm.length - 1] ^= 0xff;
639
+ var rvR = pgp.verify({ message: msg, armored: _rebuild(dr.headerToHashLeft, rm),
640
+ publicKeyPem: _rsaKp.publicKey });
641
+ check("verify: mutated RSA signature → bad-signature (crypto reject)",
642
+ rvR.ok === false && rvR.code === "mail-crypto/pgp/bad-signature");
643
+ }
644
+
645
+ // ---- verify: truncated signature MPI returns a verdict (root-fixed) ----
646
+ //
647
+ // Every other malformed-signature path returns { ok:false, code }; the raw
648
+ // _readMpi reads in the crypto section previously threw out of verify() on a
649
+ // truncated MPI. Root-fixed to route through _fail like its siblings.
650
+
651
+ function testVerifyTruncatedMpiReturnsFail() {
652
+ var msg = "truncated-mpi-probe";
653
+ var d = _dissect(pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey }).armored);
654
+
655
+ // 1-byte tail — the R MPI's 2-byte length header itself is truncated.
656
+ var rv1 = null, t1 = null;
657
+ try { rv1 = pgp.verify({ message: msg, armored: _rebuild(d.headerToHashLeft, Buffer.from([0x00])),
658
+ publicKeyPem: _edKp.publicKey }); }
659
+ catch (e) { t1 = e; }
660
+ check("verify: truncated-MPI signature returns ok:false (does not throw)",
661
+ t1 === null && rv1 && rv1.ok === false && rv1.code === "mail-crypto/pgp/bad-mpi");
662
+
663
+ // 2-byte length header claims 32 value bytes but only 1 is present.
664
+ var rv2 = null, t2 = null;
665
+ try { rv2 = pgp.verify({ message: msg,
666
+ armored: _rebuild(d.headerToHashLeft, Buffer.from([0x01, 0x00, 0x00])),
667
+ publicKeyPem: _edKp.publicKey }); }
668
+ catch (e) { t2 = e; }
669
+ check("verify: MPI value truncation returns ok:false (does not throw)",
670
+ t2 === null && rv2 && rv2.ok === false && rv2.code === "mail-crypto/pgp/bad-mpi");
671
+
672
+ // Same guard on the RSA branch's MPI read.
673
+ var dr = _dissect(pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey }).armored);
674
+ var rvR = null, tR = null;
675
+ try { rvR = pgp.verify({ message: msg, armored: _rebuild(dr.headerToHashLeft, Buffer.from([0x00])),
676
+ publicKeyPem: _rsaKp.publicKey }); }
677
+ catch (e) { tR = e; }
678
+ check("verify: truncated RSA MPI returns ok:false (does not throw)",
679
+ tR === null && rvR && rvR.ok === false && rvR.code === "mail-crypto/pgp/bad-mpi");
680
+ }
681
+
682
+ // ---- verify: over-sized MPI components are length-normalized then rejected --
683
+
684
+ function testVerifyOversizedMpiComponents() {
685
+ var msg = "oversized-mpi-probe";
686
+
687
+ var d = _dissect(pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey }).armored);
688
+ // R MPI declares a 33-byte value (bits=264); S a normal 32-byte value.
689
+ var rOver = Buffer.concat([Buffer.from([0x01, 0x08]), Buffer.alloc(33, 0x11)]);
690
+ var sNorm = Buffer.concat([Buffer.from([0x01, 0x00]), Buffer.alloc(32, 0x22)]);
691
+ var rvE = pgp.verify({ message: msg,
692
+ armored: _rebuild(d.headerToHashLeft, Buffer.concat([rOver, sNorm])),
693
+ publicKeyPem: _edKp.publicKey });
694
+ check("verify: >32-byte Ed25519 MPI component normalized then rejected",
695
+ rvE.ok === false &&
696
+ (rvE.code === "mail-crypto/pgp/bad-signature" || rvE.code === "mail-crypto/pgp/verify-error"));
697
+
698
+ // Under-sized R MPI (30 bytes, bits=240) — the high-zero-stripped form the
699
+ // MPI encoding produces; _padTo32 must left-pad it back to 32 bytes.
700
+ var rUnder = Buffer.concat([Buffer.from([0x00, 0xf0]), Buffer.alloc(30, 0x44)]);
701
+ var rvU = pgp.verify({ message: msg,
702
+ armored: _rebuild(d.headerToHashLeft, Buffer.concat([rUnder, sNorm])),
703
+ publicKeyPem: _edKp.publicKey });
704
+ check("verify: <32-byte Ed25519 MPI component left-padded then rejected",
705
+ rvU.ok === false && rvU.code === "mail-crypto/pgp/bad-signature");
706
+
707
+ var dr = _dissect(pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey }).armored);
708
+ // RSA MPI declares 300 value bytes (bits=2400), exceeding the 256-byte modulus.
709
+ var over = Buffer.concat([Buffer.from([0x09, 0x60]), Buffer.alloc(300, 0x33)]);
710
+ var rvR = pgp.verify({ message: msg, armored: _rebuild(dr.headerToHashLeft, over),
711
+ publicKeyPem: _rsaKp.publicKey });
712
+ check("verify: over-modulus RSA signature rejected",
713
+ rvR.ok === false &&
714
+ (rvR.code === "mail-crypto/pgp/bad-signature" || rvR.code === "mail-crypto/pgp/verify-error"));
715
+ }
716
+
717
+ // ---- encrypt / decrypt (ML-KEM-1024 framework envelope) ----
718
+
719
+ function testPgpEncryptDecryptRoundTrip() {
720
+ var kp = pq.ml_kem_1024.keygen();
721
+ var rid = Buffer.from([0x42, 0x43]);
722
+ var enc = pgp.encrypt({ message: "top secret",
723
+ recipients: [{ recipientId: rid, publicKey: kp.publicKey }] });
724
+ check("encrypt: returns BEGIN PGP MESSAGE armor",
725
+ typeof enc.armored === "string" && enc.armored.indexOf("BEGIN PGP MESSAGE") !== -1);
726
+ check("encrypt: returns envelope Buffer", Buffer.isBuffer(enc.envelope));
727
+
728
+ var d1 = pgp.decrypt({ armored: enc.armored, recipientId: rid, secretKey: kp.secretKey });
729
+ check("decrypt: recovers plaintext via armored", d1.plaintext.toString("utf8") === "top secret");
730
+ var d2 = pgp.decrypt({ envelope: enc.envelope, recipientId: rid, secretKey: kp.secretKey });
731
+ check("decrypt: recovers plaintext via envelope Buffer", d2.plaintext.toString("utf8") === "top secret");
732
+ }
733
+
734
+ function testPgpEncryptMultiRecipient() {
735
+ var kp1 = pq.ml_kem_1024.keygen();
736
+ var kp2 = pq.ml_kem_1024.keygen();
737
+ var rid1 = Buffer.from([0x01]);
738
+ var rid2 = Buffer.from([0x02]);
739
+ var enc = pgp.encrypt({ message: "to-both", recipients: [
740
+ { recipientId: rid1, publicKey: kp1.publicKey },
741
+ { recipientId: rid2, publicKey: kp2.publicKey },
742
+ ] });
743
+ var a = pgp.decrypt({ envelope: enc.envelope, recipientId: rid1, secretKey: kp1.secretKey });
744
+ var b = pgp.decrypt({ envelope: enc.envelope, recipientId: rid2, secretKey: kp2.secretKey });
745
+ check("encrypt/decrypt: recipient 1 recovers", a.plaintext.toString("utf8") === "to-both");
746
+ check("encrypt/decrypt: recipient 2 recovers", b.plaintext.toString("utf8") === "to-both");
747
+ }
748
+
749
+ function testPgpEncryptInputValidation() {
750
+ var kp = pq.ml_kem_1024.keygen();
751
+ var rid = Buffer.from([0x01]);
752
+ function encThrow(label, opts, code) {
753
+ var threw = null;
754
+ try { pgp.encrypt(opts); } catch (e) { threw = e; }
755
+ check("encrypt validate: " + label, threw && threw.code === code);
756
+ }
757
+ encThrow("empty message",
758
+ { message: "", recipients: [{ recipientId: rid, publicKey: kp.publicKey }] },
759
+ "mail-crypto/pgp/bad-message");
760
+ encThrow("non-Buffer/string message",
761
+ { message: 123, recipients: [{ recipientId: rid, publicKey: kp.publicKey }] },
762
+ "mail-crypto/pgp/bad-message");
763
+ encThrow("empty recipients array",
764
+ { message: "x", recipients: [] }, "mail-crypto/pgp/no-recipients");
765
+ encThrow("recipientId not a Buffer",
766
+ { message: "x", recipients: [{ recipientId: "nope", publicKey: kp.publicKey }] },
767
+ "mail-crypto/pgp/bad-recipient");
768
+ encThrow("publicKey not a Uint8Array",
769
+ { message: "x", recipients: [{ recipientId: rid, publicKey: [1, 2, 3] }] },
770
+ "mail-crypto/pgp/bad-recipient");
771
+ encThrow("recipientId over 255 bytes",
772
+ { message: "x", recipients: [{ recipientId: Buffer.alloc(256), publicKey: kp.publicKey }] },
773
+ "mail-crypto/pgp/bad-recipient");
774
+ }
775
+
776
+ function testPgpDecryptInputValidation() {
777
+ var kp = pq.ml_kem_1024.keygen();
778
+ var rid = Buffer.from([0xaa]);
779
+ var enc = pgp.encrypt({ message: "x", recipients: [{ recipientId: rid, publicKey: kp.publicKey }] });
780
+ var MAGIC = Buffer.from("BJ-PGP-PQ", "ascii");
781
+
782
+ function decThrow(label, opts, code) {
783
+ var threw = null;
784
+ try { pgp.decrypt(opts); } catch (e) { threw = e; }
785
+ check("decrypt validate: " + label, threw && threw.code === code);
786
+ }
787
+ decThrow("recipientId not a Buffer",
788
+ { envelope: enc.envelope, recipientId: "x", secretKey: kp.secretKey }, "mail-crypto/pgp/bad-opts");
789
+ decThrow("secretKey not a Uint8Array",
790
+ { envelope: enc.envelope, recipientId: rid, secretKey: "x" }, "mail-crypto/pgp/bad-opts");
791
+ decThrow("neither envelope nor armored supplied",
792
+ { recipientId: rid, secretKey: kp.secretKey }, "mail-crypto/pgp/bad-opts");
793
+ decThrow("envelope magic mismatch",
794
+ { envelope: Buffer.from("not a valid envelope at all!!"), recipientId: rid, secretKey: kp.secretKey },
795
+ "mail-crypto/pgp/bad-magic");
796
+ decThrow("unsupported envelope version",
797
+ { envelope: Buffer.concat([MAGIC, Buffer.from([2, 0])]), recipientId: rid, secretKey: kp.secretKey },
798
+ "mail-crypto/pgp/bad-version");
799
+ decThrow("truncated envelope (recipient count exceeds data)",
800
+ { envelope: Buffer.concat([MAGIC, Buffer.from([1, 1])]), recipientId: rid, secretKey: kp.secretKey },
801
+ "mail-crypto/pgp/truncated");
802
+ }
803
+
804
+ function testPgpDecryptErrorPaths() {
805
+ var kp = pq.ml_kem_1024.keygen();
806
+ var rid = Buffer.from([0xaa]);
807
+ var enc = pgp.encrypt({ message: "secret-body",
808
+ recipients: [{ recipientId: rid, publicKey: kp.publicKey }] });
809
+
810
+ var kp2 = pq.ml_kem_1024.keygen();
811
+ var w = null;
812
+ try { pgp.decrypt({ envelope: enc.envelope, recipientId: rid, secretKey: kp2.secretKey }); }
813
+ catch (e) { w = e.code; }
814
+ check("decrypt: wrong secret key → decap/unwrap failure",
815
+ w === "mail-crypto/pgp/unwrap-failed" || w === "mail-crypto/pgp/decap-failed");
816
+
817
+ var nm = null;
818
+ try { pgp.decrypt({ envelope: enc.envelope, recipientId: Buffer.from([0x99]), secretKey: kp.secretKey }); }
819
+ catch (e) { nm = e.code; }
820
+ check("decrypt: non-matching recipientId → no-matching-recipient",
821
+ nm === "mail-crypto/pgp/no-matching-recipient");
822
+
823
+ var corrupt = Buffer.from(enc.envelope);
824
+ corrupt[corrupt.length - 1] ^= 0xff;
825
+ var bd = null;
826
+ try { pgp.decrypt({ envelope: corrupt, recipientId: rid, secretKey: kp.secretKey }); }
827
+ catch (e) { bd = e.code; }
828
+ check("decrypt: corrupted AEAD body → body-decrypt-failed",
829
+ bd === "mail-crypto/pgp/body-decrypt-failed");
830
+ }
831
+
832
+ // ---- Buffer (not string) message inputs on verify + encrypt ----
833
+
834
+ function testBufferMessageInputs() {
835
+ var msg = Buffer.from("binary\x00message\xff bytes", "latin1");
836
+ var sig = pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey });
837
+ var v = pgp.verify({ message: msg, armored: sig.armored, publicKeyPem: _edKp.publicKey });
838
+ check("verify: accepts a Buffer message", v.ok === true);
839
+
840
+ var kp = pq.ml_kem_1024.keygen();
841
+ var rid = Buffer.from([0x55]);
842
+ var enc = pgp.encrypt({ message: Buffer.from([0x00, 0x01, 0x02, 0xff]),
843
+ recipients: [{ recipientId: rid, publicKey: kp.publicKey }] });
844
+ var dec = pgp.decrypt({ envelope: enc.envelope, recipientId: rid, secretKey: kp.secretKey });
845
+ check("encrypt/decrypt: round-trips a Buffer message",
846
+ Buffer.compare(dec.plaintext, Buffer.from([0x00, 0x01, 0x02, 0xff])) === 0);
847
+ }
848
+
849
+ // ---- decrypt: ML-KEM decapsulate failure (malformed ciphertext length) ----
850
+
851
+ function testPgpDecryptDecapFailure() {
852
+ var kp = pq.ml_kem_1024.keygen();
853
+ var rid = Buffer.from([0xaa]);
854
+ var MAGIC = Buffer.from("BJ-PGP-PQ", "ascii");
855
+ // Hand-built envelope whose recipient ciphertext is the wrong length, so
856
+ // ML-KEM-1024 decapsulate rejects it before session-key unwrap.
857
+ var env = Buffer.concat([
858
+ MAGIC, Buffer.from([1, 1]), // version 1, 1 recipient
859
+ Buffer.from([1, 0xaa]), // ridLen=1, rid=0xaa (matches)
860
+ _u16(10), Buffer.alloc(10), // ct: 10 bytes (invalid ML-KEM length)
861
+ _u16(5), Buffer.alloc(5), // wrappedKey
862
+ Buffer.from([0, 0, 0, 0]), // bodyLen=0
863
+ ]);
864
+ var threw = null;
865
+ try { pgp.decrypt({ envelope: env, recipientId: rid, secretKey: kp.secretKey }); }
866
+ catch (e) { threw = e; }
867
+ check("decrypt: malformed recipient ciphertext → decap-failed",
868
+ threw && threw.code === "mail-crypto/pgp/decap-failed");
869
+ }
870
+
871
+ function testPgpDecryptArmoredErrorPaths() {
872
+ var kp = pq.ml_kem_1024.keygen();
873
+ function decThrow(label, armored, code) {
874
+ var threw = null;
875
+ try { pgp.decrypt({ armored: armored, recipientId: Buffer.from([0x01]), secretKey: kp.secretKey }); }
876
+ catch (e) { threw = e; }
877
+ check("decrypt armored: " + label, threw && threw.code === code);
878
+ }
879
+ decThrow("not BEGIN PGP MESSAGE armored", "just some text", "mail-crypto/pgp/bad-armor");
880
+ decThrow("armor header without blank-line separator",
881
+ "-----BEGIN PGP MESSAGE-----\r\n-----END PGP MESSAGE-----\r\n", "mail-crypto/pgp/bad-armor");
882
+ }
883
+
884
+ // ---- wkd.computeUrl: bad-email + over-length-domain branches ----
885
+
886
+ function testPgpWkdComputeUrlErrorBranches() {
887
+ function throwCode(label, email, code) {
888
+ var threw = null;
889
+ try { pgp.wkd.computeUrl(email); } catch (e) { threw = e; }
890
+ check("wkd.computeUrl: " + label, threw && threw.code === code);
891
+ }
892
+ throwCode("missing @", "noatsign", "mail-crypto/pgp/bad-email");
893
+ throwCode("@ at start", "@domain.com", "mail-crypto/pgp/bad-email");
894
+ throwCode("@ at end", "local@", "mail-crypto/pgp/bad-email");
895
+ throwCode("over-length domain", "a@" + "d".repeat(254), "mail-crypto/pgp/bad-domain");
896
+ }
897
+
898
+ // ---- wkd.fetch: driven entirely through an injected httpsGet stub (no net) --
899
+
900
+ function _wkdStub(responses, calls) {
901
+ return function (url) {
902
+ calls.push(url);
903
+ return Promise.resolve(responses[url] || { status: 404, body: Buffer.alloc(0) });
904
+ };
905
+ }
906
+
907
+ async function testPgpWkdFetchStubbed() {
908
+ var email = "alice@example.com";
909
+ var urls = pgp.wkd.computeUrl(email);
910
+
911
+ var keyBytes = Buffer.from([0x99, 0x01, 0x02]);
912
+ var callsA = [];
913
+ var rA = {}; rA[urls.direct] = { status: 200, body: keyBytes };
914
+ var outA = await pgp.wkd.fetch(email, { httpsGet: _wkdStub(rA, callsA) });
915
+ check("wkd.fetch: direct hit → source direct",
916
+ outA.source === "direct" && outA.url === urls.direct);
917
+ check("wkd.fetch: direct hit returns reply body",
918
+ Buffer.compare(outA.keyBytes, keyBytes) === 0);
919
+ check("wkd.fetch: direct hit requested only the direct URL", callsA.length === 1);
920
+
921
+ var callsB = [];
922
+ var rB = {}; rB[urls.advanced] = { status: 200, body: Buffer.from([0xde, 0xad]) };
923
+ var outB = await pgp.wkd.fetch(email, { httpsGet: _wkdStub(rB, callsB) });
924
+ check("wkd.fetch: advanced fallback → source advanced", outB.source === "advanced");
925
+ check("wkd.fetch: advanced fallback tried direct then advanced",
926
+ callsB.length === 2 && callsB[0] === urls.direct && callsB[1] === urls.advanced);
927
+
928
+ var bothErr = null;
929
+ try { await pgp.wkd.fetch(email, { httpsGet: _wkdStub({}, []) }); } catch (e) { bothErr = e; }
930
+ check("wkd.fetch: both URLs fail → wkd-not-found",
931
+ bothErr && bothErr.code === "mail-crypto/pgp/wkd-not-found");
932
+
933
+ var noGet = null;
934
+ try { await pgp.wkd.fetch(email, {}); } catch (e) { noGet = e; }
935
+ check("wkd.fetch: missing httpsGet → no-https-get",
936
+ noGet && noGet.code === "mail-crypto/pgp/no-https-get");
937
+
938
+ var rC = {}; rC[urls.direct] = { status: 200, body: Buffer.alloc(100) };
939
+ var bigDirect = null;
940
+ try { await pgp.wkd.fetch(email, { httpsGet: _wkdStub(rC, []), maxKeyBytes: 10 }); }
941
+ catch (e) { bigDirect = e; }
942
+ check("wkd.fetch: direct reply over maxKeyBytes → wkd-too-large",
943
+ bigDirect && bigDirect.code === "mail-crypto/pgp/wkd-too-large");
944
+
945
+ var rD = {}; rD[urls.advanced] = { status: 200, body: Buffer.alloc(100) };
946
+ var bigAdv = null;
947
+ try { await pgp.wkd.fetch(email, { httpsGet: _wkdStub(rD, []), maxKeyBytes: 10 }); }
948
+ catch (e) { bigAdv = e; }
949
+ check("wkd.fetch: advanced reply over maxKeyBytes → wkd-too-large",
950
+ bigAdv && bigAdv.code === "mail-crypto/pgp/wkd-too-large");
951
+
952
+ var badMax = null;
953
+ try { await pgp.wkd.fetch(email, { httpsGet: _wkdStub({}, []), maxKeyBytes: -1 }); }
954
+ catch (e) { badMax = e; }
955
+ check("wkd.fetch: negative maxKeyBytes → bad-max-key-bytes",
956
+ badMax && badMax.code === "mail-crypto/pgp/bad-max-key-bytes");
957
+ }
958
+
959
+ // ---- verify: global invariants over a hostile signature-MPI corpus --------
960
+ //
961
+ // Two properties must hold for EVERY structurally-hostile signature the parser
962
+ // lets through to the crypto stage: verify() NEVER throws on signature content
963
+ // (the v0.16.12 truncated-MPI regression class — untrusted bytes return a
964
+ // verdict, they don't escape as an exception), and verify() NEVER returns
965
+ // ok:true for anything but the genuine signature (no fail-open). The real
966
+ // signatures supply valid framing (issuer fingerprint + leading-hash), so each
967
+ // mutated MPI tail reaches the MPI-decode + asymmetric-verify branches rather
968
+ // than short-circuiting at an earlier structural check.
969
+
970
+ function testVerifyFailsClosedOnHostileMpiCorpus() {
971
+ var msg = "hostile-mpi-corpus";
972
+ var edReal = pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey });
973
+ var rsaReal = pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey });
974
+ var edD = _dissect(edReal.armored);
975
+ var rsaD = _dissect(rsaReal.armored);
976
+
977
+ var tails = [
978
+ Buffer.alloc(0), // no MPI at all
979
+ Buffer.from([0x00]), // MPI length header truncated
980
+ Buffer.from([0xff]), // 1-byte high tail
981
+ Buffer.from([0x01, 0x00]), // header claims 1 bit, no value
982
+ Buffer.from([0x01, 0x00, 0x00]), // header vs value length mismatch
983
+ Buffer.from([0x00, 0x08]), // zero-bit MPI header
984
+ Buffer.concat([Buffer.from([0x01, 0x00]), Buffer.alloc(32, 0x00)]), // 32-byte all-zero component
985
+ Buffer.concat([Buffer.from([0x01, 0x00]), Buffer.alloc(32, 0xff)]), // 32-byte all-ones component
986
+ Buffer.concat([Buffer.from([0xff, 0xff]), Buffer.alloc(4, 0xaa)]), // 65535-bit header, 4-byte value
987
+ Buffer.concat([Buffer.from([0x09, 0x00]), Buffer.alloc(288, 0x33)]), // over-modulus RSA-sized value
988
+ ];
989
+
990
+ var fixtures = [
991
+ { d: edD, key: _edKp.publicKey },
992
+ { d: rsaD, key: _rsaKp.publicKey },
993
+ ];
994
+ var cases = 0, threw = 0, failOpen = 0;
995
+ for (var fi = 0; fi < fixtures.length; fi += 1) {
996
+ for (var ti = 0; ti < tails.length; ti += 1) {
997
+ cases += 1;
998
+ var armored = _rebuild(fixtures[fi].d.headerToHashLeft, tails[ti]);
999
+ try {
1000
+ var r = pgp.verify({ message: msg, armored: armored, publicKeyPem: fixtures[fi].key });
1001
+ if (r && r.ok === true) failOpen += 1;
1002
+ } catch (_e) { threw += 1; }
1003
+ }
1004
+ }
1005
+ check("verify: hostile MPI-tail corpus never throws (v0.16.12 class holds)", threw === 0);
1006
+ check("verify: hostile MPI-tail corpus never fails open", failOpen === 0);
1007
+ check("verify: hostile MPI-tail corpus swept both algorithms fully",
1008
+ cases === tails.length * fixtures.length);
1009
+ }
1010
+
1011
+ // ---- decrypt: only typed MailCryptoError escapes on hostile envelopes ------
1012
+ //
1013
+ // Every attacker-controlled length field in the envelope (recipient count,
1014
+ // ridLen, ct/wrapped-key/body lengths) must be bounds-checked before the read
1015
+ // so a truncated envelope surfaces as a typed mail-crypto/pgp/* refusal, never
1016
+ // a raw RangeError leaking out of decrypt(). Sweeps the truncation boundary at
1017
+ // each field plus the decapsulate-reject and no-matching-recipient exits.
1018
+
1019
+ function testDecryptTypedThrowsOnHostileEnvelopeCorpus() {
1020
+ var MAGIC = Buffer.from("BJ-PGP-PQ", "ascii");
1021
+ var rid = Buffer.from([0xaa]);
1022
+ var kp = pq.ml_kem_1024.keygen();
1023
+
1024
+ var envs = [
1025
+ Buffer.concat([MAGIC, Buffer.from([1, 1])]), // count=1, no recipient
1026
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 5])]), // ridLen=5, no rid
1027
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xaa])]), // rid ok, no ctLen
1028
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xaa, 0x00, 0x05])]), // ctLen=5, no ct
1029
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xaa, 0x00, 0x01, 0x00])]), // ct ok, no wkLen
1030
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xaa, 0x00, 0x01, 0x00, 0x00, 0x05])]), // wkLen=5, no wk
1031
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xaa, 0x00, 0x01, 0x11, 0x00, 0x01, 0x22])]), // matches → decap-reject
1032
+ Buffer.concat([MAGIC, Buffer.from([1, 1, 1, 0xbb, 0x00, 0x01, 0x11, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00])]), // rid mismatch → no-match
1033
+ ];
1034
+
1035
+ var cases = 0, untyped = 0;
1036
+ for (var i = 0; i < envs.length; i += 1) {
1037
+ cases += 1;
1038
+ try { pgp.decrypt({ envelope: envs[i], recipientId: rid, secretKey: kp.secretKey }); }
1039
+ catch (e) {
1040
+ if (!(e && typeof e.code === "string" && e.code.indexOf("mail-crypto/pgp/") === 0)) untyped += 1;
1041
+ }
1042
+ }
1043
+ check("decrypt: hostile-envelope corpus surfaces only typed MailCryptoError", untyped === 0);
1044
+ check("decrypt: hostile-envelope corpus swept every length boundary", cases === envs.length);
1045
+ }
1046
+
1047
+ // ---- verify: the hash-algorithm octet is signed (confusion defense) --------
1048
+ //
1049
+ // The signature's hash-algorithm octet sits inside the signed section, so any
1050
+ // substitution changes both the recomputed hash input and (for RSA) the
1051
+ // EMSA-PKCS1 DigestInfo. Swapping it for the OTHER supported algorithm — a
1052
+ // value the parser still accepts — must be rejected by the hash binding, not
1053
+ // silently tolerated (hash-algorithm-confusion per the module threat model).
1054
+
1055
+ function testVerifyHashAlgorithmBinding() {
1056
+ var msg = "hash-binding-probe";
1057
+
1058
+ var edSig = pgp.sign({ message: msg, privateKeyPem: _edKp.privateKey });
1059
+ var ed = _dissect(edSig.armored);
1060
+ var edHdr = Buffer.from(ed.headerToHashLeft);
1061
+ edHdr[3] = 8; // module Ed25519 signs under SHA-512 (10); swap to SHA-256 (8)
1062
+ var rvE = pgp.verify({ message: msg, armored: _rebuild(edHdr, ed.sigMpis), publicKeyPem: _edKp.publicKey });
1063
+ check("verify: Ed25519 hash-algorithm octet is bound (10→8 rejected)", rvE.ok === false);
1064
+
1065
+ var rsaSig = pgp.sign({ message: msg, privateKeyPem: _rsaKp.privateKey });
1066
+ var rs = _dissect(rsaSig.armored);
1067
+ var rsHdr = Buffer.from(rs.headerToHashLeft);
1068
+ rsHdr[3] = 10; // module RSA signs under SHA-256 (8); swap to SHA-512 (10)
1069
+ var rvR = pgp.verify({ message: msg, armored: _rebuild(rsHdr, rs.sigMpis), publicKeyPem: _rsaKp.publicKey });
1070
+ check("verify: RSA hash-algorithm octet is bound (8→10 rejected)", rvR.ok === false);
1071
+ }
1072
+
1073
+ // ---- Run ----
1074
+
1075
+ async function run() {
358
1076
  testPgpSurface();
359
1077
  testPgpSignInputValidation();
360
1078
  testPgpEd25519RoundTrip();
@@ -367,16 +1085,41 @@ function run() {
367
1085
  testPgpStableTopLevelSurface();
368
1086
  testWkdComputeUrlRefusesIdnHomograph();
369
1087
  testWkdComputeUrlPunycodeAccepted();
1088
+
1089
+ // Error / adversarial / defensive branch coverage.
1090
+ testPgpSignRejectsUnsupportedKeyType();
1091
+ testPgpSignWithPassphraseProtectedKey();
1092
+ testPgpAuditHandleThatThrows();
1093
+ testDearmorErrorPaths();
1094
+ testVerifyMalformedPackets();
1095
+ testVerifySubpacketLengthEncodings();
1096
+ testVerifyKeyResolution();
1097
+ testVerifyNoCreationTimeSubpacket();
1098
+ testVerifyCryptoRejectsMutatedSignature();
1099
+ testVerifyTruncatedMpiReturnsFail();
1100
+ testVerifyOversizedMpiComponents();
1101
+ testPgpEncryptDecryptRoundTrip();
1102
+ testPgpEncryptMultiRecipient();
1103
+ testPgpEncryptInputValidation();
1104
+ testPgpDecryptInputValidation();
1105
+ testPgpDecryptErrorPaths();
1106
+ testBufferMessageInputs();
1107
+ testPgpDecryptDecapFailure();
1108
+ testPgpDecryptArmoredErrorPaths();
1109
+ testPgpWkdComputeUrlErrorBranches();
1110
+ await testPgpWkdFetchStubbed();
1111
+
1112
+ // Verifier / decryptor global-invariant regression locks (fuzz-derived).
1113
+ testVerifyFailsClosedOnHostileMpiCorpus();
1114
+ testDecryptTypedThrowsOnHostileEnvelopeCorpus();
1115
+ testVerifyHashAlgorithmBinding();
370
1116
  }
371
1117
 
372
1118
  module.exports = { run: run };
373
1119
 
374
1120
  if (require.main === module) {
375
- try {
376
- run();
377
- console.log("OK " + helpers.getChecks() + " checks passed");
378
- } catch (e) {
379
- console.error("FAIL:", e && e.stack || e);
380
- process.exit(1);
381
- }
1121
+ run().then(
1122
+ function () { console.log("OK — " + helpers.getChecks() + " checks passed"); },
1123
+ function (e) { console.error("FAIL:", e && e.stack || e); process.exit(1); }
1124
+ );
382
1125
  }