@blamejs/core 0.9.7 → 0.9.8

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 CHANGED
@@ -8,6 +8,7 @@ upgrading across more than a few patches at a time.
8
8
 
9
9
  ## v0.9.x
10
10
 
11
+ - v0.9.8 (2026-05-13) — **`b.vendorData` — packaging-mode-invariant + signed + canary-guarded loader for vendored data files**. The three plaintext vendor data files (`public-suffix-list.dat`, `common-passwords-top-10000.txt`, `bimi-trust-anchors.pem`) are now loaded via inline `Buffer.from(base64)` modules (`<name>.data.js`), eliminating the `__dirname`-relative `fs.readFileSync` paths that broke under Single Executable Application (SEA), `pkg`, `nexe`, esbuild, Bun compile, Deno compile, and AWS Lambda layer bundling. Every load runs four orthogonal integrity checks before returning a byte: SHA-256 + SHA3-512 + SLH-DSA-SHAKE-256f signature against the maintainer's pinned public key (`lib/vendor/.vendor-data-pubkey`) + in-payload canary entry that the parsed structure must surface. Tamper at any layer throws `VendorDataError` at module-load — fail-fast rather than first-request-touches-PSL surprise. **Public API**: `b.vendorData.get(name)` returns the verified Buffer; `b.vendorData.getAsString(name)` returns UTF-8 string; `b.vendorData.verifyAll()` runs all four layers across every registered vendor data file and is invoked at framework boot; `b.vendorData.inventory()` returns per-file metadata (name, source, fetchedAt, sha256, sha3_512, signedBy, canary, byteLength, description) for compliance reporting + SBOM emission. **Migrated call sites**: `b.publicSuffix` (PSL load), `b.auth.password._loadBundledCommon` (common-passwords), `b.mail.bimi` (trust anchors) now route through `b.vendorData` — removes any downstream consumer's need to patch the loader for SEA / bundler builds. **Maintainer signing infrastructure**: vendor data files signed at refresh time by a maintainer-held SLH-DSA-SHAKE-256f keypair (private key stays in `.keys/` and is never committed; public key ships in `lib/vendor/.vendor-data-pubkey` in every npm tarball). Adds a fourth orthogonal trust root alongside SSH-signed release tags + SLSA L3 npm provenance + Sigstore-keyless SBOM signatures. **MANIFEST.json**: per-vendor-data entry gains `runtime_artifact` + `integrity_layers` + dual-file `hashes` (raw `.dat/.txt/.pem` + companion `.data.js`). **New scripts**: `scripts/vendor-data-keygen.js` (one-time keypair generation), `scripts/vendor-data-gen.js` (generator invoked by `scripts/vendor-update.sh --refresh-data`).
11
12
  - v0.9.7 (2026-05-13) — **SECURITY.md: release-tag verification path documented + signed-tag invariant from v0.9.7+**. SECURITY.md gains a "Verifying release authenticity" section documenting how operators verify a release tag's authenticity independently of GitHub's UI. The maintainer Ed25519 SSH signing key fingerprint (`SHA256:5oF/XWhFpMde9TRfEX2GAHiApAq/MXOS4vti5zQbD7g`) is published alongside the public-key retrieval URL (`https://github.com/dotCooCoo.keys`) and a `git tag -v` recipe that bypasses the "Verified" badge. From v0.9.7 onward, every release tag is an annotated SSH-signed tag; the repository's `release-tags` ruleset's `required_signatures` rule refuses any unsigned or lightweight tag push at the server side. Earlier tags (v0.9.6 and prior) remain as lightweight commits and don't verify via `git tag -v`; they continue to verify via the SLSA L3 npm provenance + Sigstore-keyless SBOM signatures already attached to those releases (the `cosign verify-blob` recipe is in the same SECURITY.md section). No framework-surface changes; this release ships the documentation + invariant only.
