@blamejs/blamejs-shop 0.5.12 → 0.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -371,8 +371,235 @@ async function testBackupPostureRefusesPlaintext() {
371
371
  refused2 && /posture-requires-encryption/.test(refused2.code || refused2.message));
372
372
  }
373
373
 
374
+ var STRONG_PASSPHRASE = "aLongCorrectHorseBatteryStaple9876!Phrase"; // ~227 bits estimated
375
+
376
+ async function testWrapInputValidation() {
377
+ var pair = b.crypto.generateEncryptionKeyPair();
378
+
379
+ // Non-Buffer / non-Uint8Array bytes → bad-input.
380
+ var badInput = null;
381
+ try { b.archive.wrap("not a buffer", { recipient: pair }); } catch (e) { badInput = e; }
382
+ check("archive.wrap: non-Buffer bytes refused with bad-input",
383
+ badInput && /bad-input/.test(badInput.code || badInput.message));
384
+
385
+ // Zero-length bytes → empty-input (nothing to seal).
386
+ var emptyErr = null;
387
+ try { b.archive.wrap(Buffer.alloc(0), { recipient: pair }); } catch (e) { emptyErr = e; }
388
+ check("archive.wrap: empty bytes refused with empty-input",
389
+ emptyErr && /empty-input/.test(emptyErr.code || emptyErr.message));
390
+
391
+ // A recipient string that is not "tenant" → bad-recipient.
392
+ var badStrErr = null;
393
+ try { b.archive.wrap(Buffer.from("x"), { recipient: "nonsense" }); } catch (e) { badStrErr = e; }
394
+ check("archive.wrap: unrecognised recipient string refused with bad-recipient",
395
+ badStrErr && /bad-recipient/.test(badStrErr.code || badStrErr.message));
396
+
397
+ // An empty recipient object (no publicKey / peerCert*) → bad-recipient.
398
+ var emptyObjErr = null;
399
+ try { b.archive.wrap(Buffer.from("x"), { recipient: {} }); } catch (e) { emptyObjErr = e; }
400
+ check("archive.wrap: empty recipient object refused with bad-recipient",
401
+ emptyObjErr && /bad-recipient/.test(emptyObjErr.code || emptyObjErr.message));
402
+
403
+ // Partial peer-cert recipient (only one of the two halves) → bad-recipient.
404
+ var partialCertErr = null;
405
+ try {
406
+ b.archive.wrap(Buffer.from("x"), { recipient: { peerCertDer: Buffer.from("cert") } });
407
+ } catch (e) { partialCertErr = e; }
408
+ check("archive.wrap: peer-cert recipient missing peerKemPubkey refused",
409
+ partialCertErr && /bad-recipient/.test(partialCertErr.code || partialCertErr.message));
410
+
411
+ var partialCertErr2 = null;
412
+ try {
413
+ b.archive.wrap(Buffer.from("x"), { recipient: { peerKemPubkey: "kem" } });
414
+ } catch (e) { partialCertErr2 = e; }
415
+ check("archive.wrap: peer-cert recipient missing peerCertDer refused",
416
+ partialCertErr2 && /bad-recipient/.test(partialCertErr2.code || partialCertErr2.message));
417
+
418
+ // Uint8Array (non-Buffer) input round-trips through the static-key path.
419
+ var u8 = new Uint8Array(Buffer.from("uint8 archive bytes ".repeat(10)));
420
+ var sealedU8 = b.archive.wrap(u8, { recipient: pair });
421
+ var recoveredU8 = b.archive.unwrap(sealedU8, { recipient: pair });
422
+ check("archive.wrap: Uint8Array input round-trips losslessly",
423
+ recoveredU8.equals(Buffer.from(u8)));
424
+ }
425
+
426
+ async function testUnwrapInputValidation() {
427
+ var pair = b.crypto.generateEncryptionKeyPair();
428
+
429
+ // Non-Buffer sealed input → bad-input.
430
+ var badInput = null;
431
+ try { b.archive.unwrap("not a buffer", { recipient: pair }); } catch (e) { badInput = e; }
432
+ check("archive.unwrap: non-Buffer sealed refused with bad-input",
433
+ badInput && /bad-input/.test(badInput.code || badInput.message));
434
+
435
+ // Input shorter than the 6-byte header → bad-magic (not a crypto error).
436
+ var shortErr = null;
437
+ try { b.archive.unwrap(Buffer.from("BAW"), { recipient: pair }); } catch (e) { shortErr = e; }
438
+ check("archive.unwrap: sub-header-length input refused with bad-magic",
439
+ shortErr && /bad-magic/.test(shortErr.code || shortErr.message));
440
+
441
+ // A well-formed BAWRP envelope with an unknown version byte → bad-version.
442
+ var sealed = b.archive.wrap(Buffer.from("archive bytes"), { recipient: pair });
443
+ var tampered = Buffer.from(sealed);
444
+ tampered[5] = 0x09; // neither 0x01 (recipient) nor 0x02 (tenant)
445
+ var badVerErr = null;
446
+ try { b.archive.unwrap(tampered, { recipient: pair }); } catch (e) { badVerErr = e; }
447
+ check("archive.unwrap: unknown version byte refused with bad-version",
448
+ badVerErr && /bad-version/.test(badVerErr.code || badVerErr.message));
449
+
450
+ // A recipient (v0x01) envelope unwrapped with no recipient → no-recipient.
451
+ var noRecipErr = null;
452
+ try { b.archive.unwrap(sealed, {}); } catch (e) { noRecipErr = e; }
453
+ check("archive.unwrap: recipient envelope without opts.recipient refused with no-recipient",
454
+ noRecipErr && /no-recipient/.test(noRecipErr.code || noRecipErr.message));
455
+
456
+ // A recipient (v0x01) envelope with a non-object recipient → no-recipient.
457
+ var strRecipErr = null;
458
+ try { b.archive.unwrap(sealed, { recipient: "tenant" }); } catch (e) { strRecipErr = e; }
459
+ check("archive.unwrap: recipient envelope with string recipient refused with no-recipient",
460
+ strRecipErr && /no-recipient/.test(strRecipErr.code || strRecipErr.message));
461
+ }
462
+
463
+ async function testPassphraseInputValidation() {
464
+ // wrapWithPassphrase: non-Buffer bytes → bad-input.
465
+ var badInput = null;
466
+ try {
467
+ await b.archive.wrapWithPassphrase("not a buffer", { passphrase: STRONG_PASSPHRASE });
468
+ } catch (e) { badInput = e; }
469
+ check("archive.wrapWithPassphrase: non-Buffer bytes refused with bad-input",
470
+ badInput && /bad-input/.test(badInput.code || badInput.message));
471
+
472
+ // wrapWithPassphrase: empty bytes → empty-input.
473
+ var emptyErr = null;
474
+ try {
475
+ await b.archive.wrapWithPassphrase(Buffer.alloc(0), { passphrase: STRONG_PASSPHRASE });
476
+ } catch (e) { emptyErr = e; }
477
+ check("archive.wrapWithPassphrase: empty bytes refused with empty-input",
478
+ emptyErr && /empty-input/.test(emptyErr.code || emptyErr.message));
479
+
480
+ // wrapWithPassphrase: missing / wrong-typed passphrase → no-passphrase.
481
+ var noPassErr = null;
482
+ try {
483
+ await b.archive.wrapWithPassphrase(Buffer.from("x"), { passphrase: 12345 });
484
+ } catch (e) { noPassErr = e; }
485
+ check("archive.wrapWithPassphrase: numeric passphrase refused with no-passphrase",
486
+ noPassErr && /no-passphrase/.test(noPassErr.code || noPassErr.message));
487
+
488
+ // wrapWithPassphrase: negative minEntropyBits → bad-arg (finite-and->=0 gate).
489
+ var negEntropyErr = null;
490
+ try {
491
+ await b.archive.wrapWithPassphrase(Buffer.from("x"), {
492
+ passphrase: STRONG_PASSPHRASE,
493
+ minEntropyBits: -5,
494
+ });
495
+ } catch (e) { negEntropyErr = e; }
496
+ check("archive.wrapWithPassphrase: negative minEntropyBits refused with bad-arg",
497
+ negEntropyErr && /bad-arg/.test(negEntropyErr.code || negEntropyErr.message));
498
+
499
+ // unwrapWithPassphrase: non-Buffer sealed → bad-input.
500
+ var uBadInput = null;
501
+ try {
502
+ await b.archive.unwrapWithPassphrase("not a buffer", { passphrase: STRONG_PASSPHRASE });
503
+ } catch (e) { uBadInput = e; }
504
+ check("archive.unwrapWithPassphrase: non-Buffer sealed refused with bad-input",
505
+ uBadInput && /bad-input/.test(uBadInput.code || uBadInput.message));
506
+
507
+ // unwrapWithPassphrase: sub-header-length input → bad-magic.
508
+ var uShortErr = null;
509
+ try {
510
+ await b.archive.unwrapWithPassphrase(Buffer.from("BAWP"), { passphrase: STRONG_PASSPHRASE });
511
+ } catch (e) { uShortErr = e; }
512
+ check("archive.unwrapWithPassphrase: sub-header input refused with bad-magic",
513
+ uShortErr && /bad-magic/.test(uShortErr.code || uShortErr.message));
514
+
515
+ // unwrapWithPassphrase: BAWPP with an unknown version byte → bad-version.
516
+ var realSealed = await b.archive.wrapWithPassphrase(Buffer.from("PHI bytes"), {
517
+ passphrase: STRONG_PASSPHRASE,
518
+ });
519
+ var verTampered = Buffer.from(realSealed);
520
+ verTampered[5] = 0x09;
521
+ var uBadVerErr = null;
522
+ try {
523
+ await b.archive.unwrapWithPassphrase(verTampered, { passphrase: STRONG_PASSPHRASE });
524
+ } catch (e) { uBadVerErr = e; }
525
+ check("archive.unwrapWithPassphrase: unknown version byte refused with bad-version",
526
+ uBadVerErr && /bad-version/.test(uBadVerErr.code || uBadVerErr.message));
527
+
528
+ // unwrapWithPassphrase: valid magic/version but no passphrase → no-passphrase.
529
+ var uNoPassErr = null;
530
+ try {
531
+ await b.archive.unwrapWithPassphrase(realSealed, {});
532
+ } catch (e) { uNoPassErr = e; }
533
+ check("archive.unwrapWithPassphrase: missing passphrase refused with no-passphrase",
534
+ uNoPassErr && /no-passphrase/.test(uNoPassErr.code || uNoPassErr.message));
535
+
536
+ // unwrapWithPassphrase: header claims a salt longer than the remaining
537
+ // bytes → truncated-envelope (adversarial length field).
538
+ var truncated = Buffer.concat([
539
+ Buffer.from("BAWPP", "ascii"),
540
+ Buffer.from([0x01, 0xff]), // version 0x01, saltLen 255
541
+ Buffer.from("too-short-for-255"),
542
+ ]);
543
+ var truncErr = null;
544
+ try {
545
+ await b.archive.unwrapWithPassphrase(truncated, { passphrase: STRONG_PASSPHRASE });
546
+ } catch (e) { truncErr = e; }
547
+ check("archive.unwrapWithPassphrase: oversized saltLen refused with truncated-envelope",
548
+ truncErr && /truncated-envelope/.test(truncErr.code || truncErr.message));
549
+ }
550
+
551
+ async function testRewrapTenantMoreRefusals() {
552
+ // Sub-header-length blob → bad-magic (no vault needed for this branch).
553
+ var shortErr = null;
554
+ try {
555
+ b.archive.rewrapTenant({ blob: Buffer.from("BA"), oldRootJson: "x", newRootJson: "y", tenantId: "alpha" });
556
+ } catch (e) { shortErr = e; }
557
+ check("rewrapTenant: sub-header blob refused with bad-magic",
558
+ shortErr && /bad-magic/.test(shortErr.code || shortErr.message));
559
+
560
+ var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-aw-rewrap-more-"));
561
+ try {
562
+ await helpers.setupVaultOnly(tmpDir);
563
+ var root = b.vault.getKeysJson();
564
+ var sealed = b.archive.wrap(Buffer.from("tenant bytes"), { recipient: "tenant", tenantId: "alpha" });
565
+
566
+ // Missing newRootJson (old root present, blob opens) → bad-root on the
567
+ // re-key leg.
568
+ var noNewRootErr = null;
569
+ try {
570
+ b.archive.rewrapTenant({ blob: sealed, oldRootJson: root, tenantId: "alpha" });
571
+ } catch (e) { noNewRootErr = e; }
572
+ check("rewrapTenant: missing newRootJson refused with bad-root",
573
+ noNewRootErr && /bad-root/.test(noNewRootErr.code || noNewRootErr.message));
574
+ } finally {
575
+ helpers.teardownVaultOnly(tmpDir);
576
+ }
577
+ }
578
+
579
+ async function testUnwrapTenantMissingId() {
580
+ var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-aw-unwrap-noid-"));
581
+ try {
582
+ await helpers.setupVaultOnly(tmpDir);
583
+ var sealed = b.archive.wrap(Buffer.from("tenant bytes"), { recipient: "tenant", tenantId: "alpha" });
584
+ // A tenant (v0x02) envelope unwrapped with recipient "tenant" but no
585
+ // tenantId → no-tenant-id from the unwrap dispatch path (distinct from
586
+ // the wrap-side no-tenant-id already covered).
587
+ var noIdErr = null;
588
+ try { b.archive.unwrap(sealed, { recipient: "tenant" }); } catch (e) { noIdErr = e; }
589
+ check("archive.unwrap tenant: missing tenantId on unwrap refused with no-tenant-id",
590
+ noIdErr && /no-tenant-id/.test(noIdErr.code || noIdErr.message));
591
+ } finally {
592
+ helpers.teardownVaultOnly(tmpDir);
593
+ }
594
+ }
595
+
374
596
  async function run() {
375
597
  await testWrapUnwrapRoundTrip();
598
+ await testWrapInputValidation();
599
+ await testUnwrapInputValidation();
600
+ await testPassphraseInputValidation();
601
+ await testRewrapTenantMoreRefusals();
602
+ await testUnwrapTenantMissingId();
376
603
  await testWrapRefusesBadMagic();
377
604
  await testWrapRefusesWrongKey();
378
605
  await testWrapRefusesPartialStaticRecipient();
@@ -232,6 +232,21 @@ function run() {
232
232
  var rawShort = b.argParser.parseRaw(["-v"]);
233
233
  check("parseRaw: -v shortcut", rawShort.flags.v === true);
234
234
 
235
+ // ---- parseRaw booleanNames: a declared flag never swallows a value ----
236
+ var rawBn = b.argParser.parseRaw(["--version", "up", "--db", "x"], { booleanNames: ["version"] });
237
+ check("parseRaw booleanNames: bare --version stays boolean, next token is positional",
238
+ rawBn.flags.version === true && rawBn.pos.length === 1 && rawBn.pos[0] === "up" && rawBn.flags.db === "x");
239
+ var rawBnMid = b.argParser.parseRaw(["migrate", "--version", "up"], { booleanNames: ["version"] });
240
+ check("parseRaw booleanNames: token after a mid-argv --version stays a positional in order",
241
+ rawBnMid.flags.version === true && rawBnMid.pos.length === 2 &&
242
+ rawBnMid.pos[0] === "migrate" && rawBnMid.pos[1] === "up");
243
+ var rawBnEq = b.argParser.parseRaw(["--version=x"], { booleanNames: ["version"] });
244
+ check("parseRaw booleanNames: inline --version=x still records the explicit value",
245
+ rawBnEq.flags.version === "x");
246
+ var rawBnOther = b.argParser.parseRaw(["--arg", "-v"], { booleanNames: ["version"] });
247
+ check("parseRaw booleanNames: a NON-declared flag still consumes its value",
248
+ rawBnOther.flags.arg === "-v");
249
+
235
250
  var rawProtoThrew = _threw(function () { b.argParser.parseRaw(["--__proto__", "x"]); });
236
251
  check("parseRaw: __proto__ rejected",
237
252
  !!rawProtoThrew && rawProtoThrew.isArgParserError);
@@ -10,6 +10,7 @@
10
10
 
11
11
  var helpers = require("../helpers");
12
12
  var check = helpers.check;
13
+ var b = helpers.b;
13
14
  var asn1 = require("../../lib/asn1-der");
14
15
 
15
16
  function testReadNodeShortFormLength() {
@@ -133,12 +134,84 @@ function testHighTagNumberNoOverflow() {
133
134
  threw && threw.code === "asn1/tag-too-large");
134
135
  }
135
136
 
137
+ function testNonMinimalLongFormLengthRejected() {
138
+ // X.690 §10.1: DER requires the MINIMUM number of length octets. A short-
139
+ // formable length (< 128) encoded in long form is non-minimal BER, not DER.
140
+ // 0x30 0x81 0x03 0x02 0x01 0x05 encodes length 3 in a 2-octet long form
141
+ // where the single short-form octet 0x03 is required. The parser rejects
142
+ // every other BER-ism (indefinite length, non-minimal OID subidentifiers,
143
+ // non-minimal high-tag-number tags), so it must reject this one too.
144
+ var buf = Buffer.from([0x30, 0x81, 0x03, 0x02, 0x01, 0x05]);
145
+ var threw = null;
146
+ try { asn1.readNode(buf); } catch (e) { threw = e; }
147
+ check("readNode: non-minimal long-form length (0x81 0x03) is refused",
148
+ threw && threw.code === "asn1/length-non-minimal");
149
+ }
150
+
151
+ function testLeadingZeroLengthOctetRejected() {
152
+ // 0x82 0x00 0x7f encodes length 127 with a leading-zero length octet — a
153
+ // strict-DER parser refuses the redundant octet (short form 0x7f is
154
+ // required). Aliases a value to two distinct wire encodings otherwise.
155
+ var body = Buffer.alloc(127, 0xaa);
156
+ var buf = Buffer.concat([Buffer.from([0x04, 0x82, 0x00, 0x7f]), body]);
157
+ var threw = null;
158
+ try { asn1.readNode(buf); } catch (e) { threw = e; }
159
+ check("readNode: leading-zero length octet (0x82 0x00 0x7f) is refused",
160
+ threw && threw.code === "asn1/length-non-minimal");
161
+ }
162
+
163
+ function testMinimalLongFormLengthAccepted() {
164
+ // Control: a genuinely long value (300 bytes) needs the 3-octet long form
165
+ // 0x82 0x01 0x2c, which IS minimal — the strictness check must NOT reject
166
+ // it. Guards against a fix that over-rejects legitimate long-form DER.
167
+ var body = Buffer.alloc(300, 0xbb);
168
+ var octet = asn1.writeOctetString(body); // encoder emits 04 82 01 2c ...
169
+ var node = asn1.readNode(octet);
170
+ check("readNode: minimal long-form length (0x82 0x01 0x2c) is accepted",
171
+ node.length === 300 && Buffer.compare(asn1.readOctetString(node), body) === 0);
172
+ // Boundary: length 128 is the first value that REQUIRES long form (short
173
+ // form maxes at 127); 0x81 0x80 is minimal and must be accepted.
174
+ var body128 = Buffer.alloc(128, 0xcc);
175
+ var octet128 = asn1.writeOctetString(body128); // 04 81 80 ...
176
+ check("readNode: minimal long-form at the 128-byte boundary is accepted",
177
+ asn1.readNode(octet128).length === 128);
178
+ // Boundary: length 127 is the last short-form value; must round-trip.
179
+ var body127 = Buffer.alloc(127, 0xdd);
180
+ check("readNode: short-form length 127 is accepted",
181
+ asn1.readNode(asn1.writeOctetString(body127)).length === 127);
182
+ }
183
+
184
+ function testCmsDecodeRefusesNonMinimalLength() {
185
+ // Consumer path: b.cms.decode routes the top-level ContentInfo through
186
+ // readNode. A non-minimal outer SEQUENCE length must be refused as
187
+ // cms/bad-asn1 rather than silently parsed — otherwise a BER/DER parser-
188
+ // differential encoding of an attacker-supplied CMS is accepted.
189
+ var inner = Buffer.concat([
190
+ asn1.writeOid("1.2.840.113549.1.7.1"),
191
+ asn1.writeContextExplicit(0, asn1.writeNull()),
192
+ ]);
193
+ // Canonical short-form outer length would be one octet; force long form.
194
+ var nonMinimal = Buffer.concat([Buffer.from([0x30, 0x81, inner.length]), inner]);
195
+ var threw = null;
196
+ try { b.cms.decode(nonMinimal); } catch (e) { threw = e; }
197
+ check("b.cms.decode: non-minimal ContentInfo length is refused (cms/bad-asn1)",
198
+ threw && threw.code === "cms/bad-asn1");
199
+ // Control: the DER-minimal encoding of the same ContentInfo still decodes.
200
+ var canonical = asn1.writeNode(0x30, inner);
201
+ check("b.cms.decode: the DER-minimal ContentInfo still decodes",
202
+ b.cms.decode(canonical).contentType === "1.2.840.113549.1.7.1");
203
+ }
204
+
136
205
  async function run() {
137
206
  testReadNodeShortFormLength();
138
207
  testReadOid();
139
208
  testOidFirstSubidMultibyte();
140
209
  testOidNonMinimalRejected();
141
210
  testHighTagNumberNoOverflow();
211
+ testNonMinimalLongFormLengthRejected();
212
+ testLeadingZeroLengthOctetRejected();
213
+ testMinimalLongFormLengthAccepted();
214
+ testCmsDecodeRefusesNonMinimalLength();
142
215
  testReadSequence();
143
216
  testReadOctetString();
144
217
  testReadBitString();
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * Layer 0 — b.atomicFile.cleanOrphans boot-time orphan sweep.
6
+ *
7
+ * A crashed atomic write leaves a sibling temp file named
8
+ * `<filepath>.tmp-<token>`. cleanOrphans globs those by prefix and prunes
9
+ * the ones older than `olderThanMs` (default 5 minutes), leaving fresh
10
+ * in-flight temps and every unrelated file untouched. This drives the real
11
+ * consumer path: real orphan temp files planted in a scratch dir, aged past
12
+ * the threshold via mtime backdating, then swept.
13
+ */
14
+
15
+ var helpers = require("../helpers");
16
+ var check = helpers.check;
17
+ var b = helpers.b;
18
+ var backdateFile = helpers.backdateFile;
19
+ var os = require("node:os");
20
+ var path = require("node:path");
21
+ var fs = require("node:fs");
22
+
23
+ function _plant(fp, token, body) {
24
+ var p = fp + ".tmp-" + token;
25
+ fs.writeFileSync(p, body || token);
26
+ return p;
27
+ }
28
+
29
+ function testCleanOrphansDefault() {
30
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "bjs-orphan-def-"));
31
+ var fp = path.join(dir, "vault.key.sealed");
32
+ try {
33
+ // Files that MUST survive: the real sealed file + an unrelated sibling.
34
+ fs.writeFileSync(fp, "real-sealed-contents");
35
+ var unrelated = path.join(dir, "other.txt");
36
+ fs.writeFileSync(unrelated, "leave-me");
37
+
38
+ // Stale orphan, aged an hour into the past (well past the 5-min default).
39
+ var stale = _plant(fp, "staleaaaa");
40
+ backdateFile(stale);
41
+ // Fresh in-flight temp (mtime ~now) — MUST survive the default sweep.
42
+ var fresh = _plant(fp, "freshbbbb");
43
+
44
+ // Default olderThanMs is documented as 300000 (5 minutes).
45
+ var removed = b.atomicFile.cleanOrphans(fp);
46
+ check("atomicFile.cleanOrphans: default removes the stale orphan", removed === 1);
47
+ check("atomicFile.cleanOrphans: stale orphan unlinked", !fs.existsSync(stale));
48
+ check("atomicFile.cleanOrphans: fresh temp survives default", fs.existsSync(fresh));
49
+ check("atomicFile.cleanOrphans: real sealed file untouched", fs.existsSync(fp));
50
+ check("atomicFile.cleanOrphans: unrelated sibling untouched", fs.existsSync(unrelated));
51
+ } finally {
52
+ fs.rmSync(dir, { recursive: true, force: true });
53
+ }
54
+ }
55
+
56
+ function testCleanOrphansExplicitThreshold() {
57
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "bjs-orphan-thr-"));
58
+ var fp = path.join(dir, "db.enc");
59
+ try {
60
+ var stale1 = _plant(fp, "aaaa");
61
+ var stale2 = _plant(fp, "bbbb");
62
+ backdateFile(stale1);
63
+ backdateFile(stale2);
64
+ var fresh = _plant(fp, "cccc");
65
+
66
+ var removed = b.atomicFile.cleanOrphans(fp, { olderThanMs: 300000 });
67
+ check("atomicFile.cleanOrphans: explicit threshold removes both stale", removed === 2);
68
+ check("atomicFile.cleanOrphans: stale1 gone", !fs.existsSync(stale1));
69
+ check("atomicFile.cleanOrphans: stale2 gone", !fs.existsSync(stale2));
70
+ check("atomicFile.cleanOrphans: fresh temp survives", fs.existsSync(fresh));
71
+
72
+ // Age is the sole driver: once the surviving temp is itself aged past
73
+ // the threshold, the next sweep prunes it too. (Backdating avoids the
74
+ // fs-mtime-granularity knife-edge of a just-created file at age 0.)
75
+ backdateFile(fresh);
76
+ var removedAged = b.atomicFile.cleanOrphans(fp, { olderThanMs: 300000 });
77
+ check("atomicFile.cleanOrphans: newly-aged temp now pruned", removedAged === 1);
78
+ check("atomicFile.cleanOrphans: aged temp gone", !fs.existsSync(fresh));
79
+ } finally {
80
+ fs.rmSync(dir, { recursive: true, force: true });
81
+ }
82
+ }
83
+
84
+ function testCleanOrphansNoOrphans() {
85
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "bjs-orphan-none-"));
86
+ var fp = path.join(dir, "audit-sign.key.sealed");
87
+ try {
88
+ fs.writeFileSync(fp, "sealed");
89
+ // A same-directory temp for a DIFFERENT basename must not be swept —
90
+ // the prefix match is anchored to this filepath's basename.
91
+ var otherTemp = path.join(dir, "vault.key.sealed.tmp-zzzz");
92
+ fs.writeFileSync(otherTemp, "not-mine");
93
+ backdateFile(otherTemp);
94
+
95
+ var removed = b.atomicFile.cleanOrphans(fp, { olderThanMs: 300000 });
96
+ check("atomicFile.cleanOrphans: no matching orphans → 0", removed === 0);
97
+ check("atomicFile.cleanOrphans: foreign-basename temp untouched", fs.existsSync(otherTemp));
98
+ } finally {
99
+ fs.rmSync(dir, { recursive: true, force: true });
100
+ }
101
+ }
102
+
103
+ function run() {
104
+ testCleanOrphansDefault();
105
+ testCleanOrphansExplicitThreshold();
106
+ testCleanOrphansNoOrphans();
107
+ }
108
+
109
+ module.exports = { run: run };
110
+
111
+ if (require.main === module) {
112
+ run();
113
+ console.log("OK — " + helpers.getChecks() + " checks passed");
114
+ }
@@ -81,6 +81,139 @@ async function run() {
81
81
  var threw = false;
82
82
  try { as.anchor({ counter: 1 }); } catch (e) { threw = e.code === "ANCHOR_BAD_TIPHASH"; }
83
83
  check("anchor throws a typed error on a malformed tip", threw);
84
+
85
+ // ---- Signed-bytes canonicalization: the record delimiter must not be a
86
+ // field value. anchorPayload joins format / counter / tipHash / prevTipHash
87
+ // / createdAt with "\n". If a string field carries a "\n", content can
88
+ // migrate across a field boundary WITHOUT changing the signed bytes, so ONE
89
+ // signature is valid for several different { tipHash, prevTipHash } splits:
90
+ // a signature minted for one split verifies for a boundary-shifted twin,
91
+ // defeating the "prevTipHash is bound into the signature" linkage guarantee.
92
+ // RED before the fix (both twins verified true); fail-closed after.
93
+ var fmt = a1.format;
94
+ var kCounter = 5, kCreatedAt = 99;
95
+ var tipA = "X", prevA = "Y\nZ"; // split A
96
+ var tipB = "X\nY", prevB = "Z"; // split B -- identical signed bytes
97
+ var bytesA = Buffer.from(fmt + "\n" + kCounter + "\n" + tipA + "\n" + prevA + "\n" + kCreatedAt, "utf8");
98
+ var bytesB = Buffer.from(fmt + "\n" + kCounter + "\n" + tipB + "\n" + prevB + "\n" + kCreatedAt, "utf8");
99
+ check("two field-boundary splits produce identical signed bytes (the collision)",
100
+ bytesA.equals(bytesB));
101
+ var collisionSig = as.sign(bytesA).toString("hex");
102
+ var collisionBase = {
103
+ format: fmt, counter: kCounter, createdAt: kCreatedAt,
104
+ algorithm: as.getAlgorithm(), publicKeyFingerprint: as.getPublicKeyFingerprint(),
105
+ signature: collisionSig,
106
+ };
107
+ var anchorSplitA = Object.assign({}, collisionBase, { tipHash: tipA, prevTipHash: prevA });
108
+ var anchorSplitB = Object.assign({}, collisionBase, { tipHash: tipB, prevTipHash: prevB });
109
+ check("verifyAnchor fails closed on a delimiter-bearing prevTipHash (canonicalization)",
110
+ as.verifyAnchor(anchorSplitA).ok === false);
111
+ check("verifyAnchor fails closed on the boundary-shifted twin (same signature, different tipHash)",
112
+ as.verifyAnchor(anchorSplitB).ok === false);
113
+
114
+ // Sign-side: minting an ambiguous signature is refused up front, so the
115
+ // collision above can never be produced through the public API.
116
+ var threwTipNL = false;
117
+ try { as.anchor({ counter: 1, tipHash: "a\nb" }); }
118
+ catch (e) { threwTipNL = e.code === "ANCHOR_BAD_TIPHASH"; }
119
+ check("anchor refuses a tipHash carrying the record delimiter", threwTipNL);
120
+ var threwPrevNL = false;
121
+ try { as.anchor({ counter: 1, tipHash: "ok", prevTipHash: "a\nb" }); }
122
+ catch (e) { threwPrevNL = e.code === "ANCHOR_BAD_PREV"; }
123
+ check("anchor refuses a prevTipHash carrying the record delimiter", threwPrevNL);
124
+ var threwFmtNL = false;
125
+ try { as.anchor({ counter: 1, tipHash: "ok" }, { format: "my\nledger" }); }
126
+ catch (e) { threwFmtNL = e.code === "ANCHOR_BAD_FORMAT"; }
127
+ check("anchor refuses a format carrying the record delimiter", threwFmtNL);
128
+
129
+ // ---- verifyAnchor defensive-reader branches (never throw on adversarial
130
+ // content; return { ok:false }). ----
131
+ check("verifyAnchor rejects a non-object",
132
+ as.verifyAnchor(null).ok === false && as.verifyAnchor(42).ok === false);
133
+ check("verifyAnchor rejects an anchor missing signature / fingerprint",
134
+ as.verifyAnchor({ tipHash: "h1", counter: 1 }).ok === false);
135
+ check("verifyAnchor rejects a non-finite counter",
136
+ as.verifyAnchor(Object.assign({}, a1, { counter: Infinity })).ok === false);
137
+
138
+ // ---- verifyAnchorChain adversarial branches ----
139
+ check("verifyAnchorChain rejects a non-array",
140
+ as.verifyAnchorChain(null).ok === false && as.verifyAnchorChain("nope").ok === false);
141
+ check("verifyAnchorChain on an empty array is a vacuous pass",
142
+ as.verifyAnchorChain([]).ok === true && as.verifyAnchorChain([]).anchorsVerified === 0);
143
+ // Replay: the same anchor twice -> counter not strictly increasing.
144
+ var replay = as.verifyAnchorChain([a1, a2, a2]);
145
+ check("verifyAnchorChain rejects a replayed (duplicate) anchor",
146
+ replay.ok === false && replay.breakAt === 2);
147
+ // Fail-closed default: linkage is REQUIRED unless the caller opts out, so an
148
+ // operator who forgets prevTipHash does not silently get the weaker guarantee.
149
+ var unlinkedDefault = as.verifyAnchorChain([u1, u2]);
150
+ check("verifyAnchorChain requires linkage by default (unlinked non-genesis rejected)",
151
+ unlinkedDefault.ok === false && unlinkedDefault.breakAt === 1);
152
+
153
+ // ---- fingerprintOf / getPublicKeyByFingerprint ----
154
+ var threwFpEmpty = false;
155
+ try { as.fingerprintOf(""); } catch (e) { threwFpEmpty = e.code === "audit-sign/bad-public-key"; }
156
+ var threwFpType = false;
157
+ try { as.fingerprintOf(123); } catch (e) { threwFpType = e.code === "audit-sign/bad-public-key"; }
158
+ check("fingerprintOf throws a typed error on empty / non-string input",
159
+ threwFpEmpty && threwFpType);
160
+ check("fingerprintOf matches getPublicKeyFingerprint for the live key",
161
+ as.fingerprintOf(as.getPublicKey()) === as.getPublicKeyFingerprint());
162
+ check("getPublicKeyByFingerprint returns null for an unknown fingerprint",
163
+ as.getPublicKeyByFingerprint("00ff00ff") === null);
164
+
165
+ // ---- reSignAll: re-sign valid, SKIP tampered / empty, never abort ----
166
+ var reSignSeen = [];
167
+ var okPayload = Buffer.from("resign-ok", "utf8");
168
+ var okEntry = { id: 1, payload: okPayload, signature: as.sign(okPayload), oldPublicKeyPem: as.getPublicKey() };
169
+ var tamperedEntry = {
170
+ id: 2, payload: Buffer.from("resign-tampered", "utf8"),
171
+ signature: as.sign(Buffer.from("a-different-payload", "utf8")), // sig over other bytes -> fails verify
172
+ oldPublicKeyPem: as.getPublicKey(),
173
+ };
174
+ async function* reSignEntries() { yield okEntry; yield tamperedEntry; yield { id: 3 }; }
175
+ var summary = await as.reSignAll(reSignEntries(), {
176
+ onProgress: function (e) { reSignSeen.push(e.id); },
177
+ });
178
+ check("reSignAll re-signs the valid entry and skips tampered + empty",
179
+ summary.reSigned === 1 && summary.skipped === 2 && summary.errors === 0);
180
+ check("reSignAll onProgress fires only for the re-signed entry",
181
+ reSignSeen.length === 1 && reSignSeen[0] === 1);
182
+
183
+ // ---- Key-rotation boundary ----
184
+ var beforeFp = as.getPublicKeyFingerprint();
185
+ var preRotAnchor = as.anchor({ counter: 200, tipHash: "rot-tip" });
186
+ check("anchor verifies before rotation", as.verifyAnchor(preRotAnchor).ok === true);
187
+ // Negative rotations first (no state change): ROTATE_NOOP + ROTATE_BAD_ALG.
188
+ var threwNoop = false;
189
+ try { await as.rotateSigningKey({ publicKeyPem: as.getPublicKey(), privateKeyPem: "unused-for-noop-check" }); }
190
+ catch (e) { threwNoop = e.code === "ROTATE_NOOP"; }
191
+ check("rotateSigningKey refuses a no-op rotation (identical fingerprint)", threwNoop);
192
+ var threwBadAlg = false;
193
+ try {
194
+ await as.rotateSigningKey({
195
+ publicKeyPem: "-----BEGIN PUBLIC KEY-----\nQUJD\n-----END PUBLIC KEY-----",
196
+ privateKeyPem: "unused", algorithm: "not-a-real-alg",
197
+ });
198
+ } catch (e) { threwBadAlg = e.code === "ROTATE_BAD_ALG"; }
199
+ check("rotateSigningKey refuses an unsupported algorithm", threwBadAlg);
200
+ check("failed rotations left the live key untouched", as.getPublicKeyFingerprint() === beforeFp);
201
+
202
+ // Real rotation: fresh key generated, old public key archived to the
203
+ // unsealed history so pre-rotation anchors still verify.
204
+ var rot = await as.rotateSigningKey();
205
+ check("rotation changed the live fingerprint",
206
+ rot.newFingerprint !== beforeFp && as.getPublicKeyFingerprint() === rot.newFingerprint);
207
+ check("pre-rotation anchor still verifies after rotation (history resolves the old key)",
208
+ as.verifyAnchor(preRotAnchor).ok === true);
209
+ check("getPublicKeyByFingerprint resolves the rotated-out key",
210
+ typeof as.getPublicKeyByFingerprint(beforeFp) === "string");
211
+ var postRotAnchor = as.anchor({ counter: 201, tipHash: "rot-tip-2", prevTipHash: "rot-tip" });
212
+ check("post-rotation anchor verifies under the new key",
213
+ as.verifyAnchor(postRotAnchor).ok === true &&
214
+ postRotAnchor.publicKeyFingerprint === rot.newFingerprint);
215
+ check("a chain spanning the rotation boundary verifies end-to-end",
216
+ as.verifyAnchorChain([preRotAnchor, postRotAnchor]).ok === true);
84
217
  } finally {
85
218
  try { b.auditSign._resetForTest(); } catch (_e) { /* best-effort */ }
86
219
  try { fs.rmSync(dir, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
@@ -88,3 +221,11 @@ async function run() {
88
221
  }
89
222
 
90
223
  module.exports = { run: run };
224
+ if (require.main === module) {
225
+ run().then(function () {
226
+ console.log("OK - audit-sign-anchor tests (" + helpers.getChecks() + " checks)");
227
+ }).catch(function (e) {
228
+ console.error(helpers.formatErr(e));
229
+ process.exitCode = 1;
230
+ });
231
+ }