Inspect the report
The endpoint is public. Generate a fresh 32-byte nonce, encoded as exactly 64 lowercase hex characters:connectAci(); agent tools can use Private AI Proxy.
Report fields
The published receipt key uses
algo: "ed25519" and key_id: "dstack-kms-receipt-ed25519-v1". Select the key from the verified report rather than hardcoding its public key.
Verification procedure
-
Verify the TDX quote. Verify
attestation.evidence.quoteagainst Intel DCAP collateral, inspect TCB status, and apply your OS and key-custody policy. A local verifier such as dcap-qvl can verify Intel evidence. The ACI SDK verifies the quote but does not check whether the dstack OS image is production or development. For OS-image assurance, verify the same quote, event log, and VM configuration with an independent dstack verifier and requireis_valid: true. -
Recompute the keyset digest. Canonicalize the complete
attestation.workload_keysetwith JCS (RFC 8785), hash those bytes with SHA-256, prefix the lowercase hex digest withsha256:, and require equality withworkload_keyset_digest. Sorting keys withjqis not a general JCS implementation. -
Check nonce binding. Build this exact statement with the recomputed digest and your nonce, without whitespace and in this field order:
Require its SHA-256 digest to equal
attestation.report_dataand the quote’s first 32 report-data bytes, with the remaining 32 bytes zero. A report fetched without a nonce does not establish freshness. -
Check expiry. Require
attestation.workload_keyset.not_afterto be a future Unix timestamp under your policy. Reject implausibly distant expiry. Receipts must cite this verifiedworkload_keyset_digestand a receipt key in this keyset. -
Replay measured evidence. Replay the boot event log to the quote’s RTMR3. Confirm the measured
compose-hashequalssha256(app_compose). Inspect the measured launcher/configuration path that selects the gateway release. -
Apply release policy. For reviewed-release enforcement, compare the measured compose hash against an independently obtained, authenticated allowlist.
source_provenance.repo_urlandrepo_commitare inspection labels; trusting them without measured corroboration does not establish a reviewed release. Pair compose appraisal with the independent OS verification in step 1. -
Bind the client channel before sending traffic. Pin hostname-validated TLS to the SPKI listed for
inference.phala.comin the attested keyset. The TypeScript SDK and Private AI Proxy implement this step.
Legacy compatibility
GET /v1/attestation/report?nonce=… returns the gateway report with compatibility signer fields. signing_algo=ecdsa (default) or ed25519 selects the legacy signer. New integrations should use /v1/aci/attestation and the keyset directly.
