Repository navigation
Intel TDX support and a GCP confidential VM guide - #305
Merged
Merged
Conversation
The guest stack could only attest against an Azure SEV-SNP vTPM, so the same proplet binary could not run on a GCP confidential VM with Intel TDX. Two changes make one binary serve both: - Compile the `tdx-attester` next to `az-snp-vtpm-attester`. Both attesters are compiled in rather than selected by a feature, because `detect_tee_type()` probes TDX first and falls through to the Azure vTPM, so the running platform decides which one is primary. A `[features]` entry cannot express this: features are not target-scoped, so enabling `attestation-agent/az-snp-vtpm-attester` from there pulls `tss-esapi-sys` into the arm64 and riscv64 builds, which CI builds and which fail without the TPM2 TSS headers. - Point `elastic-tee-hal` at wasmhal's `intel-tdx` feature so the HAL can produce a real TDX DCAP quote from the Linux TSM, next to the existing Azure vTPM path. The HAL is tracked on the fork branch because elasticproject-eu/wasmhal#7 is still open; switch it back to `main` once that lands. Verified: `cargo check --bins`, `cargo test --lib --bins` (207 tests), `cargo fmt --check` and `cargo clippy --bins` clean. `cargo tree --target` confirms the arm64 and riscv64 graphs are unchanged (no `tss-esapi-sys`) while x86_64 gains the TDX attester dependencies.
Mirrors hal/azure/README.md for the other confidential-VM platform we support: Trustee on a separate GCE VM, the CoCo guest components inside a C3/C4 Intel TDX confidential VM. Parts 4-6 (publishing an encrypted image, running a workload, exercising the HAL) follow the Azure guide. Parts 1-3 are TDX-specific and open with a comparison table of where the two platforms differ, because the differences are the failure modes: the attester is `tdx-attester` rather than `az-snp-vtpm-attester`, evidence is a DCAP quote from the Linux TSM rather than a vTPM attestation, and the guest needs neither a vTPM nor Intel's DCAP headers. Two claims are checked rather than copied from the Azure guide: - The firewall section says KBS is already reachable in a default VPC (`default-allow-internal` allows all TCP from 10.128.0.0/9) and offers the explicit rule as hardening, instead of implying one is required. - Trustee ships `trusted_certs_paths = [ca-cert.pem]`, which already is the token-signing CA, so the token-CA step is a verification with a documented fallback rather than a blind rewrite. Attestation policy hardening is left as a follow-up section: GCP boots GRUB rather than the TDVF shim, so evaluation takes Trustee's other TDX branch and needs rtmr reference values that change whenever the guest kernel does. hal-runner moves to the same wasmhal rev as proplet so Part 6 reports IntelTdx; its previous pin predated both TDX support and the Azure vTPM fix. Also cross-links the GCP guide from the Azure and QEMU guides.
Signed-off-by: Rodney Osodo <socials@rodneyosodo.com>
Signed-off-by: Rodney Osodo <socials@rodneyosodo.com>
Signed-off-by: Rodney Osodo <socials@rodneyosodo.com>
rodneyosodo
force-pushed
the
gcp-intel-tdx
branch
from
October 6, 2026 07:15
0b87cf8 to
fd1e1dc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What type of PR is this?
This is a feature because it adds Intel TDX support to the Proplet guest stack, alongside the existing Azure AMD SEV-SNP path. It is also a documentation update, because it adds
hal/gcp/README.md, and a dependency update, because it moveselastic-tee-halto upstreammainand compiles thetdx-attesterin.What does this do?
Adds a second confidential-computing platform to the guest stack. Until now Proplet could only attest against an Azure SEV-SNP vTPM, so the same binary could not run on a GCP confidential VM with Intel TDX. Three things change:
proplet/Cargo.tomlcompilestdx-attesternext toaz-snp-vtpm-attester, andelastic-tee-halwithamd-sev+intel-tdx. One binary now serves both platforms:detect_tee_type()probes TDX first and falls through to the Azure vTPM, so the running host decides which attester is primary. Both attesters are compiled rather than selected by a cargo feature on purpose — a[features]entry is not target-scoped, so enablingattestation-agent/az-snp-vtpm-attesterfrom there pullstss-esapi-sysinto the arm64 and riscv64 builds, which CI builds and which fail without the TPM2 TSS headers. Keeping the choice in the[target.'cfg(target_arch = "x86_64")'.dependencies]block leaves those builds alone.examples/hal-runnermoves to the sameelastic-tee-halrevision. Its previous pin predated both TDX support and the Azure vTPM fix, so Part 6 of the guide would have reportedtype=AmdSevor nothing.hal/gcp/README.mdis a new end-to-end guide: Trustee on a separate GCE VM, the CoCo guest components inside a C3/C4 Intel TDX confidential VM. It mirrorshal/azure/README.mdand opens with a table of where the two platforms differ, because those differences are the failure modes: the attester istdx-attesterrather thanaz-snp-vtpm-attester, evidence is a DCAP quote from the Linux TSM rather than a vTPM attestation, and the guest needs neither a vTPM for attestation nor Intel's DCAP headers.hal/azure/README.mdandhal/ubuntu/README.mdlink to it.Two claims in the guide were checked rather than copied from the Azure guide: GCP's
default-allow-internalrule already permits the KBS port, so the firewall rule is presented as hardening rather than a requirement; and current Trustee already pointstrusted_certs_pathsat the token-signing CA, so that step is a verification with a fallback rather than a blind rewrite.Attestation-policy hardening is left as a follow-up section. GCP boots GRUB rather than the TDVF shim, so Trustee evaluates its other TDX branch and needs
rtmr_*reference values that change whenever the guest kernel does.Which issue(s) does this PR fix/relate to?
None
Have you included tests for your changes?
No new tests — this is a build-configuration, dependency and documentation change, and the attester behaviour it depends on is tested upstream in
elasticproject-eu/wasmhal. Verified:cargo check --binsandcargo build --releaseinpropletcargo test --lib --bins— 207 passedcargo fmt --checkandcargo clippy --binscleancargo tree --target aarch64-unknown-linux-gnu/riscv64gcconfirm those graphs are unchanged (notss-esapi-sys), while x86_64 gains the TDX attester dependenciesc3-standard-4TDX instance: HAL reportsIntelTdx, a DCAP quote is produced from/dev/tdx_guest, and an encrypted workload decrypts and runsDid you document any new/modified features?
Yes
Notes
elasticproject-eu/wasmhalmain, where theintel-tdxfeature and the x86_64 scoping of the Azure vTPM dependencies have landed.elastic-tee-halis pinned tomainin bothpropletandexamples/hal-runner.--create-diskversus--image(one boot disk),--maintenance-policy=TERMINATEbeing valid on the CVM but rejected on a plaine2host, Intel's DCAP apt repo being needed before thekbs-clientbuild, the keyprovider's--kbsargument being the only source of its KBS URL, andKBS URL not configured/UnWrapKey API is unimplementedas wrong-branch symptoms inguest-components.<project-id>placeholders and$PROJECT/$ZONE.