12
13
  - v0.9.6 (2026-05-12) — **`b.vex` (OASIS CSAF 2.1 VEX) + framework-control compliance posture sweep**. *(PR feedback: CSAF-conformance fixes folded in pre-merge — `cwes` is now a list per §3.2.3.4 instead of a singleton `cwe` field; CWE alone is no longer accepted as a vulnerability identity per §3.2.3.2 (operator supplies `cveId` or `ids[]: [{ systemName, text }]` per §3.2.3.5); TLP allowlist corrected to TLP 2.0 (FIRST 2022) per §3.2.1.12.1.1 — `CLEAR / GREEN / AMBER / AMBER+STRICT / RED` (added the previously-omitted `AMBER+STRICT` restriction tier and removed the legacy TLP 1.0 `WHITE` label, which was renamed `CLEAR` in TLP 2.0). Public opt name `cwe` is now `cweId` to mirror `cveId`; this is a v0.9.6 surface that never shipped to npm so the rename is not a breaking change.)* Closes the framework-side findings from the 2026-05-11 exceptd framework-gap-analysis (49 gaps across CVE-triage / framework-compliance / threat-modeling / AI-security / identity-assurance / crypto-posture / supply-chain / sector-specific). **`b.vex.statement({ cveId, status, productIds, justification?, impactStatement?, references?, firstReleased?, lastUpdated? })`** builds an OASIS CSAF 2.1 §3.2.3 vulnerability statement with `product_status` keyed by status enum (`known_not_affected` / `affected` / `fixed` / `under_investigation`), `flags[].label` for §3.2.2.7 justifications (`component_not_present` / `vulnerable_code_not_present` / `vulnerable_code_not_in_execute_path` / `vulnerable_code_cannot_be_controlled_by_adversary` / `inline_mitigations_already_exist`), and `notes[].text` for impact narrative. Refuses missing CVE/CWE id, malformed CVE shape, unknown status, missing productIds, and `known_not_affected` without justification. **`b.vex.document({ documentId, title, publisher, trackingId, trackingVersion, currentReleaseDate, initialReleaseDate, statements, tlp? })`** assembles the §3.2 CSAF document envelope with category `csaf_vex`, csaf_version `2.1`, publisher category `vendor`, tracking status `final`, and `distribution.tlp.label` (default `CLEAR`; refuses non-TLP labels). **`b.vex.serialize(doc)`** routes through `b.canonicalJson.stringify` for byte-stable sorted-key output then re-indents at 2 spaces for human-diffable artifacts. Exports `STATUS_VALUES` / `JUSTIFICATION_VALUES` / `TLP_LABELS` / `CSAF_VERSION` / `VexError`. **25 new compliance postures** added to `b.compliance.KNOWN_POSTURES` (with matching `POSTURE_DEFAULTS` cascade entries): `nist-800-53` (NIST SP 800-53 Rev 5 control catalog), `nist-ai-rmf-1.0` (NIST AI Risk Management Framework 1.0), `iso-42001-2023` (AI management systems), `iso-23894-2023` (AI risk management guidance), `owasp-llm-top-10-2025` (LLM application risk catalog), `owasp-asvs-v5.0` (Application Security Verification Standard v5.0), `nist-800-218-ssdf` (Secure Software Development Framework), `nist-800-82-r3` (industrial control systems), `nist-800-63b-rev4` (digital identity authenticator guidance), `iec-62443-3-3` (industrial security), `fedramp-rev5-moderate` (federal cloud baseline), `hipaa-security-rule` (45 CFR §164.302-318 administrative + technical safeguards), `hitrust-csf-v11.4` (healthcare common security framework), `nerc-cip-007-6` (bulk electric system cyber asset security), `psd2-rts-sca` (PSD2 Regulatory Technical Standards for Strong Customer Authentication), `swift-cscf-v2026` (SWIFT Customer Security Controls Framework 2026), `slsa-v1.0-build-l3` (SLSA build-track L3 provenance), `vex-csaf-2.1` (the standard `b.vex` emits), `cyclonedx-v1.6` (already shipped via `sbom.cdx.json`), `spdx-v3.0` (SPDX 3.0 software bill of materials), `owasp-wstg-v5` (Web Security Testing Guide v5), `ptes` (Penetration Testing Execution Standard), `nist-800-115` (technical guide to information security testing), `cwe-top-25-2024` (CWE most dangerous software weaknesses 2024), `cis-controls-v8` (Center for Internet Security Critical Controls v8), `cmmc-2.0-level-2` (DoD CMMC Level 2 advanced; complements the existing `cmmc-2.0` posture). Each cascade entry encodes the regime's data-tier mandate (encrypted backups + signed audit chain + TLS 1.3 minimum + vacuum-after-erase where applicable).
