@blamejs/blamejs-shop 0.0.44

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 (1220) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +17 -0
  3. package/README.md +117 -0
  4. package/SECURITY.md +139 -0
  5. package/lib/admin.js +952 -0
  6. package/lib/analytics.js +267 -0
  7. package/lib/cart.js +279 -0
  8. package/lib/catalog-import.js +344 -0
  9. package/lib/catalog.js +769 -0
  10. package/lib/checkout.js +320 -0
  11. package/lib/config.js +151 -0
  12. package/lib/customers.js +322 -0
  13. package/lib/email.js +242 -0
  14. package/lib/externaldb-d1.js +283 -0
  15. package/lib/index.js +57 -0
  16. package/lib/inventory-alerts.js +198 -0
  17. package/lib/newsletter.js +142 -0
  18. package/lib/order.js +380 -0
  19. package/lib/payment.js +318 -0
  20. package/lib/pricing.js +185 -0
  21. package/lib/r2-bridge.js +169 -0
  22. package/lib/shipping.js +185 -0
  23. package/lib/storefront.js +2160 -0
  24. package/lib/subscriptions.js +410 -0
  25. package/lib/tax.js +161 -0
  26. package/lib/theme.js +194 -0
  27. package/lib/vendor/MANIFEST.json +19 -0
  28. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
  29. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
  30. package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
  31. package/lib/vendor/blamejs/.dockerignore +45 -0
  32. package/lib/vendor/blamejs/.gitattributes +42 -0
  33. package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
  34. package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
  35. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
  36. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
  37. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
  38. package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
  39. package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
  40. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
  41. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
  42. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
  43. package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
  44. package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
  45. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
  46. package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
  47. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
  48. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
  49. package/lib/vendor/blamejs/.gitignore +102 -0
  50. package/lib/vendor/blamejs/.gitleaks.toml +166 -0
  51. package/lib/vendor/blamejs/.hadolint.yaml +18 -0
  52. package/lib/vendor/blamejs/.npmrc +5 -0
  53. package/lib/vendor/blamejs/.pinact.yaml +17 -0
  54. package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
  55. package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
  56. package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
  57. package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
  58. package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
  59. package/lib/vendor/blamejs/LICENSE +201 -0
  60. package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
  61. package/lib/vendor/blamejs/MIGRATING.md +29 -0
  62. package/lib/vendor/blamejs/NOTICE +81 -0
  63. package/lib/vendor/blamejs/README.md +304 -0
  64. package/lib/vendor/blamejs/SECURITY.md +432 -0
  65. package/lib/vendor/blamejs/api-snapshot.json +48709 -0
  66. package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
  67. package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
  68. package/lib/vendor/blamejs/bench/README.md +77 -0
  69. package/lib/vendor/blamejs/bench/_helpers.js +70 -0
  70. package/lib/vendor/blamejs/bench/baseline.json +183 -0
  71. package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
  72. package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
  73. package/lib/vendor/blamejs/bench/run.js +140 -0
  74. package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
  75. package/lib/vendor/blamejs/bin/blamejs.js +13 -0
  76. package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
  77. package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
  78. package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
  79. package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
  80. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
  81. package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
  82. package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
  83. package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
  84. package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
  85. package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
  86. package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
  87. package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
  88. package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
  89. package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
  90. package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
  91. package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
  92. package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
  93. package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
  94. package/lib/vendor/blamejs/eslint.config.mjs +204 -0
  95. package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
  96. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
  97. package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
  98. package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
  99. package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
  100. package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
  101. package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
  102. package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
  103. package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
  104. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
  105. package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
  106. package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
  107. package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
  108. package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
  109. package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
  110. package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
  111. package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
  112. package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
  113. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
  114. package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
  115. package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
  116. package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
  117. package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
  118. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
  119. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
  120. package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
  121. package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
  122. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
  123. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
  124. package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
  125. package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
  126. package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
  127. package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
  128. package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
  129. package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
  130. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
  131. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
  132. package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
  133. package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
  134. package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
  135. package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
  136. package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
  137. package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
  138. package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
  139. package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
  140. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
  141. package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
  142. package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
  143. package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
  144. package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
  145. package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
  146. package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
  147. package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
  148. package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
  149. package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
  150. package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
  151. package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
  152. package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
  153. package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
  154. package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
  155. package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
  156. package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
  157. package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
  158. package/lib/vendor/blamejs/fuzz/README.md +137 -0
  159. package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
  160. package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
  161. package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
  162. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
  163. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
  164. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
  165. package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
  166. package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
  167. package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
  168. package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
  169. package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
  170. package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
  171. package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
  172. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
  173. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
  174. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
  175. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
  176. package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
  177. package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
  178. package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
  179. package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
  180. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
  181. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
  182. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
  183. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
  184. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
  185. package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
  186. package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
  187. package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
  188. package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
  189. package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
  190. package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
  191. package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
  192. package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
  193. package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
  194. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
  195. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
  196. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
  197. package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
  198. package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
  199. package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
  200. package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
  201. package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
  202. package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
  203. package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
  204. package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
  205. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
  206. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
  207. package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
  208. package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
  209. package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
  210. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
  211. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
  212. package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
  213. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
  214. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
  215. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
  216. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
  217. package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
  218. package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
  219. package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
  220. package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
  221. package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
  222. package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
  223. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
  224. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
  225. package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
  226. package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
  227. package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
  228. package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
  229. package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
  230. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
  231. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
  232. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
  233. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
  234. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
  235. package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
  236. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
  237. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
  238. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
  239. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
  240. package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
  241. package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
  242. package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
  243. package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
  244. package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
  245. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
  246. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
  247. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
  248. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
  249. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
  250. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
  251. package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
  252. package/lib/vendor/blamejs/index.js +678 -0
  253. package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
  254. package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
  255. package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
  256. package/lib/vendor/blamejs/lib/a2a.js +407 -0
  257. package/lib/vendor/blamejs/lib/acme.js +1448 -0
  258. package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
  259. package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
  260. package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
  261. package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
  262. package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
  263. package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
  264. package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
  265. package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
  266. package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
  267. package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
  268. package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
  269. package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
  270. package/lib/vendor/blamejs/lib/ai-input.js +201 -0
  271. package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
  272. package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
  273. package/lib/vendor/blamejs/lib/api-key.js +721 -0
  274. package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
  275. package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
  276. package/lib/vendor/blamejs/lib/app.js +365 -0
  277. package/lib/vendor/blamejs/lib/archive.js +547 -0
  278. package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
  279. package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
  280. package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
  281. package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
  282. package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
  283. package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
  284. package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
  285. package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
  286. package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
  287. package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
  288. package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
  289. package/lib/vendor/blamejs/lib/audit.js +1671 -0
  290. package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
  291. package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
  292. package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
  293. package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
  294. package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
  295. package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
  296. package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
  297. package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
  298. package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
  299. package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
  300. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
  301. package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
  302. package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
  303. package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
  304. package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
  305. package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
  306. package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
  307. package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
  308. package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
  309. package/lib/vendor/blamejs/lib/auth/password.js +693 -0
  310. package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
  311. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
  312. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
  313. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
  314. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
  315. package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
  316. package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
  317. package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
  318. package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
  319. package/lib/vendor/blamejs/lib/auth-header.js +148 -0
  320. package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
  321. package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
  322. package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
  323. package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
  324. package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
  325. package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
  326. package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
  327. package/lib/vendor/blamejs/lib/budr.js +205 -0
  328. package/lib/vendor/blamejs/lib/bundler.js +461 -0
  329. package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
  330. package/lib/vendor/blamejs/lib/cache-status.js +288 -0
  331. package/lib/vendor/blamejs/lib/cache.js +1331 -0
  332. package/lib/vendor/blamejs/lib/calendar.js +1240 -0
  333. package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
  334. package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
  335. package/lib/vendor/blamejs/lib/cert.js +763 -0
  336. package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
  337. package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
  338. package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
  339. package/lib/vendor/blamejs/lib/cli.js +2328 -0
  340. package/lib/vendor/blamejs/lib/client-hints.js +318 -0
  341. package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
  342. package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
  343. package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
  344. package/lib/vendor/blamejs/lib/cluster.js +1017 -0
  345. package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
  346. package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
  347. package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
  348. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
  349. package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
  350. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
  351. package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
  352. package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
  353. package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
  354. package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
  355. package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
  356. package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
  357. package/lib/vendor/blamejs/lib/compliance.js +1558 -0
  358. package/lib/vendor/blamejs/lib/config-drift.js +426 -0
  359. package/lib/vendor/blamejs/lib/config.js +446 -0
  360. package/lib/vendor/blamejs/lib/consent.js +369 -0
  361. package/lib/vendor/blamejs/lib/constants.js +209 -0
  362. package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
  363. package/lib/vendor/blamejs/lib/cookies.js +560 -0
  364. package/lib/vendor/blamejs/lib/cra-report.js +299 -0
  365. package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
  366. package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
  367. package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
  368. package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
  369. package/lib/vendor/blamejs/lib/crypto.js +1908 -0
  370. package/lib/vendor/blamejs/lib/csp.js +271 -0
  371. package/lib/vendor/blamejs/lib/csv.js +418 -0
  372. package/lib/vendor/blamejs/lib/daemon.js +481 -0
  373. package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
  374. package/lib/vendor/blamejs/lib/data-act.js +328 -0
  375. package/lib/vendor/blamejs/lib/db-collection.js +587 -0
  376. package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
  377. package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
  378. package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
  379. package/lib/vendor/blamejs/lib/db-query.js +802 -0
  380. package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
  381. package/lib/vendor/blamejs/lib/db-schema.js +322 -0
  382. package/lib/vendor/blamejs/lib/db.js +3111 -0
  383. package/lib/vendor/blamejs/lib/dbsc.js +299 -0
  384. package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
  385. package/lib/vendor/blamejs/lib/deprecate.js +377 -0
  386. package/lib/vendor/blamejs/lib/dev.js +405 -0
  387. package/lib/vendor/blamejs/lib/dora.js +402 -0
  388. package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
  389. package/lib/vendor/blamejs/lib/dsr.js +1188 -0
  390. package/lib/vendor/blamejs/lib/dual-control.js +526 -0
  391. package/lib/vendor/blamejs/lib/early-hints.js +212 -0
  392. package/lib/vendor/blamejs/lib/error-page.js +420 -0
  393. package/lib/vendor/blamejs/lib/events.js +214 -0
  394. package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
  395. package/lib/vendor/blamejs/lib/external-db.js +1877 -0
  396. package/lib/vendor/blamejs/lib/fapi2.js +394 -0
  397. package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
  398. package/lib/vendor/blamejs/lib/fdx.js +370 -0
  399. package/lib/vendor/blamejs/lib/fedcm.js +264 -0
  400. package/lib/vendor/blamejs/lib/file-type.js +360 -0
  401. package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
  402. package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
  403. package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
  404. package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
  405. package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
  406. package/lib/vendor/blamejs/lib/flag.js +346 -0
  407. package/lib/vendor/blamejs/lib/forms.js +525 -0
  408. package/lib/vendor/blamejs/lib/framework-error.js +724 -0
  409. package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
  410. package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
  411. package/lib/vendor/blamejs/lib/fsm.js +469 -0
  412. package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
  413. package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
  414. package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
  415. package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
  416. package/lib/vendor/blamejs/lib/guard-all.js +555 -0
  417. package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
  418. package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
  419. package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
  420. package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
  421. package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
  422. package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
  423. package/lib/vendor/blamejs/lib/guard-email.js +951 -0
  424. package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
  425. package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
  426. package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
  427. package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
  428. package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
  429. package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
  430. package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
  431. package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
  432. package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
  433. package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
  434. package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
  435. package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
  436. package/lib/vendor/blamejs/lib/guard-image.js +584 -0
  437. package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
  438. package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
  439. package/lib/vendor/blamejs/lib/guard-json.js +935 -0
  440. package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
  441. package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
  442. package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
  443. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
  444. package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
  445. package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
  446. package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
  447. package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
  448. package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
  449. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
  450. package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
  451. package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
  452. package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
  453. package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
  454. package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
  455. package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
  456. package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
  457. package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
  458. package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
  459. package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
  460. package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
  461. package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
  462. package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
  463. package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
  464. package/lib/vendor/blamejs/lib/guard-template.js +490 -0
  465. package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
  466. package/lib/vendor/blamejs/lib/guard-time.js +586 -0
  467. package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
  468. package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
  469. package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
  470. package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
  471. package/lib/vendor/blamejs/lib/hal.js +125 -0
  472. package/lib/vendor/blamejs/lib/handlers.js +350 -0
  473. package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
  474. package/lib/vendor/blamejs/lib/html-balance.js +347 -0
  475. package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
  476. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
  477. package/lib/vendor/blamejs/lib/http-client.js +2152 -0
  478. package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
  479. package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
  480. package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
  481. package/lib/vendor/blamejs/lib/i18n.js +931 -0
  482. package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
  483. package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
  484. package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
  485. package/lib/vendor/blamejs/lib/inbox.js +435 -0
  486. package/lib/vendor/blamejs/lib/incident-report.js +314 -0
  487. package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
  488. package/lib/vendor/blamejs/lib/jobs.js +185 -0
  489. package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
  490. package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
  491. package/lib/vendor/blamejs/lib/keychain.js +865 -0
  492. package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
  493. package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
  494. package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
  495. package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
  496. package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
  497. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
  498. package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
  499. package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
  500. package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
  501. package/lib/vendor/blamejs/lib/log-stream.js +584 -0
  502. package/lib/vendor/blamejs/lib/log.js +625 -0
  503. package/lib/vendor/blamejs/lib/lro.js +200 -0
  504. package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
  505. package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
  506. package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
  507. package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
  508. package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
  509. package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
  510. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
  511. package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
  512. package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
  513. package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
  514. package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
  515. package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
  516. package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
  517. package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
  518. package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
  519. package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
  520. package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
  521. package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
  522. package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
  523. package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
  524. package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
  525. package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
  526. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
  527. package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
  528. package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
  529. package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
  530. package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
  531. package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
  532. package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
  533. package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
  534. package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
  535. package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
  536. package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
  537. package/lib/vendor/blamejs/lib/mail-store.js +929 -0
  538. package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
  539. package/lib/vendor/blamejs/lib/mail.js +1971 -0
  540. package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
  541. package/lib/vendor/blamejs/lib/mcp.js +950 -0
  542. package/lib/vendor/blamejs/lib/metrics.js +1503 -0
  543. package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
  544. package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
  545. package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
  546. package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
  547. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
  548. package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
  549. package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
  550. package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
  551. package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
  552. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
  553. package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
  554. package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
  555. package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
  556. package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
  557. package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
  558. package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
  559. package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
  560. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
  561. package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
  562. package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
  563. package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
  564. package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
  565. package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
  566. package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
  567. package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
  568. package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
  569. package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
  570. package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
  571. package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
  572. package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
  573. package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
  574. package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
  575. package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
  576. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
  577. package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
  578. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
  579. package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
  580. package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
  581. package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
  582. package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
  583. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
  584. package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
  585. package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
  586. package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
  587. package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
  588. package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
  589. package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
  590. package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
  591. package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
  592. package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
  593. package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
  594. package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
  595. package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
  596. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
  597. package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
  598. package/lib/vendor/blamejs/lib/migration-files.js +37 -0
  599. package/lib/vendor/blamejs/lib/migrations.js +385 -0
  600. package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
  601. package/lib/vendor/blamejs/lib/money.js +699 -0
  602. package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
  603. package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
  604. package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
  605. package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
  606. package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
  607. package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
  608. package/lib/vendor/blamejs/lib/network-nts.js +574 -0
  609. package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
  610. package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
  611. package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
  612. package/lib/vendor/blamejs/lib/network.js +346 -0
  613. package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
  614. package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
  615. package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
  616. package/lib/vendor/blamejs/lib/notify.js +683 -0
  617. package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
  618. package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
  619. package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
  620. package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
  621. package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
  622. package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
  623. package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
  624. package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
  625. package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
  626. package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
  627. package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
  628. package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
  629. package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
  630. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
  631. package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
  632. package/lib/vendor/blamejs/lib/observability.js +720 -0
  633. package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
  634. package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
  635. package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
  636. package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
  637. package/lib/vendor/blamejs/lib/openapi.js +489 -0
  638. package/lib/vendor/blamejs/lib/otel-export.js +278 -0
  639. package/lib/vendor/blamejs/lib/outbox.js +547 -0
  640. package/lib/vendor/blamejs/lib/pagination.js +542 -0
  641. package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
  642. package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
  643. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
  644. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
  645. package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
  646. package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
  647. package/lib/vendor/blamejs/lib/permissions.js +793 -0
  648. package/lib/vendor/blamejs/lib/pick.js +105 -0
  649. package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
  650. package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
  651. package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
  652. package/lib/vendor/blamejs/lib/problem-details.js +482 -0
  653. package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
  654. package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
  655. package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
  656. package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
  657. package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
  658. package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
  659. package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
  660. package/lib/vendor/blamejs/lib/pubsub.js +463 -0
  661. package/lib/vendor/blamejs/lib/queue-local.js +476 -0
  662. package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
  663. package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
  664. package/lib/vendor/blamejs/lib/queue.js +1016 -0
  665. package/lib/vendor/blamejs/lib/redact.js +1007 -0
  666. package/lib/vendor/blamejs/lib/redis-client.js +520 -0
  667. package/lib/vendor/blamejs/lib/render.js +285 -0
  668. package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
  669. package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
  670. package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
  671. package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
  672. package/lib/vendor/blamejs/lib/restore.js +409 -0
  673. package/lib/vendor/blamejs/lib/retention.js +640 -0
  674. package/lib/vendor/blamejs/lib/retry.js +523 -0
  675. package/lib/vendor/blamejs/lib/router.js +1289 -0
  676. package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
  677. package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
  678. package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
  679. package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
  680. package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
  681. package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
  682. package/lib/vendor/blamejs/lib/safe-json.js +946 -0
  683. package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
  684. package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
  685. package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
  686. package/lib/vendor/blamejs/lib/safe-path.js +254 -0
  687. package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
  688. package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
  689. package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
  690. package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
  691. package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
  692. package/lib/vendor/blamejs/lib/safe-url.js +428 -0
  693. package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
  694. package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
  695. package/lib/vendor/blamejs/lib/sandbox.js +358 -0
  696. package/lib/vendor/blamejs/lib/scheduler.js +827 -0
  697. package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
  698. package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
  699. package/lib/vendor/blamejs/lib/security-assert.js +395 -0
  700. package/lib/vendor/blamejs/lib/seeders.js +620 -0
  701. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
  702. package/lib/vendor/blamejs/lib/self-update.js +804 -0
  703. package/lib/vendor/blamejs/lib/server-timing.js +174 -0
  704. package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
  705. package/lib/vendor/blamejs/lib/session-stores.js +138 -0
  706. package/lib/vendor/blamejs/lib/session.js +1162 -0
  707. package/lib/vendor/blamejs/lib/slug.js +381 -0
  708. package/lib/vendor/blamejs/lib/sse.js +349 -0
  709. package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
  710. package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
  711. package/lib/vendor/blamejs/lib/static.js +1249 -0
  712. package/lib/vendor/blamejs/lib/storage.js +1272 -0
  713. package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
  714. package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
  715. package/lib/vendor/blamejs/lib/subject.js +667 -0
  716. package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
  717. package/lib/vendor/blamejs/lib/template.js +931 -0
  718. package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
  719. package/lib/vendor/blamejs/lib/test-harness.js +275 -0
  720. package/lib/vendor/blamejs/lib/testing.js +1185 -0
  721. package/lib/vendor/blamejs/lib/time.js +578 -0
  722. package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
  723. package/lib/vendor/blamejs/lib/totp.js +318 -0
  724. package/lib/vendor/blamejs/lib/tracing.js +546 -0
  725. package/lib/vendor/blamejs/lib/uuid.js +207 -0
  726. package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
  727. package/lib/vendor/blamejs/lib/vault/index.js +638 -0
  728. package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
  729. package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
  730. package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
  731. package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
  732. package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
  733. package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
  734. package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
  735. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
  736. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
  737. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
  738. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
  739. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
  740. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
  741. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
  742. package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
  743. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
  744. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
  745. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
  746. package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
  747. package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
  748. package/lib/vendor/blamejs/lib/vex.js +630 -0
  749. package/lib/vendor/blamejs/lib/watcher.js +608 -0
  750. package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
  751. package/lib/vendor/blamejs/lib/webhook.js +977 -0
  752. package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
  753. package/lib/vendor/blamejs/lib/websocket.js +1561 -0
  754. package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
  755. package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
  756. package/lib/vendor/blamejs/lib/ws-client.js +978 -0
  757. package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
  758. package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
  759. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
  760. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
  761. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
  762. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
  763. package/lib/vendor/blamejs/package.json +81 -0
  764. package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
  765. package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
  766. package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
  767. package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
  768. package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
  769. package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
  770. package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
  771. package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
  772. package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
  773. package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
  774. package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
  775. package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
  776. package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
  777. package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
  778. package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
  779. package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
  780. package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
  781. package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
  782. package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
  783. package/lib/vendor/blamejs/scripts/check-services.js +483 -0
  784. package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
  785. package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
  786. package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
  787. package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
  788. package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
  789. package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
  790. package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
  791. package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
  792. package/lib/vendor/blamejs/scripts/release.js +652 -0
  793. package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
  794. package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
  795. package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
  796. package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
  797. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
  798. package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
  799. package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
  800. package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
  801. package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
  802. package/lib/vendor/blamejs/test/10-state.js +622 -0
  803. package/lib/vendor/blamejs/test/20-db.js +561 -0
  804. package/lib/vendor/blamejs/test/30-chain.js +2110 -0
  805. package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
  806. package/lib/vendor/blamejs/test/50-integration.js +486 -0
  807. package/lib/vendor/blamejs/test/_helpers.js +10 -0
  808. package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
  809. package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
  810. package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
  811. package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
  812. package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
  813. package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
  814. package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
  815. package/lib/vendor/blamejs/test/helpers/check.js +36 -0
  816. package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
  817. package/lib/vendor/blamejs/test/helpers/db.js +143 -0
  818. package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
  819. package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
  820. package/lib/vendor/blamejs/test/helpers/http.js +14 -0
  821. package/lib/vendor/blamejs/test/helpers/index.js +93 -0
  822. package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
  823. package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
  824. package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
  825. package/lib/vendor/blamejs/test/helpers/services.js +380 -0
  826. package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
  827. package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
  828. package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
  829. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
  830. package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
  831. package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
  832. package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
  833. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
  834. package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
  835. package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
  836. package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
  837. package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
  838. package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
  839. package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
  840. package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
  841. package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
  842. package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
  843. package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
  844. package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
  845. package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
  846. package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
  847. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
  848. package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
  849. package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
  850. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
  851. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
  852. package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
  853. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
  854. package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
  855. package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
  856. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
  857. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
  858. package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
  859. package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
  860. package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
  861. package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
  862. package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
  863. package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
  864. package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
  865. package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
  866. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
  867. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
  868. package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
  869. package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
  870. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
  871. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
  872. package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
  873. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
  874. package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
  875. package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
  876. package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
  877. package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
  878. package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
  879. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
  880. package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
  881. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
  882. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
  883. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
  884. package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
  885. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
  886. package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
  887. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
  888. package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
  889. package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
  890. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
  891. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
  892. package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
  893. package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
  894. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
  895. package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
  896. package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
  897. package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
  898. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
  899. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
  900. package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
  901. package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
  902. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
  903. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
  904. package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
  905. package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
  906. package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
  907. package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
  908. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
  909. package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
  910. package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
  911. package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
  912. package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
  913. package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
  914. package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
  915. package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
  916. package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
  917. package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
  918. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
  919. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
  920. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
  921. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
  922. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
  923. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
  924. package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
  925. package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
  926. package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
  927. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
  928. package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
  929. package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
  930. package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
  931. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
  932. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
  933. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
  934. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
  935. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
  936. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
  937. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
  938. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
  939. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
  940. package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
  941. package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
  942. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
  943. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
  944. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
  945. package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
  946. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
  947. package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
  948. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
  949. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
  950. package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
  951. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
  952. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
  953. package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
  954. package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
  955. package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
  956. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
  957. package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
  958. package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
  959. package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
  960. package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
  961. package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
  962. package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
  963. package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
  964. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
  965. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
  966. package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
  967. package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
  968. package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
  969. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
  970. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
  971. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
  972. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
  973. package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
  974. package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
  975. package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
  976. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
  977. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
  978. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
  979. package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
  980. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
  981. package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
  982. package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
  983. package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
  984. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
  985. package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
  986. package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
  987. package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
  988. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
  989. package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
  990. package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
  991. package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
  992. package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
  993. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
  994. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
  995. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
  996. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
  997. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
  998. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
  999. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  1000. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
  1001. package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
  1002. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
  1003. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
  1004. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
  1005. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
  1006. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
  1007. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
  1008. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
  1009. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
  1010. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
  1011. package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
  1012. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
  1013. package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
  1014. package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
  1015. package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
  1016. package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
  1017. package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
  1018. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
  1019. package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
  1020. package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
  1021. package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
  1022. package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
  1023. package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
  1024. package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
  1025. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
  1026. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
  1027. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
  1028. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
  1029. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
  1030. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
  1031. package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
  1032. package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
  1033. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
  1034. package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
  1035. package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
  1036. package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
  1037. package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
  1038. package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
  1039. package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
  1040. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
  1041. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  1042. package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
  1043. package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
  1044. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
  1045. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
  1046. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
  1047. package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
  1048. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
  1049. package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
  1050. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
  1051. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
  1052. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
  1053. package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
  1054. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
  1055. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
  1056. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
  1057. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
  1058. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
  1059. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
  1060. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
  1061. package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
  1062. package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
  1063. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
  1064. package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
  1065. package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
  1066. package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
  1067. package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
  1068. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
  1069. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
  1070. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
  1071. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
  1072. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
  1073. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
  1074. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
  1075. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
  1076. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
  1077. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
  1078. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
  1079. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
  1080. package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
  1081. package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
  1082. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
  1083. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
  1084. package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
  1085. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
  1086. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
  1087. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
  1088. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
  1089. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
  1090. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
  1091. package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
  1092. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
  1093. package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
  1094. package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
  1095. package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
  1096. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
  1097. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
  1098. package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
  1099. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
  1100. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
  1101. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
  1102. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
  1103. package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
  1104. package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
  1105. package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
  1106. package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
  1107. package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
  1108. package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
  1109. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
  1110. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
  1111. package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
  1112. package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
  1113. package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
  1114. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
  1115. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
  1116. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
  1117. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
  1118. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
  1119. package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
  1120. package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
  1121. package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
  1122. package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
  1123. package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
  1124. package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
  1125. package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
  1126. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
  1127. package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
  1128. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
  1129. package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
  1130. package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
  1131. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
  1132. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
  1133. package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
  1134. package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
  1135. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
  1136. package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
  1137. package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
  1138. package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
  1139. package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
  1140. package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
  1141. package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
  1142. package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
  1143. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
  1144. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
  1145. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
  1146. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
  1147. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
  1148. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
  1149. package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
  1150. package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
  1151. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
  1152. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
  1153. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
  1154. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
  1155. package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
  1156. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
  1157. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
  1158. package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
  1159. package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
  1160. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
  1161. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
  1162. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
  1163. package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
  1164. package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
  1165. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
  1166. package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
  1167. package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
  1168. package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
  1169. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
  1170. package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
  1171. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
  1172. package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
  1173. package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
  1174. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
  1175. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
  1176. package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
  1177. package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
  1178. package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
  1179. package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
  1180. package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
  1181. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
  1182. package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
  1183. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
  1184. package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
  1185. package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
  1186. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
  1187. package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
  1188. package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
  1189. package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
  1190. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
  1191. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
  1192. package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
  1193. package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
  1194. package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
  1195. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
  1196. package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
  1197. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
  1198. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
  1199. package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
  1200. package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
  1201. package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
  1202. package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
  1203. package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
  1204. package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
  1205. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
  1206. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
  1207. package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
  1208. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
  1209. package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
  1210. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
  1211. package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
  1212. package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
  1213. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
  1214. package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
  1215. package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
  1216. package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
  1217. package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
  1218. package/lib/vendor/blamejs/test/smoke.js +431 -0
  1219. package/lib/webhooks.js +305 -0
  1220. package/package.json +43 -0
