Skip to content

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.