13
14
  - v0.9.5 (2026-05-12) — **Fix-up for v0.9.3 + v0.9.4 audit-derived primitives** (five reported reachability/contract bugs). (1) **`b.middleware.dpop` `trustForwardedHeaders` was unreachable** — the v0.9.4 X-Forwarded-* trust gate added the option to `_reconstructHtu` but the `create()` validateOpts whitelist still rejected unknown keys. Operators behind a trusted reverse proxy got `unknown-option` instead of the documented opt-in, leaving valid DPoP proofs failing htu matching. The whitelist now includes `trustForwardedHeaders`. (2) **`b.auth.jwt.verifyExternal` `allowKidlessJwks` was unreachable** — same shape, fixed the same way. (3) **OAuth `allowKidlessJwks` didn't reach token-exchange flows** — pre-v0.9.5 the opt was per-`verifyIdToken`-call, but `_normalizeTokens()` (called from `exchangeCode` / `pollDeviceCode` / `exchangeToken` / `refreshAccessToken`) passed a reduced `{ nonce, skipNonceCheck }` shape that dropped the operator opt. Surface promoted to client-level: pass `b.auth.oauth.create({ allowKidlessJwks: true })` once and it threads through every code path that lands on the verifier. The per-call `vopts.allowKidlessJwks` continues to work for direct `verifyIdToken` callers. (4) **`b.auth.oauth.refreshAccessToken` `checkAndInsert` return-value contract inverted** — pre-v0.9.5 interpreted `true` as "already seen → replay" but the framework-wide `checkAndInsert` contract (`b.nonceStore`, `b.auth.jwt`) is the opposite: `true` = unseen-and-now-inserted (first sighting), `false` = already-present (replay). Operators reusing an existing `b.nonceStore`-style backend got every first refresh attempt rejected as token theft, breaking normal refresh flows. The handler now normalizes `inserted === false` → `alreadySeen = true`, consistent with the rest of the framework. (5) **`b.auth.ciba` `_intervalState` memory leak on error paths** — pre-v0.9.5 entries were only deleted on successful token issuance; denied / expired auth requests, and ping/push delivery modes that never call `pollToken` successfully, left permanent entries causing unbounded growth in long-running processes. Now entries carry an `expireAtMs` derived from the IdP-supplied `expires_in` of the auth_req_id, and an opportunistic sweep runs on every `_registerInitialInterval` call (no separate timer needed). Terminal CIBA errors (`expired_token` / `access_denied` / `invalid_grant` / `transaction_failed`) also delete the entry immediately on the error path.
package/index.js CHANGED
@@ -149,6 +149,7 @@ var cdnCacheControl = require("./lib/cdn-cache-control");
149
149
  var clientHints = require("./lib/client-hints");
150
150
  var structuredFields = require("./lib/structured-fields");
151
151
  var vex = require("./lib/vex");
152
+ var vendorData = require("./lib/vendor-data");
152
153
  var serverTiming = require("./lib/server-timing");
153
154
  var earlyHints = require("./lib/early-hints");
154
155
  var gateContract = require("./lib/gate-contract");
