1. What travels with a report
Three values make a report self-verifying. They appear on the report artifact and on the public share-portal metadata for the link.content_hash — SHA-256 of the evidence
content_hash — SHA-256 of the evidence
A lowercase hex SHA-256 digest of the report’s canonical evidence
JSON. The bytes are deterministic for a given report, so anyone with
the same evidence recomputes the identical hash. Any edit to the
evidence changes this value.
signature — Ed25519 over the hash
signature — Ed25519 over the hash
A base64 Ed25519 signature computed over the hex
content_hash. It
proves the hash was signed by OrcaRouter’s signing key and not forged.sig_key_id — which key signed it
sig_key_id — which key signed it
A short, stable identifier for the active public key (for example
orca- followed by a hex fragment). The verifier uses it to confirm
the report was signed by the key currently published — a report signed
by an unknown key id fails closed.The signature covers the content hash, not the rendered PDF, CSV, or
JSON bytes directly. The same evidence renders to all three formats from
one hash, so the integrity guarantee is on the underlying evidence — every
export of a given report shares one
content_hash, signature, and
sig_key_id.2. Fetch the public key
The signing public key is published at an open endpoint — no auth, no workspace context. An auditor calls it directly.public_key is the base64-encoded 32-byte Ed25519 public key. The
key_id here must match the sig_key_id on the report — if it does not,
the report was signed by a different (likely rotated or older) key and
will not verify against this published key.
3. Verify the signature
You can verify the signature two ways. Either ask OrcaRouter to check the tuple for you, or verify entirely offline with the published public key.The hosted verify endpoint
POST the three values from the report to the open verify endpoint. It is public — an auditor calls it with no credentials.valid: true means the signature checks out against the active key for
that key id. valid: false means either the signature does not match the
hash, the hash is empty, or the sig_key_id does not match the currently
published key.
Verify offline with the public key
A skeptical auditor does not need to trust the verify endpoint at all. Because the algorithm is standard Ed25519 over the hex content hash, the signature is checkable with any crypto library:4. What the signature covers
A signature proves the report’scontent_hash was signed by OrcaRouter,
and the hash proves the evidence is unedited. One subtlety: the hash is
computed over a canonical form of the evidence the gateway builds — not
the raw bytes of the JSON or PDF file. So re-hashing the downloaded artifact
yourself will not reproduce content_hash. Use the verify endpoint
(§2/§3), which recomputes the canonical hash and checks the Ed25519
signature for you:
| Check | Meaning |
|---|---|
signature_valid: true | The content_hash was signed by OrcaRouter’s key — evidence is authentic and unedited. |
| Key id matches | Report sig_key_id == the published key id → signed by the active key. |
5. Verifying a shared report
When you send an auditor a share-portal link instead of the file, the portal metadata already carriescontent_hash,
signature, and sig_key_id, plus a server-computed signature_valid
flag. The auditor can trust the flag and re-run the checks above against
the public key independently — the share portal needs no login, and the
verification path is identical.
A shared artifact is only served while its stamped region still matches
your workspace’s declared
data-residency region. If the
region was changed, downloads are withheld even though the signature
metadata stays verifiable. This is by design — see
Cross-region reads.
6. Where to go next
Signed reports
How a signed report is generated, what evidence it captures, and how to
mint an auditor share link.
Export evidence
Pull report evidence as PDF, CSV, or JSON for your auditor’s workpapers.
Data residency
How the region stamp on a report governs where it is stored and served.
Shared responsibility
What OrcaRouter guarantees on the gateway path versus what stays yours.
