Native and npm authenticate raw or bundled Vouch context and can require a bundle to match separately supplied exact source and input bytes. Native current re-execution and the local required-decision gate accept only live request-bound evidence, so bundle authority requires that complete external pair.
Working method
- Issue signed evidence with
lispex vouch issue --source RULE --input INPUT --profile csk.checked-profile/v1 --key-handle pkcs8-file:///ABSOLUTE/issuer.pk8 --out-dir OUTPUT. The provider accepts an absolute local Ed25519 PKCS#8 DER key URI, never inline, stdin, or environment-variable key material. - Authenticate without execution in either Native or npm using
lispex vouch verify --envelope OUTPUT/envelope.dsse.json --trust-policy POLICY --source RULE --input INPUT --profile csk.checked-profile/v1 --report-out AUTH-REPORT. The same accepted bytes produce the same canonical v0 report and exit 0 or 10. - On Native only, add
--reexecuteto run the current verifier. A clean report separatesauthentication: authenticatedfromreexecution: execution-agreed, namescsk.vouch-complete-transcript/v0, and recordscurrent_vs_signed: agree. npm rejects this flag before artifact I/O. - Gate an approve decision with
lispex vouch gate --envelope OUTPUT/envelope.dsse.json --trust-policy POLICY --source RULE --input INPUT --profile csk.checked-profile/v1 --require-decision approve --report-out GATE-REPORT. Use only exit 0 from this invocation as the local match; exit 10 means no grant. - Use
lispex vouch inspectfor unsigned structural receipt checks and npmlispex vouch replayfor a fixed-corpus comparison. The maintained refund-window example issues once with Native, compares Native/npm authentication reports byte for byte, then keeps re-execution and gate in Native. - Preserve the exact rule, input, profile, trust policy, reports, and release-binary identity. Verification does not reconstruct missing context.
- The refund-window flow derives identities before issuance, proves Native/npm raw/unpinned/pinned authentication parity, then supplies the exact external request to Native pinned-bundle re-execution and gate. It also proves unpinned authority rejection and request-mismatch denial.
lispex vouch policy create --public-key SPKI --engine-sha256 DIGEST --source RULE --out POLICYaccepts one 44-byte Ed25519 SPKI DER key and one or more reviewed engine digests and named source files. Shared Rust derives identities, rejects duplicates, sorts allowlists, and atomically writes byte-identical canonical policy v1 without overwriting or stdout.lispex vouch policy check --trust-policy POLICYsilently accepts only exact closed canonical v0/v1 policy bytes. Policy success is structural configuration validity, not authentication, evidence, re-execution, a gate grant, or a judgement that the chosen key, engine, or source deserves trust.lispex vouch source-id --source RULEreads at most 1 MiB once and printsSHA-256("csk.v0.source" || 0x1f || exact source bytes)as 64 lowercase hex. Native and npm use the same Rust function; public browser WASM and Playground do not expose it.lispex vouch key-id --public-key SPKIvalidates one exact 44-byte Ed25519 DER SPKI and prints the existingsha256:key ID.engine-id --executable FILEhashes at most 16 MiB as ordinary SHA-256 with the same prefix.input-id --input FILEhashes at most 1 MiB asSHA-256("csk.v0.input" || 0x1f || exact bytes)without parsing the input. Native/npm stdout is byte-identical.- Trust policy v1 requires a non-empty
allowed_source_sha256on every key. Each value is the existing receipt source identity: 64 lowercase hex forSHA-256(UTF-8("csk.v0.source") || 0x1f || exact source bytes). Policy v0 remains accepted and source-unconstrained. csk.vouch-input-bundle/v0contains exactly the canonical DSSE envelope bytes, checked source bytes, and checked input bytes. Trust policy, expected profile, required decision, key, and report path stay outside and caller-owned.lispex vouch verify --bundle BUNDLE --trust-policy POLICY --source RULE --input INPUT --profile PROFILE --report-out REPORTfirst authenticates the bundle-owned signed context, then requires byte-for-byte equality with the separately snapshotted source and input. Native and npm emit the same canonical v0 report; source mismatch is classified before input mismatch.- Raw verify authenticates caller-supplied exact context. Unpinned bundle verify remains authentication of the exact signed context transported by the bundle. Pinned bundle verify additionally proves equality with this invocation’s separately supplied request bytes. Native bundle
--reexecuteandgaterequire that complete external pair and reject its absence or a partial pair with usage exit 2 before artifact I/O. - Native emits and consumes bundles and can re-execute or gate; the npm CLI consumes bundles for authentication only. Public browser WASM and Playground expose no Vouch authentication or bundle API.
- The whole canonical bundle is limited to 16 MiB. Outer bundle failures exit 3 and create no authentication report; after successful decoding, existing authentication exits 0, 10, or 1 and v0 report bytes are unchanged. Raw mode remains the fallback for larger or independently pinned context.
Assurance levels
| Operation | Establishes | Still requires |
|---|---|---|
| Identity commands | key-id, engine-id, source-id, and input-id print exact existing values from named bounded files through shared Rust | no stdin, artifact inference, provenance, trust, input validation, authentication, evidence, or authority |
| Policy create/check | lispex vouch policy create writes one canonical v1 policy from reviewed public inputs; policy check validates exact canonical bytes | no private key, inferred engine, artifact trust, overwrite/merge, authentication, evidence, decision grant, or browser export |
| Source ID | lispex vouch source-id --source RULE prints the exact policy v1 value from bounded bytes | no stdin, artifact extraction, normalization, approval, policy writing, authentication, or evidence |
| Trust policy v1 | key-local exact allowed_source_sha256 after signature/profile/engine checks | native-source-disallowed before raw source mismatch; no input/request or freshness policy |
| Bundle | one bounded transport input for exact envelope/source/input bytes | external trust/profile plus authentication; transport alone establishes no authority |
| Inspect | schema, hashes, and structural consistency | origin authentication |
| Authenticate | an authorized key signed the exact bound envelope context | a current execution observation |
| Re-execute | the current Native verifier agrees with both signed complete transcripts | application authorization and policy review |
| Gate | live authenticated current-Native agreement exactly matches the explicitly required decision | freshness, replay handling, identity, policy review, and deployment controls |
| Act | a separate application action outside Vouch | application-owned authorization and side-effect controls |
Portable Vouch commands
1. Derive the exact key identity
OUTPUT
lispex vouch key-id --public-key issuer.spki.der2. Derive the exact engine identity
OUTPUT
lispex vouch engine-id --executable /exact/path/to/lispex3. Derive the exact source identity
OUTPUT
lispex vouch source-id --source RULE4. Derive the exact input identity
OUTPUT
lispex vouch input-id --input INPUT5. Native issue and emit the bundle
OUTPUT
lispex vouch issue \
--source RULE --input INPUT \
--profile csk.checked-profile/v1 \
--key-handle pkcs8-file:///ABSOLUTE/issuer.pk8 \
--out-dir OUTPUT --emit-bundle6. Create policy from independently reviewed public inputs
OUTPUT
lispex vouch policy create \
--public-key issuer.spki.der \
--engine-sha256 sha256:<reviewed-engine-digest> \
--source RULE --out POLICY7. Check the exact canonical policy bytes
OUTPUT
lispex vouch policy check --trust-policy POLICY8. Native or npm authenticate the bundle-owned context
OUTPUT
lispex vouch verify \
--bundle OUTPUT/vouch-input-bundle.json \
--trust-policy POLICY --profile csk.checked-profile/v1 \
--report-out AUTH-REPORT9. Native or npm pin the bundle to the intended request
OUTPUT
lispex vouch verify \
--bundle OUTPUT/vouch-input-bundle.json \
--trust-policy POLICY --source RULE --input INPUT \
--profile csk.checked-profile/v1 --report-out PINNED-REPORT10. Native bind the exact request and re-execute
OUTPUT
lispex vouch verify \
--bundle OUTPUT/vouch-input-bundle.json \
--trust-policy POLICY --source RULE --input INPUT \
--profile csk.checked-profile/v1 --reexecute \
--report-out REEXECUTION-REPORT11. Native local decision gate
OUTPUT
lispex vouch gate \
--bundle OUTPUT/vouch-input-bundle.json \
--trust-policy POLICY --source RULE --input INPUT \
--profile csk.checked-profile/v1 --require-decision approve \
--report-out GATE-REPORT12. Raw compatibility with the same policy
OUTPUT
lispex vouch verify \
--envelope OUTPUT/envelope.dsse.json \
--trust-policy POLICY --source RULE --input INPUT \
--profile csk.checked-profile/v1 --report-out AUTH-REPORTBoundaries
- The gate does not execute an external action and its report is not a transferable authorization. The calling application still owns freshness, replay handling, identity, deployment controls, and whether requiring that decision is safe and correct.
- Policy creation never accepts a private key, stdin, envelope, bundle, receipt, report, inferred running engine, network resource, or existing policy to merge. Public-key provenance, engine/source review, policy distribution, replacement, and lifecycle remain consumer-owned; browser WASM and Playground expose no policy API.
- Identity commands accept named files only and infer nothing from artifacts.
source-idandinput-idare domain-separated rather than ordinary SHA-256; neither decodes or normalizes text, andinput-iddoes not parse checked-input JSON. No identity establishes provenance, approval, policy, trust, authentication, evidence, freshness, replay control, or authority. - A bundle is untrusted transport, not a receipt, signature, report, capability, source approval, or transferable authorization. It adds no encryption or confidentiality; freshness, nonce enforcement, expiry, revocation, replay prevention, identity, independent witnessing, policy correctness, provenance before the supplied bytes, deployment safety, or permission for an external action.
- Request pinning is exact equality, not freshness, nonce uniqueness, expiry, revocation, replay prevention, human intent, or permission for an external action. An invalid signature or policy is rejected before a request mismatch is reported.
--sourceand--inputmust be supplied together with a bundle; a partial pair is usage exit 2 before artifact I/O.