@@ -385,6 +386,7 @@ module.exports = {
385
386
  clientHints: clientHints,
386
387
  structuredFields: structuredFields,
387
388
  vex: vex,
389
+ vendorData: vendorData,
388
390
  serverTiming: serverTiming,
389
391
  earlyHints: earlyHints,
390
392
  gateContract: gateContract,
@@ -207,13 +207,14 @@ var POLICY_PROFILES = Object.freeze({
207
207
  // Operators wanting deeper enforcement supply opts.forbidCommon (set
208
208
  // of additional plaintexts) and/or opts.forbidCommonExtra (operator's
209
209
  // own breach list); both layer additively on top of the bundled set.
210
- var path = require("node:path");
211
- var fs = require("node:fs");
210
+ var vendorData = require("../vendor-data");
212
211
  var _bundledCommonPasswords = null;
213
212
  function _loadBundledCommon() {
214
213
  if (_bundledCommonPasswords) return _bundledCommonPasswords;
215
- var p = path.join(__dirname, "..", "vendor", "common-passwords-top-10000.txt");
216
- var text = fs.readFileSync(p, "utf8");
214
+ // b.vendorData verifies the dual-hash + SLH-DSA signature + in-payload
215
+ // canary before returning the bytes. Packaging-mode-invariant — no
216
+ // __dirname-relative file lookup that breaks under SEA / pkg / bundler.
217
+ var text = vendorData.getAsString("common-passwords-top-10000");
217
218
  var set = new Set();
218
219
  var lines = text.split(/\r?\n/);
219
220
  for (var i = 0; i < lines.length; i++) {
package/lib/mail-bimi.js CHANGED
@@ -50,8 +50,6 @@
50
50
  var dns = require("node:dns");
51
51
  var nodeCrypto = require("node:crypto");
52
52
  var dnsPromises = dns.promises;
53
- var fs = require("node:fs");
54
- var nodePath = require("node:path");
55
53
 
56
54
  var asn1 = require("./asn1-der");
57
55
  var C = require("./constants");
@@ -112,15 +110,16 @@ var CMC_POLICY_OID = "1.3.6.1.4.1.53087.1.2";
112
110
  // RFC 3709 4.2 — the logotype extension OID.
113
111
  var ID_PE_LOGOTYPE = "1.3.6.1.5.5.7.1.12";
114
112
 
115
- // Vendored BIMI Group trust anchors. Read once at module load. The
116
- // vendor file may be empty-of-PEM in source trees (operators populate
117
- // via the documented refresh procedure); fetchAndVerifyMark refuses
118
- // to validate if both the vendored bundle is empty and the call-site
119
- // `trustAnchorsPem` opt is absent.
120
- var _vendoredTrustAnchorsPath = nodePath.join(__dirname, "vendor", "bimi-trust-anchors.pem");
113
+ // Vendored BIMI Group trust anchors. Loaded via b.vendorData which
114
+ // dual-hash + SLH-DSA-SHAKE-256f-signature-verifies before returning
115
+ // the bytes. The vendor file may be empty-of-PEM in source trees
116
+ // (operators populate via the documented refresh procedure);
117
+ // fetchAndVerifyMark refuses to validate if both the vendored bundle
118
+ // is empty and the call-site `trustAnchorsPem` opt is absent.
119
+ var vendorData = require("./vendor-data");
121
120
  var _vendoredTrustAnchorsPem = "";
122
121
  try {
123
- _vendoredTrustAnchorsPem = fs.readFileSync(_vendoredTrustAnchorsPath, "utf8");
122
+ _vendoredTrustAnchorsPem = vendorData.getAsString("bimi-trust-anchors");
124
123
  } catch (_e) {
125
124
  _vendoredTrustAnchorsPem = "";
126
125
  }
@@ -52,18 +52,17 @@
52
52
  * before lookup. Bad inputs throw `PublicSuffixError`.
53
53
  */
54
54
 
55
- var fs = require("node:fs");
56
- var nodePath = require("node:path");
57
- var nodeCrypto = require("node:crypto");
58
55
  var nodeUrl = require("node:url");
56
+ var vendorData = require("./vendor-data");
57
+ var pslDataModule = require("./vendor/public-suffix-list.data");
59
58
  var { PublicSuffixError } = require("./framework-error");
60
59
 
61
- // Vendored PSL data file. Per the framework's vendoring policy this
62
- // is checked in alongside the bundled npm-deps and tracked in
63
- // lib/vendor/MANIFEST.json. Loaded synchronously at module-init
64
- // missing file is a packaging break operators must catch at boot,
65
- // not on first lookup at request time.
66
- var PSL_PATH = nodePath.join(__dirname, "vendor", "public-suffix-list.dat");
60
+ // Vendored PSL data file. Loaded via b.vendorData which inlines the
61
+ // bytes as a CommonJS module, dual-hash + SLH-DSA-SHAKE-256f-signature
62
+ // verifies on first access, and carries an in-payload canary the
63
+ // PSL parser must observe. Packaging-mode-invariant survives SEA,
64
+ // pkg, nexe, esbuild bundles, Lambda layers, Bun/Deno compile. See
65
+ // lib/vendor-data.js for the integrity surface.
67
66
 
68
67
  function _err(code, message) {
69
68
  return new PublicSuffixError(code, message);
@@ -185,34 +184,24 @@ var _sourceMeta;
185
184
  (function _init() {
186
185
  var raw;
187
186
  try {
188
- raw = fs.readFileSync(PSL_PATH);
187
+ raw = vendorData.get("public-suffix-list");
189
188
  } catch (e) {
190
189
  throw _err("public-suffix/not-loaded",
191
- "publicSuffix: vendored PSL data file missing at " + PSL_PATH +
192
- " (" + (e && e.message ? e.message : "unknown error") + ")");
190
+ "publicSuffix: vendored PSL data not loadable via b.vendorData " +
191
+ "(" + (e && e.message ? e.message : "unknown error") + ")");
193
192
  }
194
- var sha256 = nodeCrypto.createHash("sha256").update(raw).digest("hex");
195
193
  var parsed = _parsePsl(raw.toString("utf8"));
196
194
  _data = parsed;
197
- // Read vendoredAt from MANIFEST.json so the metadata stays in lock-
198
- // step with the vendor refresh. Falls back to "unknown" if the
199
- // manifest can't be read or doesn't carry the entry — the parsed
200
- // sha256 still uniquely identifies the file content.
201
- var vendoredAt = "unknown";
202
- try {
203
- var manifestPath = nodePath.join(__dirname, "vendor", "MANIFEST.json");
204
- var manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8")); // allow:bare-json-parse — MANIFEST.json is a framework-internal vendored file checked in alongside code; never from operator / network input
205
- var entry = manifest && manifest.packages && manifest.packages["publicsuffix-list"];
206
- if (entry && typeof entry.bundledAt === "string") vendoredAt = entry.bundledAt;
207
- } catch (_e) {
208
- // Manifest missing / malformed — continue with vendoredAt =
209
- // "unknown". This is observability-only metadata; a request-path
210
- // failure here would punish operators for a non-fatal drift.
211
- }
195
+ // Provenance comes from the .data.js module's own metadata, which
196
+ // carries sha256 + sha3-512 + signing public-key fingerprint +
197
+ // upstream fetchedAt timestamp. All four were verified by
198
+ // vendorData.get() before the bytes reached this caller.
199
+ var meta = pslDataModule.metadata;
212
200
  _sourceMeta = Object.freeze({
213
- vendoredAt: vendoredAt,
201
+ vendoredAt: meta.fetchedAt,
214
202
  entries: parsed.entries,
215
- sha256: sha256,
203
+ sha256: meta.sha256,
204
+ signedBy: meta.publicKeyFingerprint,
216
205
  });
217
206
  })();
218
207
 
@@ -0,0 +1,4 @@
1
+ -----BEGIN SLH-DSA-SHAKE-256F PUBLIC KEY-----
2
+ NyFNN00fxmgkHnZwtfy1FU9SodrVbgJRihT5/S605tM7c6YAKIS1mry4y8VCKh2h
3
+ G+oRhGOPLb1ebxNmcQZw+g==
4
+ -----END SLH-DSA-SHAKE-256F PUBLIC KEY-----
@@ -1,144 +1,156 @@
1
- {
2
- "_comment": "Vendored dependencies no npm runtime packages. Use scripts/vendor-update.sh to update.",
3
- "packages": {
4
- "@noble/ciphers": {
5
- "version": "2.2.0",
6
- "license": "MIT",
7
- "author": "Paul Miller",
8
- "source": "https://github.com/paulmillr/noble-ciphers",
9
- "exports": [
10
- "xchacha20poly1305"
11
- ],
12
- "files": {
13
- "server": "lib/vendor/noble-ciphers.cjs"
14
- },
15
- "bundler": "esbuild --format=cjs --minify --platform=node",
16
- "bundledAt": "2026-04-25",
17
- "hashes": {
18
- "server": "sha256:5d539dfc9ef47121d4c09bd7256d76448a1f5ac47ee09ac44c78ff6a062af9ab"
19
- }
20
- },
21
- "@noble/post-quantum": {
22
- "version": "0.6.1",
23
- "license": "MIT",
24
- "author": "Paul Miller",
25
- "source": "https://github.com/paulmillr/noble-post-quantum",
26
- "_about": "FIPS 203 / 204 / 205 PQC algorithms in pure JS. First-class on both server-side and client-side interoperable with Node's built-in WebCrypto ML-KEM (a ciphertext encapsulated with Node ML-KEM-1024 decapsulates correctly with b.pqcSoftware.ml_kem_1024 and vice versa). Operators wire it server-side via `b.pqcSoftware.{ml_kem_1024,ml_dsa_87,slh_dsa_shake_256f,...}` (security-first defaults are the highest cat-5 levels), or re-bundle for browser / mobile clients shipping b.middleware.apiEncrypt.client. Older Node versions without the experimental WebCrypto ML-KEM extension can use the vendored bundle as the primary PQC path.",
27
- "exports": [
28
- "ml_kem512",
29
- "ml_kem768",
30
- "ml_kem1024",
31
- "ml_dsa44",
32
- "ml_dsa65",
33
- "ml_dsa87",
34
- "slh_dsa_sha2_128f",
35
- "slh_dsa_sha2_192f",
36
- "slh_dsa_sha2_256f",
37
- "slh_dsa_shake_128f",
38
- "slh_dsa_shake_192f",
39
- "slh_dsa_shake_256f"
40
- ],
41
- "files": {
42
- "server": "lib/vendor/noble-post-quantum.cjs"
43
- },
44
- "bundler": "esbuild --format=cjs --minify --platform=node",
45
- "bundledAt": "2026-05-06",
46
- "hashes": {
47
- "server": "sha256:f9190309daadca4c2e2cc2b76beaa6b96e463429cc3c390bd9f0ceaf7b588c68"
48
- }
49
- },
50
- "@simplewebauthn/server": {
51
- "version": "13.3.0",
52
- "license": "MIT",
53
- "author": "Matthew Miller",
54
- "source": "https://github.com/MasterKale/SimpleWebAuthn",
55
- "exports": [
56
- "generateRegistrationOptions",
57
- "verifyRegistrationResponse",
58
- "generateAuthenticationOptions",
59
- "verifyAuthenticationResponse",
60
- "MetadataService"
61
- ],
62
- "files": {
63
- "server": "lib/vendor/simplewebauthn-server.cjs"
64
- },
65
- "bundler": "esbuild --format=cjs --minify --platform=node --external:crypto --external:node:crypto",
66
- "bundledAt": "2026-04-26",
67
- "hashes": {
68
- "server": "sha256:a9777dca582095d67f17ca24e19a0791de29928555b6b779c2233429175eb3f0"
69
- }
70
- },
71
- "SecLists-common-passwords-top-10000": {
72
- "version": "10k-most-common (master)",
73
- "license": "CC-BY-3.0",
74
- "author": "Daniel Miessler / SecLists contributors",
75
- "source": "https://github.com/danielmiessler/SecLists",
76
- "_about": "Top 10,000 most-common passwords (breach-derived). Loaded by b.auth.password.policy() to satisfy NIST 800-63B §5.1.1.2 'previously breached' check. Operators with deeper enforcement (HIBP downloads, NCSC 100k) layer on top via opts.forbidCommon the bundled set is additive.",
77
- "files": {
78
- "server": "lib/vendor/common-passwords-top-10000.txt"
79
- },
80
- "bundler": "curl https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10k-most-common.txt",
81
- "bundledAt": "2026-05-02",
82
- "hashes": {
83
- "server": "sha256:4adb3f0afb4a10cf19ebe48d8c69a46f934bbc8d77c694c210564f9583e7f4ba"
84
- }
85
- },
86
- "bimi-trust-anchors": {
87
- "version": "operator-managed",
88
- "license": "BIMI Group / per-issuer",
89
- "author": "BIMI Group / DigiCert / Entrust",
90
- "source": "https://bimigroup.org/",
91
- "_about": "RFC 9091 BIMI Group Verified Mark trust-anchor bundle (PEM, concatenated). Loaded by lib/mail-bimi.js for VMC + CMC chain validation. Source-tree default is empty-of-PEM (operators populate via the documented refresh procedure in the file header); call-site overrides via b.mail.bimi.fetchAndVerifyMark({ trustAnchorsPem }) are supported. Refresh procedure pulls https://www.digicert.com/CACerts/DigiCertVerifiedMarkRootCA.pem + https://web.entrust.com/root-certificates/entrust_verified_mark_root_g3.cer and concatenates them into the file.",
92
- "exports": [
93
- "bimi-vmc-trust-anchors"
94
- ],
95
- "files": {
96
- "server": "lib/vendor/bimi-trust-anchors.pem"
97
- },
98
- "bundler": "operator-managed (see file header for refresh procedure)",
99
- "bundledAt": "2026-05-09",
100
- "hashes": {
101
- "server": "sha256:81ff9f5ab3c9774132c845684e783be95cf73146f8b670d964105f0a3765b4b4"
102
- }
103
- },
104
- "publicsuffix-list": {
105
- "version": "master",
106
- "license": "MPL-2.0",
107
- "author": "Mozilla Foundation",
108
- "source": "https://publicsuffix.org/list/public_suffix_list.dat",
109
- "_about": "Mozilla Public Suffix List — canonical catalog of effective top-level domains used by b.publicSuffix to derive organizational domains for DMARCbis (psd= / np=), BIMI, cookie-scope checks, and same-site policies. Loaded at module-init from lib/vendor/public-suffix-list.dat; the file is the data, not a code bundle.",
110
- "files": {
111
- "server": "lib/vendor/public-suffix-list.dat"
112
- },
113
- "bundler": "curl https://publicsuffix.org/list/public_suffix_list.dat",
114
- "bundledAt": "2026-05-09",
115
- "hashes": {
116
- "server": "sha256:a00855bbf027ca86cead1cf0bafc0b9b1ae904dda97f3e24b0062aa2e6e289e2"
117
- }
118
- },
119
- "peculiar-pki": {
120
- "version": "2.0.0+pkijs-3.4.0",
121
- "license": "MIT",
122
- "author": "Peculiar Ventures",
123
- "source": "https://github.com/PeculiarVentures",
124
- "_about": "Meta-bundle of @peculiar/x509 + pkijs + reflect-metadata + every transitive ASN.1 schema package. Used by lib/mtls-engine-default.js as the pure-JS CA + PKCS#12 engine wired into b.mtlsCa.",
125
- "components": {
126
- "@peculiar/x509": "https://github.com/PeculiarVentures/x509",
127
- "pkijs": "https://github.com/PeculiarVentures/PKI.js"
128
- },
129
- "exports": [
130
- "x509",
131
- "pkijs",
132
- "crypto"
133
- ],
134
- "files": {
135
- "server": "lib/vendor/pki.cjs"
136
- },
137
- "bundler": "esbuild --format=cjs --minify --platform=node --external:crypto --external:node:crypto",
138
- "bundledAt": "2026-04-29",
139
- "hashes": {
140
- "server": "sha256:9bbc191afaaa2b1e5757f00480457c08134cdc2c55d541df18d9155bba9cbf77"
141
- }
142
- }
143
- }
144
- }
1
+ {
2
+ "_comment": "Vendored dependencies \u00e2\u20ac\u201d no npm runtime packages. Use scripts/vendor-update.sh to update.",
3
+ "packages": {
4
+ "@noble/ciphers": {
5
+ "version": "2.2.0",
6
+ "license": "MIT",
7
+ "author": "Paul Miller",
8
+ "source": "https://github.com/paulmillr/noble-ciphers",
9
+ "exports": [
10
+ "xchacha20poly1305"
11
+ ],
12
+ "files": {
13
+ "server": "lib/vendor/noble-ciphers.cjs"
14
+ },
15
+ "bundler": "esbuild --format=cjs --minify --platform=node",
16
+ "bundledAt": "2026-04-25",
17
+ "hashes": {
18
+ "server": "sha256:5d539dfc9ef47121d4c09bd7256d76448a1f5ac47ee09ac44c78ff6a062af9ab"
19
+ }
20
+ },
21
+ "@noble/post-quantum": {
22
+ "version": "0.6.1",
23
+ "license": "MIT",
24
+ "author": "Paul Miller",
25
+ "source": "https://github.com/paulmillr/noble-post-quantum",
26
+ "_about": "FIPS 203 / 204 / 205 PQC algorithms in pure JS. First-class on both server-side and client-side \u00e2\u20ac\u201d interoperable with Node's built-in WebCrypto ML-KEM (a ciphertext encapsulated with Node ML-KEM-1024 decapsulates correctly with b.pqcSoftware.ml_kem_1024 and vice versa). Operators wire it server-side via `b.pqcSoftware.{ml_kem_1024,ml_dsa_87,slh_dsa_shake_256f,...}` (security-first defaults are the highest cat-5 levels), or re-bundle for browser / mobile clients shipping b.middleware.apiEncrypt.client. Older Node versions without the experimental WebCrypto ML-KEM extension can use the vendored bundle as the primary PQC path.",
27
+ "exports": [
28
+ "ml_kem512",
29
+ "ml_kem768",
30
+ "ml_kem1024",
31
+ "ml_dsa44",
32
+ "ml_dsa65",
33
+ "ml_dsa87",
34
+ "slh_dsa_sha2_128f",
35
+ "slh_dsa_sha2_192f",
36
+ "slh_dsa_sha2_256f",
37
+ "slh_dsa_shake_128f",
38
+ "slh_dsa_shake_192f",
39
+ "slh_dsa_shake_256f"
40
+ ],
41
+ "files": {
42
+ "server": "lib/vendor/noble-post-quantum.cjs"
43
+ },
44
+ "bundler": "esbuild --format=cjs --minify --platform=node",
45
+ "bundledAt": "2026-05-06",
46
+ "hashes": {
47
+ "server": "sha256:f9190309daadca4c2e2cc2b76beaa6b96e463429cc3c390bd9f0ceaf7b588c68"
48
+ }
49
+ },
50
+ "@simplewebauthn/server": {
51
+ "version": "13.3.0",
52
+ "license": "MIT",
53
+ "author": "Matthew Miller",
54
+ "source": "https://github.com/MasterKale/SimpleWebAuthn",
55
+ "exports": [
56
+ "generateRegistrationOptions",
57
+ "verifyRegistrationResponse",
58
+ "generateAuthenticationOptions",
59
+ "verifyAuthenticationResponse",
60
+ "MetadataService"
61
+ ],
62
+ "files": {
63
+ "server": "lib/vendor/simplewebauthn-server.cjs"
64
+ },
65
+ "bundler": "esbuild --format=cjs --minify --platform=node --external:crypto --external:node:crypto",
66
+ "bundledAt": "2026-04-26",
67
+ "hashes": {
68
+ "server": "sha256:a9777dca582095d67f17ca24e19a0791de29928555b6b779c2233429175eb3f0"
69
+ }
70
+ },
71
+ "SecLists-common-passwords-top-10000": {
72
+ "version": "10k-most-common (master)",
73
+ "license": "CC-BY-3.0",
74
+ "author": "Daniel Miessler / SecLists contributors",
75
+ "source": "https://github.com/danielmiessler/SecLists",
76
+ "_about": "Top 10,000 most-common passwords (breach-derived). Loaded by b.auth.password.policy() to satisfy NIST 800-63B \u00c2\u00a75.1.1.2 'previously breached' check. Operators with deeper enforcement (HIBP downloads, NCSC 100k) layer on top via opts.forbidCommon \u00e2\u20ac\u201d the bundled set is additive.",
77
+ "files": {
78
+ "server": "lib/vendor/common-passwords-top-10000.txt",
79
+ "data_js": "lib/vendor/common-passwords-top-10000.data.js"
80
+ },
81
+ "bundler": "curl https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10k-most-common.txt",
82
+ "bundledAt": "2026-05-13",
83
+ "hashes": {
84
+ "server": "sha256:3c04e3cec775a7d0e21e544d33810dd434cccdb02e98903ba12e506dd9cd01bd",
85
+ "data_js": "sha256:87b223beca89f33d2c2c32a2cfda0bc187e58061de40e7127bb5ffc4258c6e2a"
86
+ },
87
+ "runtime_artifact": "lib/vendor/common-passwords-top-10000.data.js",
88
+ "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)"
89
+ },
90
+ "bimi-trust-anchors": {
91
+ "version": "operator-managed",
92
+ "license": "BIMI Group / per-issuer",
93
+ "author": "BIMI Group / DigiCert / Entrust",
94
+ "source": "https://bimigroup.org/",
95
+ "_about": "RFC 9091 BIMI Group Verified Mark trust-anchor bundle (PEM, concatenated). Loaded by lib/mail-bimi.js for VMC + CMC chain validation. Source-tree default is empty-of-PEM (operators populate via the documented refresh procedure in the file header); call-site overrides via b.mail.bimi.fetchAndVerifyMark({ trustAnchorsPem }) are supported. Refresh procedure pulls https://www.digicert.com/CACerts/DigiCertVerifiedMarkRootCA.pem + https://web.entrust.com/root-certificates/entrust_verified_mark_root_g3.cer and concatenates them into the file.",
96
+ "exports": [
97
+ "bimi-vmc-trust-anchors"
98
+ ],
99
+ "files": {
100
+ "server": "lib/vendor/bimi-trust-anchors.pem",
101
+ "data_js": "lib/vendor/bimi-trust-anchors.data.js"
102
+ },
103
+ "bundler": "operator-managed (see file header for refresh procedure)",
104
+ "bundledAt": "2026-05-13",
105
+ "hashes": {
106
+ "server": "sha256:81ff9f5ab3c9774132c845684e783be95cf73146f8b670d964105f0a3765b4b4",
107
+ "data_js": "sha256:aa7a4d33b65a68422a2a2c1670177689f66fdcaa08bd2514d78798b827bd1608"
108
+ },
109
+ "runtime_artifact": "lib/vendor/bimi-trust-anchors.data.js",
110
+ "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)"
111
+ },
112
+ "publicsuffix-list": {
113
+ "version": "master",
114
+ "license": "MPL-2.0",
115
+ "author": "Mozilla Foundation",
116
+ "source": "https://publicsuffix.org/list/public_suffix_list.dat",
117
+ "_about": "Mozilla Public Suffix List \u00e2\u20ac\u201d canonical catalog of effective top-level domains used by b.publicSuffix to derive organizational domains for DMARCbis (psd= / np=), BIMI, cookie-scope checks, and same-site policies. Loaded at module-init from lib/vendor/public-suffix-list.dat; the file is the data, not a code bundle.",
118
+ "files": {
119
+ "server": "lib/vendor/public-suffix-list.dat",
120
+ "data_js": "lib/vendor/public-suffix-list.data.js"
121
+ },
122
+ "bundler": "curl https://publicsuffix.org/list/public_suffix_list.dat",
123
+ "bundledAt": "2026-05-13",
124
+ "hashes": {
125
+ "server": "sha256:f15642cea028662c39d380caa9ddfbe36c81466e3a82f8f4b10703d83760295c",
126
+ "data_js": "sha256:b4b6ae76fdacbfe07683c4ea62761326f42894c2ccf4359f253bbcab9826ed04"
127
+ },
128
+ "runtime_artifact": "lib/vendor/public-suffix-list.data.js",
129
+ "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)"
130
+ },
131
+ "peculiar-pki": {
132
+ "version": "2.0.0+pkijs-3.4.0",
133
+ "license": "MIT",
134
+ "author": "Peculiar Ventures",
135
+ "source": "https://github.com/PeculiarVentures",
136
+ "_about": "Meta-bundle of @peculiar/x509 + pkijs + reflect-metadata + every transitive ASN.1 schema package. Used by lib/mtls-engine-default.js as the pure-JS CA + PKCS#12 engine wired into b.mtlsCa.",
137
+ "components": {
138
+ "@peculiar/x509": "https://github.com/PeculiarVentures/x509",
139
+ "pkijs": "https://github.com/PeculiarVentures/PKI.js"
140
+ },
141
+ "exports": [
142
+ "x509",
143
+ "pkijs",
144
+ "crypto"
145
+ ],
146
+ "files": {
147
+ "server": "lib/vendor/pki.cjs"
148
+ },
149
+ "bundler": "esbuild --format=cjs --minify --platform=node --external:crypto --external:node:crypto",
150
+ "bundledAt": "2026-04-29",
151
+ "hashes": {
152
+ "server": "sha256:9bbc191afaaa2b1e5757f00480457c08134cdc2c55d541df18d9155bba9cbf77"
153
+ }
154
+ }
155
+ }
156
+ }