@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,495 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* Layer 0 — b.auth.oid4vp (OpenID4VP 1.0 verifier).
|
|
6
|
+
*
|
|
7
|
+
* Dedicated behavioral coverage for the verifier surface only exercised
|
|
8
|
+
* indirectly by federation-vc-suite before now: the DCQL validator's
|
|
9
|
+
* every refusal branch, createRequest option handling, the DCQL matcher
|
|
10
|
+
* (format / issuer_values / credential_sets / null-and-index path walk),
|
|
11
|
+
* and — the high-yield path — verifyResponse composing the real SD-JWT
|
|
12
|
+
* VC verifier.
|
|
13
|
+
*
|
|
14
|
+
* Fixtures are real: SD-JWT VC presentations are minted with the
|
|
15
|
+
* framework's own b.auth.sdJwtVc.issue + present (holder-bound via cnf,
|
|
16
|
+
* KB-JWT signed over ES256) and verified offline through the
|
|
17
|
+
* issuerKeyResolver DI seam — no network. The adversarial checks pin the
|
|
18
|
+
* fail-closed contracts: a presentation whose vct sits OUTSIDE a 2+
|
|
19
|
+
* vct_values DCQL filter is refused (over-disclosure defense, oid4vp.js
|
|
20
|
+
* ~506-513); a presentation bound to the wrong audience or a stale nonce
|
|
21
|
+
* fails closed; requireKeyAttestation with no attestation refuses.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
var helpers = require("../helpers");
|
|
25
|
+
var b = helpers.b;
|
|
26
|
+
var check = helpers.check;
|
|
27
|
+
var nodeCrypto = require("node:crypto");
|
|
28
|
+
|
|
29
|
+
// One issuer + one holder keypair reused across the file (P-256 / ES256).
|
|
30
|
+
var ISSUER_KP = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
31
|
+
var HOLDER_KP = nodeCrypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
32
|
+
|
|
33
|
+
var CLIENT_ID = "https://verifier.example";
|
|
34
|
+
var RESPONSE_URI = "https://verifier.example/vp";
|
|
35
|
+
|
|
36
|
+
function _mkVerifier(extra) {
|
|
37
|
+
return b.auth.oid4vp.verifier.create(Object.assign({
|
|
38
|
+
clientId: CLIENT_ID,
|
|
39
|
+
responseUri: RESPONSE_URI,
|
|
40
|
+
issuerKeyResolver: function () { return ISSUER_KP.publicKey; },
|
|
41
|
+
}, extra || {}));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Mint a holder-bound SD-JWT VC and present it (KB-JWT over audience+nonce).
|
|
45
|
+
function _present(o) {
|
|
46
|
+
var holderJwk = HOLDER_KP.publicKey.export({ format: "jwk" });
|
|
47
|
+
var sd = b.auth.sdJwtVc.issue({
|
|
48
|
+
issuer: "https://issuer",
|
|
49
|
+
vct: o.vct,
|
|
50
|
+
claims: o.claims,
|
|
51
|
+
selectivelyDisclosed: Object.keys(o.claims),
|
|
52
|
+
issuerKey: ISSUER_KP.privateKey,
|
|
53
|
+
algorithm: "ES256",
|
|
54
|
+
holderKey: holderJwk,
|
|
55
|
+
});
|
|
56
|
+
return b.auth.sdJwtVc.present({
|
|
57
|
+
sdJwt: sd.token,
|
|
58
|
+
disclosedClaimNames: o.disclosed || Object.keys(o.claims),
|
|
59
|
+
audience: o.audience,
|
|
60
|
+
nonce: o.nonce,
|
|
61
|
+
holderKey: HOLDER_KP.privateKey,
|
|
62
|
+
algorithm: "ES256",
|
|
63
|
+
}).presentation;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Run a synchronous fn and return the thrown error's .code (or null).
|
|
67
|
+
function _syncCode(fn) {
|
|
68
|
+
try { fn(); return null; }
|
|
69
|
+
catch (e) { return e && e.code; }
|
|
70
|
+
}
|
|
71
|
+
// Await a promise and return the rejection's .code (or null on resolve).
|
|
72
|
+
async function _rejectCode(promise) {
|
|
73
|
+
try { await promise; return null; }
|
|
74
|
+
catch (e) { return e && e.code; }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---- create(): config-time validation --------------------------------
|
|
78
|
+
|
|
79
|
+
function testVerifierCreateValidation() {
|
|
80
|
+
check("create: non-object opts refused",
|
|
81
|
+
_syncCode(function () { b.auth.oid4vp.verifier.create(null); }) !== null);
|
|
82
|
+
|
|
83
|
+
check("create: missing clientId refused",
|
|
84
|
+
_syncCode(function () {
|
|
85
|
+
b.auth.oid4vp.verifier.create({ responseUri: RESPONSE_URI, issuerKeyResolver: function () {} });
|
|
86
|
+
}) === "auth-oid4vp/no-client-id");
|
|
87
|
+
|
|
88
|
+
check("create: missing responseUri refused",
|
|
89
|
+
_syncCode(function () {
|
|
90
|
+
b.auth.oid4vp.verifier.create({ clientId: CLIENT_ID, issuerKeyResolver: function () {} });
|
|
91
|
+
}) === "auth-oid4vp/no-response-uri");
|
|
92
|
+
|
|
93
|
+
check("create: non-function issuerKeyResolver refused",
|
|
94
|
+
_syncCode(function () {
|
|
95
|
+
b.auth.oid4vp.verifier.create({ clientId: CLIENT_ID, responseUri: RESPONSE_URI, issuerKeyResolver: "nope" });
|
|
96
|
+
}) === "auth-oid4vp/no-resolver");
|
|
97
|
+
|
|
98
|
+
var v = _mkVerifier();
|
|
99
|
+
check("create: valid opts expose the verifier surface",
|
|
100
|
+
v && typeof v.createRequest === "function" &&
|
|
101
|
+
typeof v.verifyResponse === "function" &&
|
|
102
|
+
typeof v.matchDcql === "function" &&
|
|
103
|
+
v.clientId === CLIENT_ID && v.responseUri === RESPONSE_URI);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ---- _validateDcql: every refusal branch (through matchDcql) ----------
|
|
107
|
+
|
|
108
|
+
function testDcqlValidatorRefusals() {
|
|
109
|
+
function code(dcql) { return _syncCode(function () { b.auth.oid4vp.matchDcql([], dcql); }); }
|
|
110
|
+
|
|
111
|
+
check("dcql: null query refused",
|
|
112
|
+
code(null) === "auth-oid4vp/bad-dcql");
|
|
113
|
+
check("dcql: array query refused",
|
|
114
|
+
code([]) === "auth-oid4vp/bad-dcql");
|
|
115
|
+
check("dcql: missing credentials refused",
|
|
116
|
+
code({}) === "auth-oid4vp/no-credentials");
|
|
117
|
+
check("dcql: empty credentials array refused",
|
|
118
|
+
code({ credentials: [] }) === "auth-oid4vp/no-credentials");
|
|
119
|
+
check("dcql: non-object credential entry refused",
|
|
120
|
+
code({ credentials: [null] }) === "auth-oid4vp/bad-credential-query");
|
|
121
|
+
check("dcql: missing credential id refused",
|
|
122
|
+
code({ credentials: [{ format: "vc+sd-jwt" }] }) === "auth-oid4vp/no-credential-id");
|
|
123
|
+
check("dcql: duplicate credential id refused",
|
|
124
|
+
code({ credentials: [
|
|
125
|
+
{ id: "c", format: "vc+sd-jwt" },
|
|
126
|
+
{ id: "c", format: "vc+sd-jwt" },
|
|
127
|
+
] }) === "auth-oid4vp/duplicate-id");
|
|
128
|
+
check("dcql: missing format refused",
|
|
129
|
+
code({ credentials: [{ id: "c" }] }) === "auth-oid4vp/no-format");
|
|
130
|
+
check("dcql: non-array claims refused",
|
|
131
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt", claims: "x" }] }) === "auth-oid4vp/bad-claims");
|
|
132
|
+
check("dcql: empty claim path refused",
|
|
133
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt", claims: [{ path: [] }] }] }) === "auth-oid4vp/bad-claim-path");
|
|
134
|
+
check("dcql: non-array claim path refused",
|
|
135
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt", claims: [{ path: "given_name" }] }] }) === "auth-oid4vp/bad-claim-path");
|
|
136
|
+
check("dcql: non-string/number/null path segment refused",
|
|
137
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt", claims: [{ path: [true] }] }] }) === "auth-oid4vp/bad-claim-segment");
|
|
138
|
+
check("dcql: non-array claim.values refused",
|
|
139
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt", claims: [{ path: ["x"], values: "v" }] }] }) === "auth-oid4vp/bad-claim-values");
|
|
140
|
+
check("dcql: non-array credential_sets refused",
|
|
141
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt" }], credential_sets: "x" }) === "auth-oid4vp/bad-credential-sets");
|
|
142
|
+
check("dcql: empty set options refused",
|
|
143
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt" }], credential_sets: [{ options: [] }] }) === "auth-oid4vp/bad-set-options");
|
|
144
|
+
check("dcql: non-array set option refused",
|
|
145
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt" }], credential_sets: [{ options: ["c"] }] }) === "auth-oid4vp/bad-set-option");
|
|
146
|
+
check("dcql: set option referencing unknown id refused",
|
|
147
|
+
code({ credentials: [{ id: "c", format: "vc+sd-jwt" }], credential_sets: [{ options: [["ghost"]] }] }) === "auth-oid4vp/unknown-set-id");
|
|
148
|
+
|
|
149
|
+
// A null path segment IS accepted (array wildcard) — proves the
|
|
150
|
+
// segment-type guard admits the spec-legal shapes.
|
|
151
|
+
check("dcql: null path segment accepted (array wildcard)",
|
|
152
|
+
_syncCode(function () {
|
|
153
|
+
b.auth.oid4vp.matchDcql(
|
|
154
|
+
[{ id: "c", format: "vc+sd-jwt", claims: { arr: [{ v: 1 }] } }],
|
|
155
|
+
{ credentials: [{ id: "c", format: "vc+sd-jwt", claims: [{ path: ["arr", null, "v"] }] }] });
|
|
156
|
+
}) === null);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ---- createRequest: option handling ----------------------------------
|
|
160
|
+
|
|
161
|
+
function testCreateRequest() {
|
|
162
|
+
var v = _mkVerifier();
|
|
163
|
+
|
|
164
|
+
check("createRequest: missing dcql refused",
|
|
165
|
+
_syncCode(function () { v.createRequest({}); }) === "auth-oid4vp/no-dcql");
|
|
166
|
+
check("createRequest: invalid dcql surfaces validator refusal",
|
|
167
|
+
_syncCode(function () { v.createRequest({ dcql: { credentials: [] } }); }) === "auth-oid4vp/no-credentials");
|
|
168
|
+
|
|
169
|
+
var dcql = { credentials: [{ id: "id-card", format: "vc+sd-jwt", claims: [{ path: ["given_name"] }] }] };
|
|
170
|
+
|
|
171
|
+
// Defaults: response_mode direct_post, generated 128-bit nonce/state,
|
|
172
|
+
// no aud key when the caller omits it.
|
|
173
|
+
var def = v.createRequest({ dcql: dcql });
|
|
174
|
+
check("createRequest: defaults response_type/mode + embeds dcql",
|
|
175
|
+
def.request.response_type === "vp_token" &&
|
|
176
|
+
def.request.response_mode === "direct_post" &&
|
|
177
|
+
def.request.client_id === CLIENT_ID &&
|
|
178
|
+
def.request.response_uri === RESPONSE_URI &&
|
|
179
|
+
def.request.dcql_query === dcql);
|
|
180
|
+
check("createRequest: generated nonce + state are non-empty and distinct",
|
|
181
|
+
typeof def.nonce === "string" && def.nonce.length > 0 &&
|
|
182
|
+
typeof def.state === "string" && def.state.length > 0 &&
|
|
183
|
+
def.nonce !== def.state);
|
|
184
|
+
check("createRequest: nonce/state on request mirror the return",
|
|
185
|
+
def.request.nonce === def.nonce && def.request.state === def.state);
|
|
186
|
+
check("createRequest: no aud key when omitted",
|
|
187
|
+
!("aud" in def.request));
|
|
188
|
+
|
|
189
|
+
// Overrides: responseMode / nonce / state / aud all honored.
|
|
190
|
+
var ov = v.createRequest({
|
|
191
|
+
dcql: dcql, responseMode: "direct_post.jwt",
|
|
192
|
+
nonce: "fixed-nonce", state: "fixed-state", aud: "https://aud.example",
|
|
193
|
+
});
|
|
194
|
+
check("createRequest: responseMode override honored",
|
|
195
|
+
ov.request.response_mode === "direct_post.jwt");
|
|
196
|
+
check("createRequest: nonce/state overrides honored",
|
|
197
|
+
ov.nonce === "fixed-nonce" && ov.state === "fixed-state");
|
|
198
|
+
check("createRequest: aud override reflected on request",
|
|
199
|
+
ov.request.aud === "https://aud.example");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ---- matchDcql: structural matcher paths ------------------------------
|
|
203
|
+
|
|
204
|
+
function testMatchDcqlPaths() {
|
|
205
|
+
var dcql = { credentials: [
|
|
206
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
207
|
+
meta: { vct_values: ["https://vct/identity"] },
|
|
208
|
+
claims: [{ path: ["given_name"] }] },
|
|
209
|
+
] };
|
|
210
|
+
|
|
211
|
+
// presentations must be an array.
|
|
212
|
+
var notArr = b.auth.oid4vp.matchDcql("not-an-array", dcql);
|
|
213
|
+
check("matchDcql: non-array presentations → invalid with error",
|
|
214
|
+
notArr.valid === false && notArr.errors.length > 0);
|
|
215
|
+
|
|
216
|
+
// presentation missing an id.
|
|
217
|
+
var noId = b.auth.oid4vp.matchDcql([{ format: "vc+sd-jwt", claims: {} }], dcql);
|
|
218
|
+
check("matchDcql: presentation missing id → invalid",
|
|
219
|
+
noId.valid === false && /missing id/.test(noId.errors[0]));
|
|
220
|
+
|
|
221
|
+
// format mismatch → the credential does not satisfy the query.
|
|
222
|
+
var badFmt = b.auth.oid4vp.matchDcql([
|
|
223
|
+
{ id: "id-card", format: "mso_mdoc", claims: { vct: "https://vct/identity", given_name: "A" } },
|
|
224
|
+
], dcql);
|
|
225
|
+
check("matchDcql: format mismatch refused",
|
|
226
|
+
badFmt.valid === false && badFmt.errors.length > 0);
|
|
227
|
+
|
|
228
|
+
// issuer_values filter — hit and miss.
|
|
229
|
+
var issDcql = { credentials: [
|
|
230
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
231
|
+
meta: { issuer_values: ["https://trusted-issuer"] } },
|
|
232
|
+
] };
|
|
233
|
+
var issHit = b.auth.oid4vp.matchDcql([
|
|
234
|
+
{ id: "id-card", format: "vc+sd-jwt", claims: { iss: "https://trusted-issuer", given_name: "A" } },
|
|
235
|
+
], issDcql);
|
|
236
|
+
check("matchDcql: issuer_values match accepted", issHit.valid === true);
|
|
237
|
+
var issMiss = b.auth.oid4vp.matchDcql([
|
|
238
|
+
{ id: "id-card", format: "vc+sd-jwt", claims: { iss: "https://rogue-issuer" } },
|
|
239
|
+
], issDcql);
|
|
240
|
+
check("matchDcql: issuer_values mismatch refused",
|
|
241
|
+
issMiss.valid === false && issMiss.errors.length > 0);
|
|
242
|
+
|
|
243
|
+
// A pure-credentials query (no credential_sets): a missing credential
|
|
244
|
+
// is an error via the else-branch.
|
|
245
|
+
var missing = b.auth.oid4vp.matchDcql([], dcql);
|
|
246
|
+
check("matchDcql: missing credential (no sets) → invalid",
|
|
247
|
+
missing.valid === false && /missing from presentation/.test(missing.errors[0]));
|
|
248
|
+
|
|
249
|
+
// credential_sets with required:false — an unsatisfied optional set is
|
|
250
|
+
// NOT an error.
|
|
251
|
+
var optDcql = {
|
|
252
|
+
credentials: [
|
|
253
|
+
{ id: "id-card", format: "vc+sd-jwt", claims: [{ path: ["given_name"] }] },
|
|
254
|
+
{ id: "passport", format: "vc+sd-jwt", claims: [{ path: ["number"] }] },
|
|
255
|
+
],
|
|
256
|
+
credential_sets: [
|
|
257
|
+
{ options: [["id-card"]], required: true },
|
|
258
|
+
{ options: [["passport"]], required: false },
|
|
259
|
+
],
|
|
260
|
+
};
|
|
261
|
+
var optRes = b.auth.oid4vp.matchDcql([
|
|
262
|
+
{ id: "id-card", format: "vc+sd-jwt", claims: { given_name: "A" } },
|
|
263
|
+
], optDcql);
|
|
264
|
+
check("matchDcql: unsatisfied optional credential_set is not an error",
|
|
265
|
+
optRes.valid === true && !!optRes.matched["id-card"] && !optRes.matched.passport);
|
|
266
|
+
|
|
267
|
+
// A required credential_set with no satisfied option → error.
|
|
268
|
+
var reqRes = b.auth.oid4vp.matchDcql([], {
|
|
269
|
+
credentials: [{ id: "id-card", format: "vc+sd-jwt" }],
|
|
270
|
+
credential_sets: [{ options: [["id-card"]], required: true }],
|
|
271
|
+
});
|
|
272
|
+
check("matchDcql: unsatisfied required credential_set refused",
|
|
273
|
+
reqRes.valid === false && /not satisfied/.test(reqRes.errors[0]));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ---- verifyResponse: input-shape refusals -----------------------------
|
|
277
|
+
|
|
278
|
+
async function testVerifyResponseInputGuards() {
|
|
279
|
+
var v = _mkVerifier();
|
|
280
|
+
var dcql = { credentials: [
|
|
281
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
282
|
+
meta: { vct_values: ["https://vct/identity"] },
|
|
283
|
+
claims: [{ path: ["given_name"] }] },
|
|
284
|
+
] };
|
|
285
|
+
|
|
286
|
+
check("verifyResponse: missing dcql throws",
|
|
287
|
+
(await _rejectCode(v.verifyResponse({ vpToken: {}, nonce: "n" }))) === "auth-oid4vp/no-dcql");
|
|
288
|
+
check("verifyResponse: missing nonce throws",
|
|
289
|
+
(await _rejectCode(v.verifyResponse({ vpToken: {}, dcql: dcql }))) === "auth-oid4vp/no-nonce");
|
|
290
|
+
check("verifyResponse: empty-string nonce throws",
|
|
291
|
+
(await _rejectCode(v.verifyResponse({ vpToken: {}, dcql: dcql, nonce: "" }))) === "auth-oid4vp/no-nonce");
|
|
292
|
+
|
|
293
|
+
// Legacy single-string vp_token with a MULTI-credential DCQL is refused
|
|
294
|
+
// (can't bind an unlabeled token to one of several credential queries).
|
|
295
|
+
var multiDcql = { credentials: [
|
|
296
|
+
{ id: "id-card", format: "vc+sd-jwt", claims: [{ path: ["given_name"] }] },
|
|
297
|
+
{ id: "passport", format: "vc+sd-jwt", claims: [{ path: ["number"] }] },
|
|
298
|
+
] };
|
|
299
|
+
check("verifyResponse: legacy string vp_token + multi-credential refused",
|
|
300
|
+
(await _rejectCode(v.verifyResponse({ vpToken: "sometoken", dcql: multiDcql, nonce: "n" })))
|
|
301
|
+
=== "auth-oid4vp/legacy-multi-credential");
|
|
302
|
+
|
|
303
|
+
// Array / non-object vp_token → bad-vp-token.
|
|
304
|
+
check("verifyResponse: array vp_token refused",
|
|
305
|
+
(await _rejectCode(v.verifyResponse({ vpToken: ["x"], dcql: dcql, nonce: "n" })))
|
|
306
|
+
=== "auth-oid4vp/bad-vp-token");
|
|
307
|
+
check("verifyResponse: numeric vp_token refused",
|
|
308
|
+
(await _rejectCode(v.verifyResponse({ vpToken: 42, dcql: dcql, nonce: "n" })))
|
|
309
|
+
=== "auth-oid4vp/bad-vp-token");
|
|
310
|
+
|
|
311
|
+
// A vp_token key not present in the DCQL query is recorded as an error,
|
|
312
|
+
// not silently accepted.
|
|
313
|
+
var stray = await v.verifyResponse({ vpToken: { "ghost": "tok" }, dcql: dcql, nonce: "n" });
|
|
314
|
+
check("verifyResponse: vp_token key absent from DCQL → error, invalid",
|
|
315
|
+
stray.valid === false && stray.errors.some(function (e) { return /not present in DCQL query/.test(e); }));
|
|
316
|
+
|
|
317
|
+
// A non-string presentation value → error.
|
|
318
|
+
var nonStr = await v.verifyResponse({ vpToken: { "id-card": 123 }, dcql: dcql, nonce: "n" });
|
|
319
|
+
check("verifyResponse: non-string presentation → error, invalid",
|
|
320
|
+
nonStr.valid === false && nonStr.errors.some(function (e) { return /is not a string/.test(e); }));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// ---- verifyResponse: real SD-JWT VC round-trips -----------------------
|
|
324
|
+
|
|
325
|
+
async function testVerifyResponseRoundTrip() {
|
|
326
|
+
var v = _mkVerifier();
|
|
327
|
+
var VCT = "https://vct/identity";
|
|
328
|
+
var dcql = { credentials: [
|
|
329
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
330
|
+
meta: { vct_values: [VCT] },
|
|
331
|
+
claims: [{ path: ["given_name"] }] },
|
|
332
|
+
] };
|
|
333
|
+
var req = v.createRequest({ dcql: dcql });
|
|
334
|
+
|
|
335
|
+
var pres = _present({
|
|
336
|
+
vct: VCT, claims: { given_name: "Alice", family_name: "Smith" },
|
|
337
|
+
disclosed: ["given_name"], audience: CLIENT_ID, nonce: req.nonce,
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// Object-keyed vp_token — the canonical DCQL path.
|
|
341
|
+
var ok = await v.verifyResponse({ vpToken: { "id-card": pres }, dcql: dcql, nonce: req.nonce });
|
|
342
|
+
check("verifyResponse: object-keyed round-trip valid",
|
|
343
|
+
ok.valid === true && ok.errors.length === 0 &&
|
|
344
|
+
ok.presentations.length === 1 &&
|
|
345
|
+
ok.presentations[0].claims.given_name === "Alice" &&
|
|
346
|
+
ok.presentations[0].claims.family_name === undefined &&
|
|
347
|
+
!!ok.matched["id-card"]);
|
|
348
|
+
|
|
349
|
+
// Legacy single-string vp_token with a single-credential DCQL binds to
|
|
350
|
+
// the lone credential id.
|
|
351
|
+
var okLegacy = await v.verifyResponse({ vpToken: pres, dcql: dcql, nonce: req.nonce });
|
|
352
|
+
check("verifyResponse: legacy string vp_token binds to lone credential",
|
|
353
|
+
okLegacy.valid === true && !!okLegacy.matched["id-card"]);
|
|
354
|
+
|
|
355
|
+
// Array-of-presentations under one id — each verified.
|
|
356
|
+
var okArr = await v.verifyResponse({ vpToken: { "id-card": [pres] }, dcql: dcql, nonce: req.nonce });
|
|
357
|
+
check("verifyResponse: array-valued presentation verified",
|
|
358
|
+
okArr.valid === true && okArr.presentations.length === 1);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// ---- verifyResponse: fail-closed adversarial contracts ----------------
|
|
362
|
+
|
|
363
|
+
async function testVerifyResponseFailClosed() {
|
|
364
|
+
var VCT = "https://vct/identity";
|
|
365
|
+
var dcql = { credentials: [
|
|
366
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
367
|
+
meta: { vct_values: [VCT] },
|
|
368
|
+
claims: [{ path: ["given_name"] }] },
|
|
369
|
+
] };
|
|
370
|
+
var v = _mkVerifier();
|
|
371
|
+
var req = v.createRequest({ dcql: dcql });
|
|
372
|
+
|
|
373
|
+
// Wrong audience: the KB-JWT is bound to a DIFFERENT verifier than the
|
|
374
|
+
// one checking it → refused (audience-redirection defense).
|
|
375
|
+
var wrongAud = _present({ vct: VCT, claims: { given_name: "Alice" },
|
|
376
|
+
audience: "https://attacker.example", nonce: req.nonce });
|
|
377
|
+
var rWrongAud = await v.verifyResponse({ vpToken: { "id-card": wrongAud }, dcql: dcql, nonce: req.nonce });
|
|
378
|
+
check("verifyResponse: wrong-audience presentation refused",
|
|
379
|
+
rWrongAud.valid === false && rWrongAud.errors.length > 0);
|
|
380
|
+
|
|
381
|
+
// Stale / forged nonce: presentation bound to nonce A, verified under
|
|
382
|
+
// nonce B → refused (replay defense).
|
|
383
|
+
var goodPres = _present({ vct: VCT, claims: { given_name: "Alice" },
|
|
384
|
+
audience: CLIENT_ID, nonce: req.nonce });
|
|
385
|
+
var rStaleNonce = await v.verifyResponse({ vpToken: { "id-card": goodPres }, dcql: dcql, nonce: "a-stale-nonce" });
|
|
386
|
+
check("verifyResponse: stale-nonce (replay) presentation refused",
|
|
387
|
+
rStaleNonce.valid === false && rStaleNonce.errors.length > 0);
|
|
388
|
+
|
|
389
|
+
// requireKeyAttestation with an ordinary presentation (no key_attestation
|
|
390
|
+
// header) → refused.
|
|
391
|
+
var rAttest = await v.verifyResponse({
|
|
392
|
+
vpToken: { "id-card": goodPres }, dcql: dcql, nonce: req.nonce, requireKeyAttestation: true });
|
|
393
|
+
check("verifyResponse: requireKeyAttestation with no attestation refused",
|
|
394
|
+
rAttest.valid === false && rAttest.errors.length > 0);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// ---- verifyResponse: per-presentation vct enforcement -----------------
|
|
398
|
+
|
|
399
|
+
async function testVerifyResponseVctEnforcement() {
|
|
400
|
+
var v = _mkVerifier();
|
|
401
|
+
|
|
402
|
+
// (A) Single vct_values → expectedVct pinned; a presentation with a
|
|
403
|
+
// DIFFERENT vct fails inside the SD-JWT VC verifier (fail-closed).
|
|
404
|
+
var pinnedDcql = { credentials: [
|
|
405
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
406
|
+
meta: { vct_values: ["https://vct/identity"] },
|
|
407
|
+
claims: [{ path: ["given_name"] }] },
|
|
408
|
+
] };
|
|
409
|
+
var reqPin = v.createRequest({ dcql: pinnedDcql });
|
|
410
|
+
var wrongVctPres = _present({ vct: "https://vct/passport", claims: { given_name: "Alice" },
|
|
411
|
+
audience: CLIENT_ID, nonce: reqPin.nonce });
|
|
412
|
+
var rPin = await v.verifyResponse({ vpToken: { "id-card": wrongVctPres }, dcql: pinnedDcql, nonce: reqPin.nonce });
|
|
413
|
+
check("verifyResponse: pinned single vct_values rejects a mismatched vct",
|
|
414
|
+
rPin.valid === false && rPin.errors.length > 0);
|
|
415
|
+
|
|
416
|
+
// (B) Two+ vct_values → verify runs WITHOUT expectedVct, then the
|
|
417
|
+
// manual membership check runs. In-list vct is accepted...
|
|
418
|
+
var listDcql = { credentials: [
|
|
419
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
420
|
+
meta: { vct_values: ["https://vct/identity", "https://vct/passport"] },
|
|
421
|
+
claims: [{ path: ["given_name"] }] },
|
|
422
|
+
] };
|
|
423
|
+
var reqList = v.createRequest({ dcql: listDcql });
|
|
424
|
+
var inListPres = _present({ vct: "https://vct/passport", claims: { given_name: "Alice" },
|
|
425
|
+
audience: CLIENT_ID, nonce: reqList.nonce });
|
|
426
|
+
var rInList = await v.verifyResponse({ vpToken: { "id-card": inListPres }, dcql: listDcql, nonce: reqList.nonce });
|
|
427
|
+
check("verifyResponse: 2+ vct_values accepts an in-list vct",
|
|
428
|
+
rInList.valid === true && rInList.presentations.length === 1 &&
|
|
429
|
+
rInList.presentations[0].claims.vct === "https://vct/passport");
|
|
430
|
+
|
|
431
|
+
// ...and a vct OUTSIDE the 2+ list is REFUSED (over-disclosure defense).
|
|
432
|
+
// A valid signature + correct audience/nonce is not enough: the holder
|
|
433
|
+
// must present a credential type the query actually asked for. Without
|
|
434
|
+
// the manual membership check this would slip through, since expectedVct
|
|
435
|
+
// is not pinned for a 2+ list.
|
|
436
|
+
var outListPres = _present({ vct: "https://vct/driver-license", claims: { given_name: "Alice" },
|
|
437
|
+
audience: CLIENT_ID, nonce: reqList.nonce });
|
|
438
|
+
var rOutList = await v.verifyResponse({ vpToken: { "id-card": outListPres }, dcql: listDcql, nonce: reqList.nonce });
|
|
439
|
+
check("verifyResponse: 2+ vct_values REFUSES an out-of-list vct (over-disclosure defense)",
|
|
440
|
+
rOutList.valid === false &&
|
|
441
|
+
rOutList.errors.some(function (e) { return /not in DCQL vct_values/.test(e); }));
|
|
442
|
+
check("verifyResponse: out-of-list vct is not surfaced as a presentation",
|
|
443
|
+
rOutList.presentations.length === 0);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// ---- verifyResponse: audience override (create({ audience })) ---------
|
|
447
|
+
|
|
448
|
+
async function testVerifyResponseAudienceOverride() {
|
|
449
|
+
var OVERRIDE_AUD = "https://audience-override.example";
|
|
450
|
+
var v = _mkVerifier({ audience: OVERRIDE_AUD });
|
|
451
|
+
var VCT = "https://vct/identity";
|
|
452
|
+
var dcql = { credentials: [
|
|
453
|
+
{ id: "id-card", format: "vc+sd-jwt",
|
|
454
|
+
meta: { vct_values: [VCT] },
|
|
455
|
+
claims: [{ path: ["given_name"] }] },
|
|
456
|
+
] };
|
|
457
|
+
var req = v.createRequest({ dcql: dcql });
|
|
458
|
+
|
|
459
|
+
// A presentation bound to the override audience verifies — proving the
|
|
460
|
+
// override, not clientId, is the audience the verifier binds to.
|
|
461
|
+
var presOk = _present({ vct: VCT, claims: { given_name: "Alice" },
|
|
462
|
+
audience: OVERRIDE_AUD, nonce: req.nonce });
|
|
463
|
+
var rOk = await v.verifyResponse({ vpToken: { "id-card": presOk }, dcql: dcql, nonce: req.nonce });
|
|
464
|
+
check("verifyResponse: audience override — presentation bound to override verifies",
|
|
465
|
+
rOk.valid === true);
|
|
466
|
+
|
|
467
|
+
// A presentation bound to clientId (the default) is REFUSED when an
|
|
468
|
+
// override audience is configured — the override is honored, not ignored.
|
|
469
|
+
var presClientId = _present({ vct: VCT, claims: { given_name: "Alice" },
|
|
470
|
+
audience: CLIENT_ID, nonce: req.nonce });
|
|
471
|
+
var rReject = await v.verifyResponse({ vpToken: { "id-card": presClientId }, dcql: dcql, nonce: req.nonce });
|
|
472
|
+
check("verifyResponse: audience override — presentation bound to clientId refused",
|
|
473
|
+
rReject.valid === false && rReject.errors.length > 0);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
async function run() {
|
|
477
|
+
testVerifierCreateValidation();
|
|
478
|
+
testDcqlValidatorRefusals();
|
|
479
|
+
testCreateRequest();
|
|
480
|
+
testMatchDcqlPaths();
|
|
481
|
+
await testVerifyResponseInputGuards();
|
|
482
|
+
await testVerifyResponseRoundTrip();
|
|
483
|
+
await testVerifyResponseFailClosed();
|
|
484
|
+
await testVerifyResponseVctEnforcement();
|
|
485
|
+
await testVerifyResponseAudienceOverride();
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
module.exports = { run: run };
|
|
489
|
+
|
|
490
|
+
if (require.main === module) {
|
|
491
|
+
run().then(
|
|
492
|
+
function () { console.log("[auth-oid4vp] OK — " + helpers.getChecks() + " checks passed"); },
|
|
493
|
+
function (e) { console.error("FAIL:", e && e.stack || e); process.exit(1); }
|
|
494
|
+
);
|
|
495
|
+
}
|