@@ -0,0 +1,1286 @@
1
+ "use strict";
2
+ // codebase-patterns:allow-file raw-byte-literal — RFC 9580 OpenPGP packet
3
+ // framing carries protocol-mandated byte-shape constants throughout (32-byte
4
+ // Ed25519 keys, 64-byte signature halves, 192 / 8384 / 224 length-octet
5
+ // thresholds, /8 bit-to-byte conversions). These are protocol literals, not
6
+ // memory caps; the C.BYTES.kib/mib helpers don't apply.
7
+ /**
8
+ * @module b.mail.crypto.pgp
9
+ * @nav Communication
10
+ * @title Mail PGP
11
+ * @order 120
12
+ * @slug mail-crypto-pgp
13
+ *
14
+ * @card
15
+ * OpenPGP detached-signature sign + verify for mail per RFC 9580
16
+ * (Nov 2024). v4 Ed25519 / RSA-PKCS#1-v1.5, multipart/signed.
17
+ *
18
+ * @intro
19
+ * OpenPGP detached-signature signing + verification for mail per
20
+ * RFC 9580 (the November 2024 OpenPGP revision that obsoletes
21
+ * RFC 4880). Produces `multipart/signed; protocol=
22
+ * "application/pgp-signature"` per RFC 3156 §5 with a v4 OpenPGP
23
+ * signature packet wrapped in ASCII armor (RFC 9580 §6).
24
+ *
25
+ * Supported v1 surface (sign + verify):
26
+ * - Ed25519 v4 signatures using OpenPGP public-key algorithm 22
27
+ * (Ed25519Legacy per RFC 9580 §9.1), the universally-supported
28
+ * Ed25519 form. RFC 9580 also defines algorithm 27 (Ed25519)
29
+ * for v6 signatures; v6 signature output is deferred — see
30
+ * the deferral note below.
31
+ * - RSA v4 signatures using OpenPGP public-key algorithm 1 (RSA)
32
+ * with EMSA-PKCS1-v1_5 padding over SHA-256, which is what
33
+ * every fielded PGP implementation expects for v4 RSA
34
+ * signatures. Keys < 2048 bits are refused at sign time
35
+ * (RFC 8301 §3.1 RSA floor; v0.7.x DKIM established the same
36
+ * posture across the mail surface).
37
+ *
38
+ * Threat model:
39
+ * - EFAIL (CVE-2017-17688 / CVE-2017-17689) attacks decrypt-and-
40
+ * render flows that (a) fetch remote content in encrypted parts,
41
+ * (b) tolerate MIME-part-structure mutation between decrypt and
42
+ * render, or (c) feed decrypted HTML to a permissive renderer.
43
+ * This v1 surface is sign + verify only, so EFAIL does not bind
44
+ * directly. When encrypt + decrypt lights up (see deferral note)
45
+ * the renderer-side gate is `b.guardHtml` strict profile,
46
+ * inline image fetches in encrypted parts are refused, and the
47
+ * MIME-part tree captured at decrypt time is compared byte-for-
48
+ * byte against the tree at render time.
49
+ * - SHA-1 collision attacks (SHAttered, 2017) on signature hash
50
+ * inputs — refuse SHA-1 as the signature hash on verify and
51
+ * never emit it from sign.
52
+ * - Hash-algorithm-confusion: the signature's `hash_alg` field is
53
+ * enforced against the locally-recomputed hash; verifying with
54
+ * a different algorithm than was signed is refused.
55
+ * - Key-fingerprint pinning: verify() returns the v4 fingerprint
56
+ * (RFC 9580 §5.5.4) of the signing key so the caller can pin
57
+ * to a known operator key rather than trusting any key that
58
+ * happens to match the signature.
59
+ *
60
+ * Deferred from v1 (each with the documented condition for opting in):
61
+ * - In-process encrypt + decrypt (Message Encrypted Session Key +
62
+ * Symmetrically Encrypted Integrity Protected Data packets,
63
+ * RFC 9580 §5.1 / §5.13) and WKD key discovery (draft-koch-
64
+ * openpgp-webkey-service). Defer condition: ships in v0.10.14
65
+ * alongside `b.mail.crypto.smime` sign + verify — the CMS
66
+ * substrate `b.cms` landed in v0.10.13 unblocked the S/MIME
67
+ * side, and OpenPGP encrypt rides the same release so the
68
+ * mail-crypto surface lights up coherently rather than half-
69
+ * on-each-side across two patches. Cheap escape hatch (pre-
70
+ * v0.10.14): operators wire a third-party OpenPGP library in
71
+ * their own consumer code and call this module's sign() /
72
+ * verify() on the resulting cleartext blob.
73
+ * - v6 signature packets (RFC 9580 §5.2.3, packet version 6 with
74
+ * SHA2-512 fingerprints and salted hashes). Defer condition: v6
75
+ * is not yet emitted by GnuPG 2.4 LTS or by Sequoia stable, so
76
+ * v6 output would fail to verify on the majority of fielded
77
+ * receivers. Reopen when at least two major implementations
78
+ * ship v6 signature verification by default. Cheap escape
79
+ * hatch: operators on v6-only systems can ingest the v4
80
+ * signature from this module and re-sign with their own
81
+ * v6-capable toolchain.
82
+ *
83
+ * Surface:
84
+ * var sigBundle = b.mail.crypto.pgp.sign({
85
+ * message: "rfc822 body bytes",
86
+ * privateKeyPem: "-----BEGIN PRIVATE KEY----- ...",
87
+ * passphrase: undefined | "...", // optional
88
+ * audit: opts.audit, // optional b.audit handle
89
+ * });
90
+ * // → { armored: "-----BEGIN PGP SIGNATURE----- ...",
91
+ * // multipartSigned: "Content-Type: multipart/signed; ...",
92
+ * // signedAt: epochSeconds, fingerprint: "abcd..." }
93
+ *
94
+ * var rv = b.mail.crypto.pgp.verify({
95
+ * message: "the signed payload bytes",
96
+ * armored: "-----BEGIN PGP SIGNATURE----- ...",
97
+ * publicKeyPem: "-----BEGIN PUBLIC KEY----- ...",
98
+ * audit: opts.audit,
99
+ * });
100
+ * // → { ok: true, signerFingerprint: "abcd...", signedAt: epoch, hashAlg: "sha256" }
101
+ *
102
+ * The signer's `message` MUST be the canonicalized payload that the
103
+ * verifier will recompute over. For `multipart/signed` per RFC 3156
104
+ * §5, the canonical form is the signed part's full MIME headers +
105
+ * body with CRLF line endings — operators producing such a body
106
+ * should pass exactly those bytes here.
107
+ *
108
+ * RFC citations:
109
+ * - RFC 9580 (OpenPGP, Nov 2024; obsoletes RFC 4880)
110
+ * - RFC 3156 (MIME Security with OpenPGP)
111
+ * - RFC 8301 (DKIM RSA floor — reused as the cross-surface RSA bit floor)
112
+ *
113
+ * CVE citations:
114
+ * - CVE-2017-17688 / CVE-2017-17689 (EFAIL — informs the encrypt/
115
+ * decrypt deferral conditions above)
116
+ * - CVE-2019-13050 (PGP keyserver flood — not in scope here; out-of-
117
+ * band fingerprint pinning is the operator's responsibility)
118
+ */
119
+ var lazyRequire = require("./lazy-require");
120
+ var audit = lazyRequire(function () { return require("./audit"); });
121
+ var nodeCrypto = require("node:crypto");
122
+ var validateOpts = require("./validate-opts");
123
+ var numericBounds = require("./numeric-bounds");
124
+ var { defineClass } = require("./framework-error");
125
+
126
+ var MailCryptoError = defineClass("MailCryptoError", { alwaysPermanent: true });
127
+
128
+ // RFC 9580 §9 public-key algorithm IDs that this module emits/accepts.
129
+ var PUB_ALG_RSA = 1; // allow:raw-byte-literal — RFC 9580 §9.1 RSA
130
+ var PUB_ALG_ED25519_LEGACY = 22; // allow:raw-byte-literal — RFC 9580 §9.1 EdDSA Ed25519Legacy
131
+
132
+ // RFC 9580 §9.5 hash algorithm IDs.
133
+ var HASH_ALG_SHA256 = 8; // allow:raw-byte-literal — RFC 9580 §9.5 SHA2-256
134
+ var HASH_ALG_SHA512 = 10; // allow:raw-byte-literal — RFC 9580 §9.5 SHA2-512
135
+
136
+ // RFC 9580 §5.2.1 signature type — Signature of a binary document.
137
+ var SIG_TYPE_BINARY = 0; // allow:raw-byte-literal — RFC 9580 §5.2.1
138
+
139
+ // RFC 9580 §5.2.3.1 subpacket types we emit / consume.
140
+ var SUBPKT_SIG_CREATION_TIME = 2; // allow:raw-byte-literal — RFC 9580 §5.2.3.4
141
+ var SUBPKT_ISSUER_FPR = 33; // allow:raw-byte-literal — RFC 9580 §5.2.3.35 Issuer Fingerprint
142
+
143
+ // RSA modulus floor — matches DKIM RFC 8301 §3.1 and the framework's
144
+ // cross-mail-surface posture (lib/mail-dkim.js RSA_WEAK_BITS).
145
+ var RSA_MIN_BITS = 2048; // allow:raw-byte-literal — RFC 8301 §3.1
146
+
147
+ // ASCII armor framing per RFC 9580 §6.2.
148
+ var ARMOR_BEGIN = "-----BEGIN PGP SIGNATURE-----";
149
+ var ARMOR_END = "-----END PGP SIGNATURE-----";
150
+
151
+ // ---- Buffer helpers ----
152
+
153
+ function _u8(n) {
154
+ var b = Buffer.alloc(1);
155
+ b.writeUInt8(n & 0xff, 0);
156
+ return b;
157
+ }
158
+
159
+ function _u16be(n) {
160
+ var b = Buffer.alloc(2);
161
+ b.writeUInt16BE(n & 0xffff, 0);
162
+ return b;
163
+ }
164
+
165
+ function _u32be(n) {
166
+ var b = Buffer.alloc(4);
167
+ b.writeUInt32BE(n >>> 0, 0);
168
+ return b;
169
+ }
170
+
171
+ // RFC 9580 §3.2 — Multi-Precision Integer encoding: 2-byte big-endian
172
+ // bit-length, followed by ceil(bits/8) value bytes. Leading zero bytes
173
+ // of the raw integer are stripped before the bit count is computed.
174
+ function _mpi(raw) {
175
+ // Strip leading zero bytes.
176
+ var i = 0;
177
+ while (i < raw.length - 1 && raw[i] === 0) i += 1;
178
+ var stripped = raw.slice(i);
179
+ // Bit-length of the most-significant byte.
180
+ var msb = stripped[0];
181
+ var bits = (stripped.length - 1) * 8;
182
+ for (var b = 7; b >= 0; b -= 1) {
183
+ if ((msb >> b) & 1) { bits += b + 1; break; }
184
+ }
185
+ if (bits === 0) bits = 1;
186
+ return Buffer.concat([_u16be(bits), stripped]);
187
+ }
188
+
189
+ // RFC 9580 §4.2.1 — new-format packet length octets.
190
+ function _encodeNewLength(length) {
191
+ if (length < 192) {
192
+ return _u8(length);
193
+ }
194
+ if (length < 8384) {
195
+ var first = ((length - 192) >> 8) + 192;
196
+ var second = (length - 192) & 0xff;
197
+ return Buffer.from([first, second]);
198
+ }
199
+ // 5-octet length: 0xff || 4-byte big-endian.
200
+ return Buffer.concat([_u8(0xff), _u32be(length)]);
201
+ }
202
+
203
+ // RFC 9580 §4.2 packet framing — new-format header for tag T:
204
+ // byte0 = 0b11TTTTTT
205
+ function _packetHeader(tag, bodyLength) {
206
+ var firstByte = 0xc0 | (tag & 0x3f);
207
+ return Buffer.concat([_u8(firstByte), _encodeNewLength(bodyLength)]);
208
+ }
209
+
210
+ // RFC 9580 §5.2.3.1 — subpacket length octets (same encoding as
211
+ // packet length octets in §4.2.1).
212
+ function _encodeSubpacketLength(length) {
213
+ return _encodeNewLength(length);
214
+ }
215
+
216
+ function _subpacket(type, body) {
217
+ // Subpacket = length-of(type-byte + body) || type-byte || body
218
+ var typeBuf = _u8(type & 0xff);
219
+ var inner = Buffer.concat([typeBuf, body]);
220
+ return Buffer.concat([_encodeSubpacketLength(inner.length), inner]);
221
+ }
222
+
223
+ // ---- Key fingerprint (RFC 9580 §5.5.4) ----
224
+ //
225
+ // v4 fingerprint = SHA-1 over (0x99 || u16be(publicPacketBodyLen) ||
226
+ // publicPacketBody). SHA-1 here is the spec — we are NOT hashing for
227
+ // signature integrity (verify-time hash alg is enforced separately);
228
+ // SHA-1's use as a fingerprint identifier is per RFC 9580 §5.5.4 v4
229
+ // fingerprint definition. RFC 9580 also defines v6 fingerprints
230
+ // (SHA-256) but v6 is deferred per the module @intro.
231
+ function _v4Fingerprint(publicPacketBody) {
232
+ var len = publicPacketBody.length;
233
+ var preimage = Buffer.concat([
234
+ _u8(0x99), _u16be(len), publicPacketBody,
235
+ ]);
236
+ return nodeCrypto.createHash("sha1").update(preimage).digest();
237
+ }
238
+
239
+ // ---- Public key packet body (RFC 9580 §5.5.2) ----
240
+
241
+ function _ed25519PublicPacketBody(rawPub32, creationTime) {
242
+ // v4 packet body:
243
+ // version(1)=4 || creationTime(4) || pubAlg(1)=22 ||
244
+ // curveOidLen(1) || curveOid || pointMpi
245
+ // Ed25519Legacy curve OID per RFC 9580 §9.2 = 1.3.6.1.4.1.11591.15.1
246
+ // encoded as: 0x2b 0x06 0x01 0x04 0x01 0xda 0x47 0x0f 0x01 (9 bytes).
247
+ var oid = Buffer.from([0x2b, 0x06, 0x01, 0x04, 0x01, 0xda, 0x47, 0x0f, 0x01]);
248
+ // The point is 0x40 || 32-byte raw Ed25519 public key (RFC 9580 §9.2).
249
+ var point = Buffer.concat([_u8(0x40), rawPub32]);
250
+ return Buffer.concat([
251
+ _u8(4),
252
+ _u32be(creationTime),
253
+ _u8(PUB_ALG_ED25519_LEGACY),
254
+ _u8(oid.length),
255
+ oid,
256
+ _mpi(point),
257
+ ]);
258
+ }
259
+
260
+ function _rsaPublicPacketBody(nBuf, eBuf, creationTime) {
261
+ // v4 packet body:
262
+ // version(1)=4 || creationTime(4) || pubAlg(1)=1 || n-mpi || e-mpi
263
+ return Buffer.concat([
264
+ _u8(4),
265
+ _u32be(creationTime),
266
+ _u8(PUB_ALG_RSA),
267
+ _mpi(nBuf),
268
+ _mpi(eBuf),
269
+ ]);
270
+ }
271
+
272
+ // ---- ASCII armor (RFC 9580 §6.2 + §6.1 CRC-24) ----
273
+
274
+ function _crc24(data) {
275
+ // RFC 9580 §6.1 CRC-24.
276
+ var crc = 0x00b704ce;
277
+ for (var i = 0; i < data.length; i += 1) {
278
+ crc ^= data[i] << 16;
279
+ for (var j = 0; j < 8; j += 1) {
280
+ crc <<= 1;
281
+ if (crc & 0x01000000) crc ^= 0x01864cfb;
282
+ }
283
+ }
284
+ return crc & 0xffffff;
285
+ }
286
+
287
+ function _armor(packetBytes) {
288
+ var b64 = packetBytes.toString("base64");
289
+ var lines = [];
290
+ for (var i = 0; i < b64.length; i += 64) {
291
+ lines.push(b64.slice(i, i + 64));
292
+ }
293
+ var crc = _crc24(packetBytes);
294
+ var crcBuf = Buffer.from([(crc >> 16) & 0xff, (crc >> 8) & 0xff, crc & 0xff]);
295
+ var crcB64 = crcBuf.toString("base64");
296
+ return [
297
+ ARMOR_BEGIN,
298
+ "",
299
+ lines.join("\r\n"),
300
+ "=" + crcB64,
301
+ ARMOR_END,
302
+ ].join("\r\n") + "\r\n";
303
+ }
304
+
305
+ function _dearmor(armored) {
306
+ if (typeof armored !== "string") {
307
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
308
+ "armored signature must be a string");
309
+ }
310
+ var beginIdx = armored.indexOf(ARMOR_BEGIN);
311
+ var endIdx = armored.indexOf(ARMOR_END);
312
+ if (beginIdx === -1 || endIdx === -1 || endIdx < beginIdx) {
313
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
314
+ "armored signature missing BEGIN/END framing per RFC 9580 §6.2");
315
+ }
316
+ var inner = armored.slice(beginIdx + ARMOR_BEGIN.length, endIdx);
317
+ // Skip header lines (terminated by a blank line) per RFC 9580 §6.2.
318
+ var lines = inner.replace(/\r\n/g, "\n").split("\n");
319
+ var k = 0;
320
+ // Drop leading empty lines.
321
+ while (k < lines.length && lines[k] === "") k += 1;
322
+ // Skip header lines until blank.
323
+ while (k < lines.length && lines[k].indexOf(":") !== -1) k += 1;
324
+ if (k < lines.length && lines[k] === "") k += 1;
325
+ // Collect base64 body until CRC line (leading "=").
326
+ var b64 = "";
327
+ var crcLine = null;
328
+ for (; k < lines.length; k += 1) {
329
+ var ln = lines[k];
330
+ if (ln === "") continue;
331
+ if (ln.charAt(0) === "=") { crcLine = ln.slice(1); break; }
332
+ b64 += ln;
333
+ }
334
+ if (crcLine === null) {
335
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
336
+ "armored signature missing CRC-24 trailer per RFC 9580 §6.1");
337
+ }
338
+ var packetBytes = Buffer.from(b64, "base64");
339
+ var expectedCrc = _crc24(packetBytes);
340
+ var crcBuf = Buffer.from(crcLine, "base64");
341
+ if (crcBuf.length !== 3) {
342
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
343
+ "armored signature CRC-24 trailer must decode to 3 bytes");
344
+ }
345
+ var seenCrc = (crcBuf[0] << 16) | (crcBuf[1] << 8) | crcBuf[2];
346
+ if (seenCrc !== expectedCrc) {
347
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
348
+ "armored signature CRC-24 mismatch — armor is corrupt");
349
+ }
350
+ return packetBytes;
351
+ }
352
+
353
+ // ---- Key-shape extraction (node:crypto KeyObject → raw integers) ----
354
+
355
+ function _extractRsaPublicComponents(keyObject) {
356
+ // node:crypto exposes jwk export for RSA keys: { kty:"RSA", n, e }.
357
+ var jwk = keyObject.export({ format: "jwk" });
358
+ if (!jwk || jwk.kty !== "RSA") {
359
+ throw new MailCryptoError("mail-crypto/pgp/bad-key",
360
+ "expected RSA key, got " + (jwk && jwk.kty));
361
+ }
362
+ var n = Buffer.from(jwk.n, "base64url");
363
+ var e = Buffer.from(jwk.e, "base64url");
364
+ return { n: n, e: e, bits: n.length * 8 };
365
+ }
366
+
367
+ function _extractEd25519PublicRaw(keyObject) {
368
+ var jwk = keyObject.export({ format: "jwk" });
369
+ if (!jwk || jwk.kty !== "OKP" || jwk.crv !== "Ed25519") {
370
+ throw new MailCryptoError("mail-crypto/pgp/bad-key",
371
+ "expected Ed25519 key, got " + (jwk && (jwk.kty + "/" + jwk.crv)));
372
+ }
373
+ var raw = Buffer.from(jwk.x, "base64url");
374
+ if (raw.length !== 32) {
375
+ throw new MailCryptoError("mail-crypto/pgp/bad-key",
376
+ "Ed25519 public key must decode to 32 bytes");
377
+ }
378
+ return raw;
379
+ }
380
+
381
+ // ---- Sign ----
382
+
383
+ function _hashName(hashAlgId) {
384
+ if (hashAlgId === HASH_ALG_SHA256) return "sha256";
385
+ if (hashAlgId === HASH_ALG_SHA512) return "sha512";
386
+ throw new MailCryptoError("mail-crypto/pgp/bad-hash",
387
+ "hash algorithm " + hashAlgId + " not supported; only SHA-256 / SHA-512");
388
+ }
389
+
390
+ /**
391
+ * @primitive b.mail.crypto.pgp.sign
392
+ * @signature b.mail.crypto.pgp.sign(opts)
393
+ * @since 0.9.58
394
+ * @status stable
395
+ * @compliance hipaa, pci-dss, gdpr, soc2
396
+ *
397
+ * Produces a v4 OpenPGP detached signature over `opts.message` and
398
+ * returns the ASCII-armored signature plus a ready-to-emit
399
+ * `multipart/signed; protocol="application/pgp-signature"` body
400
+ * (RFC 3156 §5). Ed25519 (algorithm 22) and RSA-PKCS#1-v1.5 over
401
+ * SHA-256 (algorithm 1) are the v1 signing forms; RSA keys below
402
+ * 2048 bits are refused per RFC 8301 §3.1.
403
+ *
404
+ * @example
405
+ * var rv = b.mail.crypto.pgp.sign({
406
+ * message: "rfc822 body bytes",
407
+ * privateKeyPem: pem,
408
+ * });
409
+ * // → { armored, multipartSigned, signedAt, fingerprint }
410
+ */
411
+ function sign(opts) {
412
+ opts = validateOpts.requireObject(opts, "mail.crypto.pgp.sign", MailCryptoError, "mail-crypto/pgp/bad-opts");
413
+ validateOpts(opts, ["message", "privateKeyPem", "passphrase", "audit", "creationTime"], "mail.crypto.pgp.sign");
414
+
415
+ var message = opts.message;
416
+ if (!(typeof message === "string" || Buffer.isBuffer(message))) {
417
+ throw new MailCryptoError("mail-crypto/pgp/bad-message",
418
+ "message must be a string or Buffer");
419
+ }
420
+ if (message.length === 0) {
421
+ throw new MailCryptoError("mail-crypto/pgp/bad-message",
422
+ "message must be non-empty");
423
+ }
424
+ validateOpts.requireNonEmptyString(opts.privateKeyPem, "privateKeyPem",
425
+ MailCryptoError, "mail-crypto/pgp/bad-key");
426
+ if (opts.passphrase !== undefined && opts.passphrase !== null &&
427
+ typeof opts.passphrase !== "string") {
428
+ throw new MailCryptoError("mail-crypto/pgp/bad-passphrase",
429
+ "passphrase must be a string when provided");
430
+ }
431
+
432
+ var creationTime = (opts.creationTime === undefined)
433
+ ? Math.floor(Date.now() / 1000)
434
+ : opts.creationTime;
435
+ if (typeof creationTime !== "number" || !isFinite(creationTime) ||
436
+ creationTime < 0 || Math.floor(creationTime) !== creationTime) {
437
+ throw new MailCryptoError("mail-crypto/pgp/bad-creation-time",
438
+ "creationTime must be a non-negative integer epoch-seconds");
439
+ }
440
+
441
+ var privateKey;
442
+ try {
443
+ var keyOpts = { key: opts.privateKeyPem, format: "pem" };
444
+ if (opts.passphrase) keyOpts.passphrase = opts.passphrase;
445
+ privateKey = nodeCrypto.createPrivateKey(keyOpts);
446
+ } catch (e) {
447
+ throw new MailCryptoError("mail-crypto/pgp/bad-key",
448
+ "privateKeyPem could not be parsed: " + ((e && e.message) || String(e)));
449
+ }
450
+
451
+ var publicKey = nodeCrypto.createPublicKey(privateKey);
452
+ var keyType = privateKey.asymmetricKeyType; // "rsa" | "ed25519" | ...
453
+
454
+ var pubAlg, hashAlg, publicPacketBody;
455
+ if (keyType === "ed25519") {
456
+ pubAlg = PUB_ALG_ED25519_LEGACY;
457
+ hashAlg = HASH_ALG_SHA512;
458
+ var rawPub = _extractEd25519PublicRaw(publicKey);
459
+ publicPacketBody = _ed25519PublicPacketBody(rawPub, creationTime);
460
+ } else if (keyType === "rsa" || keyType === "rsa-pss") {
461
+ pubAlg = PUB_ALG_RSA;
462
+ hashAlg = HASH_ALG_SHA256;
463
+ var rsaPub = _extractRsaPublicComponents(publicKey);
464
+ if (rsaPub.bits < RSA_MIN_BITS) {
465
+ throw new MailCryptoError("mail-crypto/pgp/rsa-too-small",
466
+ "RSA key is " + rsaPub.bits + " bits; minimum is " + RSA_MIN_BITS +
467
+ " (RFC 8301 §3.1)");
468
+ }
469
+ publicPacketBody = _rsaPublicPacketBody(rsaPub.n, rsaPub.e, creationTime);
470
+ } else {
471
+ throw new MailCryptoError("mail-crypto/pgp/bad-key-type",
472
+ "unsupported privateKey algorithm '" + keyType +
473
+ "'; only ed25519 and rsa are supported");
474
+ }
475
+
476
+ var fingerprint = _v4Fingerprint(publicPacketBody);
477
+
478
+ // RFC 9580 §5.2.3 — hashed subpackets we always include:
479
+ // - Signature Creation Time (2)
480
+ // - Issuer Fingerprint v4 (33) — version byte 0x04 || 20-byte fpr
481
+ var hashedSub = Buffer.concat([
482
+ _subpacket(SUBPKT_SIG_CREATION_TIME, _u32be(creationTime)),
483
+ _subpacket(SUBPKT_ISSUER_FPR, Buffer.concat([_u8(4), fingerprint])),
484
+ ]);
485
+
486
+ // RFC 9580 §5.2.4 — Compute signed hash:
487
+ // data || signed-section || trailer
488
+ // where signed-section is the bytes from version through end of
489
+ // hashed subpackets, and trailer is 0x04 0xff || u32be(signedSectionLen).
490
+ // The signed-section is:
491
+ // version(1)=4 || sigType(1) || pubAlg(1) || hashAlg(1) ||
492
+ // hashedSubLen(2) || hashedSub
493
+ var signedSection = Buffer.concat([
494
+ _u8(4),
495
+ _u8(SIG_TYPE_BINARY),
496
+ _u8(pubAlg),
497
+ _u8(hashAlg),
498
+ _u16be(hashedSub.length),
499
+ hashedSub,
500
+ ]);
501
+
502
+ var trailer = Buffer.concat([
503
+ _u8(4), _u8(0xff), _u32be(signedSection.length),
504
+ ]);
505
+
506
+ var dataBuf = Buffer.isBuffer(message) ? message : Buffer.from(message, "utf8");
507
+
508
+ var hashName = _hashName(hashAlg);
509
+ var digest = nodeCrypto.createHash(hashName)
510
+ .update(dataBuf)
511
+ .update(signedSection)
512
+ .update(trailer)
513
+ .digest();
514
+
515
+ // RFC 9580 §5.2.4 — the signature packet records the leftmost 2
516
+ // octets of the hash so verifiers can fail fast on the wrong key.
517
+ var hashLeft16 = digest.slice(0, 2);
518
+
519
+ // Now produce the actual asymmetric signature over the digest.
520
+ var sigMpis;
521
+ if (pubAlg === PUB_ALG_RSA) {
522
+ // RSA EMSA-PKCS1-v1_5 over the precomputed digest.
523
+ var rsaSig = nodeCrypto.sign(hashName, Buffer.concat([dataBuf, signedSection, trailer]), {
524
+ key: privateKey,
525
+ padding: nodeCrypto.constants.RSA_PKCS1_PADDING,
526
+ });
527
+ sigMpis = _mpi(rsaSig);
528
+ } else {
529
+ // Ed25519Legacy — signs the precomputed-digest input. EdDSA signs
530
+ // the message directly; RFC 9580 §5.2.4 specifies signing over the
531
+ // same hash input as the digest computation. Per RFC 9580 §13.7
532
+ // (Ed25519Legacy) the signed message is the SHA-512 hash bytes.
533
+ var edSig = nodeCrypto.sign(null,
534
+ Buffer.concat([dataBuf, signedSection, trailer]), privateKey);
535
+ // edSig is 64 raw bytes (R || S). RFC 9580 §5.2.3 encodes R and S
536
+ // as two 256-bit MPIs.
537
+ if (edSig.length !== 64) {
538
+ throw new MailCryptoError("mail-crypto/pgp/bad-signature",
539
+ "Ed25519 raw signature must be 64 bytes; got " + edSig.length);
540
+ }
541
+ sigMpis = Buffer.concat([_mpi(edSig.slice(0, 32)), _mpi(edSig.slice(32))]);
542
+ }
543
+
544
+ // Assemble the signature packet body.
545
+ // version(1)=4 || sigType(1) || pubAlg(1) || hashAlg(1) ||
546
+ // hashedSubLen(2) || hashedSub ||
547
+ // unhashedSubLen(2)=0 ||
548
+ // hashLeft16(2) || sigMpis
549
+ var unhashedSub = Buffer.alloc(0);
550
+ var sigBody = Buffer.concat([
551
+ signedSection,
552
+ _u16be(unhashedSub.length),
553
+ unhashedSub,
554
+ hashLeft16,
555
+ sigMpis,
556
+ ]);
557
+
558
+ // Tag 2 = Signature packet (RFC 9580 §5.2).
559
+ var packet = Buffer.concat([_packetHeader(2, sigBody.length), sigBody]);
560
+
561
+ var armored = _armor(packet);
562
+
563
+ // RFC 3156 §5 multipart/signed wrapper. The signer is responsible
564
+ // for assembling the message body that gets signed; we provide the
565
+ // boundary structure once the caller hands us their canonicalized
566
+ // signed-part bytes plus the armored signature.
567
+ // MIME-boundary uniqueness only (not a security token); operator
568
+ // key/cert material flows through createSign/verify, not this path.
569
+ // allow:raw-randombytes-token — boundary string, not auth credential
570
+ var boundary = "blamejs-pgp-" + nodeCrypto.randomBytes(12).toString("hex");
571
+ var multipartSigned =
572
+ 'Content-Type: multipart/signed; micalg="pgp-' + hashName + '"; ' +
573
+ 'protocol="application/pgp-signature"; boundary="' + boundary + '"\r\n' +
574
+ "\r\n" +
575
+ "--" + boundary + "\r\n" +
576
+ (Buffer.isBuffer(message) ? message.toString("binary") : message) +
577
+ "\r\n--" + boundary + "\r\n" +
578
+ 'Content-Type: application/pgp-signature; name="signature.asc"\r\n' +
579
+ "Content-Description: OpenPGP digital signature\r\n" +
580
+ 'Content-Disposition: attachment; filename="signature.asc"\r\n' +
581
+ "\r\n" +
582
+ armored +
583
+ "--" + boundary + "--\r\n";
584
+
585
+ // Audit (drop-silent — never crash the request that triggered us).
586
+ _audit(opts.audit, "mail.crypto.pgp.sign", "success", {
587
+ keyType: keyType,
588
+ hashAlg: hashName,
589
+ fingerprint: fingerprint.toString("hex"),
590
+ signedAt: creationTime,
591
+ });
592
+
593
+ return {
594
+ armored: armored,
595
+ multipartSigned: multipartSigned,
596
+ signedAt: creationTime,
597
+ fingerprint: fingerprint.toString("hex"),
598
+ hashAlg: hashName,
599
+ boundary: boundary,
600
+ };
601
+ }
602
+
603
+ // ---- Verify ----
604
+
605
+ function _parseSignaturePacket(packetBytes) {
606
+ // RFC 9580 §4.2 — accept new-format packets only (legacy/old format
607
+ // is RFC 1991 vintage; producers since the 1998 RFC 2440 era emit
608
+ // new-format). Header byte: 0b11TTTTTT.
609
+ if (packetBytes.length < 2) {
610
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
611
+ "signature packet too short");
612
+ }
613
+ var first = packetBytes[0];
614
+ if ((first & 0xc0) !== 0xc0) {
615
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
616
+ "expected new-format packet header per RFC 9580 §4.2 (legacy/old-format input refused)");
617
+ }
618
+ var tag = first & 0x3f;
619
+ if (tag !== 2) {
620
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
621
+ "expected Signature packet (tag=2) per RFC 9580 §5.2; got tag " + tag);
622
+ }
623
+ // Parse length.
624
+ var idx = 1;
625
+ var bodyLen;
626
+ var lenFirst = packetBytes[idx];
627
+ if (lenFirst < 192) {
628
+ bodyLen = lenFirst;
629
+ idx += 1;
630
+ } else if (lenFirst < 224) {
631
+ if (idx + 2 > packetBytes.length) {
632
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet", "truncated length");
633
+ }
634
+ bodyLen = ((lenFirst - 192) << 8) + packetBytes[idx + 1] + 192;
635
+ idx += 2;
636
+ } else if (lenFirst === 0xff) {
637
+ if (idx + 5 > packetBytes.length) {
638
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet", "truncated length");
639
+ }
640
+ bodyLen = packetBytes.readUInt32BE(idx + 1);
641
+ idx += 5;
642
+ } else {
643
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
644
+ "partial-body length octets refused — full-length packets only");
645
+ }
646
+ if (idx + bodyLen > packetBytes.length) {
647
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
648
+ "signature packet body truncated");
649
+ }
650
+ var body = packetBytes.slice(idx, idx + bodyLen);
651
+
652
+ if (body.length < 6 || body[0] !== 4) {
653
+ throw new MailCryptoError("mail-crypto/pgp/bad-version",
654
+ "only v4 signature packets supported (v6 deferred per @intro)");
655
+ }
656
+ var sigType = body[1];
657
+ var pubAlg = body[2];
658
+ var hashAlg = body[3];
659
+ if (sigType !== SIG_TYPE_BINARY) {
660
+ throw new MailCryptoError("mail-crypto/pgp/bad-sig-type",
661
+ "only binary-document signatures (type=0) accepted; got " + sigType);
662
+ }
663
+ if (hashAlg !== HASH_ALG_SHA256 && hashAlg !== HASH_ALG_SHA512) {
664
+ throw new MailCryptoError("mail-crypto/pgp/bad-hash",
665
+ "hash alg " + hashAlg + " refused; only SHA-256 (8) and SHA-512 (10) are accepted. " +
666
+ "SHA-1 (id=2) refused per SHAttered (CVE-2017-9006-class).");
667
+ }
668
+ var hashedSubLen = body.readUInt16BE(4);
669
+ if (6 + hashedSubLen > body.length) {
670
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
671
+ "hashed-subpackets length overflows packet body");
672
+ }
673
+ var hashedSub = body.slice(6, 6 + hashedSubLen);
674
+ var p = 6 + hashedSubLen;
675
+ if (p + 2 > body.length) {
676
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
677
+ "missing unhashed-subpackets length");
678
+ }
679
+ var unhashedSubLen = body.readUInt16BE(p);
680
+ p += 2;
681
+ if (p + unhashedSubLen + 2 > body.length) {
682
+ throw new MailCryptoError("mail-crypto/pgp/bad-packet",
683
+ "unhashed-subpackets length overflows packet body");
684
+ }
685
+ p += unhashedSubLen;
686
+ var hashLeft16 = body.slice(p, p + 2);
687
+ p += 2;
688
+ var sigMpisBytes = body.slice(p);
689
+
690
+ return {
691
+ body: body,
692
+ pubAlg: pubAlg,
693
+ hashAlg: hashAlg,
694
+ hashedSub: hashedSub,
695
+ hashLeft16: hashLeft16,
696
+ sigMpisBytes: sigMpisBytes,
697
+ signedSection: body.slice(0, 6 + hashedSubLen),
698
+ };
699
+ }
700
+
701
+ function _parseSubpackets(subpacketsBuf) {
702
+ var out = {};
703
+ var i = 0;
704
+ while (i < subpacketsBuf.length) {
705
+ var first = subpacketsBuf[i];
706
+ var subLen, hdrLen;
707
+ if (first < 192) { subLen = first; hdrLen = 1; }
708
+ else if (first < 255) {
709
+ if (i + 2 > subpacketsBuf.length) break;
710
+ subLen = ((first - 192) << 8) + subpacketsBuf[i + 1] + 192;
711
+ hdrLen = 2;
712
+ } else {
713
+ if (i + 5 > subpacketsBuf.length) break;
714
+ subLen = subpacketsBuf.readUInt32BE(i + 1);
715
+ hdrLen = 5;
716
+ }
717
+ if (i + hdrLen + subLen > subpacketsBuf.length) break;
718
+ var subType = subpacketsBuf[i + hdrLen] & 0x7f;
719
+ var subBody = subpacketsBuf.slice(i + hdrLen + 1, i + hdrLen + subLen);
720
+ if (subType === SUBPKT_SIG_CREATION_TIME && subBody.length === 4) {
721
+ out.signedAt = subBody.readUInt32BE(0);
722
+ } else if (subType === SUBPKT_ISSUER_FPR && subBody.length === 21) {
723
+ out.issuerFprVersion = subBody[0];
724
+ out.issuerFingerprint = subBody.slice(1).toString("hex");
725
+ }
726
+ i += hdrLen + subLen;
727
+ }
728
+ return out;
729
+ }
730
+
731
+ function _readMpi(buf, offset) {
732
+ if (offset + 2 > buf.length) {
733
+ throw new MailCryptoError("mail-crypto/pgp/bad-mpi",
734
+ "MPI truncated");
735
+ }
736
+ var bits = buf.readUInt16BE(offset);
737
+ var byteLen = Math.ceil(bits / 8);
738
+ if (offset + 2 + byteLen > buf.length) {
739
+ throw new MailCryptoError("mail-crypto/pgp/bad-mpi",
740
+ "MPI value truncated");
741
+ }
742
+ return { value: buf.slice(offset + 2, offset + 2 + byteLen),
743
+ next: offset + 2 + byteLen };
744
+ }
745
+
746
+ /**
747
+ * @primitive b.mail.crypto.pgp.verify
748
+ * @signature b.mail.crypto.pgp.verify(opts)
749
+ * @since 0.9.58
750
+ * @status stable
751
+ * @compliance hipaa, pci-dss, gdpr, soc2
752
+ *
753
+ * Verifies an ASCII-armored OpenPGP detached signature against
754
+ * `opts.message` using `opts.publicKeyPem`. The signature's hash
755
+ * algorithm is enforced against the recomputed digest; SHA-1 is
756
+ * refused. Returns the v4 signer fingerprint (RFC 9580 §5.5.4) so
757
+ * callers can pin to a known operator key rather than trusting any
758
+ * key that happens to verify.
759
+ *
760
+ * @example
761
+ * var rv = b.mail.crypto.pgp.verify({
762
+ * message: bytes,
763
+ * armored: "-----BEGIN PGP SIGNATURE----- ...",
764
+ * publicKeyPem: pubPem,
765
+ * });
766
+ * // → { ok: true, signerFingerprint, signedAt, hashAlg }
767
+ */
768
+ function verify(opts) {
769
+ opts = validateOpts.requireObject(opts, "mail.crypto.pgp.verify", MailCryptoError, "mail-crypto/pgp/bad-opts");
770
+ validateOpts(opts, ["message", "armored", "publicKeyPem", "audit"], "mail.crypto.pgp.verify");
771
+
772
+ var message = opts.message;
773
+ if (!(typeof message === "string" || Buffer.isBuffer(message))) {
774
+ throw new MailCryptoError("mail-crypto/pgp/bad-message",
775
+ "message must be a string or Buffer");
776
+ }
777
+ validateOpts.requireNonEmptyString(opts.armored, "armored",
778
+ MailCryptoError, "mail-crypto/pgp/bad-armor");
779
+ validateOpts.requireNonEmptyString(opts.publicKeyPem, "publicKeyPem",
780
+ MailCryptoError, "mail-crypto/pgp/bad-key");
781
+
782
+ var failReason = null;
783
+ function _fail(code, reason) {
784
+ failReason = { code: code, reason: reason };
785
+ _audit(opts.audit, "mail.crypto.pgp.verify_fail", "failure", {
786
+ reason: reason, code: code,
787
+ });
788
+ return { ok: false, code: code, reason: reason };
789
+ }
790
+
791
+ var packetBytes;
792
+ try { packetBytes = _dearmor(opts.armored); }
793
+ catch (e) { return _fail(e.code || "mail-crypto/pgp/bad-armor", e.message); }
794
+
795
+ var parsed;
796
+ try { parsed = _parseSignaturePacket(packetBytes); }
797
+ catch (e) { return _fail(e.code || "mail-crypto/pgp/bad-packet", e.message); }
798
+
799
+ var subs = _parseSubpackets(parsed.hashedSub);
800
+
801
+ var publicKey;
802
+ try { publicKey = nodeCrypto.createPublicKey({ key: opts.publicKeyPem, format: "pem" }); }
803
+ catch (e) { return _fail("mail-crypto/pgp/bad-key",
804
+ "publicKeyPem could not be parsed: " + ((e && e.message) || String(e))); }
805
+
806
+ var keyType = publicKey.asymmetricKeyType;
807
+ if (parsed.pubAlg === PUB_ALG_RSA && !(keyType === "rsa" || keyType === "rsa-pss")) {
808
+ return _fail("mail-crypto/pgp/key-alg-mismatch",
809
+ "signature claims RSA but provided key is " + keyType);
810
+ }
811
+ if (parsed.pubAlg === PUB_ALG_ED25519_LEGACY && keyType !== "ed25519") {
812
+ return _fail("mail-crypto/pgp/key-alg-mismatch",
813
+ "signature claims Ed25519 but provided key is " + keyType);
814
+ }
815
+ if (parsed.pubAlg !== PUB_ALG_RSA && parsed.pubAlg !== PUB_ALG_ED25519_LEGACY) {
816
+ return _fail("mail-crypto/pgp/bad-pubalg",
817
+ "public-key algorithm " + parsed.pubAlg + " not supported");
818
+ }
819
+
820
+ // Recompute the v4 fingerprint over the provided public key and
821
+ // require equality with the issuer-fingerprint subpacket so the
822
+ // caller can't be tricked into trusting a different key than the
823
+ // one that signed.
824
+ var publicPacketBody;
825
+ if (parsed.pubAlg === PUB_ALG_RSA) {
826
+ var rsaPub = _extractRsaPublicComponents(publicKey);
827
+ if (rsaPub.bits < RSA_MIN_BITS) {
828
+ return _fail("mail-crypto/pgp/rsa-too-small",
829
+ "RSA key is " + rsaPub.bits + " bits; minimum is " + RSA_MIN_BITS +
830
+ " (RFC 8301 §3.1)");
831
+ }
832
+ var creationTimeFromSub = (subs.signedAt === undefined) ? 0 : subs.signedAt;
833
+ publicPacketBody = _rsaPublicPacketBody(rsaPub.n, rsaPub.e, creationTimeFromSub);
834
+ } else {
835
+ var rawPub = _extractEd25519PublicRaw(publicKey);
836
+ var creationTimeFromSubE = (subs.signedAt === undefined) ? 0 : subs.signedAt;
837
+ publicPacketBody = _ed25519PublicPacketBody(rawPub, creationTimeFromSubE);
838
+ }
839
+ var fpr = _v4Fingerprint(publicPacketBody).toString("hex");
840
+ if (subs.issuerFingerprint && subs.issuerFingerprint !== fpr) {
841
+ return _fail("mail-crypto/pgp/fingerprint-mismatch",
842
+ "signature's Issuer Fingerprint (" + subs.issuerFingerprint +
843
+ ") does not match provided public key (" + fpr + ")");
844
+ }
845
+
846
+ var hashName = _hashName(parsed.hashAlg);
847
+ var dataBuf = Buffer.isBuffer(message) ? message : Buffer.from(message, "utf8");
848
+ var trailer = Buffer.concat([
849
+ _u8(4), _u8(0xff), _u32be(parsed.signedSection.length),
850
+ ]);
851
+ var hashInput = Buffer.concat([dataBuf, parsed.signedSection, trailer]);
852
+ var digest = nodeCrypto.createHash(hashName).update(hashInput).digest();
853
+
854
+ // Hash-left-16 fast-fail check.
855
+ if (digest[0] !== parsed.hashLeft16[0] || digest[1] !== parsed.hashLeft16[1]) {
856
+ return _fail("mail-crypto/pgp/hash-mismatch",
857
+ "leading 16 hash bits do not match — wrong key, wrong message, or wrong hash algorithm");
858
+ }
859
+
860
+ var ok;
861
+ if (parsed.pubAlg === PUB_ALG_RSA) {
862
+ var rsaMpi = _readMpi(parsed.sigMpisBytes, 0);
863
+ try {
864
+ ok = nodeCrypto.verify(hashName, hashInput, {
865
+ key: publicKey,
866
+ padding: nodeCrypto.constants.RSA_PKCS1_PADDING,
867
+ }, rsaMpi.value);
868
+ } catch (e) {
869
+ return _fail("mail-crypto/pgp/verify-error",
870
+ "RSA verify threw: " + ((e && e.message) || String(e)));
871
+ }
872
+ } else {
873
+ // Ed25519Legacy — two MPIs (R, S) reassemble into the 64-byte raw
874
+ // EdDSA signature.
875
+ var rMpi = _readMpi(parsed.sigMpisBytes, 0);
876
+ var sMpi = _readMpi(parsed.sigMpisBytes, rMpi.next);
877
+ function _padTo32(buf) {
878
+ if (buf.length === 32) return buf;
879
+ if (buf.length > 32) return buf.slice(buf.length - 32);
880
+ return Buffer.concat([Buffer.alloc(32 - buf.length), buf]);
881
+ }
882
+ var rawSig = Buffer.concat([_padTo32(rMpi.value), _padTo32(sMpi.value)]);
883
+ try {
884
+ ok = nodeCrypto.verify(null, hashInput, publicKey, rawSig);
885
+ } catch (e) {
886
+ return _fail("mail-crypto/pgp/verify-error",
887
+ "Ed25519 verify threw: " + ((e && e.message) || String(e)));
888
+ }
889
+ }
890
+
891
+ if (!ok) {
892
+ return _fail("mail-crypto/pgp/bad-signature",
893
+ "signature did not verify against provided public key");
894
+ }
895
+
896
+ void failReason;
897
+ _audit(opts.audit, "mail.crypto.pgp.verify_pass", "success", {
898
+ signerFingerprint: fpr,
899
+ hashAlg: hashName,
900
+ signedAt: subs.signedAt,
901
+ });
902
+
903
+ return {
904
+ ok: true,
905
+ signerFingerprint: fpr,
906
+ signedAt: subs.signedAt,
907
+ hashAlg: hashName,
908
+ };
909
+ }
910
+
911
+ // ---- Audit (drop-silent — RFC §audit hot-path discipline) ----
912
+
913
+ function _audit(auditHandle, action, outcome, metadata) {
914
+ try {
915
+ var a = auditHandle || audit();
916
+ if (a && typeof a.safeEmit === "function") {
917
+ a.safeEmit({
918
+ action: action,
919
+ outcome: outcome,
920
+ actor: {},
921
+ metadata: metadata,
922
+ });
923
+ }
924
+ } catch (_e) { /* drop-silent — audit failures must not crash callers */ }
925
+ }
926
+
927
+ // ---- v0.10.16 experimental encrypt/decrypt + WKD ----
928
+ //
929
+ // PQC PGP encrypt/decrypt for ML-KEM-1024 recipients shipped under
930
+ // `experimental` namespace (RFC 9580bis PKESK ML-KEM codepoints
931
+ // haven't IANA-registered yet). Framework-private envelope matching
932
+ // the v0.10.10 `b.jose.jwe.experimental` precedent. Operators
933
+ // integrating with peers running this same framework get
934
+ // encrypt/decrypt today; cross-implementation interop waits for IANA.
935
+
936
+ var bCrypto = require("./crypto");
937
+ var pqcSoftware = require("./pqc-software");
938
+
939
+ var PGP_PQ_MAGIC = Buffer.from("BJ-PGP-PQ", "ascii"); // allow:raw-byte-literal — 9-byte framework magic
940
+ var PGP_PQ_VERSION = 1; // allow:raw-byte-literal — envelope version
941
+
942
+ function experimentalEncrypt(opts) {
943
+ opts = validateOpts.requireObject(opts, "mail.crypto.pgp.experimental.encrypt",
944
+ MailCryptoError, "mail-crypto/pgp/bad-opts");
945
+ validateOpts(opts, ["message", "recipients", "audit"], "mail.crypto.pgp.experimental.encrypt");
946
+ if (!opts.message || (!Buffer.isBuffer(opts.message) && typeof opts.message !== "string")) {
947
+ throw new MailCryptoError("mail-crypto/pgp/bad-message",
948
+ "encrypt: opts.message must be a Buffer or string");
949
+ }
950
+ if (!Array.isArray(opts.recipients) || opts.recipients.length === 0) {
951
+ throw new MailCryptoError("mail-crypto/pgp/no-recipients",
952
+ "encrypt: opts.recipients must be a non-empty array");
953
+ }
954
+ var plaintext = Buffer.isBuffer(opts.message) ? opts.message : Buffer.from(opts.message, "utf8");
955
+ var sessionKey = bCrypto.generateBytes(32); // allow:raw-byte-literal — 256-bit session key
956
+ var ciphertext = bCrypto.encryptPacked(plaintext, sessionKey);
957
+ var recipientBlobs = [];
958
+ for (var i = 0; i < opts.recipients.length; i += 1) {
959
+ var r = opts.recipients[i];
960
+ if (!Buffer.isBuffer(r.recipientId)) {
961
+ throw new MailCryptoError("mail-crypto/pgp/bad-recipient",
962
+ "encrypt: recipients[" + i + "].recipientId must be a Buffer");
963
+ }
964
+ if (!(r.publicKey instanceof Uint8Array)) {
965
+ throw new MailCryptoError("mail-crypto/pgp/bad-recipient",
966
+ "encrypt: recipients[" + i + "].publicKey must be a Uint8Array (ML-KEM-1024)");
967
+ }
968
+ if (r.recipientId.length > 255) { // allow:raw-byte-literal — u8 length cap
969
+ throw new MailCryptoError("mail-crypto/pgp/bad-recipient",
970
+ "encrypt: recipients[" + i + "].recipientId must be <= 255 bytes");
971
+ }
972
+ var encap = pqcSoftware.ml_kem_1024.encapsulate(r.publicKey);
973
+ var kek = bCrypto.kdf(Buffer.concat([
974
+ Buffer.from(encap.sharedSecret),
975
+ Buffer.from("pgp/experimental/chacha20-poly1305", "ascii"),
976
+ ]), 32); // allow:raw-byte-literal — 256-bit KEK
977
+ var wrappedKey = bCrypto.encryptPacked(sessionKey, kek);
978
+ var ct = Buffer.from(encap.cipherText);
979
+ recipientBlobs.push(Buffer.concat([
980
+ Buffer.from([r.recipientId.length]),
981
+ r.recipientId,
982
+ _u16be(ct.length),
983
+ ct,
984
+ _u16be(wrappedKey.length),
985
+ wrappedKey,
986
+ ]));
987
+ }
988
+ var envelope = Buffer.concat([
989
+ PGP_PQ_MAGIC,
990
+ Buffer.from([PGP_PQ_VERSION]),
991
+ Buffer.from([opts.recipients.length]), // allow:raw-byte-literal — u8 recipient count
992
+ Buffer.concat(recipientBlobs),
993
+ _u32be(ciphertext.length),
994
+ ciphertext,
995
+ ]);
996
+ var armored = _armorMessage(envelope);
997
+ _audit(opts.audit, "mail.crypto.pgp.experimental.encrypt", "success", {
998
+ recipients: opts.recipients.length,
999
+ });
1000
+ return { armored: armored, envelope: envelope };
1001
+ }
1002
+
1003
+ function experimentalDecrypt(opts) {
1004
+ opts = validateOpts.requireObject(opts, "mail.crypto.pgp.experimental.decrypt",
1005
+ MailCryptoError, "mail-crypto/pgp/bad-opts");
1006
+ validateOpts(opts, ["armored", "envelope", "recipientId", "secretKey", "audit"],
1007
+ "mail.crypto.pgp.experimental.decrypt");
1008
+ if (!Buffer.isBuffer(opts.recipientId)) {
1009
+ throw new MailCryptoError("mail-crypto/pgp/bad-opts",
1010
+ "decrypt: opts.recipientId must be a Buffer");
1011
+ }
1012
+ if (!(opts.secretKey instanceof Uint8Array)) {
1013
+ throw new MailCryptoError("mail-crypto/pgp/bad-opts",
1014
+ "decrypt: opts.secretKey must be a Uint8Array");
1015
+ }
1016
+ var envelope;
1017
+ if (Buffer.isBuffer(opts.envelope)) {
1018
+ envelope = opts.envelope;
1019
+ } else if (typeof opts.armored === "string" && opts.armored.length > 0) {
1020
+ envelope = _dearmorMessage(opts.armored);
1021
+ } else {
1022
+ throw new MailCryptoError("mail-crypto/pgp/bad-opts",
1023
+ "decrypt: opts.envelope OR opts.armored required");
1024
+ }
1025
+ if (envelope.length < PGP_PQ_MAGIC.length + 2 ||
1026
+ !envelope.slice(0, PGP_PQ_MAGIC.length).equals(PGP_PQ_MAGIC)) {
1027
+ throw new MailCryptoError("mail-crypto/pgp/bad-magic",
1028
+ "decrypt: envelope magic mismatch (not a blamejs-pgp-pq-v1 envelope)");
1029
+ }
1030
+ var off = PGP_PQ_MAGIC.length;
1031
+ var version = envelope[off]; off += 1;
1032
+ if (version !== PGP_PQ_VERSION) {
1033
+ throw new MailCryptoError("mail-crypto/pgp/bad-version",
1034
+ "decrypt: envelope version " + version + " unsupported (expected " + PGP_PQ_VERSION + ")");
1035
+ }
1036
+ var nRecips = envelope[off]; off += 1;
1037
+ var matchedSessionKey = null;
1038
+ for (var i = 0; i < nRecips; i += 1) {
1039
+ if (off >= envelope.length) {
1040
+ throw new MailCryptoError("mail-crypto/pgp/truncated",
1041
+ "decrypt: envelope truncated at recipient " + i);
1042
+ }
1043
+ var ridLen = envelope[off]; off += 1;
1044
+ var rid = envelope.slice(off, off + ridLen); off += ridLen;
1045
+ var ctLen = envelope.readUInt16BE(off); off += 2; // allow:raw-byte-literal — u16-be width
1046
+ var ct = envelope.slice(off, off + ctLen); off += ctLen;
1047
+ var wkLen = envelope.readUInt16BE(off); off += 2; // allow:raw-byte-literal — u16-be width
1048
+ var wrappedKey = envelope.slice(off, off + wkLen); off += wkLen;
1049
+ if (matchedSessionKey) continue;
1050
+ if (!rid.equals(opts.recipientId)) continue;
1051
+ var shared;
1052
+ try { shared = pqcSoftware.ml_kem_1024.decapsulate(new Uint8Array(ct), opts.secretKey); }
1053
+ catch (e) {
1054
+ throw new MailCryptoError("mail-crypto/pgp/decap-failed",
1055
+ "decrypt: ML-KEM-1024 decapsulate failed: " + ((e && e.message) || String(e)));
1056
+ }
1057
+ var kek = bCrypto.kdf(Buffer.concat([
1058
+ Buffer.from(shared),
1059
+ Buffer.from("pgp/experimental/chacha20-poly1305", "ascii"),
1060
+ ]), 32); // allow:raw-byte-literal — 256-bit KEK
1061
+ try { matchedSessionKey = bCrypto.decryptPacked(wrappedKey, kek); }
1062
+ catch (e2) {
1063
+ throw new MailCryptoError("mail-crypto/pgp/unwrap-failed",
1064
+ "decrypt: session-key unwrap failed: " + ((e2 && e2.message) || String(e2)));
1065
+ }
1066
+ }
1067
+ if (!matchedSessionKey) {
1068
+ throw new MailCryptoError("mail-crypto/pgp/no-matching-recipient",
1069
+ "decrypt: no recipient in envelope matches opts.recipientId");
1070
+ }
1071
+ var bodyLen = envelope.readUInt32BE(off); off += 4; // allow:raw-byte-literal — u32-be width
1072
+ var body = envelope.slice(off, off + bodyLen);
1073
+ var plaintext;
1074
+ try { plaintext = bCrypto.decryptPacked(body, matchedSessionKey); }
1075
+ catch (e3) {
1076
+ throw new MailCryptoError("mail-crypto/pgp/body-decrypt-failed",
1077
+ "decrypt: body AEAD verify failed: " + ((e3 && e3.message) || String(e3)));
1078
+ }
1079
+ _audit(opts.audit, "mail.crypto.pgp.experimental.decrypt", "success", {});
1080
+ return { plaintext: plaintext, recipientId: opts.recipientId };
1081
+ }
1082
+
1083
+ function _armorMessage(bytes) {
1084
+ var b64 = bytes.toString("base64");
1085
+ var lines = [];
1086
+ for (var i = 0; i < b64.length; i += 64) { // allow:raw-byte-literal — RFC 2045 base64 line length
1087
+ lines.push(b64.slice(i, i + 64)); // allow:raw-byte-literal — RFC 2045 base64 line length
1088
+ }
1089
+ return "-----BEGIN PGP MESSAGE-----\r\nVersion: blamejs-pgp-pq-v1\r\n\r\n" +
1090
+ lines.join("\r\n") + "\r\n-----END PGP MESSAGE-----\r\n";
1091
+ }
1092
+
1093
+ function _dearmorMessage(armored) {
1094
+ // Line-by-line parser — avoids the polynomial-time backtracking of
1095
+ // the prior regex (CodeQL "Polynomial regular expression on
1096
+ // uncontrolled data"). The previous shape
1097
+ // /-----BEGIN PGP MESSAGE-----\r?\n(?:[^\r\n]+\r?\n)*\r?\n.../
1098
+ // backtracks pathologically on inputs starting with many repeated
1099
+ // BEGIN lines. Split + walk in linear time instead.
1100
+ if (typeof armored !== "string") {
1101
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
1102
+ "dearmor: envelope must be a string");
1103
+ }
1104
+ var lines = armored.split(/\r?\n/);
1105
+ var begin = -1;
1106
+ var end = -1;
1107
+ for (var i = 0; i < lines.length; i += 1) {
1108
+ if (begin === -1 && lines[i] === "-----BEGIN PGP MESSAGE-----") begin = i;
1109
+ else if (begin !== -1 && lines[i] === "-----END PGP MESSAGE-----") { end = i; break; }
1110
+ }
1111
+ if (begin === -1 || end === -1) {
1112
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
1113
+ "dearmor: envelope is not BEGIN PGP MESSAGE armored");
1114
+ }
1115
+ // Skip header lines until the blank-line separator (RFC 9580 §6.2),
1116
+ // then collect base64 body lines until the END marker.
1117
+ var bodyStart = begin + 1;
1118
+ while (bodyStart < end && lines[bodyStart] !== "") bodyStart += 1;
1119
+ if (bodyStart >= end) {
1120
+ throw new MailCryptoError("mail-crypto/pgp/bad-armor",
1121
+ "dearmor: armor header has no blank-line separator before body");
1122
+ }
1123
+ var bodyChunks = [];
1124
+ for (var j = bodyStart + 1; j < end; j += 1) bodyChunks.push(lines[j]);
1125
+ return Buffer.from(bodyChunks.join(""), "base64");
1126
+ }
1127
+
1128
+ /**
1129
+ * @primitive b.mail.crypto.pgp.experimental.wkd.fetch
1130
+ * @signature b.mail.crypto.pgp.experimental.wkd.fetch(email, opts)
1131
+ * @since 0.10.16
1132
+ * @status experimental
1133
+ *
1134
+ * Fetch a WKD key for `email` per draft-koch-openpgp-webkey-service.
1135
+ * Tries the direct URL first; on 404 / network failure falls back
1136
+ * to the advanced URL. `opts.httpsGet(url) → Promise<{ status,
1137
+ * body: Buffer }>` is operator-supplied so the framework doesn't
1138
+ * couple to a specific HTTP client. Returns
1139
+ * `{ keyBytes, source: "direct" | "advanced", url }` or throws
1140
+ * `mail-crypto/pgp/wkd-not-found` when both URLs fail.
1141
+ *
1142
+ * @opts
1143
+ * httpsGet: Function, // (url) → Promise<{ status, body }>; REQUIRED
1144
+ * advancedHost: string, // passed through to computeUrl
1145
+ * maxKeyBytes: number, // default 256 KiB
1146
+ *
1147
+ * @example
1148
+ * var key = await b.mail.crypto.pgp.experimental.wkd.fetch("alice@example.com", {
1149
+ * httpsGet: function (url) {
1150
+ * return b.httpClient.request({ url: url, method: "GET" });
1151
+ * },
1152
+ * });
1153
+ */
1154
+ function wkdFetch(email, opts) {
1155
+ opts = validateOpts.requireObject(opts, "mail.crypto.pgp.experimental.wkd.fetch",
1156
+ MailCryptoError, "mail-crypto/pgp/bad-opts");
1157
+ if (typeof opts.httpsGet !== "function") {
1158
+ throw new MailCryptoError("mail-crypto/pgp/no-https-get",
1159
+ "wkd.fetch: opts.httpsGet must be a function (url) => Promise<{status, body}>");
1160
+ }
1161
+ numericBounds.requirePositiveFiniteIntIfPresent(opts.maxKeyBytes, "maxKeyBytes",
1162
+ MailCryptoError, "mail-crypto/pgp/bad-max-key-bytes");
1163
+ var maxBytes = typeof opts.maxKeyBytes === "number" ? opts.maxKeyBytes : (256 * 1024); // allow:raw-byte-literal — 256 KiB default key cap
1164
+ var urls = wkdComputeUrl(email, { advancedHost: opts.advancedHost });
1165
+ return Promise.resolve(opts.httpsGet(urls.direct)).then(function (resp) {
1166
+ if (resp && resp.status === 200 && Buffer.isBuffer(resp.body) && resp.body.length > 0) { // allow:raw-byte-literal — HTTP 200
1167
+ if (resp.body.length > maxBytes) {
1168
+ throw new MailCryptoError("mail-crypto/pgp/wkd-too-large",
1169
+ "wkd.fetch: key bytes " + resp.body.length + " exceed maxKeyBytes=" + maxBytes);
1170
+ }
1171
+ return { keyBytes: resp.body, source: "direct", url: urls.direct };
1172
+ }
1173
+ return Promise.resolve(opts.httpsGet(urls.advanced)).then(function (resp2) {
1174
+ if (resp2 && resp2.status === 200 && Buffer.isBuffer(resp2.body) && resp2.body.length > 0) { // allow:raw-byte-literal — HTTP 200
1175
+ if (resp2.body.length > maxBytes) {
1176
+ throw new MailCryptoError("mail-crypto/pgp/wkd-too-large",
1177
+ "wkd.fetch: key bytes " + resp2.body.length + " exceed maxKeyBytes=" + maxBytes);
1178
+ }
1179
+ return { keyBytes: resp2.body, source: "advanced", url: urls.advanced };
1180
+ }
1181
+ throw new MailCryptoError("mail-crypto/pgp/wkd-not-found",
1182
+ "wkd.fetch: neither direct nor advanced URL returned a key for " + email);
1183
+ });
1184
+ });
1185
+ }
1186
+
1187
+ function wkdComputeUrl(email, opts) {
1188
+ opts = opts || {};
1189
+ if (typeof email !== "string" || email.indexOf("@") <= 0 || email.indexOf("@") === email.length - 1) {
1190
+ throw new MailCryptoError("mail-crypto/pgp/bad-email",
1191
+ "wkd.computeUrl: email must be a 'local@domain' string");
1192
+ }
1193
+ // RFC 5321 §4.5.3.1 — practical email-length cap. 320 octets is the
1194
+ // upper bound (64 local + 1 @ + 255 domain). Refuse beyond that BEFORE
1195
+ // any further processing to defend tokenisation paths against
1196
+ // adversarial-length inputs.
1197
+ if (email.length > 320) { // allow:raw-byte-literal — RFC 5321 max email length
1198
+ throw new MailCryptoError("mail-crypto/pgp/bad-email",
1199
+ "wkd.computeUrl: email length " + email.length + " exceeds RFC 5321 max 320 octets");
1200
+ }
1201
+ var at = email.indexOf("@");
1202
+ var localRaw = email.slice(0, at);
1203
+ var localLower = localRaw.toLowerCase();
1204
+ var domain = email.slice(at + 1).toLowerCase();
1205
+ // IDN-homograph defense — refuse domains with bytes outside the
1206
+ // LDH+dot ASCII subset (RFC 952 / RFC 1123 §2). Operators with IDN
1207
+ // (internationalised) domains MUST Punycode-encode upstream
1208
+ // (RFC 3492 `xn--` form). Cyrillic / Greek / Han homograph attacks
1209
+ // (`paypa1` lookalike etc.) are the threat model — the WKD URL has
1210
+ // to be an unambiguous host string, and the framework's b.httpClient
1211
+ // already refuses non-ASCII hostnames at the SSRF guard, so this
1212
+ // surface is the canonical refusal point.
1213
+ if (!/^[a-z0-9.-]+$/.test(domain)) {
1214
+ throw new MailCryptoError("mail-crypto/pgp/bad-domain",
1215
+ "wkd.computeUrl: domain must be ASCII LDH+dot (Punycode-encode IDN domains upstream; RFC 3492 xn-- form)");
1216
+ }
1217
+ if (domain.indexOf("..") !== -1 || domain.charAt(0) === "." || domain.charAt(domain.length - 1) === ".") {
1218
+ throw new MailCryptoError("mail-crypto/pgp/bad-domain",
1219
+ "wkd.computeUrl: domain must not contain empty labels");
1220
+ }
1221
+ if (domain.length > 253) { // allow:raw-byte-literal — RFC 1035 §2.3.4 max domain length
1222
+ throw new MailCryptoError("mail-crypto/pgp/bad-domain",
1223
+ "wkd.computeUrl: domain length " + domain.length + " exceeds RFC 1035 max 253 octets");
1224
+ }
1225
+ var hashed = bCrypto.kdf(Buffer.from(localLower, "utf8"), 20); // allow:raw-byte-literal — 20-byte hash per draft-koch §3.1
1226
+ var encoded = _zbase32Encode(hashed);
1227
+ var advancedHost = opts.advancedHost || ("openpgpkey." + domain);
1228
+ var encodedLocal = encodeURIComponent(localRaw);
1229
+ return {
1230
+ direct: "https://" + domain + "/.well-known/openpgpkey/hu/" + encoded + "?l=" + encodedLocal,
1231
+ advanced: "https://" + advancedHost + "/.well-known/openpgpkey/" + domain + "/hu/" + encoded + "?l=" + encodedLocal,
1232
+ hashed: encoded,
1233
+ localLower: localLower,
1234
+ domain: domain,
1235
+ };
1236
+ }
1237
+
1238
+ var ZBASE32_ALPHABET = "ybndrfg8ejkmcpqxot1uwisza345h769";
1239
+
1240
+ function _zbase32Encode(buf) {
1241
+ var bits = 0;
1242
+ var bitCount = 0;
1243
+ var out = "";
1244
+ for (var i = 0; i < buf.length; i += 1) {
1245
+ bits = (bits << 8) | buf[i]; // allow:raw-byte-literal — 8 bits per input byte
1246
+ bitCount += 8; // allow:raw-byte-literal — 8 bits per input byte
1247
+ while (bitCount >= 5) { // allow:raw-byte-literal — 5 bits per zbase32 char
1248
+ bitCount -= 5; // allow:raw-byte-literal — 5 bits per zbase32 char
1249
+ out += ZBASE32_ALPHABET.charAt((bits >> bitCount) & 0x1f); // allow:raw-byte-literal — 5-bit mask
1250
+ }
1251
+ }
1252
+ if (bitCount > 0) {
1253
+ out += ZBASE32_ALPHABET.charAt((bits << (5 - bitCount)) & 0x1f); // allow:raw-byte-literal — final partial char
1254
+ }
1255
+ return out;
1256
+ }
1257
+
1258
+ module.exports = {
1259
+ sign: sign,
1260
+ verify: verify,
1261
+ // v0.11.32 — encrypt / decrypt / wkd promoted to stable top-level
1262
+ // surface. The framework-private envelope (BJ-PGP-PQ magic + version)
1263
+ // is the same one the experimental namespace shipped at v0.10.16;
1264
+ // the IANA-pending RFC 9580bis ML-KEM PKESK codepoints will be
1265
+ // wired as an alternate-encoding option in a follow-up slice. Until
1266
+ // then the `experimental` alias keeps the v0.10.16 import paths
1267
+ // working — operators migrate at their own pace.
1268
+ encrypt: experimentalEncrypt,
1269
+ decrypt: experimentalDecrypt,
1270
+ wkd: {
1271
+ computeUrl: wkdComputeUrl,
1272
+ fetch: wkdFetch,
1273
+ },
1274
+ experimental: {
1275
+ encrypt: experimentalEncrypt,
1276
+ decrypt: experimentalDecrypt,
1277
+ wkd: {
1278
+ computeUrl: wkdComputeUrl,
1279
+ fetch: wkdFetch,
1280
+ },
1281
+ },
1282
+ MailCryptoError: MailCryptoError,
1283
+ _v4FingerprintForTest: _v4Fingerprint,
1284
+ _armorForTest: _armor,
1285
+ _dearmorForTest: _dearmor,
1286
+ };