@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
|
@@ -75,6 +75,29 @@ function _ecPair(curve) {
|
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
// -------- Core b.auth.jwt (PQC framework signer) helpers --------
|
|
79
|
+
// ML-DSA-87 keygen is available on the Node 24 CI floor; SLH-DSA keygen is
|
|
80
|
+
// Node-26+ (see auth-status-list.test.js), so the core round-trips below sign
|
|
81
|
+
// with ML-DSA-87 and only NAME SLH-DSA-SHAKE-256f in headers/allowlists.
|
|
82
|
+
function _mlPair() { return nodeCrypto.generateKeyPairSync("ml-dsa-87"); }
|
|
83
|
+
|
|
84
|
+
function _b64urlJson(obj) {
|
|
85
|
+
return Buffer.from(JSON.stringify(obj)).toString("base64url");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// _rawJws — build a compact JWS with a caller-chosen header, so a test can
|
|
89
|
+
// forge the header.alg/key divergence that the shipped sign() now refuses to
|
|
90
|
+
// emit. Signs with null digest (KeyObject drives the real algorithm), exactly
|
|
91
|
+
// as lib/auth/jwt.js does.
|
|
92
|
+
function _rawJws(privateKey, header, payload) {
|
|
93
|
+
var input = _b64urlJson(header) + "." + _b64urlJson(payload);
|
|
94
|
+
var sig = nodeCrypto.sign(null, Buffer.from(input, "ascii"), privateKey);
|
|
95
|
+
return input + "." + Buffer.from(sig).toString("base64url");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
var _NOW_MS = 1700000000000; // allow:raw-byte-literal — fixed test clock (epoch ms)
|
|
99
|
+
var _NOW_SEC = 1700000000; // allow:raw-byte-literal — same instant, seconds
|
|
100
|
+
|
|
78
101
|
// -------- CVE-2026-22817 — alg/kty cross-check (jwt-external) --------
|
|
79
102
|
|
|
80
103
|
async function testAlgKtyMismatchRsaWithEs256() {
|
|
@@ -405,7 +428,420 @@ async function testOauthCreateNonFiniteSkewRejected() {
|
|
|
405
428
|
}
|
|
406
429
|
}
|
|
407
430
|
|
|
431
|
+
// ========================================================================
|
|
432
|
+
// Core b.auth.jwt (PQC framework signer) — verify/sign/decode defenses
|
|
433
|
+
// ========================================================================
|
|
434
|
+
|
|
435
|
+
// PRIMARY RED — algorithm-confusion / allowlist bypass (CWE-347).
|
|
436
|
+
//
|
|
437
|
+
// node:crypto.verify(null, ...) drives the algorithm from the KeyObject, NOT
|
|
438
|
+
// the JWS header.alg. verify() gates its algorithm allowlist on that header
|
|
439
|
+
// label. So a token signed by an ML-DSA-87 key but declaring
|
|
440
|
+
// alg="SLH-DSA-SHAKE-256f" passes an SLH-ONLY allowlist and is verified with
|
|
441
|
+
// the ML-DSA key — a full algorithm-allowlist bypass. Exactly the shape an
|
|
442
|
+
// operator uses the allowlist to prevent (pin the high-assurance algorithm).
|
|
443
|
+
//
|
|
444
|
+
// RED on the buggy tree: verify RESOLVES with the attacker's claims.
|
|
445
|
+
// GREEN after binding header.alg to the key: auth-jwt/alg-key-mismatch.
|
|
446
|
+
async function testAlgConfusionAllowlistBypass() {
|
|
447
|
+
var ml = _mlPair();
|
|
448
|
+
// Forge: header says SLH-DSA-SHAKE-256f, signature is a real ML-DSA-87 sig.
|
|
449
|
+
var confused = _rawJws(ml.privateKey,
|
|
450
|
+
{ alg: "SLH-DSA-SHAKE-256f", typ: "JWT" },
|
|
451
|
+
{ sub: "attacker", role: "admin", iat: _NOW_SEC });
|
|
452
|
+
|
|
453
|
+
var claims = null, threw = null;
|
|
454
|
+
try {
|
|
455
|
+
claims = await b.auth.jwt.verify(confused, {
|
|
456
|
+
publicKey: ml.publicKey,
|
|
457
|
+
algorithms: ["SLH-DSA-SHAKE-256f"], // SLH-only allowlist
|
|
458
|
+
now: _NOW_MS,
|
|
459
|
+
});
|
|
460
|
+
} catch (e) { threw = e; }
|
|
461
|
+
check("core jwt: SLH-declared/ML-signed token refused (alg-key binding, CWE-347)",
|
|
462
|
+
threw && threw.code === "auth-jwt/alg-key-mismatch");
|
|
463
|
+
check("core jwt: alg-confused token yields NO claims (fail closed, no bypass)",
|
|
464
|
+
claims === null);
|
|
465
|
+
|
|
466
|
+
// Ordering control: when the forged label is NOT in the allowlist, the
|
|
467
|
+
// allowlist gate fires first (algorithm-not-allowed), still fail-closed.
|
|
468
|
+
var threw2 = null;
|
|
469
|
+
try {
|
|
470
|
+
await b.auth.jwt.verify(confused, {
|
|
471
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
472
|
+
});
|
|
473
|
+
} catch (e) { threw2 = e; }
|
|
474
|
+
check("core jwt: forged label outside allowlist refused (algorithm-not-allowed)",
|
|
475
|
+
threw2 && threw2.code === "auth-jwt/algorithm-not-allowed");
|
|
476
|
+
|
|
477
|
+
// Positive control: a correctly-labeled ML-DSA token still verifies, proving
|
|
478
|
+
// the binding didn't break the happy path.
|
|
479
|
+
var honest = _rawJws(ml.privateKey,
|
|
480
|
+
{ alg: "ML-DSA-87", typ: "JWT" }, { sub: "u1", iat: _NOW_SEC });
|
|
481
|
+
var ok = await b.auth.jwt.verify(honest, {
|
|
482
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
483
|
+
});
|
|
484
|
+
check("core jwt: correctly-labeled ML-DSA token still verifies", ok && ok.sub === "u1");
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// RED (sign side of the same root) — sign() must not EMIT a token whose header
|
|
488
|
+
// alg misstates the signing key's real algorithm (the artifact the verify
|
|
489
|
+
// bypass consumes). Config-time throw.
|
|
490
|
+
async function testSignRefusesMismatchedAlgKey() {
|
|
491
|
+
var ml = _mlPair();
|
|
492
|
+
var threw = null;
|
|
493
|
+
try {
|
|
494
|
+
await b.auth.jwt.sign({ sub: "u1" },
|
|
495
|
+
{ privateKey: ml.privateKey, algorithm: "SLH-DSA-SHAKE-256f" });
|
|
496
|
+
} catch (e) { threw = e; }
|
|
497
|
+
check("core jwt: sign refuses SLH alg with an ML-DSA key (no mislabeled token emitted)",
|
|
498
|
+
threw && threw.code === "auth-jwt/alg-key-mismatch");
|
|
499
|
+
|
|
500
|
+
// Matched alg/key still signs (happy path intact).
|
|
501
|
+
var tok = await b.auth.jwt.sign({ sub: "u1" },
|
|
502
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87" });
|
|
503
|
+
check("core jwt: sign with matched ML-DSA alg/key emits a 3-part token",
|
|
504
|
+
typeof tok === "string" && tok.split(".").length === 3);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// decode() — malformed-segment / non-object / part-count branches all return
|
|
508
|
+
// typed auth-jwt/malformed, never a raw throw.
|
|
509
|
+
function testCoreJwtDecodeMalformed() {
|
|
510
|
+
var cases = [
|
|
511
|
+
["", "empty string"],
|
|
512
|
+
["only-two.parts", "two parts"],
|
|
513
|
+
["a.b.c.d", "four parts"],
|
|
514
|
+
["!!!.b.c", "non-base64url header"],
|
|
515
|
+
[_b64urlJson([1, 2, 3]) + "." + _b64urlJson({ sub: "x" }) + ".c", "array header (not object)"],
|
|
516
|
+
[_b64urlJson({ alg: "ML-DSA-87" }) + "." + _b64urlJson("string-payload") + ".c", "scalar payload (not object)"],
|
|
517
|
+
];
|
|
518
|
+
for (var i = 0; i < cases.length; i++) {
|
|
519
|
+
var threw = null;
|
|
520
|
+
try { b.auth.jwt.decode(cases[i][0]); } catch (e) { threw = e; }
|
|
521
|
+
check("core jwt: decode(" + cases[i][1] + ") throws typed auth-jwt/malformed",
|
|
522
|
+
threw && threw.code === "auth-jwt/malformed");
|
|
523
|
+
}
|
|
524
|
+
// Non-string token.
|
|
525
|
+
var t2 = null;
|
|
526
|
+
try { b.auth.jwt.decode(12345); } catch (e) { t2 = e; }
|
|
527
|
+
check("core jwt: decode(non-string) throws auth-jwt/malformed",
|
|
528
|
+
t2 && t2.code === "auth-jwt/malformed");
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// Key resolution branches: missing key, keyResolver/publicKey conflict,
|
|
532
|
+
// resolver-throws, resolver-returns-nothing, resolver-success.
|
|
533
|
+
async function testCoreJwtKeyResolution() {
|
|
534
|
+
var ml = _mlPair();
|
|
535
|
+
var token = await b.auth.jwt.sign({ sub: "u1" },
|
|
536
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
537
|
+
|
|
538
|
+
var t1 = null;
|
|
539
|
+
try { await b.auth.jwt.verify(token, { algorithms: ["ML-DSA-87"], now: _NOW_MS }); }
|
|
540
|
+
catch (e) { t1 = e; }
|
|
541
|
+
check("core jwt: verify with neither publicKey nor keyResolver → missing-key",
|
|
542
|
+
t1 && t1.code === "auth-jwt/missing-key");
|
|
543
|
+
|
|
544
|
+
var t2 = null;
|
|
545
|
+
try {
|
|
546
|
+
await b.auth.jwt.verify(token, {
|
|
547
|
+
publicKey: ml.publicKey, keyResolver: function () { return ml.publicKey; },
|
|
548
|
+
algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
549
|
+
});
|
|
550
|
+
} catch (e) { t2 = e; }
|
|
551
|
+
check("core jwt: keyResolver AND publicKey together → conflicting-key-source",
|
|
552
|
+
t2 && t2.code === "auth-jwt/conflicting-key-source");
|
|
553
|
+
|
|
554
|
+
var t3 = null;
|
|
555
|
+
try {
|
|
556
|
+
await b.auth.jwt.verify(token, {
|
|
557
|
+
keyResolver: function () { throw new Error("jwks down"); },
|
|
558
|
+
algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
559
|
+
});
|
|
560
|
+
} catch (e) { t3 = e; }
|
|
561
|
+
check("core jwt: keyResolver that throws → key-resolver-failed",
|
|
562
|
+
t3 && t3.code === "auth-jwt/key-resolver-failed");
|
|
563
|
+
|
|
564
|
+
var t4 = null;
|
|
565
|
+
try {
|
|
566
|
+
await b.auth.jwt.verify(token, {
|
|
567
|
+
keyResolver: function () { return null; },
|
|
568
|
+
algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
569
|
+
});
|
|
570
|
+
} catch (e) { t4 = e; }
|
|
571
|
+
check("core jwt: keyResolver returning no key → key-not-found",
|
|
572
|
+
t4 && t4.code === "auth-jwt/key-not-found");
|
|
573
|
+
|
|
574
|
+
// Async resolver returning the right key succeeds, and receives the full
|
|
575
|
+
// decoded header (kid is delegated to the operator to sanitize).
|
|
576
|
+
var sawKid = null;
|
|
577
|
+
var ok = await b.auth.jwt.verify(token, {
|
|
578
|
+
keyResolver: function (hdr) { sawKid = hdr.alg; return Promise.resolve(ml.publicKey); },
|
|
579
|
+
algorithms: ["ML-DSA-87"], now: _NOW_MS,
|
|
580
|
+
});
|
|
581
|
+
check("core jwt: async keyResolver returning the right key verifies",
|
|
582
|
+
ok && ok.sub === "u1" && sawKid === "ML-DSA-87");
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// crit + expectedTyp defenses.
|
|
586
|
+
async function testCoreJwtCritAndTyp() {
|
|
587
|
+
var ml = _mlPair();
|
|
588
|
+
// Unknown crit extension → refused (RFC 7515 §4.1.11).
|
|
589
|
+
var critTok = _rawJws(ml.privateKey,
|
|
590
|
+
{ alg: "ML-DSA-87", typ: "JWT", crit: ["exp"] }, { sub: "u1", iat: _NOW_SEC });
|
|
591
|
+
var t1 = null;
|
|
592
|
+
try {
|
|
593
|
+
await b.auth.jwt.verify(critTok, { publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS });
|
|
594
|
+
} catch (e) { t1 = e; }
|
|
595
|
+
check("core jwt: unknown crit header refused (auth-jwt/unknown-crit)",
|
|
596
|
+
t1 && t1.code === "auth-jwt/unknown-crit");
|
|
597
|
+
|
|
598
|
+
// expectedTyp mismatch (case-insensitive per RFC 8725 §3.11).
|
|
599
|
+
var jwtTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
600
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", typ: "JWT", now: _NOW_MS });
|
|
601
|
+
var t2 = null;
|
|
602
|
+
try {
|
|
603
|
+
await b.auth.jwt.verify(jwtTok, {
|
|
604
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], expectedTyp: "at+jwt", now: _NOW_MS,
|
|
605
|
+
});
|
|
606
|
+
} catch (e) { t2 = e; }
|
|
607
|
+
check("core jwt: expectedTyp mismatch refused (auth-jwt/typ-mismatch)",
|
|
608
|
+
t2 && t2.code === "auth-jwt/typ-mismatch");
|
|
609
|
+
|
|
610
|
+
// Matching typ (different case) accepted.
|
|
611
|
+
var ok = await b.auth.jwt.verify(jwtTok, {
|
|
612
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], expectedTyp: "jwt", now: _NOW_MS,
|
|
613
|
+
});
|
|
614
|
+
check("core jwt: expectedTyp matches case-insensitively", ok && ok.sub === "u1");
|
|
615
|
+
|
|
616
|
+
// Empty/blank expectedTyp is a config error.
|
|
617
|
+
var t3 = null;
|
|
618
|
+
try {
|
|
619
|
+
await b.auth.jwt.verify(jwtTok, {
|
|
620
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], expectedTyp: "", now: _NOW_MS,
|
|
621
|
+
});
|
|
622
|
+
} catch (e) { t3 = e; }
|
|
623
|
+
check("core jwt: empty expectedTyp refused (auth-jwt/bad-expected-typ)",
|
|
624
|
+
t3 && t3.code === "auth-jwt/bad-expected-typ");
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Algorithm allowlist gate branches: an unsupported entry in the caller's list,
|
|
628
|
+
// and a token alg outside the list.
|
|
629
|
+
async function testCoreJwtAlgAllowlist() {
|
|
630
|
+
var ml = _mlPair();
|
|
631
|
+
var token = await b.auth.jwt.sign({ sub: "u1" },
|
|
632
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
633
|
+
|
|
634
|
+
// Caller lists a bogus algorithm → surfaced at config time.
|
|
635
|
+
var t1 = null;
|
|
636
|
+
try {
|
|
637
|
+
await b.auth.jwt.verify(token, { publicKey: ml.publicKey, algorithms: ["HS256"], now: _NOW_MS });
|
|
638
|
+
} catch (e) { t1 = e; }
|
|
639
|
+
check("core jwt: unsupported alg in allowlist refused (auth-jwt/unsupported-algorithm)",
|
|
640
|
+
t1 && t1.code === "auth-jwt/unsupported-algorithm");
|
|
641
|
+
|
|
642
|
+
// "none" can never be configured into the allowlist.
|
|
643
|
+
var t2 = null;
|
|
644
|
+
try {
|
|
645
|
+
await b.auth.jwt.verify(token, { publicKey: ml.publicKey, algorithms: ["none"], now: _NOW_MS });
|
|
646
|
+
} catch (e) { t2 = e; }
|
|
647
|
+
check("core jwt: alg 'none' cannot enter the allowlist (auth-jwt/unsupported-algorithm)",
|
|
648
|
+
t2 && t2.code === "auth-jwt/unsupported-algorithm");
|
|
649
|
+
|
|
650
|
+
// Token alg legitimately outside the (valid) allowlist.
|
|
651
|
+
var t3 = null;
|
|
652
|
+
try {
|
|
653
|
+
await b.auth.jwt.verify(token, {
|
|
654
|
+
publicKey: ml.publicKey, algorithms: ["SLH-DSA-SHAKE-256f"], now: _NOW_MS,
|
|
655
|
+
});
|
|
656
|
+
} catch (e) { t3 = e; }
|
|
657
|
+
check("core jwt: token alg outside allowlist refused (auth-jwt/algorithm-not-allowed)",
|
|
658
|
+
t3 && t3.code === "auth-jwt/algorithm-not-allowed");
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Signature integrity: tampering the payload after signing invalidates it.
|
|
662
|
+
async function testCoreJwtTamperedSignature() {
|
|
663
|
+
var ml = _mlPair();
|
|
664
|
+
var token = await b.auth.jwt.sign({ sub: "u1", role: "user" },
|
|
665
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
666
|
+
var parts = token.split(".");
|
|
667
|
+
var forgedPayload = _b64urlJson({ sub: "u1", role: "admin", iat: _NOW_SEC });
|
|
668
|
+
var tampered = parts[0] + "." + forgedPayload + "." + parts[2];
|
|
669
|
+
var threw = null;
|
|
670
|
+
try {
|
|
671
|
+
await b.auth.jwt.verify(tampered, { publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS });
|
|
672
|
+
} catch (e) { threw = e; }
|
|
673
|
+
check("core jwt: tampered payload refused (auth-jwt/invalid-signature)",
|
|
674
|
+
threw && threw.code === "auth-jwt/invalid-signature");
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// Time-based claims: exp / nbf enforcement, clock tolerance leeway, bad
|
|
678
|
+
// tolerance config, and NumericDate typing (a string exp must not bypass).
|
|
679
|
+
async function testCoreJwtTimeClaims() {
|
|
680
|
+
var ml = _mlPair();
|
|
681
|
+
|
|
682
|
+
// Expired token (exp = now + 100s; verify 200s later).
|
|
683
|
+
var expiredTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
684
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", expiresInSec: 100, now: _NOW_MS });
|
|
685
|
+
var laterMs = (_NOW_SEC + 200) * 1000; // allow:raw-byte-literal — seconds→ms
|
|
686
|
+
var t1 = null;
|
|
687
|
+
try {
|
|
688
|
+
await b.auth.jwt.verify(expiredTok, { publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: laterMs });
|
|
689
|
+
} catch (e) { t1 = e; }
|
|
690
|
+
check("core jwt: expired token refused (auth-jwt/expired)",
|
|
691
|
+
t1 && t1.code === "auth-jwt/expired");
|
|
692
|
+
|
|
693
|
+
// Clock tolerance widens the window enough to accept it.
|
|
694
|
+
var okTol = await b.auth.jwt.verify(expiredTok, {
|
|
695
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: laterMs, clockToleranceSec: 300,
|
|
696
|
+
});
|
|
697
|
+
check("core jwt: clockToleranceSec leeway accepts a barely-expired token", okTol && okTol.sub === "u1");
|
|
698
|
+
|
|
699
|
+
// not-yet-valid (nbf in the future).
|
|
700
|
+
var futureTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
701
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", notBeforeSec: 100, now: _NOW_MS });
|
|
702
|
+
var t2 = null;
|
|
703
|
+
try {
|
|
704
|
+
await b.auth.jwt.verify(futureTok, { publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS });
|
|
705
|
+
} catch (e) { t2 = e; }
|
|
706
|
+
check("core jwt: nbf-in-future refused (auth-jwt/not-yet-valid)",
|
|
707
|
+
t2 && t2.code === "auth-jwt/not-yet-valid");
|
|
708
|
+
|
|
709
|
+
// Negative / non-finite clock tolerance is a config error.
|
|
710
|
+
var bad = [-1, Infinity, NaN];
|
|
711
|
+
for (var i = 0; i < bad.length; i++) {
|
|
712
|
+
var tb = null;
|
|
713
|
+
try {
|
|
714
|
+
await b.auth.jwt.verify(expiredTok, {
|
|
715
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: laterMs, clockToleranceSec: bad[i],
|
|
716
|
+
});
|
|
717
|
+
} catch (e) { tb = e; }
|
|
718
|
+
check("core jwt: clockToleranceSec=" + String(bad[i]) + " refused (auth-jwt/bad-clock-tolerance)",
|
|
719
|
+
tb && tb.code === "auth-jwt/bad-clock-tolerance");
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// NumericDate typing: a STRING exp must not silently bypass expiry.
|
|
723
|
+
var strExpTok = _rawJws(ml.privateKey,
|
|
724
|
+
{ alg: "ML-DSA-87", typ: "JWT" }, { sub: "u1", exp: "9999999999", iat: _NOW_SEC });
|
|
725
|
+
var t3 = null;
|
|
726
|
+
try {
|
|
727
|
+
await b.auth.jwt.verify(strExpTok, { publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], now: _NOW_MS });
|
|
728
|
+
} catch (e) { t3 = e; }
|
|
729
|
+
check("core jwt: string exp refused as malformed (no expiry bypass, RFC 7519 NumericDate)",
|
|
730
|
+
t3 && t3.code === "auth-jwt/malformed");
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Registered-claim assertions: iss (StringOrURI, not an array), aud (any-of),
|
|
734
|
+
// sub (exact).
|
|
735
|
+
async function testCoreJwtClaimAssertions() {
|
|
736
|
+
var ml = _mlPair();
|
|
737
|
+
|
|
738
|
+
// iss-array injection: iss:["evil","trusted"] must NOT satisfy a single
|
|
739
|
+
// trusted-issuer expectation (CVE-2025-30144 class).
|
|
740
|
+
var arrIssTok = await b.auth.jwt.sign(
|
|
741
|
+
{ sub: "u1", iss: ["evil.example", "trusted.example"] },
|
|
742
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
743
|
+
var t1 = null;
|
|
744
|
+
try {
|
|
745
|
+
await b.auth.jwt.verify(arrIssTok, {
|
|
746
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], issuer: "trusted.example", now: _NOW_MS,
|
|
747
|
+
});
|
|
748
|
+
} catch (e) { t1 = e; }
|
|
749
|
+
check("core jwt: array iss does not satisfy single-issuer expectation (auth-jwt/iss-mismatch)",
|
|
750
|
+
t1 && t1.code === "auth-jwt/iss-mismatch");
|
|
751
|
+
|
|
752
|
+
// aud any-of: token aud is an array, expectation matches one entry.
|
|
753
|
+
var audTok = await b.auth.jwt.sign(
|
|
754
|
+
{ sub: "u1", aud: ["svc-a", "svc-b"] },
|
|
755
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
756
|
+
var okAud = await b.auth.jwt.verify(audTok, {
|
|
757
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], audience: "svc-b", now: _NOW_MS,
|
|
758
|
+
});
|
|
759
|
+
check("core jwt: aud array matches expected any-of", okAud && okAud.sub === "u1");
|
|
760
|
+
var t2 = null;
|
|
761
|
+
try {
|
|
762
|
+
await b.auth.jwt.verify(audTok, {
|
|
763
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], audience: "svc-c", now: _NOW_MS,
|
|
764
|
+
});
|
|
765
|
+
} catch (e) { t2 = e; }
|
|
766
|
+
check("core jwt: aud mismatch refused (auth-jwt/aud-mismatch)",
|
|
767
|
+
t2 && t2.code === "auth-jwt/aud-mismatch");
|
|
768
|
+
|
|
769
|
+
// sub exact match.
|
|
770
|
+
var subTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
771
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: _NOW_MS });
|
|
772
|
+
var t3 = null;
|
|
773
|
+
try {
|
|
774
|
+
await b.auth.jwt.verify(subTok, {
|
|
775
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], subject: "u2", now: _NOW_MS,
|
|
776
|
+
});
|
|
777
|
+
} catch (e) { t3 = e; }
|
|
778
|
+
check("core jwt: sub mismatch refused (auth-jwt/sub-mismatch)",
|
|
779
|
+
t3 && t3.code === "auth-jwt/sub-mismatch");
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
// Replay defense: jti-less token refused when replayStore is wired; a valid
|
|
783
|
+
// token verifies once and is refused on second use; a store missing
|
|
784
|
+
// checkAndInsert is a config error.
|
|
785
|
+
async function testCoreJwtReplay() {
|
|
786
|
+
var ml = _mlPair();
|
|
787
|
+
var store = b.nonceStore.create({ backend: "memory" });
|
|
788
|
+
// The memory replay store evicts against real wall-clock, and expireAt is
|
|
789
|
+
// derived from the token's exp claim — so drive this case on the real clock
|
|
790
|
+
// (a fixed past exp would evict the entry before the replay check).
|
|
791
|
+
var realNowMs = Date.now();
|
|
792
|
+
|
|
793
|
+
// No exp → no auto-jti → replayStore has nothing to bind → refuse.
|
|
794
|
+
var noJtiTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
795
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", now: realNowMs });
|
|
796
|
+
var t1 = null;
|
|
797
|
+
try {
|
|
798
|
+
await b.auth.jwt.verify(noJtiTok, {
|
|
799
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], replayStore: store, now: realNowMs,
|
|
800
|
+
});
|
|
801
|
+
} catch (e) { t1 = e; }
|
|
802
|
+
check("core jwt: replayStore with a jti-less token refused (auth-jwt/replay-no-jti)",
|
|
803
|
+
t1 && t1.code === "auth-jwt/replay-no-jti");
|
|
804
|
+
|
|
805
|
+
// exp present → jti auto-minted → first verify ok, second is a replay.
|
|
806
|
+
var repTok = await b.auth.jwt.sign({ sub: "u1" },
|
|
807
|
+
{ privateKey: ml.privateKey, algorithm: "ML-DSA-87", expiresInSec: 3600, now: realNowMs });
|
|
808
|
+
var okFirst = await b.auth.jwt.verify(repTok, {
|
|
809
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], replayStore: store, now: realNowMs,
|
|
810
|
+
});
|
|
811
|
+
check("core jwt: first use of a jti verifies with replayStore", okFirst && okFirst.sub === "u1");
|
|
812
|
+
var t2 = null;
|
|
813
|
+
try {
|
|
814
|
+
await b.auth.jwt.verify(repTok, {
|
|
815
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], replayStore: store, now: realNowMs,
|
|
816
|
+
});
|
|
817
|
+
} catch (e) { t2 = e; }
|
|
818
|
+
check("core jwt: second use of the same jti refused (auth-jwt/replay)",
|
|
819
|
+
t2 && t2.code === "auth-jwt/replay");
|
|
820
|
+
|
|
821
|
+
// A store lacking checkAndInsert is a config error.
|
|
822
|
+
var t3 = null;
|
|
823
|
+
try {
|
|
824
|
+
await b.auth.jwt.verify(repTok, {
|
|
825
|
+
publicKey: ml.publicKey, algorithms: ["ML-DSA-87"], replayStore: {}, now: realNowMs,
|
|
826
|
+
});
|
|
827
|
+
} catch (e) { t3 = e; }
|
|
828
|
+
check("core jwt: replayStore missing checkAndInsert refused (auth-jwt/bad-replay-store)",
|
|
829
|
+
t3 && t3.code === "auth-jwt/bad-replay-store");
|
|
830
|
+
|
|
831
|
+
if (typeof store.close === "function") store.close();
|
|
832
|
+
}
|
|
833
|
+
|
|
408
834
|
async function run() {
|
|
835
|
+
await testAlgConfusionAllowlistBypass();
|
|
836
|
+
await testSignRefusesMismatchedAlgKey();
|
|
837
|
+
testCoreJwtDecodeMalformed();
|
|
838
|
+
await testCoreJwtKeyResolution();
|
|
839
|
+
await testCoreJwtCritAndTyp();
|
|
840
|
+
await testCoreJwtAlgAllowlist();
|
|
841
|
+
await testCoreJwtTamperedSignature();
|
|
842
|
+
await testCoreJwtTimeClaims();
|
|
843
|
+
await testCoreJwtClaimAssertions();
|
|
844
|
+
await testCoreJwtReplay();
|
|
409
845
|
await testJwtExternalNonFiniteSkewRejected();
|
|
410
846
|
await testOauthCreateNonFiniteSkewRejected();
|
|
411
847
|
await testNullJoseHeaderTypedError();
|