@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- 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
|
@@ -237,19 +237,56 @@ function testTinyPsSvgBadInput() {
|
|
|
237
237
|
|
|
238
238
|
// ---- fetchAndVerifyMark with a self-signed test cert chain ----
|
|
239
239
|
|
|
240
|
+
var YEAR_MS = 365 * 24 * 60 * 60 * 1000;
|
|
241
|
+
var BIMI_EKU_OID = "1.3.6.1.5.5.7.3.31";
|
|
242
|
+
var ID_PE_LOGOTYPE_OID = "1.3.6.1.5.5.7.1.12";
|
|
243
|
+
|
|
244
|
+
function _genKey() {
|
|
245
|
+
return pki.crypto.subtle.generateKey(
|
|
246
|
+
{ name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"]);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// _logotypeExtension — a minimal RFC 3709 id-pe-logotype extension whose
|
|
250
|
+
// value is `SEQUENCE { OCTET STRING <svg...> }`, exercising both the
|
|
251
|
+
// constructed-recursion and primitive-match paths of the framework's
|
|
252
|
+
// best-effort embedded-SVG scanner. The SVG stays < 128 bytes so every
|
|
253
|
+
// DER length is single-byte.
|
|
254
|
+
function _logotypeExtension(svgText) {
|
|
255
|
+
var svg = Buffer.from(svgText, "utf8");
|
|
256
|
+
var octet = Buffer.concat([Buffer.from([0x04, svg.length]), svg]);
|
|
257
|
+
var seq = Buffer.concat([Buffer.from([0x30, octet.length]), octet]);
|
|
258
|
+
return new x509.Extension(ID_PE_LOGOTYPE_OID, false, seq);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// _logotypeExtensionRaw — id-pe-logotype extension over caller-supplied
|
|
262
|
+
// DER, so a test can exercise the scanner's non-SVG-leaf, no-match, and
|
|
263
|
+
// truncated-SEQUENCE fallback branches directly.
|
|
264
|
+
function _logotypeExtensionRaw(innerDer) {
|
|
265
|
+
return new x509.Extension(ID_PE_LOGOTYPE_OID, false, innerDer);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// A short DER OCTET STRING whose bytes are not an SVG magic prefix.
|
|
269
|
+
var _OCTET_NON_SVG = Buffer.from([0x04, 0x04, 0x78, 0x78, 0x78, 0x78]);
|
|
270
|
+
function _octetOf(text) {
|
|
271
|
+
var b2 = Buffer.from(text, "utf8");
|
|
272
|
+
return Buffer.concat([Buffer.from([0x04, b2.length]), b2]);
|
|
273
|
+
}
|
|
274
|
+
function _derSequence(contentBuf) {
|
|
275
|
+
return Buffer.concat([Buffer.from([0x30, contentBuf.length]), contentBuf]);
|
|
276
|
+
}
|
|
277
|
+
|
|
240
278
|
async function _generateTestChain(opts) {
|
|
241
279
|
opts = opts || {};
|
|
242
280
|
var sanDomain = opts.sanDomain || "example.com";
|
|
243
281
|
var includeBimiEku = opts.includeBimiEku !== false;
|
|
244
|
-
var bimiEkuOid = "1.3.6.1.5.5.7.3.31";
|
|
245
282
|
|
|
246
|
-
var caKeys = await
|
|
247
|
-
|
|
248
|
-
var leafKeys = await pki.crypto.subtle.generateKey(
|
|
249
|
-
{ name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"]);
|
|
283
|
+
var caKeys = await _genKey();
|
|
284
|
+
var leafKeys = await _genKey();
|
|
250
285
|
|
|
251
286
|
var now = new Date();
|
|
252
|
-
var notAfter = new Date(now.getTime() +
|
|
287
|
+
var notAfter = new Date(now.getTime() + YEAR_MS);
|
|
288
|
+
var leafNotBefore = opts.leafNotBefore || now;
|
|
289
|
+
var leafNotAfter = opts.leafNotAfter || notAfter;
|
|
253
290
|
|
|
254
291
|
var ca = await x509.X509CertificateGenerator.createSelfSigned({
|
|
255
292
|
serialNumber: "01",
|
|
@@ -269,12 +306,13 @@ async function _generateTestChain(opts) {
|
|
|
269
306
|
new x509.BasicConstraintsExtension(false, undefined, true),
|
|
270
307
|
new x509.KeyUsagesExtension(
|
|
271
308
|
x509.KeyUsageFlags.digitalSignature, true),
|
|
272
|
-
new x509.SubjectAlternativeNameExtension([
|
|
273
|
-
{ type: "dns", value: sanDomain },
|
|
274
|
-
]),
|
|
275
309
|
];
|
|
310
|
+
if (!opts.noSan) {
|
|
311
|
+
var sanEntries = opts.sanEntries || [{ type: "dns", value: sanDomain }];
|
|
312
|
+
leafExts.push(new x509.SubjectAlternativeNameExtension(sanEntries));
|
|
313
|
+
}
|
|
276
314
|
if (includeBimiEku) {
|
|
277
|
-
leafExts.push(new x509.ExtendedKeyUsageExtension([
|
|
315
|
+
leafExts.push(new x509.ExtendedKeyUsageExtension([BIMI_EKU_OID], false));
|
|
278
316
|
}
|
|
279
317
|
if (opts.policyOid) {
|
|
280
318
|
// Add a CertificatePolicies extension carrying the supplied OID so
|
|
@@ -282,13 +320,19 @@ async function _generateTestChain(opts) {
|
|
|
282
320
|
// pkijs/asn1 path the vendor bundle exposes.
|
|
283
321
|
leafExts.push(new x509.CertificatePolicyExtension([opts.policyOid], false));
|
|
284
322
|
}
|
|
323
|
+
if (opts.logoSvg) {
|
|
324
|
+
leafExts.push(_logotypeExtension(opts.logoSvg));
|
|
325
|
+
}
|
|
326
|
+
if (opts.logotypeExt) {
|
|
327
|
+
leafExts.push(opts.logotypeExt);
|
|
328
|
+
}
|
|
285
329
|
|
|
286
330
|
var leaf = await x509.X509CertificateGenerator.create({
|
|
287
331
|
serialNumber: "02",
|
|
288
332
|
issuer: ca.subject,
|
|
289
333
|
subject: "CN=" + sanDomain,
|
|
290
|
-
notBefore:
|
|
291
|
-
notAfter:
|
|
334
|
+
notBefore: leafNotBefore,
|
|
335
|
+
notAfter: leafNotAfter,
|
|
292
336
|
signingAlgorithm: { name: "ECDSA", hash: "SHA-256" },
|
|
293
337
|
publicKey: leafKeys.publicKey,
|
|
294
338
|
signingKey: caKeys.privateKey,
|
|
@@ -301,6 +345,86 @@ async function _generateTestChain(opts) {
|
|
|
301
345
|
};
|
|
302
346
|
}
|
|
303
347
|
|
|
348
|
+
// _generateThreeLevelChain — root -> intermediate -> leaf, so the fetched
|
|
349
|
+
// PEM body carries [leaf, intermediate] and the trust anchor is the root.
|
|
350
|
+
// Drives the intermediate-walk branch of the chain verifier.
|
|
351
|
+
async function _generateThreeLevelChain() {
|
|
352
|
+
var rootKeys = await _genKey();
|
|
353
|
+
var interKeys = await _genKey();
|
|
354
|
+
var leafKeys = await _genKey();
|
|
355
|
+
var now = new Date();
|
|
356
|
+
var far = new Date(now.getTime() + 10 * YEAR_MS);
|
|
357
|
+
var alg = { name: "ECDSA", hash: "SHA-256" };
|
|
358
|
+
var caUsage = x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign;
|
|
359
|
+
|
|
360
|
+
var root = await x509.X509CertificateGenerator.createSelfSigned({
|
|
361
|
+
serialNumber: "01", name: "CN=BIMI Test Root", notBefore: now, notAfter: far,
|
|
362
|
+
signingAlgorithm: alg, keys: rootKeys,
|
|
363
|
+
extensions: [
|
|
364
|
+
new x509.BasicConstraintsExtension(true, 2, true),
|
|
365
|
+
new x509.KeyUsagesExtension(caUsage, true),
|
|
366
|
+
],
|
|
367
|
+
});
|
|
368
|
+
var inter = await x509.X509CertificateGenerator.create({
|
|
369
|
+
serialNumber: "02", issuer: root.subject, subject: "CN=BIMI Test Intermediate",
|
|
370
|
+
notBefore: now, notAfter: far, signingAlgorithm: alg,
|
|
371
|
+
publicKey: interKeys.publicKey, signingKey: rootKeys.privateKey,
|
|
372
|
+
extensions: [
|
|
373
|
+
new x509.BasicConstraintsExtension(true, 0, true),
|
|
374
|
+
new x509.KeyUsagesExtension(caUsage, true),
|
|
375
|
+
],
|
|
376
|
+
});
|
|
377
|
+
var leaf = await x509.X509CertificateGenerator.create({
|
|
378
|
+
serialNumber: "03", issuer: inter.subject, subject: "CN=example.com",
|
|
379
|
+
notBefore: now, notAfter: far, signingAlgorithm: alg,
|
|
380
|
+
publicKey: leafKeys.publicKey, signingKey: interKeys.privateKey,
|
|
381
|
+
extensions: [
|
|
382
|
+
new x509.BasicConstraintsExtension(false, undefined, true),
|
|
383
|
+
new x509.SubjectAlternativeNameExtension([{ type: "dns", value: "example.com" }]),
|
|
384
|
+
new x509.ExtendedKeyUsageExtension([BIMI_EKU_OID], false),
|
|
385
|
+
],
|
|
386
|
+
});
|
|
387
|
+
return {
|
|
388
|
+
rootPem: root.toString("pem"),
|
|
389
|
+
intermediatePem: inter.toString("pem"),
|
|
390
|
+
leafPem: leaf.toString("pem"),
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// _generateSelfSignedScenario — a self-signed leaf (with SAN + BIMI EKU)
|
|
395
|
+
// paired with an unrelated root as the trust anchor. The verifier reaches
|
|
396
|
+
// the "self-signed root not in bundle" branch.
|
|
397
|
+
async function _generateSelfSignedScenario() {
|
|
398
|
+
var leafKeys = await _genKey();
|
|
399
|
+
var otherKeys = await _genKey();
|
|
400
|
+
var now = new Date();
|
|
401
|
+
var far = new Date(now.getTime() + 10 * YEAR_MS);
|
|
402
|
+
var alg = { name: "ECDSA", hash: "SHA-256" };
|
|
403
|
+
|
|
404
|
+
var leaf = await x509.X509CertificateGenerator.createSelfSigned({
|
|
405
|
+
serialNumber: "05", name: "CN=example.com", notBefore: now, notAfter: far,
|
|
406
|
+
signingAlgorithm: alg, keys: leafKeys,
|
|
407
|
+
extensions: [
|
|
408
|
+
new x509.BasicConstraintsExtension(false, undefined, true),
|
|
409
|
+
new x509.SubjectAlternativeNameExtension([{ type: "dns", value: "example.com" }]),
|
|
410
|
+
new x509.ExtendedKeyUsageExtension([BIMI_EKU_OID], false),
|
|
411
|
+
],
|
|
412
|
+
});
|
|
413
|
+
var other = await x509.X509CertificateGenerator.createSelfSigned({
|
|
414
|
+
serialNumber: "06", name: "CN=Unrelated Root", notBefore: now, notAfter: far,
|
|
415
|
+
signingAlgorithm: alg, keys: otherKeys,
|
|
416
|
+
extensions: [
|
|
417
|
+
new x509.BasicConstraintsExtension(true, 1, true),
|
|
418
|
+
new x509.KeyUsagesExtension(
|
|
419
|
+
x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign, true),
|
|
420
|
+
],
|
|
421
|
+
});
|
|
422
|
+
return {
|
|
423
|
+
leafPem: leaf.toString("pem"),
|
|
424
|
+
otherRootPem: other.toString("pem"),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
304
428
|
function _stubHttpClient(body, statusCode) {
|
|
305
429
|
return {
|
|
306
430
|
request: function (_opts) {
|
|
@@ -455,6 +579,578 @@ async function testFetchAndVerifyMarkBadOpts() {
|
|
|
455
579
|
threw && threw.code === "bimi/bad-opts");
|
|
456
580
|
}
|
|
457
581
|
|
|
582
|
+
// ---- recordShape adversarial branches ----
|
|
583
|
+
|
|
584
|
+
function testRecordShapeNonHttpsLogo() {
|
|
585
|
+
var threw = null;
|
|
586
|
+
try { b.mail.bimi.recordShape({ logoUrl: "http://example.com/logo.svg" }); }
|
|
587
|
+
catch (e) { threw = e; }
|
|
588
|
+
check("recordShape: non-https logoUrl throws mail-bimi/bad-logoUrl",
|
|
589
|
+
threw && threw.code === "mail-bimi/bad-logoUrl");
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
function testRecordShapeSemicolonLogo() {
|
|
593
|
+
// A semicolon survives safeUrl.parse (legal in the path) but must be
|
|
594
|
+
// refused as a TXT record-separator injection vector.
|
|
595
|
+
var threw = null;
|
|
596
|
+
try { b.mail.bimi.recordShape({ logoUrl: "https://example.com/logo.svg;a=evil" }); }
|
|
597
|
+
catch (e) { threw = e; }
|
|
598
|
+
check("recordShape: record-separator in logoUrl throws mail-bimi/bad-logo",
|
|
599
|
+
threw && threw.code === "mail-bimi/bad-logo");
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
function testRecordShapeSemicolonVmc() {
|
|
603
|
+
var threw = null;
|
|
604
|
+
try {
|
|
605
|
+
b.mail.bimi.recordShape({
|
|
606
|
+
logoUrl: "https://example.com/logo.svg",
|
|
607
|
+
vmcUrl: "https://example.com/cert.pem;a=evil",
|
|
608
|
+
});
|
|
609
|
+
} catch (e) { threw = e; }
|
|
610
|
+
check("recordShape: record-separator in vmcUrl throws mail-bimi/bad-vmc",
|
|
611
|
+
threw && threw.code === "mail-bimi/bad-vmc");
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
function testRecordShapeNonHttpsVmc() {
|
|
615
|
+
var threw = null;
|
|
616
|
+
try {
|
|
617
|
+
b.mail.bimi.recordShape({
|
|
618
|
+
logoUrl: "https://example.com/logo.svg",
|
|
619
|
+
vmcUrl: "http://example.com/cert.pem",
|
|
620
|
+
});
|
|
621
|
+
} catch (e) { threw = e; }
|
|
622
|
+
check("recordShape: non-https vmcUrl throws mail-bimi/bad-vmcUrl",
|
|
623
|
+
threw && threw.code === "mail-bimi/bad-vmcUrl");
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// ---- parseRecord defensive branches ----
|
|
627
|
+
|
|
628
|
+
function testParseRecordNonString() {
|
|
629
|
+
check("parseRecord: number input returns null",
|
|
630
|
+
b.mail.bimi.parseRecord(12345) === null);
|
|
631
|
+
check("parseRecord: null input returns null",
|
|
632
|
+
b.mail.bimi.parseRecord(null) === null);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
function testParseRecordTooLong() {
|
|
636
|
+
var big = "v=BIMI1; l=https://example.com/" + "a".repeat(2100);
|
|
637
|
+
check("parseRecord: record over 2 KiB cap returns null",
|
|
638
|
+
b.mail.bimi.parseRecord(big) === null);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// ---- fetchPolicy (DNS lookup path) ----
|
|
642
|
+
|
|
643
|
+
function _dnsStub(rows) {
|
|
644
|
+
return function (_qname, _type) { return Promise.resolve(rows); };
|
|
645
|
+
}
|
|
646
|
+
function _dnsReject(err) {
|
|
647
|
+
return function () { return Promise.reject(err); };
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
async function testFetchPolicySuccess() {
|
|
651
|
+
var pol = await b.mail.bimi.fetchPolicy("example.com", {
|
|
652
|
+
dnsLookup: _dnsStub([
|
|
653
|
+
["v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/cert.pem"],
|
|
654
|
+
]),
|
|
655
|
+
});
|
|
656
|
+
check("fetchPolicy: resolves and parses the BIMI record",
|
|
657
|
+
pol && pol.v === "BIMI1" &&
|
|
658
|
+
pol.l === "https://example.com/logo.svg" &&
|
|
659
|
+
pol.a === "https://example.com/cert.pem");
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
async function testFetchPolicySelectorMultiChunk() {
|
|
663
|
+
// Non-default selector; first record is not BIMI (skipped), second is a
|
|
664
|
+
// multi-chunk TXT that must be joined before parsing.
|
|
665
|
+
var pol = await b.mail.bimi.fetchPolicy("example.com", {
|
|
666
|
+
selector: "brand",
|
|
667
|
+
dnsLookup: _dnsStub([
|
|
668
|
+
["v=spf1 -all"],
|
|
669
|
+
["v=BIMI1; ", "l=https://example.com/logo.svg"],
|
|
670
|
+
]),
|
|
671
|
+
});
|
|
672
|
+
check("fetchPolicy: selector + multi-chunk record joins and parses",
|
|
673
|
+
pol && pol.v === "BIMI1" && pol.l === "https://example.com/logo.svg");
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
async function testFetchPolicyStringRow() {
|
|
677
|
+
// A resolver that returns flat string rows (not string[] chunks) must
|
|
678
|
+
// still parse — the record is coerced via String(rec).
|
|
679
|
+
var pol = await b.mail.bimi.fetchPolicy("example.com", {
|
|
680
|
+
dnsLookup: _dnsStub(["v=BIMI1; l=https://example.com/logo.svg"]),
|
|
681
|
+
});
|
|
682
|
+
check("fetchPolicy: flat string TXT row is coerced and parsed",
|
|
683
|
+
pol && pol.v === "BIMI1" && pol.l === "https://example.com/logo.svg");
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
async function testFetchPolicyNoBimiRecord() {
|
|
687
|
+
var pol = await b.mail.bimi.fetchPolicy("example.com", {
|
|
688
|
+
dnsLookup: _dnsStub([["v=spf1 -all"], ["random text"]]),
|
|
689
|
+
});
|
|
690
|
+
check("fetchPolicy: no v=BIMI1 record returns null", pol === null);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
async function testFetchPolicyAbsence() {
|
|
694
|
+
// ENODATA / ENOTFOUND => absence, not error => null.
|
|
695
|
+
var e = new Error("no TXT records");
|
|
696
|
+
e.code = "ENODATA";
|
|
697
|
+
var pol = await b.mail.bimi.fetchPolicy("example.com", {
|
|
698
|
+
dnsLookup: _dnsReject(e),
|
|
699
|
+
});
|
|
700
|
+
check("fetchPolicy: ENODATA absence returns null", pol === null);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
async function testFetchPolicyLookupFailure() {
|
|
704
|
+
var threw = null;
|
|
705
|
+
try {
|
|
706
|
+
await b.mail.bimi.fetchPolicy("example.com", {
|
|
707
|
+
dnsLookup: _dnsReject(new Error("SERVFAIL")),
|
|
708
|
+
});
|
|
709
|
+
} catch (err) { threw = err; }
|
|
710
|
+
check("fetchPolicy: non-absence lookup failure throws mail-bimi/lookup-failed",
|
|
711
|
+
threw && threw.code === "mail-bimi/lookup-failed");
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
async function testFetchPolicyBadDomain() {
|
|
715
|
+
var threw = null;
|
|
716
|
+
try { await b.mail.bimi.fetchPolicy(""); }
|
|
717
|
+
catch (err) { threw = err; }
|
|
718
|
+
check("fetchPolicy: empty domain throws mail-bimi/bad-domain",
|
|
719
|
+
threw && threw.code === "mail-bimi/bad-domain");
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// ---- validateTinyPsSvg additional tokenizer / cap branches ----
|
|
723
|
+
|
|
724
|
+
function testTinyPsSvgTooLargeBuffer() {
|
|
725
|
+
var threw = null;
|
|
726
|
+
try { b.mail.bimi.validateTinyPsSvg(Buffer.alloc(40000, 0x20)); }
|
|
727
|
+
catch (e) { threw = e; }
|
|
728
|
+
check("tiny-ps: oversized Buffer throws bimi/svg-too-large",
|
|
729
|
+
threw && threw.code === "bimi/svg-too-large");
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
function testTinyPsSvgComment() {
|
|
733
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
734
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><!-- a comment --></svg>');
|
|
735
|
+
check("tiny-ps: well-formed comment is allowed", rv.ok === true);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
function testTinyPsSvgUnterminatedComment() {
|
|
739
|
+
var threw = null;
|
|
740
|
+
try {
|
|
741
|
+
b.mail.bimi.validateTinyPsSvg(
|
|
742
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><!-- never closed');
|
|
743
|
+
} catch (e) { threw = e; }
|
|
744
|
+
check("tiny-ps: unterminated comment throws bimi/svg-tiny-ps-violation (parse-failed)",
|
|
745
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation" &&
|
|
746
|
+
/parse-failed/.test(threw.message));
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
function testTinyPsSvgCdata() {
|
|
750
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
751
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><title><![CDATA[hi]]></title></svg>');
|
|
752
|
+
check("tiny-ps: CDATA section is tolerated", rv.ok === true);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
function testTinyPsSvgUnterminatedCdata() {
|
|
756
|
+
var threw = null;
|
|
757
|
+
try {
|
|
758
|
+
b.mail.bimi.validateTinyPsSvg(
|
|
759
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><![CDATA[unterminated');
|
|
760
|
+
} catch (e) { threw = e; }
|
|
761
|
+
check("tiny-ps: unterminated CDATA throws parse-failed",
|
|
762
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
function testTinyPsSvgDeclaration() {
|
|
766
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
767
|
+
'<!ENTITY foo "bar"><svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"></svg>');
|
|
768
|
+
check("tiny-ps: non-DOCTYPE declaration flagged",
|
|
769
|
+
!rv.ok && rv.violations.some(function (v) { return v.code === "declaration-forbidden"; }));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
function testTinyPsSvgUnterminatedDeclaration() {
|
|
773
|
+
var threw = null;
|
|
774
|
+
try { b.mail.bimi.validateTinyPsSvg("<!ENTITY foo"); }
|
|
775
|
+
catch (e) { threw = e; }
|
|
776
|
+
check("tiny-ps: unterminated declaration throws parse-failed",
|
|
777
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
function testTinyPsSvgProcessingInstruction() {
|
|
781
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
782
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><?php echo 1 ?></svg>');
|
|
783
|
+
check("tiny-ps: non-xml processing instruction flagged",
|
|
784
|
+
!rv.ok && rv.violations.some(function (v) { return v.code === "pi-forbidden"; }));
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
function testTinyPsSvgAnimatePrefixElement() {
|
|
788
|
+
// Starts with "animate" but is not in the static forbidden list — the
|
|
789
|
+
// prefix rule must still refuse it (future SMIL animation elements).
|
|
790
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
791
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"><animateColor/></svg>');
|
|
792
|
+
check("tiny-ps: animate-prefixed element flagged as animation",
|
|
793
|
+
!rv.ok && rv.violations.some(function (v) {
|
|
794
|
+
return v.code === "element-forbidden" && /animation element/.test(v.message);
|
|
795
|
+
}));
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
function testTinyPsSvgTrailingText() {
|
|
799
|
+
var rv = b.mail.bimi.validateTinyPsSvg(GOOD_SVG + "trailing text after root");
|
|
800
|
+
check("tiny-ps: trailing text after root is tokenized without crash",
|
|
801
|
+
rv.ok === true);
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
function testTinyPsSvgUnterminatedDoctype() {
|
|
805
|
+
var threw = null;
|
|
806
|
+
try { b.mail.bimi.validateTinyPsSvg("<!DOCTYPE svg"); }
|
|
807
|
+
catch (e) { threw = e; }
|
|
808
|
+
check("tiny-ps: unterminated doctype throws parse-failed",
|
|
809
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
function testTinyPsSvgUnterminatedProcessingInstruction() {
|
|
813
|
+
var threw = null;
|
|
814
|
+
try { b.mail.bimi.validateTinyPsSvg("<?xml foo"); }
|
|
815
|
+
catch (e) { threw = e; }
|
|
816
|
+
check("tiny-ps: unterminated processing instruction throws parse-failed",
|
|
817
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
function testTinyPsSvgUnterminatedEndTag() {
|
|
821
|
+
var threw = null;
|
|
822
|
+
try {
|
|
823
|
+
b.mail.bimi.validateTinyPsSvg(
|
|
824
|
+
'<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"></svg');
|
|
825
|
+
} catch (e) { threw = e; }
|
|
826
|
+
check("tiny-ps: unterminated end tag throws parse-failed",
|
|
827
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
function testTinyPsSvgUnterminatedStartTag() {
|
|
831
|
+
var threw = null;
|
|
832
|
+
try { b.mail.bimi.validateTinyPsSvg('<svg version="1.2"'); }
|
|
833
|
+
catch (e) { threw = e; }
|
|
834
|
+
check("tiny-ps: unterminated start tag throws parse-failed",
|
|
835
|
+
threw && threw.code === "bimi/svg-tiny-ps-violation");
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
function testTinyPsSvgSingleQuotedAttrs() {
|
|
839
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
840
|
+
"<svg version='1.2' baseProfile='tiny-ps' viewBox='0 0 1 1'></svg>");
|
|
841
|
+
check("tiny-ps: single-quoted attributes accepted", rv.ok === true);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
function testTinyPsSvgMissingVersion() {
|
|
845
|
+
var rv = b.mail.bimi.validateTinyPsSvg(
|
|
846
|
+
'<svg baseProfile="tiny-ps" viewBox="0 0 1 1"></svg>');
|
|
847
|
+
check("tiny-ps: entirely-missing version flagged as (missing)",
|
|
848
|
+
!rv.ok && rv.violations.some(function (v) {
|
|
849
|
+
return v.code === "bad-version" && /\(missing\)/.test(v.message);
|
|
850
|
+
}));
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// ---- fetchAndVerifyMark additional error / chain / audit branches ----
|
|
854
|
+
|
|
855
|
+
function _throwingHttpClient(err) {
|
|
856
|
+
return { request: function () { return Promise.reject(err); } };
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
async function testFetchAndVerifyMarkRequestThrows() {
|
|
860
|
+
var chain = await _generateTestChain();
|
|
861
|
+
var threw = null;
|
|
862
|
+
try {
|
|
863
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
864
|
+
domain: "example.com",
|
|
865
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
866
|
+
trustAnchorsPem: chain.rootPem,
|
|
867
|
+
httpClient: _throwingHttpClient(new Error("ECONNREFUSED")),
|
|
868
|
+
});
|
|
869
|
+
} catch (e) { threw = e; }
|
|
870
|
+
check("fetchAndVerifyMark: transport error throws bimi/vmc-fetch-failed",
|
|
871
|
+
threw && threw.code === "bimi/vmc-fetch-failed" && /ECONNREFUSED/.test(threw.message));
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
async function testFetchAndVerifyMarkNoPemBlocks() {
|
|
875
|
+
// Body contains a BEGIN marker (passes the has-PEM check) but no END —
|
|
876
|
+
// _splitPemChain yields zero blocks.
|
|
877
|
+
var threw = null;
|
|
878
|
+
try {
|
|
879
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
880
|
+
domain: "example.com",
|
|
881
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
882
|
+
trustAnchorsPem: "anchor",
|
|
883
|
+
httpClient: _stubHttpClient("-----BEGIN CERTIFICATE-----\nabc\n"),
|
|
884
|
+
});
|
|
885
|
+
} catch (e) { threw = e; }
|
|
886
|
+
check("fetchAndVerifyMark: BEGIN-only body throws (no CERTIFICATE blocks)",
|
|
887
|
+
threw && threw.code === "bimi/vmc-fetch-failed" &&
|
|
888
|
+
/no CERTIFICATE blocks/.test(threw.message));
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
async function testFetchAndVerifyMarkGarbageIntermediate() {
|
|
892
|
+
var chain = await _generateTestChain();
|
|
893
|
+
var body = chain.leafPem +
|
|
894
|
+
"\n-----BEGIN CERTIFICATE-----\nnot-valid-der\n-----END CERTIFICATE-----\n";
|
|
895
|
+
var threw = null;
|
|
896
|
+
try {
|
|
897
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
898
|
+
domain: "example.com",
|
|
899
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
900
|
+
trustAnchorsPem: chain.rootPem,
|
|
901
|
+
httpClient: _stubHttpClient(body),
|
|
902
|
+
});
|
|
903
|
+
} catch (e) { threw = e; }
|
|
904
|
+
check("fetchAndVerifyMark: unparseable intermediate throws bimi/vmc-chain-invalid",
|
|
905
|
+
threw && threw.code === "bimi/vmc-chain-invalid" &&
|
|
906
|
+
/X.509 parse failed/.test(threw.message));
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
async function testFetchAndVerifyMarkGarbageTrustAnchor() {
|
|
910
|
+
var chain = await _generateTestChain();
|
|
911
|
+
var threw = null;
|
|
912
|
+
try {
|
|
913
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
914
|
+
domain: "example.com",
|
|
915
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
916
|
+
trustAnchorsPem: "-----BEGIN CERTIFICATE-----\nnot-valid\n-----END CERTIFICATE-----",
|
|
917
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
918
|
+
});
|
|
919
|
+
} catch (e) { threw = e; }
|
|
920
|
+
check("fetchAndVerifyMark: unparseable trust anchor throws bimi/vmc-chain-invalid",
|
|
921
|
+
threw && threw.code === "bimi/vmc-chain-invalid" &&
|
|
922
|
+
/trust-anchor PEM parse failed/.test(threw.message));
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
async function testFetchAndVerifyMarkExpiredCert() {
|
|
926
|
+
var chain = await _generateTestChain({
|
|
927
|
+
leafNotBefore: new Date(Date.now() - 2 * YEAR_MS),
|
|
928
|
+
leafNotAfter: new Date(Date.now() - YEAR_MS),
|
|
929
|
+
});
|
|
930
|
+
var threw = null;
|
|
931
|
+
try {
|
|
932
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
933
|
+
domain: "example.com",
|
|
934
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
935
|
+
trustAnchorsPem: chain.rootPem,
|
|
936
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
937
|
+
});
|
|
938
|
+
} catch (e) { threw = e; }
|
|
939
|
+
check("fetchAndVerifyMark: expired leaf throws bimi/vmc-chain-invalid (expired)",
|
|
940
|
+
threw && threw.code === "bimi/vmc-chain-invalid" && /expired/.test(threw.message));
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
async function testFetchAndVerifyMarkNotYetValidCert() {
|
|
944
|
+
var chain = await _generateTestChain({
|
|
945
|
+
leafNotBefore: new Date(Date.now() + YEAR_MS),
|
|
946
|
+
leafNotAfter: new Date(Date.now() + 2 * YEAR_MS),
|
|
947
|
+
});
|
|
948
|
+
var threw = null;
|
|
949
|
+
try {
|
|
950
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
951
|
+
domain: "example.com",
|
|
952
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
953
|
+
trustAnchorsPem: chain.rootPem,
|
|
954
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
955
|
+
});
|
|
956
|
+
} catch (e) { threw = e; }
|
|
957
|
+
check("fetchAndVerifyMark: not-yet-valid leaf throws bimi/vmc-chain-invalid",
|
|
958
|
+
threw && threw.code === "bimi/vmc-chain-invalid" && /not-yet-valid/.test(threw.message));
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
async function testFetchAndVerifyMarkThreeLevelChain() {
|
|
962
|
+
var chain = await _generateThreeLevelChain();
|
|
963
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
964
|
+
domain: "example.com",
|
|
965
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
966
|
+
trustAnchorsPem: chain.rootPem,
|
|
967
|
+
httpClient: _stubHttpClient(chain.leafPem + "\n" + chain.intermediatePem),
|
|
968
|
+
});
|
|
969
|
+
check("fetchAndVerifyMark: leaf->intermediate->root chain validates",
|
|
970
|
+
rv.ok === true && rv.vmcType === "vmc");
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
async function testFetchAndVerifyMarkSelfSignedNotInBundle() {
|
|
974
|
+
var scenario = await _generateSelfSignedScenario();
|
|
975
|
+
var threw = null;
|
|
976
|
+
try {
|
|
977
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
978
|
+
domain: "example.com",
|
|
979
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
980
|
+
trustAnchorsPem: scenario.otherRootPem,
|
|
981
|
+
httpClient: _stubHttpClient(scenario.leafPem),
|
|
982
|
+
});
|
|
983
|
+
} catch (e) { threw = e; }
|
|
984
|
+
check("fetchAndVerifyMark: self-signed leaf not in bundle throws chain-invalid",
|
|
985
|
+
threw && threw.code === "bimi/vmc-chain-invalid" &&
|
|
986
|
+
/self-signed root not in trust-anchor/.test(threw.message));
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
async function testFetchAndVerifyMarkUriSanSuccess() {
|
|
990
|
+
var chain = await _generateTestChain({
|
|
991
|
+
sanEntries: [{ type: "url", value: "https://example.com" }],
|
|
992
|
+
});
|
|
993
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
994
|
+
domain: "example.com",
|
|
995
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
996
|
+
trustAnchorsPem: chain.rootPem,
|
|
997
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
998
|
+
});
|
|
999
|
+
check("fetchAndVerifyMark: URI-form SAN matches the BIMI domain",
|
|
1000
|
+
rv.ok === true);
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
async function testFetchAndVerifyMarkUriSanMalformed() {
|
|
1004
|
+
// A URI SAN carrying userinfo is refused by the URL parser — the SAN
|
|
1005
|
+
// matcher must fail closed (no substring fallback) rather than vouch for
|
|
1006
|
+
// the domain. documents current behavior.
|
|
1007
|
+
var chain = await _generateTestChain({
|
|
1008
|
+
sanEntries: [{ type: "url", value: "https://evil@example.com" }],
|
|
1009
|
+
});
|
|
1010
|
+
var threw = null;
|
|
1011
|
+
try {
|
|
1012
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
1013
|
+
domain: "example.com",
|
|
1014
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1015
|
+
trustAnchorsPem: chain.rootPem,
|
|
1016
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1017
|
+
});
|
|
1018
|
+
} catch (e) { threw = e; }
|
|
1019
|
+
check("fetchAndVerifyMark: unparseable URI SAN fails closed (domain-mismatch)",
|
|
1020
|
+
threw && threw.code === "bimi/vmc-domain-mismatch");
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
async function testFetchAndVerifyMarkNoSan() {
|
|
1024
|
+
var chain = await _generateTestChain({ noSan: true });
|
|
1025
|
+
var threw = null;
|
|
1026
|
+
try {
|
|
1027
|
+
await b.mail.bimi.fetchAndVerifyMark({
|
|
1028
|
+
domain: "example.com",
|
|
1029
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1030
|
+
trustAnchorsPem: chain.rootPem,
|
|
1031
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1032
|
+
});
|
|
1033
|
+
} catch (e) { threw = e; }
|
|
1034
|
+
check("fetchAndVerifyMark: certificate without SAN throws domain-mismatch (none)",
|
|
1035
|
+
threw && threw.code === "bimi/vmc-domain-mismatch" && /\(none\)/.test(threw.message));
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
async function testFetchAndVerifyMarkLogotypeSvg() {
|
|
1039
|
+
var svgStr = '<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"></svg>';
|
|
1040
|
+
var chain = await _generateTestChain({ logoSvg: svgStr });
|
|
1041
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1042
|
+
domain: "example.com",
|
|
1043
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1044
|
+
trustAnchorsPem: chain.rootPem,
|
|
1045
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1046
|
+
});
|
|
1047
|
+
check("fetchAndVerifyMark: RFC 3709 logotype SVG is extracted onto mark.svg",
|
|
1048
|
+
rv.ok === true && typeof rv.mark.svg === "string" &&
|
|
1049
|
+
rv.mark.svg.indexOf("<svg") !== -1);
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
async function testFetchAndVerifyMarkLogotypeNonSvgLeafThenSvg() {
|
|
1053
|
+
// A logotype SEQUENCE whose first leaf is not an SVG magic prefix — the
|
|
1054
|
+
// scanner skips it and keeps descending to the SVG leaf.
|
|
1055
|
+
var svgStr = '<svg version="1.2" baseProfile="tiny-ps" viewBox="0 0 1 1"></svg>';
|
|
1056
|
+
var seq = _derSequence(Buffer.concat([_OCTET_NON_SVG, _octetOf(svgStr)]));
|
|
1057
|
+
var chain = await _generateTestChain({ logotypeExt: _logotypeExtensionRaw(seq) });
|
|
1058
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1059
|
+
domain: "example.com",
|
|
1060
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1061
|
+
trustAnchorsPem: chain.rootPem,
|
|
1062
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1063
|
+
});
|
|
1064
|
+
check("fetchAndVerifyMark: scanner skips non-SVG leaf and finds the SVG",
|
|
1065
|
+
rv.ok === true && typeof rv.mark.svg === "string" &&
|
|
1066
|
+
rv.mark.svg.indexOf("<svg") !== -1);
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
async function testFetchAndVerifyMarkLogotypeNoSvg() {
|
|
1070
|
+
// A logotype SEQUENCE with no SVG payload — the scan returns null and the
|
|
1071
|
+
// mark carries no svg.
|
|
1072
|
+
var seq = _derSequence(_OCTET_NON_SVG);
|
|
1073
|
+
var chain = await _generateTestChain({ logotypeExt: _logotypeExtensionRaw(seq) });
|
|
1074
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1075
|
+
domain: "example.com",
|
|
1076
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1077
|
+
trustAnchorsPem: chain.rootPem,
|
|
1078
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1079
|
+
});
|
|
1080
|
+
check("fetchAndVerifyMark: logotype without SVG yields mark.svg === null",
|
|
1081
|
+
rv.ok === true && rv.mark.svg === null);
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
async function testFetchAndVerifyMarkLogotypeTruncatedSequence() {
|
|
1085
|
+
// Logotype value where the outer SEQUENCE fails a full sequence-decode
|
|
1086
|
+
// (trailing incomplete TLV) but the first complete TLV still decodes to
|
|
1087
|
+
// the SVG — exercises the readNode fallback in the scanner.
|
|
1088
|
+
var inner = Buffer.from([0x30, 0x07, 0x04, 0x04, 0x3C, 0x73, 0x76, 0x67, 0xFF]);
|
|
1089
|
+
var chain = await _generateTestChain({ logotypeExt: _logotypeExtensionRaw(inner) });
|
|
1090
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1091
|
+
domain: "example.com",
|
|
1092
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1093
|
+
trustAnchorsPem: chain.rootPem,
|
|
1094
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1095
|
+
});
|
|
1096
|
+
check("fetchAndVerifyMark: scanner recovers SVG via readNode fallback",
|
|
1097
|
+
rv.ok === true && typeof rv.mark.svg === "string" &&
|
|
1098
|
+
rv.mark.svg.indexOf("<svg") !== -1);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
async function testFetchAndVerifyMarkStringBodyAndExplicitOpts() {
|
|
1102
|
+
// Response body delivered as a string (not Buffer) with explicit
|
|
1103
|
+
// timeoutMs / maxResponseBytes overrides.
|
|
1104
|
+
var chain = await _generateTestChain();
|
|
1105
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1106
|
+
domain: "example.com",
|
|
1107
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1108
|
+
trustAnchorsPem: chain.rootPem,
|
|
1109
|
+
timeoutMs: 5000,
|
|
1110
|
+
maxResponseBytes: 65536,
|
|
1111
|
+
httpClient: {
|
|
1112
|
+
request: function () {
|
|
1113
|
+
return Promise.resolve({ statusCode: 200, headers: {}, body: chain.leafPem });
|
|
1114
|
+
},
|
|
1115
|
+
},
|
|
1116
|
+
});
|
|
1117
|
+
check("fetchAndVerifyMark: string body + explicit timeout/maxBytes validates",
|
|
1118
|
+
rv.ok === true);
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
async function testFetchAndVerifyMarkAuditSinkSuccess() {
|
|
1122
|
+
var chain = await _generateTestChain();
|
|
1123
|
+
var events = [];
|
|
1124
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1125
|
+
domain: "example.com",
|
|
1126
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1127
|
+
trustAnchorsPem: chain.rootPem,
|
|
1128
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1129
|
+
evidenceDocument: "https://example.com/evidence.pdf",
|
|
1130
|
+
audit: { safeEmit: function (rec) { events.push(rec); } },
|
|
1131
|
+
});
|
|
1132
|
+
check("fetchAndVerifyMark: operator audit sink receives the success event",
|
|
1133
|
+
rv.ok === true &&
|
|
1134
|
+
rv.mark.evidenceDocument === "https://example.com/evidence.pdf" &&
|
|
1135
|
+
events.some(function (e) {
|
|
1136
|
+
return e.action === "mail.bimi.vmc.verified" && e.outcome === "success";
|
|
1137
|
+
}));
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
async function testFetchAndVerifyMarkAuditSinkThrows() {
|
|
1141
|
+
// A throwing audit sink must NOT break the verify hot path (drop-silent).
|
|
1142
|
+
var chain = await _generateTestChain();
|
|
1143
|
+
var rv = await b.mail.bimi.fetchAndVerifyMark({
|
|
1144
|
+
domain: "example.com",
|
|
1145
|
+
vmcUrl: "https://example.com/cert.pem",
|
|
1146
|
+
trustAnchorsPem: chain.rootPem,
|
|
1147
|
+
httpClient: _stubHttpClient(chain.leafPem),
|
|
1148
|
+
audit: { safeEmit: function () { throw new Error("sink boom"); } },
|
|
1149
|
+
});
|
|
1150
|
+
check("fetchAndVerifyMark: throwing audit sink is swallowed (verify still succeeds)",
|
|
1151
|
+
rv.ok === true);
|
|
1152
|
+
}
|
|
1153
|
+
|
|
458
1154
|
async function run() {
|
|
459
1155
|
testSurface();
|
|
460
1156
|
testRecordShape();
|
|
@@ -482,6 +1178,30 @@ async function run() {
|
|
|
482
1178
|
testTinyPsSvgTooLarge();
|
|
483
1179
|
testTinyPsSvgBadInput();
|
|
484
1180
|
|
|
1181
|
+
testRecordShapeNonHttpsLogo();
|
|
1182
|
+
testRecordShapeSemicolonLogo();
|
|
1183
|
+
testRecordShapeSemicolonVmc();
|
|
1184
|
+
testRecordShapeNonHttpsVmc();
|
|
1185
|
+
testParseRecordNonString();
|
|
1186
|
+
testParseRecordTooLong();
|
|
1187
|
+
|
|
1188
|
+
testTinyPsSvgTooLargeBuffer();
|
|
1189
|
+
testTinyPsSvgComment();
|
|
1190
|
+
testTinyPsSvgUnterminatedComment();
|
|
1191
|
+
testTinyPsSvgCdata();
|
|
1192
|
+
testTinyPsSvgUnterminatedCdata();
|
|
1193
|
+
testTinyPsSvgDeclaration();
|
|
1194
|
+
testTinyPsSvgUnterminatedDeclaration();
|
|
1195
|
+
testTinyPsSvgProcessingInstruction();
|
|
1196
|
+
testTinyPsSvgAnimatePrefixElement();
|
|
1197
|
+
testTinyPsSvgTrailingText();
|
|
1198
|
+
testTinyPsSvgUnterminatedDoctype();
|
|
1199
|
+
testTinyPsSvgUnterminatedProcessingInstruction();
|
|
1200
|
+
testTinyPsSvgUnterminatedEndTag();
|
|
1201
|
+
testTinyPsSvgUnterminatedStartTag();
|
|
1202
|
+
testTinyPsSvgSingleQuotedAttrs();
|
|
1203
|
+
testTinyPsSvgMissingVersion();
|
|
1204
|
+
|
|
485
1205
|
await testFetchAndVerifyMarkSuccess();
|
|
486
1206
|
await testFetchAndVerifyMarkCmc();
|
|
487
1207
|
await testFetchAndVerifyMarkChainInvalid();
|
|
@@ -492,6 +1212,33 @@ async function run() {
|
|
|
492
1212
|
await testFetchAndVerifyMarkHttpStatusFailure();
|
|
493
1213
|
await testFetchAndVerifyMarkBadOpts();
|
|
494
1214
|
|
|
1215
|
+
await testFetchPolicySuccess();
|
|
1216
|
+
await testFetchPolicySelectorMultiChunk();
|
|
1217
|
+
await testFetchPolicyStringRow();
|
|
1218
|
+
await testFetchPolicyNoBimiRecord();
|
|
1219
|
+
await testFetchPolicyAbsence();
|
|
1220
|
+
await testFetchPolicyLookupFailure();
|
|
1221
|
+
await testFetchPolicyBadDomain();
|
|
1222
|
+
|
|
1223
|
+
await testFetchAndVerifyMarkRequestThrows();
|
|
1224
|
+
await testFetchAndVerifyMarkNoPemBlocks();
|
|
1225
|
+
await testFetchAndVerifyMarkGarbageIntermediate();
|
|
1226
|
+
await testFetchAndVerifyMarkGarbageTrustAnchor();
|
|
1227
|
+
await testFetchAndVerifyMarkExpiredCert();
|
|
1228
|
+
await testFetchAndVerifyMarkNotYetValidCert();
|
|
1229
|
+
await testFetchAndVerifyMarkThreeLevelChain();
|
|
1230
|
+
await testFetchAndVerifyMarkSelfSignedNotInBundle();
|
|
1231
|
+
await testFetchAndVerifyMarkUriSanSuccess();
|
|
1232
|
+
await testFetchAndVerifyMarkUriSanMalformed();
|
|
1233
|
+
await testFetchAndVerifyMarkNoSan();
|
|
1234
|
+
await testFetchAndVerifyMarkLogotypeSvg();
|
|
1235
|
+
await testFetchAndVerifyMarkLogotypeNonSvgLeafThenSvg();
|
|
1236
|
+
await testFetchAndVerifyMarkLogotypeNoSvg();
|
|
1237
|
+
await testFetchAndVerifyMarkLogotypeTruncatedSequence();
|
|
1238
|
+
await testFetchAndVerifyMarkStringBodyAndExplicitOpts();
|
|
1239
|
+
await testFetchAndVerifyMarkAuditSinkSuccess();
|
|
1240
|
+
await testFetchAndVerifyMarkAuditSinkThrows();
|
|
1241
|
+
|
|
495
1242
|
// Suppress unused warning - reserved for future fixture-based negative tests.
|
|
496
1243
|
void nodeCrypto;
|
|
497
1244
|
}
|