@blamejs/blamejs-shop 0.5.12 → 0.5.14
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.
- package/CHANGELOG.md +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* b.crypto adversarial + malformed-input hardening across the public
|
|
6
|
+
* surface — the error/rejection half of the primitives whose happy path
|
|
7
|
+
* lives in crypto.test.js / crypto-envelope.test.js / crypto-base64url.test.js.
|
|
8
|
+
*
|
|
9
|
+
* Every decrypt / verify assertion here drives the exported consumer path
|
|
10
|
+
* (b.crypto.decrypt / b.crypto.verify / b.crypto.decryptPacked) with a
|
|
11
|
+
* tampered, truncated, wrong-key, wrong-suite, or otherwise hostile input
|
|
12
|
+
* built from real ML-KEM / ML-DSA / SLH-DSA / XChaCha20 fixtures — so the
|
|
13
|
+
* signature-PASSING adversarial shapes (implicit-rejection KEM, bit-flipped
|
|
14
|
+
* AEAD, downgraded suite header) are exercised, not merely parse failures.
|
|
15
|
+
* The security contract under test is fail-CLOSED: a decrypt / verify of a
|
|
16
|
+
* tampered input must reject (throw a typed envelope error, or return false)
|
|
17
|
+
* — never accept, never return a value, never leak a raw runtime error past
|
|
18
|
+
* the module's documented "Invalid envelope: ..." contract.
|
|
19
|
+
*
|
|
20
|
+
* Run standalone: `node test/layer-0-primitives/crypto-adversarial.test.js`
|
|
21
|
+
* Or via smoke: `node test/smoke.js`
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
var helpers = require("../helpers");
|
|
25
|
+
var b = helpers.b;
|
|
26
|
+
var check = helpers.check;
|
|
27
|
+
|
|
28
|
+
// ---- Signature verify: an attacker-controlled signature must NEVER verify
|
|
29
|
+
// true and must NEVER throw (the documented contract: false, not an
|
|
30
|
+
// exception, on a malformed signature). Driven for both PQC signature
|
|
31
|
+
// families the framework auto-detects.
|
|
32
|
+
function testVerifyAdversarial() {
|
|
33
|
+
var pair = b.crypto.generateSigningKeyPair(); // ml-dsa-87 default
|
|
34
|
+
var msg = "audit:row=42|action=delete";
|
|
35
|
+
var sig = b.crypto.sign(msg, pair.privateKey);
|
|
36
|
+
check("sign→verify round-trips (ml-dsa-87)", b.crypto.verify(msg, sig, pair.publicKey) === true);
|
|
37
|
+
|
|
38
|
+
// Every tampered / malformed signature shape → false, no throw.
|
|
39
|
+
var bitflip = Buffer.from(sig); bitflip[0] ^= 0xff;
|
|
40
|
+
check("verify rejects a bit-flipped signature", b.crypto.verify(msg, bitflip, pair.publicKey) === false);
|
|
41
|
+
check("verify rejects a truncated signature", b.crypto.verify(msg, sig.subarray(0, 100), pair.publicKey) === false);
|
|
42
|
+
check("verify rejects an oversized signature", b.crypto.verify(msg, Buffer.concat([sig, Buffer.from([1, 2, 3])]), pair.publicKey) === false);
|
|
43
|
+
check("verify rejects an empty signature", b.crypto.verify(msg, Buffer.alloc(0), pair.publicKey) === false);
|
|
44
|
+
check("verify rejects a garbage signature", b.crypto.verify(msg, Buffer.from("not-a-signature-at-all"), pair.publicKey) === false);
|
|
45
|
+
check("verify rejects a hex-string signature", b.crypto.verify(msg, sig.toString("hex"), pair.publicKey) === false);
|
|
46
|
+
check("verify rejects the right sig over tampered data", b.crypto.verify("audit:row=43|action=delete", sig, pair.publicKey) === false);
|
|
47
|
+
|
|
48
|
+
// A signature that is valid under a DIFFERENT key must not verify under this one.
|
|
49
|
+
var other = b.crypto.generateSigningKeyPair();
|
|
50
|
+
check("verify rejects a signature from a different keypair", b.crypto.verify(msg, sig, other.publicKey) === false);
|
|
51
|
+
|
|
52
|
+
// SLH-DSA-SHAKE-256f — the hash-based family. Round-trip + tamper.
|
|
53
|
+
var slh = b.crypto.generateSigningKeyPair("slh-dsa-shake-256f");
|
|
54
|
+
var slhSig = b.crypto.sign(msg, slh.privateKey);
|
|
55
|
+
check("sign→verify round-trips (slh-dsa-shake-256f)", b.crypto.verify(msg, slhSig, slh.publicKey) === true);
|
|
56
|
+
var slhBad = Buffer.from(slhSig); slhBad[5] ^= 0xff;
|
|
57
|
+
check("verify rejects a tampered slh-dsa signature", b.crypto.verify(msg, slhBad, slh.publicKey) === false);
|
|
58
|
+
// The two families produce distinctly-sized signatures (auto-detect works
|
|
59
|
+
// off the key PEM, not a caller-passed algorithm id).
|
|
60
|
+
check("ml-dsa and slh-dsa signatures differ in length", sig.length !== slhSig.length);
|
|
61
|
+
|
|
62
|
+
// sign() with a public key PEM (operator error) surfaces the failure.
|
|
63
|
+
var signThrew = false;
|
|
64
|
+
try { b.crypto.sign(msg, pair.publicKey); } catch (_e) { signThrew = true; }
|
|
65
|
+
check("sign refuses a public key as the signing key", signThrew);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ---- Envelope decrypt error matrix. Each malformed / hostile envelope
|
|
69
|
+
// must reject with the module's typed "Invalid envelope: ..." contract (or
|
|
70
|
+
// a Poly1305 tag failure), driven through the public b.crypto.decrypt.
|
|
71
|
+
function testDecryptErrorMatrix() {
|
|
72
|
+
var keys = b.crypto.generateEncryptionKeyPair();
|
|
73
|
+
var full = Buffer.from(b.crypto.encrypt("hybrid envelope adversarial body", keys), "base64");
|
|
74
|
+
|
|
75
|
+
function decryptThrows(label, buf, keyMaterial, match) {
|
|
76
|
+
var threw = null;
|
|
77
|
+
try { b.crypto.decrypt(buf.toString("base64"), keyMaterial || keys); }
|
|
78
|
+
catch (e) { threw = e; }
|
|
79
|
+
check(label, threw && match.test(threw.message));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Unsupported magic byte (neither 0xE1 legacy nor 0xE2 current).
|
|
83
|
+
decryptThrows("decrypt refuses an unsupported magic byte", Buffer.alloc(12), keys, /unsupported format/);
|
|
84
|
+
// Too short to hold the 4-byte suite header.
|
|
85
|
+
decryptThrows("decrypt refuses a header shorter than 4 bytes", Buffer.from([0xE2, 0x03, 0x02]), keys, /too short/);
|
|
86
|
+
// Valid header but truncated at the 2-byte KEM-ct length prefix.
|
|
87
|
+
decryptThrows("decrypt refuses truncation at the length prefix", full.subarray(0, 5), keys, /truncated/);
|
|
88
|
+
// Suite-substitution on the header: unsupported cipher / KDF / KEM id.
|
|
89
|
+
var badCipher = Buffer.from(full); badCipher[2] = 0x09;
|
|
90
|
+
decryptThrows("decrypt refuses an unsupported cipher id", badCipher, keys, /unsupported cipher/);
|
|
91
|
+
var badKdf = Buffer.from(full); badKdf[3] = 0x07;
|
|
92
|
+
decryptThrows("decrypt refuses an unsupported KDF id", badKdf, keys, /unsupported KDF/);
|
|
93
|
+
var badKem = Buffer.from(full); badKem[1] = 0x7A;
|
|
94
|
+
decryptThrows("decrypt refuses an unsupported KEM id", badKem, keys, /unsupported KEM ID/);
|
|
95
|
+
|
|
96
|
+
// Hybrid (ML-KEM-1024 + P-384) envelope opened without the EC private key.
|
|
97
|
+
decryptThrows("decrypt refuses a hybrid envelope missing the EC private key",
|
|
98
|
+
full, { privateKey: keys.privateKey }, /Hybrid KEM requires EC private key/);
|
|
99
|
+
|
|
100
|
+
// Implicit-rejection KEM: a bit-flip inside the ML-KEM ciphertext yields a
|
|
101
|
+
// DIFFERENT shared secret (FIPS 203 implicit rejection), so the derived key
|
|
102
|
+
// is wrong and the AEAD tag fails — the ciphertext is NOT accepted.
|
|
103
|
+
var tamperedKemCt = Buffer.from(full); tamperedKemCt[7] ^= 0xff;
|
|
104
|
+
decryptThrows("decrypt rejects a tampered KEM ciphertext (implicit rejection → tag failure)",
|
|
105
|
+
tamperedKemCt, keys, /tag|invalid|auth/i);
|
|
106
|
+
// Bit-flip in the trailing AEAD body → Poly1305 failure.
|
|
107
|
+
var tamperedBody = Buffer.from(full); tamperedBody[full.length - 1] ^= 0xff;
|
|
108
|
+
decryptThrows("decrypt rejects a tampered AEAD body", tamperedBody, keys, /tag|invalid|auth/i);
|
|
109
|
+
|
|
110
|
+
// Mismatched recipient — a fresh, unrelated keypair cannot open the envelope.
|
|
111
|
+
var wrong = b.crypto.generateEncryptionKeyPair();
|
|
112
|
+
decryptThrows("decrypt rejects a mismatched recipient keypair", full, wrong, /tag|invalid|auth|Decapsulation/i);
|
|
113
|
+
|
|
114
|
+
// ML-KEM-768 + X25519 envelope opened through the generic dispatcher
|
|
115
|
+
// without the required x25519 private key.
|
|
116
|
+
var p768 = b.crypto.generateMlkem768X25519KeyPair();
|
|
117
|
+
var env768 = Buffer.from(b.crypto.encryptMlkem768X25519("interop body", {
|
|
118
|
+
mlkemPublicKey: p768.mlkemPublicKey,
|
|
119
|
+
x25519PublicKey: p768.x25519PublicKey,
|
|
120
|
+
}), "base64");
|
|
121
|
+
decryptThrows("decrypt refuses an ML-KEM-768 envelope missing x25519PrivateKey",
|
|
122
|
+
env768, { privateKey: p768.mlkemPrivateKey }, /requires x25519PrivateKey/);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ---- Truncated-envelope contract (root-fix regression). A truncated
|
|
126
|
+
// envelope (untrusted ciphertext) must fail with the typed
|
|
127
|
+
// "Invalid envelope: ..." error at EVERY truncation length — never a raw
|
|
128
|
+
// RangeError leaking noble-cipher internals past the documented contract,
|
|
129
|
+
// the same class the _envU16 bounds check already closes for the length
|
|
130
|
+
// prefixes. Before the fix, a truncation landing inside the 24-byte nonce
|
|
131
|
+
// or the 16-byte Poly1305 tag surfaced a raw RangeError.
|
|
132
|
+
function testTruncationNeverLeaksRangeError() {
|
|
133
|
+
var keys = b.crypto.generateEncryptionKeyPair();
|
|
134
|
+
var plaintext = "truncation probe payload — every offset must reject typed";
|
|
135
|
+
|
|
136
|
+
// Exercise all three KEM suites so the shared nonce/tag bounds check is
|
|
137
|
+
// proven across the hybrid, KEM-only, and ML-KEM-768 dispatch arms.
|
|
138
|
+
var p768 = b.crypto.generateMlkem768X25519KeyPair();
|
|
139
|
+
var suites = [
|
|
140
|
+
{
|
|
141
|
+
name: "hybrid ML-KEM-1024 + P-384",
|
|
142
|
+
full: Buffer.from(b.crypto.encrypt(plaintext, keys), "base64"),
|
|
143
|
+
key: keys,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "KEM-only ML-KEM-1024",
|
|
147
|
+
full: Buffer.from(b.crypto.encrypt(plaintext, keys.publicKey), "base64"),
|
|
148
|
+
key: { privateKey: keys.privateKey },
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: "ML-KEM-768 + X25519",
|
|
152
|
+
full: Buffer.from(b.crypto.encryptMlkem768X25519(plaintext, {
|
|
153
|
+
mlkemPublicKey: p768.mlkemPublicKey,
|
|
154
|
+
x25519PublicKey: p768.x25519PublicKey,
|
|
155
|
+
}), "base64"),
|
|
156
|
+
key: { privateKey: p768.mlkemPrivateKey, x25519PrivateKey: p768.x25519PrivateKey },
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
for (var s = 0; s < suites.length; s += 1) {
|
|
161
|
+
var suite = suites[s];
|
|
162
|
+
var full = suite.full;
|
|
163
|
+
// Every truncation offset must reject either with the typed
|
|
164
|
+
// "Invalid envelope"/"Invalid packed" contract (a truncation in the header,
|
|
165
|
+
// a length-prefixed KEM ciphertext / ephemeral key, or the nonce/tag
|
|
166
|
+
// region) or with the genuine AEAD "invalid tag" authentication failure (a
|
|
167
|
+
// truncation inside the ciphertext body, where the structure is intact but
|
|
168
|
+
// Poly1305 fails) — NEVER a raw low-level crypto leak: a noble RangeError
|
|
169
|
+
// ("nonce" length) or a Node "Failed to perform decapsulation" / key-parse
|
|
170
|
+
// error from handing an under-length component to Node crypto. The agent's
|
|
171
|
+
// original test caught only RangeError, so the decapsulation leak (a
|
|
172
|
+
// truncation inside the length-prefixed KEM ciphertext, reaching
|
|
173
|
+
// nodeCrypto.decapsulate before the trailing bounds check) slipped through.
|
|
174
|
+
var leaked = null;
|
|
175
|
+
for (var n = full.length - 1; n >= 1 && leaked === null; n -= 1) {
|
|
176
|
+
try { b.crypto.decrypt(full.subarray(0, n).toString("base64"), suite.key); }
|
|
177
|
+
catch (e) {
|
|
178
|
+
var msg = (e && e.message) || String(e);
|
|
179
|
+
if (e instanceof RangeError || !/Invalid envelope|Invalid packed|invalid tag/i.test(msg)) {
|
|
180
|
+
leaked = { n: n, msg: msg };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
check("decrypt rejects every truncation of a " + suite.name +
|
|
185
|
+
" envelope with the typed contract or a genuine AEAD tag failure " +
|
|
186
|
+
"(no raw RangeError / decapsulation error): " +
|
|
187
|
+
(leaked ? leaked.n + "→" + leaked.msg : "clean"),
|
|
188
|
+
leaked === null);
|
|
189
|
+
|
|
190
|
+
// A truncation landing inside the nonce/tag region rejects with the
|
|
191
|
+
// typed envelope error (positive lock on the contract, not just the
|
|
192
|
+
// absence of a RangeError). ctLen = plaintext bytes + 16-byte tag; land
|
|
193
|
+
// 4 bytes into the 24-byte nonce.
|
|
194
|
+
var ctLen = Buffer.byteLength(plaintext, "utf8") + 16;
|
|
195
|
+
var inNonce = full.length - ctLen - 4;
|
|
196
|
+
var nonceErr = null;
|
|
197
|
+
try { b.crypto.decrypt(full.subarray(0, inNonce).toString("base64"), suite.key); }
|
|
198
|
+
catch (e) { nonceErr = e; }
|
|
199
|
+
check("decrypt rejects a nonce-region truncation with the typed envelope error (" + suite.name + ")",
|
|
200
|
+
nonceErr && !(nonceErr instanceof RangeError) && /Invalid envelope/.test(nonceErr.message));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ---- KEM-only fallback + raw mode round-trips (positive paths that reach
|
|
205
|
+
// the encryptMlkemOnly / ML_KEM_1024 decrypt arm and the raw:true return).
|
|
206
|
+
function testKemOnlyAndRawRoundTrips() {
|
|
207
|
+
var keys = b.crypto.generateEncryptionKeyPair();
|
|
208
|
+
|
|
209
|
+
// encrypt() with only an ML-KEM public key (string form) drops to KEM-only
|
|
210
|
+
// and still round-trips through the ML_KEM_1024 decrypt arm.
|
|
211
|
+
var sealedStr = b.crypto.encrypt("kem-only via string pubkey", keys.publicKey);
|
|
212
|
+
check("KEM-only (string pubkey) round-trips",
|
|
213
|
+
b.crypto.decrypt(sealedStr, { privateKey: keys.privateKey }) === "kem-only via string pubkey");
|
|
214
|
+
|
|
215
|
+
// encrypt() with an object carrying only publicKey (no ecPublicKey) takes
|
|
216
|
+
// the same fallback (and emits the one-shot hybrid_disabled audit).
|
|
217
|
+
var sealedObj = b.crypto.encrypt("kem-only via object", { publicKey: keys.publicKey });
|
|
218
|
+
check("KEM-only (object, no ecPublicKey) round-trips",
|
|
219
|
+
b.crypto.decrypt(sealedObj, { privateKey: keys.privateKey }) === "kem-only via object");
|
|
220
|
+
|
|
221
|
+
// decrypt accepts the private key as a bare PEM string too (the
|
|
222
|
+
// `typeof privateKeys === "string" ? privateKeys : privateKeys.privateKey`
|
|
223
|
+
// shape) for the KEM-only suite.
|
|
224
|
+
check("KEM-only decrypt accepts a bare PEM-string private key",
|
|
225
|
+
b.crypto.decrypt(sealedStr, keys.privateKey) === "kem-only via string pubkey");
|
|
226
|
+
|
|
227
|
+
// raw:true returns the decrypted Buffer rather than a utf8 string.
|
|
228
|
+
var sealedHybrid = b.crypto.encrypt("binary-carrier body", keys);
|
|
229
|
+
var rawOut = b.crypto.decrypt(sealedHybrid, keys, { raw: true });
|
|
230
|
+
check("decrypt raw:true returns a Buffer", Buffer.isBuffer(rawOut) && rawOut.toString("utf8") === "binary-carrier body");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// ---- Symmetric packed decrypt error matrix (b.crypto.decryptPacked).
|
|
234
|
+
function testDecryptPackedErrors() {
|
|
235
|
+
var key = b.crypto.generateBytes(32);
|
|
236
|
+
var packed = b.crypto.encryptPacked(Buffer.from("row-42 column-ssn", "utf8"), key);
|
|
237
|
+
|
|
238
|
+
// Round-trip sanity (the happy path lives elsewhere, but anchor the fixture).
|
|
239
|
+
check("encryptPacked→decryptPacked round-trips",
|
|
240
|
+
b.crypto.decryptPacked(packed, key).toString("utf8") === "row-42 column-ssn");
|
|
241
|
+
|
|
242
|
+
// Unsupported format byte.
|
|
243
|
+
var badFmt = Buffer.from(packed); badFmt[0] = 0x09;
|
|
244
|
+
var fmtThrew = null;
|
|
245
|
+
try { b.crypto.decryptPacked(badFmt, key); } catch (e) { fmtThrew = e; }
|
|
246
|
+
check("decryptPacked refuses an unsupported format byte",
|
|
247
|
+
fmtThrew && /unsupported version/.test(fmtThrew.message));
|
|
248
|
+
|
|
249
|
+
// AAD binding: a ciphertext sealed under one AAD cannot open under another.
|
|
250
|
+
var aadPacked = b.crypto.encryptPacked(Buffer.from("bound cell", "utf8"), key, Buffer.from("patients|42|ssn"));
|
|
251
|
+
var aadThrew = null;
|
|
252
|
+
try { b.crypto.decryptPacked(aadPacked, key, Buffer.from("patients|43|ssn")); } catch (e) { aadThrew = e; }
|
|
253
|
+
check("decryptPacked rejects a mismatched AAD (context binding holds)",
|
|
254
|
+
aadThrew && /tag|invalid|auth/i.test(aadThrew.message));
|
|
255
|
+
|
|
256
|
+
// Truncated packed blob (untrusted / corrupt storage cell) — must reject
|
|
257
|
+
// with the typed "Invalid packed format" contract, not a raw RangeError
|
|
258
|
+
// from the nonce/ciphertext subarray (same root as the envelope bounds
|
|
259
|
+
// check).
|
|
260
|
+
var leaked = null;
|
|
261
|
+
for (var n = packed.length - 1; n >= 1 && leaked === null; n -= 1) {
|
|
262
|
+
try { b.crypto.decryptPacked(packed.subarray(0, n), key); }
|
|
263
|
+
catch (e) { if (e instanceof RangeError) leaked = { n: n, msg: e.message }; }
|
|
264
|
+
}
|
|
265
|
+
check("decryptPacked never leaks a raw RangeError on a truncated blob", leaked === null);
|
|
266
|
+
var shortThrew = null;
|
|
267
|
+
try { b.crypto.decryptPacked(Buffer.from([0x02]), key); } catch (e) { shortThrew = e; }
|
|
268
|
+
check("decryptPacked rejects a too-short blob with the typed format error",
|
|
269
|
+
shortThrew && !(shortThrew instanceof RangeError) && /Invalid packed format/.test(shortThrew.message));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// ---- base64url strict canonicalization (CWE-347 / CWE-1286). The strict
|
|
273
|
+
// decoder is the signature-canonicalization boundary — a length-mod-4-of-1
|
|
274
|
+
// shape is impossible for any conforming encoder and must be refused, while
|
|
275
|
+
// {strict:false} lets a documented lossy legacy payload through.
|
|
276
|
+
function testBase64UrlCanonicalization() {
|
|
277
|
+
var lenOneThrew = null;
|
|
278
|
+
try { b.crypto.fromBase64Url("aGVsbG8AA"); } catch (e) { lenOneThrew = e; } // 9 chars → len % 4 === 1
|
|
279
|
+
check("fromBase64Url (strict) refuses a length-mod-4-of-1 encoding",
|
|
280
|
+
lenOneThrew instanceof TypeError && /length %% 4 === 1|% 4/.test(lenOneThrew.message));
|
|
281
|
+
|
|
282
|
+
// Strict mode still accepts the canonical PADDED form (RFC 4648 §5 allows
|
|
283
|
+
// optional `=` padding) — exercises the trailing-`=` strip before the
|
|
284
|
+
// length check. "AQIDBA==" decodes to the 4 bytes [1,2,3,4].
|
|
285
|
+
var padded = b.crypto.fromBase64Url("AQIDBA==");
|
|
286
|
+
check("fromBase64Url (strict) accepts canonical padded input",
|
|
287
|
+
Buffer.isBuffer(padded) && padded.equals(Buffer.from([1, 2, 3, 4])));
|
|
288
|
+
|
|
289
|
+
// {strict:false} tolerates non-canonical input (opt-out escape hatch).
|
|
290
|
+
check("fromBase64Url {strict:false} tolerates non-canonical garbage",
|
|
291
|
+
Buffer.isBuffer(b.crypto.fromBase64Url("!!!", { strict: false })));
|
|
292
|
+
check("fromBase64Url {strict:false} still decodes a canonical value",
|
|
293
|
+
b.crypto.fromBase64Url("aGVsbG8", { strict: false }).toString("utf8") === "hello");
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ---- Constant-time compare entry-tier validation (b.crypto.timingSafeEqual).
|
|
297
|
+
function testTimingSafeEqualEntryTier() {
|
|
298
|
+
// Length mismatch returns false immediately (length is not a secret).
|
|
299
|
+
check("timingSafeEqual returns false on length mismatch",
|
|
300
|
+
b.crypto.timingSafeEqual("abc", "abcd") === false);
|
|
301
|
+
// Non-string / non-Buffer arguments throw at the entry tier so a
|
|
302
|
+
// toString-poisoned caller cannot redirect the compare through arbitrary bytes.
|
|
303
|
+
var aThrew = null;
|
|
304
|
+
try { b.crypto.timingSafeEqual(42, "x"); } catch (e) { aThrew = e; }
|
|
305
|
+
check("timingSafeEqual refuses a non-Buffer/non-string first argument",
|
|
306
|
+
aThrew instanceof TypeError && /argument 'a'/.test(aThrew.message));
|
|
307
|
+
var bThrew = null;
|
|
308
|
+
try { b.crypto.timingSafeEqual("x", null); } catch (e) { bThrew = e; }
|
|
309
|
+
check("timingSafeEqual refuses a null second argument",
|
|
310
|
+
bThrew instanceof TypeError && /argument 'b'/.test(bThrew.message));
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// ---- Remaining config-time throws on the hashing surface driven here for
|
|
314
|
+
// completeness (namespaceHash CRLF-in-value, hashCertFingerprint oversized
|
|
315
|
+
// PEM). Both are entry-tier rejections that keep hostile bytes out of
|
|
316
|
+
// derived-column inputs / the ReDoS-bounded PEM parser.
|
|
317
|
+
function testHashingSurfaceRejections() {
|
|
318
|
+
var crlfThrew = null;
|
|
319
|
+
try { b.crypto.namespaceHash("bj-email", "line1\r\nline2"); } catch (e) { crlfThrew = e; }
|
|
320
|
+
check("namespaceHash refuses a CR/LF string value (log-injection barrier)",
|
|
321
|
+
crlfThrew instanceof TypeError && /CR \/ LF/.test(crlfThrew.message));
|
|
322
|
+
|
|
323
|
+
var oversizedThrew = null;
|
|
324
|
+
try {
|
|
325
|
+
var big = "-----BEGIN CERTIFICATE-----\n" + new Array(70001).join("A") + "\n-----END CERTIFICATE-----";
|
|
326
|
+
b.crypto.hashCertFingerprint(big);
|
|
327
|
+
} catch (e) { oversizedThrew = e; }
|
|
328
|
+
check("hashCertFingerprint refuses an oversized PEM (ReDoS bound)",
|
|
329
|
+
oversizedThrew instanceof TypeError && /exceeds 64 KiB/.test(oversizedThrew.message));
|
|
330
|
+
|
|
331
|
+
// generateToken default length is 32 bytes → 64 hex chars.
|
|
332
|
+
var tok = b.crypto.generateToken();
|
|
333
|
+
check("generateToken default is 64 hex chars (32 bytes)", typeof tok === "string" && tok.length === 64 && /^[0-9a-f]+$/.test(tok));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
function run() {
|
|
337
|
+
testVerifyAdversarial();
|
|
338
|
+
testDecryptErrorMatrix();
|
|
339
|
+
testTruncationNeverLeaksRangeError();
|
|
340
|
+
testKemOnlyAndRawRoundTrips();
|
|
341
|
+
testDecryptPackedErrors();
|
|
342
|
+
testBase64UrlCanonicalization();
|
|
343
|
+
testTimingSafeEqualEntryTier();
|
|
344
|
+
testHashingSurfaceRejections();
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
module.exports = { run: run };
|
|
348
|
+
|
|
349
|
+
if (require.main === module) {
|
|
350
|
+
try { run(); console.log("[crypto-adversarial] OK — " + helpers.getChecks() + " checks"); }
|
|
351
|
+
catch (e) { console.error(e && e.stack || e); process.exit(1); }
|
|
352
|
+
}
|
|
@@ -151,6 +151,38 @@ async function run() {
|
|
|
151
151
|
catch (e) { cnhBadTruncFloat = /truncateBytes must be/.test(e.message); }
|
|
152
152
|
check("computeNamespacedHash non-integer truncateBytes throws", cnhBadTruncFloat);
|
|
153
153
|
|
|
154
|
+
// ---- MAC-key sealed-file integrity: a plaintext (non-sealed) file
|
|
155
|
+
// planted on disk must be REFUSED, never accepted as the secret MAC
|
|
156
|
+
// key. vault.unseal() returns a value that lacks the "vault:" prefix
|
|
157
|
+
// VERBATIM (idempotent read passthrough), so without a load-bearing
|
|
158
|
+
// prefix check the reader would treat an attacker-planted plaintext
|
|
159
|
+
// base64 key as the MAC key — defeating the sealed-at-rest guarantee a
|
|
160
|
+
// disk-write-only attacker (no vault passphrase, so unable to forge a
|
|
161
|
+
// genuine seal) otherwise cannot bypass. db.js applies the same
|
|
162
|
+
// prefix check to db.key.enc; this is its sibling. ----
|
|
163
|
+
var macDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cf-dh-mac-"));
|
|
164
|
+
b.vault._resetForTest();
|
|
165
|
+
await b.vault.init({ mode: "plaintext", dataDir: macDir });
|
|
166
|
+
var legitMac = b.vault.getDerivedHashMacKey();
|
|
167
|
+
check("MAC key round-trips from a genuine sealed file",
|
|
168
|
+
Buffer.isBuffer(legitMac) && legitMac.length === 32);
|
|
169
|
+
// Attacker overwrites the sealed file with a KNOWN plaintext base64 key
|
|
170
|
+
// (32 bytes → passes the length check) that carries no "vault:" prefix.
|
|
171
|
+
var macFile = path.join(macDir, "vault.derived-hash-mac.sealed");
|
|
172
|
+
var knownKey = Buffer.alloc(32, 0x41);
|
|
173
|
+
fs.writeFileSync(macFile, knownKey.toString("base64"));
|
|
174
|
+
// Drop the in-process cache + re-init so the tampered file is re-read.
|
|
175
|
+
b.vault._resetForTest();
|
|
176
|
+
await b.vault.init({ mode: "plaintext", dataDir: macDir });
|
|
177
|
+
var macRefused = false;
|
|
178
|
+
var forgedMac = null;
|
|
179
|
+
try { forgedMac = b.vault.getDerivedHashMacKey(); }
|
|
180
|
+
catch (e) { macRefused = /corrupt|sealed|prefix/i.test(e.message); }
|
|
181
|
+
check("getDerivedHashMacKey refuses a plaintext (non-sealed) MAC file — " +
|
|
182
|
+
"not the attacker's known key",
|
|
183
|
+
macRefused && forgedMac === null);
|
|
184
|
+
b.vault._resetForTest();
|
|
185
|
+
|
|
154
186
|
console.log("OK — crypto-field derived-hash tests");
|
|
155
187
|
}
|
|
156
188
|
|