@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
|
@@ -68,6 +68,10 @@ var safeBuffer = lazyRequire(function () { return require("./safe-buffer"); });
|
|
|
68
68
|
// pqc-software requires this module (b.crypto) — lazy-load to break the
|
|
69
69
|
// cycle. Only the power-on self-test needs it here.
|
|
70
70
|
var pqcSoftware = lazyRequire(function () { return require("./pqc-software"); });
|
|
71
|
+
// network-tls requires this module (b.crypto) at top-of-file — lazy-load
|
|
72
|
+
// to break the cycle. Only spkiPinVerifier composes its RFC 9525 strict
|
|
73
|
+
// hostname/SAN matcher.
|
|
74
|
+
var networkTls = lazyRequire(function () { return require("./network-tls"); });
|
|
71
75
|
|
|
72
76
|
// Streaming-hash algorithm allowlist. Mirrors the framework's PQC-
|
|
73
77
|
// first crypto policy: SHA3 / SHAKE family is the default surface;
|
|
@@ -121,13 +125,20 @@ function hmac(key, data, algorithm) {
|
|
|
121
125
|
*/
|
|
122
126
|
function hashStream(readable, algorithm) {
|
|
123
127
|
var alg = (algorithm || STREAM_HASH_DEFAULT).toLowerCase();
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
// Own-property guard, not a truthiness check: STREAM_HASH_ALGORITHMS is a
|
|
129
|
+
// plain object, so a name colliding with an Object.prototype member
|
|
130
|
+
// ("constructor" → the Object constructor, "__proto__" → Object.prototype)
|
|
131
|
+
// would read back a truthy inherited value, slip past `if (!entry)`, and then
|
|
132
|
+
// throw ERR_INVALID_ARG_TYPE synchronously at createHash(entry.algorithm ===
|
|
133
|
+
// undefined) — a sync throw from a Promise-returning function. Refuse it here
|
|
134
|
+
// as the documented Promise.reject, matching b.crypto.sri's algorithm guard.
|
|
135
|
+
if (!Object.prototype.hasOwnProperty.call(STREAM_HASH_ALGORITHMS, alg)) {
|
|
126
136
|
return Promise.reject(new TypeError(
|
|
127
137
|
"crypto.hashStream: unsupported algorithm '" + algorithm +
|
|
128
138
|
"' (allowed: " + Object.keys(STREAM_HASH_ALGORITHMS).join(", ") + ")"
|
|
129
139
|
));
|
|
130
140
|
}
|
|
141
|
+
var entry = STREAM_HASH_ALGORITHMS[alg];
|
|
131
142
|
if (!readable || typeof readable.pipe !== "function") {
|
|
132
143
|
return Promise.reject(new TypeError(
|
|
133
144
|
"crypto.hashStream: readable must be a Readable stream"
|
|
@@ -191,19 +202,38 @@ function _hashFileMulti(filePath, algorithms, opts) {
|
|
|
191
202
|
var st;
|
|
192
203
|
try { st = nodeFs.lstatSync(filePath); }
|
|
193
204
|
catch (statErr) {
|
|
194
|
-
|
|
195
|
-
|
|
205
|
+
// Preserve the underlying fs error metadata (.code / .errno /
|
|
206
|
+
// .syscall / .path) so callers branch on ENOENT vs EACCES vs
|
|
207
|
+
// ELOOP rather than string-matching the wrapped message. The
|
|
208
|
+
// mid-read `stream.on("error", reject)` path below rejects the
|
|
209
|
+
// raw fs error and already carries .code; wrapping the pre-open
|
|
210
|
+
// stat error WITHOUT copying it forward made the observable
|
|
211
|
+
// failure shape nondeterministic by timing. Match atomic-file's
|
|
212
|
+
// posture of surfacing the raw fs code on the ENOENT-class path.
|
|
213
|
+
var statWrapped = new Error("crypto.hashFilesParallel: stat failed for '" +
|
|
214
|
+
filePath + "': " + (statErr && statErr.message ? statErr.message : String(statErr)));
|
|
215
|
+
if (statErr) {
|
|
216
|
+
statWrapped.code = statErr.code;
|
|
217
|
+
statWrapped.errno = statErr.errno;
|
|
218
|
+
statWrapped.syscall = statErr.syscall;
|
|
219
|
+
statWrapped.cause = statErr;
|
|
220
|
+
}
|
|
221
|
+
statWrapped.path = filePath;
|
|
222
|
+
reject(statWrapped);
|
|
196
223
|
return;
|
|
197
224
|
}
|
|
198
225
|
if (st.isSymbolicLink() && !followSymlink) {
|
|
199
|
-
|
|
226
|
+
var symErr = new Error("crypto.hashFilesParallel: refusing symlink '" +
|
|
200
227
|
filePath + "' — pass {followSymlinks: true} to opt in (an attacker " +
|
|
201
228
|
"with write access to the input list can otherwise direct the hasher " +
|
|
202
|
-
"to files the caller cannot read directly)")
|
|
229
|
+
"to files the caller cannot read directly)");
|
|
230
|
+
symErr.code = "crypto/hash-refused-symlink";
|
|
231
|
+
symErr.path = filePath;
|
|
232
|
+
reject(symErr);
|
|
203
233
|
return;
|
|
204
234
|
}
|
|
205
235
|
if (!st.isFile() && !st.isSymbolicLink()) {
|
|
206
|
-
|
|
236
|
+
var nonRegularErr = new Error("crypto.hashFilesParallel: refusing non-regular file '" +
|
|
207
237
|
filePath + "' (FIFOs / sockets / character / block devices read indefinitely " +
|
|
208
238
|
"or return platform-undefined bytes; hashing them is meaningless and " +
|
|
209
239
|
"DoS-prone). Type: " +
|
|
@@ -211,7 +241,10 @@ function _hashFileMulti(filePath, algorithms, opts) {
|
|
|
211
241
|
st.isSocket() ? "socket" :
|
|
212
242
|
st.isBlockDevice() ? "block-device" :
|
|
213
243
|
st.isCharacterDevice() ? "char-device" :
|
|
214
|
-
st.isDirectory() ? "directory" : "unknown"))
|
|
244
|
+
st.isDirectory() ? "directory" : "unknown"));
|
|
245
|
+
nonRegularErr.code = "crypto/hash-refused-non-regular-file";
|
|
246
|
+
nonRegularErr.path = filePath;
|
|
247
|
+
reject(nonRegularErr);
|
|
215
248
|
return;
|
|
216
249
|
}
|
|
217
250
|
var hashers = new Array(algorithms.length);
|
|
@@ -233,9 +266,12 @@ function _hashFileMulti(filePath, algorithms, opts) {
|
|
|
233
266
|
if (maxBytes && byteLength > maxBytes) {
|
|
234
267
|
aborted = true;
|
|
235
268
|
try { stream.destroy(); } catch (_e) { /* best-effort */ }
|
|
236
|
-
|
|
269
|
+
var maxBytesErr = new Error("crypto.hashFilesParallel: file '" + filePath +
|
|
237
270
|
"' exceeded opts.maxBytesPerFile (" + maxBytes +
|
|
238
|
-
" bytes); refusing to continue hashing")
|
|
271
|
+
" bytes); refusing to continue hashing");
|
|
272
|
+
maxBytesErr.code = "crypto/hash-max-bytes-exceeded";
|
|
273
|
+
maxBytesErr.path = filePath;
|
|
274
|
+
reject(maxBytesErr);
|
|
239
275
|
return;
|
|
240
276
|
}
|
|
241
277
|
for (var j = 0; j < hashers.length; j += 1) hashers[j].update(chunk);
|
|
@@ -957,7 +993,7 @@ var SRI_ALGORITHMS = { "sha256": "sha256", "sha384": "sha384", "sha512": "sha512
|
|
|
957
993
|
*
|
|
958
994
|
* @example
|
|
959
995
|
* var attr = b.crypto.sri(Buffer.from("alert(1);", "utf8"), { algorithm: "sha384" });
|
|
960
|
-
* // → "sha384-
|
|
996
|
+
* // → "sha384-dnux3uAPxaf+IhCrFG1D/XVNzP1XLDNcn3Pe3jyxouEAoot5kfwC5u8rMwNhE5oi"
|
|
961
997
|
*
|
|
962
998
|
* var multi = b.crypto.sri(["payload-a", "payload-b"], { algorithm: "sha512" });
|
|
963
999
|
* // → "sha512-... sha512-..." (two tokens, space-separated)
|
|
@@ -1369,6 +1405,24 @@ function _envU16(buf, at) {
|
|
|
1369
1405
|
return buf.readUInt16BE(at);
|
|
1370
1406
|
}
|
|
1371
1407
|
|
|
1408
|
+
// Read a 2-byte-length-prefixed component and bounds-check that the declared
|
|
1409
|
+
// body actually fits in the envelope BEFORE slicing it. Without this a
|
|
1410
|
+
// truncated envelope hands an under-length component (a short KEM ciphertext /
|
|
1411
|
+
// ephemeral public key) to Node crypto, which throws a raw
|
|
1412
|
+
// "Failed to perform decapsulation" / key-parse error that escapes the
|
|
1413
|
+
// documented "Invalid envelope: ..." contract. Returns { bytes, pos } where
|
|
1414
|
+
// pos is the offset past the component. A well-formed envelope always carries
|
|
1415
|
+
// each declared component in full, so this never rejects a valid input.
|
|
1416
|
+
function _envSlice(buf, at, label) {
|
|
1417
|
+
var len = _envU16(buf, at);
|
|
1418
|
+
at += 2;
|
|
1419
|
+
if (at + len > buf.length) {
|
|
1420
|
+
throw new Error("Invalid envelope: truncated (declared " + len + "-byte " +
|
|
1421
|
+
label + " at offset " + at + " exceeds the " + buf.length + "-byte envelope)");
|
|
1422
|
+
}
|
|
1423
|
+
return { bytes: buf.subarray(at, at + len), pos: at + len };
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1372
1426
|
function decryptEnvelope(packed, privateKeys, internalOpts) {
|
|
1373
1427
|
if (!Buffer.isBuffer(packed) || packed.length < 4) {
|
|
1374
1428
|
throw new Error("Invalid envelope: too short (need at least the 4-byte suite header)");
|
|
@@ -1388,8 +1442,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
|
|
|
1388
1442
|
throw new Error("Invalid envelope: unsupported KDF (only SHAKE256 supported)");
|
|
1389
1443
|
}
|
|
1390
1444
|
|
|
1391
|
-
var
|
|
1392
|
-
var kemCt =
|
|
1445
|
+
var kemSlice = _envSlice(packed, pos, "KEM ciphertext");
|
|
1446
|
+
var kemCt = kemSlice.bytes; pos = kemSlice.pos;
|
|
1393
1447
|
|
|
1394
1448
|
var mlkemPriv = nodeCrypto.createPrivateKey(
|
|
1395
1449
|
typeof privateKeys === "string" ? privateKeys : privateKeys.privateKey
|
|
@@ -1399,8 +1453,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
|
|
|
1399
1453
|
var fixedInfo = omitFixedInfo ? Buffer.alloc(0) : _suiteFixedInfo(kemId, cipherId, kdfId);
|
|
1400
1454
|
|
|
1401
1455
|
if (kemId === C.KEM_IDS.ML_KEM_1024_P384) {
|
|
1402
|
-
var
|
|
1403
|
-
var ecEphDer =
|
|
1456
|
+
var ecEphSlice = _envSlice(packed, pos, "EC ephemeral public key");
|
|
1457
|
+
var ecEphDer = ecEphSlice.bytes; pos = ecEphSlice.pos;
|
|
1404
1458
|
var ecPrivPem = typeof privateKeys === "string" ? null : privateKeys.ecPrivateKey;
|
|
1405
1459
|
if (!ecPrivPem) throw new Error("Hybrid KEM requires EC private key");
|
|
1406
1460
|
var ecSs = nodeCrypto.diffieHellman({
|
|
@@ -1416,8 +1470,8 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
|
|
|
1416
1470
|
// the correct keypair via privateKeys when the envelope was sealed
|
|
1417
1471
|
// with this algorithm. Same length-prefixed shape as the P-384
|
|
1418
1472
|
// hybrid: 2-byte ec-eph-len + DER X25519 pubkey + nonce + ct.
|
|
1419
|
-
var
|
|
1420
|
-
var x25519EphDer =
|
|
1473
|
+
var x25519EphSlice = _envSlice(packed, pos, "X25519 ephemeral public key");
|
|
1474
|
+
var x25519EphDer = x25519EphSlice.bytes; pos = x25519EphSlice.pos;
|
|
1421
1475
|
var x25519PrivPem = typeof privateKeys === "string" ? null : privateKeys.x25519PrivateKey;
|
|
1422
1476
|
if (!x25519PrivPem) throw new Error("ML-KEM-768 + X25519 hybrid envelope requires x25519PrivateKey");
|
|
1423
1477
|
var x25519Ss = nodeCrypto.diffieHellman({
|
|
@@ -1429,7 +1483,22 @@ function decryptEnvelope(packed, privateKeys, internalOpts) {
|
|
|
1429
1483
|
throw new Error("Invalid envelope: unsupported KEM ID " + kemId);
|
|
1430
1484
|
}
|
|
1431
1485
|
|
|
1432
|
-
|
|
1486
|
+
// Bounds-check the trailing nonce + AEAD tag before slicing them out. A
|
|
1487
|
+
// truncated envelope (untrusted ciphertext) that ends inside the 24-byte
|
|
1488
|
+
// nonce or before the 16-byte Poly1305 tag otherwise reaches the cipher as
|
|
1489
|
+
// an under-length nonce / ciphertext and surfaces as a raw noble
|
|
1490
|
+
// RangeError ("nonce"/"ciphertext" length) — escaping the documented
|
|
1491
|
+
// "Invalid envelope: ..." error contract exactly the way an unchecked
|
|
1492
|
+
// _envU16 read would (see _envU16 above). Fail with the typed envelope
|
|
1493
|
+
// error instead. A valid envelope always carries a full nonce and at
|
|
1494
|
+
// least the tag, so this never rejects a well-formed input.
|
|
1495
|
+
var nonceLen = C.BYTES.bytes(24);
|
|
1496
|
+
var tagLen = C.BYTES.bytes(16);
|
|
1497
|
+
if (pos + nonceLen + tagLen > packed.length) {
|
|
1498
|
+
throw new Error("Invalid envelope: truncated (expected a " + nonceLen +
|
|
1499
|
+
"-byte nonce and a " + tagLen + "-byte authentication tag at offset " + pos + ")");
|
|
1500
|
+
}
|
|
1501
|
+
var nonce = packed.subarray(pos, pos + nonceLen); pos += nonceLen;
|
|
1433
1502
|
// Re-derive the 4-byte envelope-header AAD from the bytes we just
|
|
1434
1503
|
// dispatched on. A tampered header (algorithm-substitution attack)
|
|
1435
1504
|
// surfaces here as a Poly1305 tag verification failure.
|
|
@@ -1509,6 +1578,17 @@ function decryptPacked(packed, key, aad) {
|
|
|
1509
1578
|
if (packed[0] !== C.FORMAT.XCHACHA20_POLY1305) {
|
|
1510
1579
|
throw new Error("Invalid packed format: unsupported version");
|
|
1511
1580
|
}
|
|
1581
|
+
// A packed blob shorter than the 1-byte format id + 24-byte nonce +
|
|
1582
|
+
// 16-byte Poly1305 tag is truncated / corrupt (untrusted or damaged
|
|
1583
|
+
// storage cell); slicing the nonce / ciphertext out of it otherwise
|
|
1584
|
+
// reaches the cipher as an under-length nonce and throws a raw noble
|
|
1585
|
+
// RangeError that escapes this function's typed error contract (mirrors
|
|
1586
|
+
// the envelope decrypt bounds check). A valid packet is always at least
|
|
1587
|
+
// this long, so this never rejects a well-formed input.
|
|
1588
|
+
if (packed.length < 1 + C.BYTES.bytes(24) + C.BYTES.bytes(16)) {
|
|
1589
|
+
throw new Error("Invalid packed format: truncated (need at least a 1-byte " +
|
|
1590
|
+
"version, a 24-byte nonce, and a 16-byte authentication tag)");
|
|
1591
|
+
}
|
|
1512
1592
|
return Buffer.from(
|
|
1513
1593
|
xchacha20poly1305(key, packed.subarray(1, 25), aad ? Buffer.from(aad) : undefined)
|
|
1514
1594
|
.decrypt(packed.subarray(25))
|
|
@@ -1899,7 +1979,7 @@ function _pemToDer(pemOrDer) {
|
|
|
1899
1979
|
// for mTLS bootstrap / webhook verification / peer-cert pinning.
|
|
1900
1980
|
// 64 KiB caps the largest plausible PEM (a P-384 cert + chain) at
|
|
1901
1981
|
// ~3× margin while refusing pathological inputs outright.
|
|
1902
|
-
if (safeBuffer.byteLengthOf(pemOrDer) > C.BYTES.kib(64)) {
|
|
1982
|
+
if (safeBuffer().byteLengthOf(pemOrDer) > C.BYTES.kib(64)) {
|
|
1903
1983
|
throw new TypeError(
|
|
1904
1984
|
"crypto.hashCertFingerprint: PEM input exceeds 64 KiB (" +
|
|
1905
1985
|
pemOrDer.length + " bytes); refuse oversized input to avoid " +
|
|
@@ -1991,6 +2071,219 @@ function isCertRevoked(pemOrDer, denyList) {
|
|
|
1991
2071
|
return false;
|
|
1992
2072
|
}
|
|
1993
2073
|
|
|
2074
|
+
// ---- RFC 7469 SubjectPublicKeyInfo pinning ----
|
|
2075
|
+
//
|
|
2076
|
+
// The pin is base64(SHA-256(SPKI DER)) — RFC 7469 §2.4 / HPKP. This
|
|
2077
|
+
// deliberately uses SHA-256, which is otherwise absent from the b.crypto
|
|
2078
|
+
// surface (see the @module intro): it is an interop WIRE CONSTANT, not a
|
|
2079
|
+
// framework hashing choice. Browsers, curl `--pinnedpubkey sha256//...`,
|
|
2080
|
+
// OpenSSL, and every HPKP-style pin store speak SHA-256(SPKI); a SHA3-512
|
|
2081
|
+
// pin would not interoperate with any of them. `hashCertFingerprint`
|
|
2082
|
+
// documents the same "framework-canonical hash vs interop rendering"
|
|
2083
|
+
// split. The pin binds the certificate's LONG-TERM SubjectPublicKeyInfo
|
|
2084
|
+
// (which survives certificate reissue on the same key) — it says nothing
|
|
2085
|
+
// about the ephemeral PQC TLS key-exchange group negotiated per
|
|
2086
|
+
// handshake; those are orthogonal (identity of the peer key vs secrecy
|
|
2087
|
+
// of the session).
|
|
2088
|
+
var SPKI_PIN_PREFIX = "sha256/";
|
|
2089
|
+
|
|
2090
|
+
// Decode a `sha256/<base64>` pin string into its raw 32-byte digest
|
|
2091
|
+
// Buffer, throwing a TypeError on any malformed entry (config-time /
|
|
2092
|
+
// entry-point tier — the operator catches the typo at construction).
|
|
2093
|
+
function _decodeSpkiPin(pinStr, ctx) {
|
|
2094
|
+
if (typeof pinStr !== "string" || pinStr.length === 0) {
|
|
2095
|
+
throw new TypeError(ctx + ": each pin must be a non-empty 'sha256/<base64>' string");
|
|
2096
|
+
}
|
|
2097
|
+
if (pinStr.indexOf(SPKI_PIN_PREFIX) !== 0) {
|
|
2098
|
+
throw new TypeError(ctx + ": pin '" + pinStr +
|
|
2099
|
+
"' must carry the RFC 7469 'sha256/' prefix");
|
|
2100
|
+
}
|
|
2101
|
+
var body = pinStr.slice(SPKI_PIN_PREFIX.length);
|
|
2102
|
+
var buf = Buffer.from(body, "base64");
|
|
2103
|
+
// SHA-256 digest = 32 bytes; require a canonical base64 round-trip so a
|
|
2104
|
+
// silently-truncated / non-canonical body is refused rather than
|
|
2105
|
+
// matching a shorter buffer.
|
|
2106
|
+
if (buf.length !== 32 || buf.toString("base64") !== body) {
|
|
2107
|
+
throw new TypeError(ctx + ": pin '" + pinStr +
|
|
2108
|
+
"' must be base64 of a 32-byte SHA-256 SPKI digest");
|
|
2109
|
+
}
|
|
2110
|
+
return buf;
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
/**
|
|
2114
|
+
* @primitive b.crypto.spkiPin
|
|
2115
|
+
* @signature b.crypto.spkiPin(pemOrDer)
|
|
2116
|
+
* @since 0.17.13
|
|
2117
|
+
* @status stable
|
|
2118
|
+
* @related b.crypto.spkiPinVerifier, b.crypto.hashCertFingerprint
|
|
2119
|
+
*
|
|
2120
|
+
* Computes the RFC 7469 (HPKP §2.4) public-key pin of an X.509
|
|
2121
|
+
* certificate: `base64(SHA-256(SubjectPublicKeyInfo DER))`. Accepts DER
|
|
2122
|
+
* bytes (Buffer) or a PEM string (BEGIN/END envelope stripped, base64
|
|
2123
|
+
* body decoded — same 64 KiB ReDoS cap as `hashCertFingerprint`).
|
|
2124
|
+
* Returns `{ sha256, b64, hex }`: `sha256` is the `sha256/<base64>` wire
|
|
2125
|
+
* form browsers and `curl --pinnedpubkey` render, `b64` the bare base64
|
|
2126
|
+
* body, `hex` the lowercase-hex digest.
|
|
2127
|
+
*
|
|
2128
|
+
* Unlike `hashCertFingerprint` (SHA3-512 over the WHOLE certificate), an
|
|
2129
|
+
* SPKI pin binds only the public key, so it survives certificate reissue
|
|
2130
|
+
* on the same key pair — the property RFC 7469 pinning relies on.
|
|
2131
|
+
*
|
|
2132
|
+
* This is the one place SHA-256 appears on the b.crypto surface: it is an
|
|
2133
|
+
* RFC 7469 interop wire constant (browsers / curl / OpenSSL pin stores),
|
|
2134
|
+
* not a framework hashing default. The pin binds the peer's long-term
|
|
2135
|
+
* SPKI, not the ephemeral PQC key-exchange group negotiated per TLS
|
|
2136
|
+
* handshake.
|
|
2137
|
+
*
|
|
2138
|
+
* @example
|
|
2139
|
+
* var fs = require("fs");
|
|
2140
|
+
* var pem = fs.readFileSync("/etc/ssl/peer.cert.pem", "utf8");
|
|
2141
|
+
* var pin = b.crypto.spkiPin(pem);
|
|
2142
|
+
* pin.sha256;
|
|
2143
|
+
* // → "sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="
|
|
2144
|
+
*/
|
|
2145
|
+
function spkiPin(pemOrDer) {
|
|
2146
|
+
var der = _pemToDer(pemOrDer);
|
|
2147
|
+
// SubjectPublicKeyInfo DER — the exact bytes RFC 7469 §2.4 hashes.
|
|
2148
|
+
var spkiDer = new nodeCrypto.X509Certificate(der)
|
|
2149
|
+
.publicKey.export({ type: "spki", format: "der" });
|
|
2150
|
+
var digest = nodeCrypto.createHash("sha256").update(spkiDer).digest();
|
|
2151
|
+
var b64 = digest.toString("base64");
|
|
2152
|
+
return { sha256: SPKI_PIN_PREFIX + b64, b64: b64, hex: digest.toString("hex") };
|
|
2153
|
+
}
|
|
2154
|
+
|
|
2155
|
+
/**
|
|
2156
|
+
* @primitive b.crypto.spkiPinVerifier
|
|
2157
|
+
* @signature b.crypto.spkiPinVerifier(opts)
|
|
2158
|
+
* @since 0.17.13
|
|
2159
|
+
* @status stable
|
|
2160
|
+
* @related b.crypto.spkiPin, b.network.tls.checkServerIdentity9525
|
|
2161
|
+
*
|
|
2162
|
+
* Builds a `tls.checkServerIdentity`-compatible `(host, cert) =>
|
|
2163
|
+
* Error | undefined` that enforces RFC 7469 public-key pinning on top of
|
|
2164
|
+
* RFC 9525 strict hostname verification. Pass the returned function as
|
|
2165
|
+
* `tls.connect({ checkServerIdentity })`.
|
|
2166
|
+
*
|
|
2167
|
+
* The verifier runs hostname/SAN identity FIRST (via
|
|
2168
|
+
* `b.network.tls.checkServerIdentity9525` — SAN-required, no Common Name
|
|
2169
|
+
* fallback), so a pin match on a certificate issued for the wrong name is
|
|
2170
|
+
* still refused. Only when identity passes does it derive the peer's SPKI
|
|
2171
|
+
* pin from the presented DER and constant-time-compare
|
|
2172
|
+
* (`crypto.timingSafeEqual`) it against every configured pin. Returns the
|
|
2173
|
+
* identity `Error` on a hostname/SAN failure, an `Error` with code
|
|
2174
|
+
* `crypto/spki-pin-mismatch` when no pin matches, or `undefined` when
|
|
2175
|
+
* both identity and pin check out.
|
|
2176
|
+
*
|
|
2177
|
+
* `opts.pins` MUST be an array of at least two `sha256/<base64>` pins:
|
|
2178
|
+
* RFC 7469 §4.3 requires a backup pin corresponding to a key not in the
|
|
2179
|
+
* current chain so key rotation does not brick the pinned endpoint. When
|
|
2180
|
+
* `opts.hostname` is set, the certificate identity is checked against it
|
|
2181
|
+
* instead of the host argument Node supplies — pin the expected name
|
|
2182
|
+
* explicitly. Produce pin strings with `b.crypto.spkiPin(...).sha256`.
|
|
2183
|
+
*
|
|
2184
|
+
* @opts
|
|
2185
|
+
* pins: string[], // required — >= 2 'sha256/<base64>' pins (RFC 7469 backup-pin rule)
|
|
2186
|
+
* hostname: string, // optional — verify cert identity against this name instead of the host arg
|
|
2187
|
+
*
|
|
2188
|
+
* @example
|
|
2189
|
+
* var tls = require("node:tls");
|
|
2190
|
+
* var verify = b.crypto.spkiPinVerifier({
|
|
2191
|
+
* pins: [
|
|
2192
|
+
* "sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=",
|
|
2193
|
+
* "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", // backup key
|
|
2194
|
+
* ],
|
|
2195
|
+
* });
|
|
2196
|
+
* var sock = tls.connect({
|
|
2197
|
+
* host: "api.example.com",
|
|
2198
|
+
* port: 443,
|
|
2199
|
+
* checkServerIdentity: verify,
|
|
2200
|
+
* });
|
|
2201
|
+
*/
|
|
2202
|
+
function spkiPinVerifier(opts) {
|
|
2203
|
+
if (!opts || typeof opts !== "object") {
|
|
2204
|
+
throw new TypeError("crypto.spkiPinVerifier: opts is required");
|
|
2205
|
+
}
|
|
2206
|
+
if (!Array.isArray(opts.pins)) {
|
|
2207
|
+
throw new TypeError(
|
|
2208
|
+
"crypto.spkiPinVerifier: opts.pins must be an array of 'sha256/<base64>' pins"
|
|
2209
|
+
);
|
|
2210
|
+
}
|
|
2211
|
+
// RFC 7469 §4.3 requires a backup pin corresponding to a key NOT in the
|
|
2212
|
+
// current chain. Two IDENTICAL pins are not a backup (the same key repeated),
|
|
2213
|
+
// so require at least two DISTINCT pins — a length-only check would accept a
|
|
2214
|
+
// duplicate and silently leave the endpoint with no rotation key.
|
|
2215
|
+
var distinctPins = [];
|
|
2216
|
+
for (var dpi = 0; dpi < opts.pins.length; dpi += 1) {
|
|
2217
|
+
if (distinctPins.indexOf(opts.pins[dpi]) === -1) distinctPins.push(opts.pins[dpi]);
|
|
2218
|
+
}
|
|
2219
|
+
if (distinctPins.length < 2) {
|
|
2220
|
+
throw new TypeError(
|
|
2221
|
+
"crypto.spkiPinVerifier: opts.pins must contain at least two DISTINCT " +
|
|
2222
|
+
"'sha256/<base64>' pins — RFC 7469 §4.3 requires a backup pin " +
|
|
2223
|
+
"corresponding to a key not in the current chain so key rotation " +
|
|
2224
|
+
"does not brick the pinned endpoint"
|
|
2225
|
+
);
|
|
2226
|
+
}
|
|
2227
|
+
var pinBufs = new Array(distinctPins.length);
|
|
2228
|
+
for (var pi = 0; pi < distinctPins.length; pi += 1) {
|
|
2229
|
+
pinBufs[pi] = _decodeSpkiPin(distinctPins[pi], "crypto.spkiPinVerifier");
|
|
2230
|
+
}
|
|
2231
|
+
var expectedHost = opts.hostname;
|
|
2232
|
+
if (expectedHost !== undefined &&
|
|
2233
|
+
(typeof expectedHost !== "string" || expectedHost.length === 0)) {
|
|
2234
|
+
throw new TypeError(
|
|
2235
|
+
"crypto.spkiPinVerifier: opts.hostname must be a non-empty string when supplied"
|
|
2236
|
+
);
|
|
2237
|
+
}
|
|
2238
|
+
return function verifySpkiPin(host, cert) {
|
|
2239
|
+
// Identity (hostname / SAN) FIRST — a pin match on a cert issued for
|
|
2240
|
+
// the wrong name is still impersonation. checkServerIdentity9525 is
|
|
2241
|
+
// RFC 9525 strict (SAN-required, no CN fallback) and returns
|
|
2242
|
+
// Error | undefined.
|
|
2243
|
+
var effectiveHost = expectedHost !== undefined ? expectedHost : host;
|
|
2244
|
+
var identityError = networkTls().checkServerIdentity9525(effectiveHost, cert);
|
|
2245
|
+
if (identityError) return identityError;
|
|
2246
|
+
// Peer SPKI pin — hash the DER the peer actually presented. Node's
|
|
2247
|
+
// detailed cert object exposes the raw DER as cert.raw.
|
|
2248
|
+
if (!cert || !Buffer.isBuffer(cert.raw)) {
|
|
2249
|
+
var noDerErr = new Error(
|
|
2250
|
+
"crypto.spkiPinVerifier: peer cert object carries no DER `raw` bytes to pin"
|
|
2251
|
+
);
|
|
2252
|
+
noDerErr.code = "crypto/spki-pin-no-peer-der";
|
|
2253
|
+
return noDerErr;
|
|
2254
|
+
}
|
|
2255
|
+
var peerBuf;
|
|
2256
|
+
try {
|
|
2257
|
+
peerBuf = Buffer.from(spkiPin(cert.raw).b64, "base64");
|
|
2258
|
+
} catch (parseErr) {
|
|
2259
|
+
var peerErr = new Error(
|
|
2260
|
+
"crypto.spkiPinVerifier: failed to derive peer SPKI pin (" +
|
|
2261
|
+
(parseErr && parseErr.message ? parseErr.message : String(parseErr)) + ")"
|
|
2262
|
+
);
|
|
2263
|
+
peerErr.code = "crypto/spki-pin-peer-parse-failed";
|
|
2264
|
+
return peerErr;
|
|
2265
|
+
}
|
|
2266
|
+
var matched = false;
|
|
2267
|
+
for (var mi = 0; mi < pinBufs.length; mi += 1) {
|
|
2268
|
+
// No early exit — comparing against every pin keeps the match
|
|
2269
|
+
// timing from leaking which configured pin matched.
|
|
2270
|
+
if (peerBuf.length === pinBufs[mi].length &&
|
|
2271
|
+
nodeCrypto.timingSafeEqual(peerBuf, pinBufs[mi])) {
|
|
2272
|
+
matched = true;
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
if (!matched) {
|
|
2276
|
+
var mismatchErr = new Error(
|
|
2277
|
+
"crypto.spkiPinVerifier: peer SPKI pin (" + SPKI_PIN_PREFIX +
|
|
2278
|
+
peerBuf.toString("base64") + ") does not match any configured pin"
|
|
2279
|
+
);
|
|
2280
|
+
mismatchErr.code = "crypto/spki-pin-mismatch";
|
|
2281
|
+
return mismatchErr;
|
|
2282
|
+
}
|
|
2283
|
+
return undefined;
|
|
2284
|
+
};
|
|
2285
|
+
}
|
|
2286
|
+
|
|
1994
2287
|
var SUPPORTED_KEM_ALGORITHMS = Object.freeze([
|
|
1995
2288
|
{ id: "ml-kem-1024", envelopeId: C.KEM_IDS.ML_KEM_1024, description: "ML-KEM-1024 KEM-only (legacy single-component)" },
|
|
1996
2289
|
{ id: "ml-kem-1024-p384", envelopeId: C.KEM_IDS.ML_KEM_1024_P384, description: "ML-KEM-1024 + ECDH P-384 hybrid (framework default)" },
|
|
@@ -2140,6 +2433,8 @@ module.exports = {
|
|
|
2140
2433
|
// Cert fingerprint helpers
|
|
2141
2434
|
hashCertFingerprint: hashCertFingerprint,
|
|
2142
2435
|
isCertRevoked: isCertRevoked,
|
|
2436
|
+
spkiPin: spkiPin,
|
|
2437
|
+
spkiPinVerifier: spkiPinVerifier,
|
|
2143
2438
|
// Random
|
|
2144
2439
|
generateBytes: generateBytes,
|
|
2145
2440
|
generateToken: generateToken,
|
|
@@ -221,20 +221,28 @@ function build(directives, opts) {
|
|
|
221
221
|
"csp.build: source '" + src + "' contains whitespace or ';' — a CSP source " +
|
|
222
222
|
"must be a single token (directive-injection defense)");
|
|
223
223
|
}
|
|
224
|
+
// A UA matches CSP source keywords ('unsafe-inline' ...) and scheme
|
|
225
|
+
// sources (https: / data:) ASCII case-INSENSITIVELY (CSP3 §2.3 /
|
|
226
|
+
// §6.7.2). Compare a lowercased copy against the (lowercase) guard sets
|
|
227
|
+
// so a case-variant token ("'Unsafe-Inline'" / "HTTPS:" / "DATA:") can't
|
|
228
|
+
// slip past and be emitted verbatim into a header the browser still
|
|
229
|
+
// honors. The ORIGINAL src is what gets emitted (hosts/paths stay
|
|
230
|
+
// case-preserved); only the guard comparison is normalized.
|
|
231
|
+
var srcLower = src.toLowerCase();
|
|
224
232
|
if (!acknowledgeUnsafe && SCRIPT_DIRECTIVES.indexOf(name) !== -1 &&
|
|
225
|
-
UNSAFE_KEYWORDS.indexOf(
|
|
233
|
+
UNSAFE_KEYWORDS.indexOf(srcLower) !== -1) {
|
|
226
234
|
throw new CspError("csp/unsafe-keyword",
|
|
227
235
|
"csp.build: " + name + " contains " + src + "; pass acknowledgeUnsafe:true with a " +
|
|
228
236
|
"documented justification to allow it (CSP3 §6.2.5.x — unsafe keywords are a " +
|
|
229
237
|
"common XSS bypass surface)");
|
|
230
238
|
}
|
|
231
|
-
if (CATCH_ALL_SOURCES.indexOf(
|
|
239
|
+
if (CATCH_ALL_SOURCES.indexOf(srcLower) !== -1) {
|
|
232
240
|
throw new CspError("csp/catch-all-source",
|
|
233
241
|
"csp.build: " + name + " contains catch-all source '" + src + "'; CSP3 best " +
|
|
234
242
|
"practice refuses these (use an explicit allowlist instead)");
|
|
235
243
|
}
|
|
236
244
|
if (!allowDataImages && (name === "img-src" || name === "media-src" || name === "font-src") &&
|
|
237
|
-
|
|
245
|
+
srcLower === "data:") {
|
|
238
246
|
throw new CspError("csp/data-source",
|
|
239
247
|
"csp.build: " + name + " contains 'data:'; pass allowDataImages:true with a " +
|
|
240
248
|
"documented reason (data: URLs sidestep most CSP defenses)");
|