Verify evidence offline¶
You can check an evidence pack, a key-release decision or a CI receipt yourself, without access to the console and without trusting untrust's database. All three commands work on an exported file and a signer public key that you obtained separately.
The rule: trust only the key you bring¶
A signature is honoured only when it verifies against a public key you supply. A key embedded in the file being checked is never trusted on its own. Get the signer's public key from your untrust administrator or from the signing key itself, never from the file.
Each artifact is also bound to one organization. One signer signs every organization's receipts, so you must also say which organization you expect. A file that belongs to another organization does not verify.
Exit codes¶
All three commands share one contract:
| Exit | Result | Meaning |
|---|---|---|
0 |
VERIFIED | Integrity, the trusted key and the organization all hold. |
1 |
NOT VERIFIED | Tampered, signed by another key, or for another organization. |
2 |
Usage | A required binding input (the key or the organization) is missing. |
3 |
UNSIGNED or UNBOUND | Nothing proves who signed it or for which organization, for example a legacy file that names no organization. |
Only 0 is a pass. unsigned means the file has integrity but no signature to check; it
is never reported as signed.
Evidence packs¶
An evidence pack is a deterministic, signed bundle for one policy or compliance framework over a time window. Request one with an organization API key that can write (analyst or administrator):
curl -sS -X POST "https://app.untrustsecurity.com/v1/organizations/<org>/packs" \
-H "Authorization: Bearer $UNTRUST_API_KEY" \
-H "Content-Type: application/json" \
-d '{"framework": "soc2-cc6-cc7", "window_start": <unix-seconds>, "window_end": <unix-seconds>}' \
> pack.json
untrust pack verify pack.json --organization <org> --public-key untrust-signer.pem
The window is at most 366 days. pack verify always re-hashes every member against the
pack's manifest, and checks the signature against --public-key. A signed pack checked
without --public-key exits 2.
Key-release decisions¶
Read a decision from the API, then verify the ledger entry against the evidence it cites:
untrust api get "https://app.untrustsecurity.com/v1/organizations/<org>/decisions/<entry-id>" \
> decision.json
untrust ledger verify <entry-id> --file decision.json --org <org> --public-key untrust-signer.pem
A decided entry is a release untrust gated, with a receipt. An observed entry is a release untrust saw in cloud logs and did not gate; verification says so plainly. Without a signature, an entry is still checked for integrity and its link in the hash chain.
CI receipts¶
untrust api get "https://app.untrustsecurity.com/v1/organizations/<org>/ci-evidence/<evidence-id>" \
> envelope.json
untrust ci verify envelope.json --org <org> --public-key untrust-signer.pem
ci verify requires both --public-key and --org.
What verification proves¶
Verification proves the artifact is exactly what untrust recorded, for your organization, signed by the key you trust. It does not prove the underlying hardware evidence was truthful: that is what the attestation checks assess.
Where the service has no signer configured, receipts and packs are unsigned, and
integrity rests on the ledger's hash chain or the pack's manifest digest. The commands
report that as unsigned (exit 3), never as verified.
Other offline tools¶
untrust measure computes expected launch measurements from build artifacts, so you can
pin them before deployment:
| Command | Computes or checks |
|---|---|
untrust measure snp |
The AMD SEV-SNP launch measurement for an OVMF image, vCPU count and optional kernel, initrd and command line. |
untrust measure tdx |
The Intel TDX MRTD for a TDVF firmware image. |
untrust measure launch |
The measurement for a launch-inputs manifest, the same value the fleet verifier compares. |
untrust measure tdx-eventlog |
Replays a TDX event log to the quoted RTMRs and finds your kernel, initrd and command line in it. |
untrust measure tpm-eventlog |
Replays a TPM event log to the quoted PCRs. |
untrust measure gce-endorsement |
Verifies a Google-signed GCE launch endorsement and its expected measurements. |
untrust measure ibm-se-tags |
Prints an IBM Secure Execution image's boot header tags to pin. |
See the CLI reference for every option.