Skip to content

docs: real-hardware runs (vTPM quote, attested peer, cross-TEE Azure SNP to GCP TDX) - #68

Merged
imran-siddique merged 3 commits into
mainfrom
docs/hardware-runs
Jul 28, 2026
Merged

docs: real-hardware runs (vTPM quote, attested peer, cross-TEE Azure SNP to GCP TDX)#68
imran-siddique merged 3 commits into
mainfrom
docs/hardware-runs

Conversation

@imran-siddique

Copy link
Copy Markdown
Contributor

Three hardware runs, plus the two commits orphaned when #61 merged ahead of them.

Cross-operator, cross-TEE: Azure SEV-SNP calling GCP TDX

An AMD SEV-SNP peer on Azure (DC2ads_v5, eastus) called an Intel TDX peer on GCP (c3-standard-4, us-central1-a). Different clouds, different operators, unrelated attestation formats: an AMD VCEK chain on one side, an Intel PCK chain on the other.

Step Result
Caller appraises callee's TDX quote 8,000 bytes, verified to the pinned Intel SGX Root CA
Channel key bound to the quote Yes, REPORTDATA = sha256(channel_pub || nonce) matched
Stale nonce Rejected
Sealed delegated task Opened inside the TDX enclave
tool:search Allowed, effective scope [task:read, tool:search]
tool:purchase Refused, 403 SCOPE_NOT_PERMITTED
Denial record Returned across the boundary with decision, requested capability, effective scope and reason

All four primitives held at once across a real trust boundary: a scope narrowed by a chain the callee did not issue, attestation on real hardware gating the seal, confidentiality to a measured guest, and provenance for both the allow and the deny.

Also included

  • Live attested peer: verify_offer returned assurance="hardware" for the first time, off a real SEV-SNP quote on an Azure CVM, with measurement mismatch and stale nonce both rejected.
  • Real Azure vTPM quote through the TPM verifier: parse, magic and type, qualifying-data binding, PCR digest and the AK signature, with a flipped bit rejected.

What these runs do not establish, stated in the docs

  • The cross-TEE attestation was one-directional. The callee never appraised the caller. Mutual simultaneous attestation is the remaining step.
  • Both peers were driven by one operator's harness.
  • The TPM certificate chain is still unexercised: Azure's NV AK cert covers its pre-provisioned AK, not an in-guest one, and has no AIA extension for its issuer.
  • The committed examples/cross-operator-delegation stays software-attested. Real evidence embeds per-CPU identifiers, so it cannot ship as a fixture; the runs are recorded in docs/hardware-validation.md instead.

Test plan

  • pytest tests/ — 206 passed; 6 pre-existing test_cedar.py failures unrelated to this change (local cedarpy binding; they pass in CI)
  • mypy src/ — clean
  • Both VMs and the GCP firewall rule were deleted immediately after the run

🤖 Generated with Claude Code

imran-siddique and others added 3 commits July 27, 2026 16:45
Captured a genuine TPM 2.0 quote from an Azure Trusted Launch VM (vTPM, secure
boot, PCRs 0-7 under a fresh nonce). The verifier's parse, magic and type
checks, qualifying-data binding, PCR digest and AK RSA PKCS#1 v1.5 SHA-256
signature all hold on it, and a flipped bit in the attest blob is rejected.
Env-gated on CA2A_TPM_FIXTURE_DIR; the capture is not committed.

What this does not close, stated in docs/hardware-validation.md rather than
glossed: the AK certificate chain. Azure's pre-provisioned AK certificate
certifies a different key than an in-guest tpm2_createak AK, so it does not
verify against this quote, and it carries no AIA extension, so its issuing
intermediate is not fetchable from it. Chain-to-vendor-root stays unexercised
for TPM, which is why this verifier takes caller-supplied roots rather than
pinning one. This is also a Hyper-V vTPM, not a discrete TPM chip.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rdware

Drove ca2a_runtime.attestation's verifier seam off a live SEV-SNP quote on an
Azure DC2ads_v5 confidential VM. verify_offer returned assurance="hardware"
rather than "none" for the first time, a payload was sealed to a channel key a
hardware-verified measurement vouches for and opened inside the enclave, and
both a measurement mismatch and a stale nonce were rejected.

Azure SEV-SNP is paravisor-mediated, so the binding is one hop longer than
bare-metal: the caller's nonce rides in the AK-signed TPM quote, the paravisor
binds that AK into the SNP report's REPORT_DATA, and the report chains VCEK to
ASK to ARK-Milan against AMD KDS. docs/hardware-validation.md spells that out.

What this does not close is said in the same breath, in LIMITATIONS and the
ROADMAP: the run had one attested peer with the caller on the same host, so cA2A
is still not demonstrated attested across trust domains. That needs two
independently operated attested peers. Software mode also remains the default
for the reference transport; the hardware path is a validated capability, not
the shipped default.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
An AMD SEV-SNP peer on Azure called an Intel TDX peer on GCP: different clouds,
different operators, unrelated attestation formats. The caller appraised the
callee's genuine 8KB TDX quote against the pinned Intel SGX Root CA, confirmed
the quote's REPORTDATA bound the callee's channel key under a nonce the caller
chose, and only then sealed a delegated task. The TDX enclave opened it, enforced
a scope narrowed by a chain it did not issue, allowed tool:search, and refused
tool:purchase with a denial record carrying the requested capability, the
effective scope and the reason back across the trust boundary. A stale nonce was
rejected.

That is the four primitives holding at once across a real trust boundary, which
is what the cross-operator claim rested on.

Two honest limits are recorded with it: the attestation was one-directional, so
the callee never appraised the caller, and both peers ran from one operator's
harness. Mutual simultaneous attestation is the remaining step. The committed
cross-operator example stays software-attested, because real evidence embeds
per-CPU identifiers and cannot be shipped as a fixture.

Also carries the two commits orphaned when #61 merged: the real Azure vTPM quote
test and the assurance="hardware" live-peer run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@imran-siddique
imran-siddique merged commit 592f249 into main Jul 28, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant