Repository navigation
Conversation
The guest of an Azure confidential VM with Intel TDX cannot get a TDX quote itself: there is no /dev/tdx_guest and configfs-tsm has no provider. Its paravisor produces a TD report whose report data is SHA-256 of a runtime claims document, zero-padded, and Azure's instance metadata service turns that report into an Intel-signed quote. The guest controls 64 bytes of user data in the runtime claims. The new azure-tdx format verifies the quote with the existing TDX verifier, checks that its report data commits to the runtime data sent with it, and returns the claims' user data as the binding and the relying party's nonce. The quote's MRTD measures the paravisor, not the guest, so the format is accepted only when listed, and the runtime claims (the vTPM's HCLAkPub key and the VM configuration) are passed to webhooks and templates for policy. A real quote and runtime claims captured on a deleted Standard_DC2es_v6 VM test the path against Intel's root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FfGsdwrq6AroSzEU654oya
|
Tested end to end on a real Azure Standard_DC4es_v6 VM, with smallstep/step-tee-plugin#2 producing the evidence and |
The new ita format accepts tokens Intel Trust Authority issues for Intel TDX trust domains, including Azure confidential VMs whose paravisor reports for the guest. They arrive as application/eat+jwt and are told from Confidential Space tokens by their issuer. step-ca verifies a token with the signing key its kid names, fetched from Intel Trust Authority's key set at a configured URL (never the token's jku, which must match it if present), cached and refetched for an unknown kid. The key's x5c chain must verify to Intel Trust Authority's root, which is embedded. The token must be recent, not for a debuggable trust domain, and carry 64 bytes of attester_user_data: the binding and the relying party's nonce. The runtime data its TD quote committed to must be SHA-512 of the verifier nonce, if any, and that user data, as Intel's client computes it, so the binding is checked against what the quote covers rather than taken on Intel Trust Authority's word alone. Tested end to end on a Standard_DC4es_v6 VM with Intel Trust Authority: a remote-attest-01 order was finalized with a token it issued. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FfGsdwrq6AroSzEU654oya
|
Added: Intel Trust Authority ( What it does
Tested on the VM (Standard_DC4es_v6, 2026-11-07, live Intel Trust Authority):
Not yet: ITA can also appraise the vTPM ( Unit tests cover the |
Adds an
azure-tdxevidence format toremote-attest-01, for Azure confidential VMs with Intel TDX (DCesv6/ECesv6). It targetsjosh/acme-remote-attest.Why
On these VMs the guest can't get a TDX quote itself. There is no
/dev/tdx_guest, and configfs-tsm returnsENXIO, so the configfs-tsm evidence path doesn't work there. Instead:SHA-256(runtime claims JSON), zero-padded to 64 bytes. The guest reads it from vTPM NV index0x01400001.HCLAkPub,HCLEkPub), the VM configuration, and 64 bytes ofuser-datathe guest writes to NV0x01400002before reading the report.POST /acc/tdquote) turns the TD report into a normal Intel-signed v4 quote.What it does
application/vnd.smallstep.azure-tdx+json:{"quote": <base64>, "runtimeData": <base64>}.runtimeDatais the runtime claims document, byte-for-byte as the paravisor hashed it.tdx.Verifier: signature, QE, PCK chain, collateral, TCB and non-debug;SHA-256(runtimeData) ‖ 32 zero bytes;user-dataas the bound data.user-data, in the same layout as the configfs-tsm report data. Size checks and the finalize check are unchanged.formats. The quote's MRTD measures Azure's paravisor, not the guest, and the RTMRs are zero, so a genuine quote alone says nothing about the guest's software.azureRuntimealongsidetdx, with the vTPM JWKs and the VM configuration (secure-boot,console-enabled,vmUniqueId, …), so webhooks and templates can apply policy.tdxandazure-tdxshare one TDX verifier and its roots.Tests
attestation/tdx/azure_test.goverifies a real quote and runtime claims captured on a Standard_DC2es_v6 VM, since deleted, against Intel's embedded root, without collateral, at the capture time. It then checks the report-data commitment and extracts theuser-data. The negative cases are:user-data, bad JSON;go test ./attestation/... ./authority/provisioner/... ./webhook/... ./acme/...passes on Windows, exceptacme/db/nosql. That package fails the same way without this change (badger temp-dir cleanup on Windows).Not in this PR
HCLAkPub(now in the result) over the chosen PCRs, ideally with the same binding as its qualifying data. That could be a follow-up field in the evidence object, or left to a webhook.UpToDate. An Azure DCesv6 host was ratedOutOfDateby Intel Trust Authority in August 2026 andUpToDatevia PCS in November 2026, so this format inherits the same exposure astdx.step-tee-pluginneeds an Azure path: writebinding ‖ nonceto NV0x01400002, read the HCL report from NV0x01400001, split out the TD report and the runtime claims, and POST the TD report to IMDS/acc/tdquote.🤖 Generated with Claude Code
https://claude.ai/code/session_01FfGsdwrq6AroSzEU654oya