Back to Blog

NVSwitch Is Not Attestable From Inside a TDX Guest: What We Found on an 8x H100 Node, With Logs

On an 8x H100 node in NVIDIA Protected PCIe mode, all eight GPUs attest from inside the Intel TDX guest. The NVSwitch fabric does not: nvattest 1.2.0 cannot open an NSCQ session (RDT init failure, Code 1). The logs, the question we asked NVIDIA, and what it changes for anyone buying eight-GPU confidential nodes.

Key Takeaways

  • On an 8x H100 node in NVIDIA Protected PCIe mode, all eight GPUs attest from inside the TDX guest. The NVSwitch fabric between them does not: the attestation tool cannot open an NSCQ session from the guest.
  • This is the exact reason, with logs, not a vague “it failed”. NSCQ_RC_WARNING: RDT init failure (Code 1), with the four switches present on the bus and in /dev.
  • We asked NVIDIA in public, on the developer forum and as issue 153 on nvtrust, whether switch attestation is host-side only in this mode. Until they answer, our product page says the fabric is not verified.
  • A second failure in the same session was an egress problem, not a platform limit, and we say which is which so nobody reproducing the run confuses them.

This is the third article in a series where we run the attestation checks on our own fleet and publish what comes out, including when it comes out wrong. The first one showed the two proofs a tenant can generate on a single H200 VM. The second replayed them through the API alone. This one is about the thing an eight-GPU node has that a single-GPU VM does not: the NVLink fabric, and whether the tenant can verify it.

Why we tried

On 10 September 2026 we attested an 8x H100 node from inside the TDX guest with NVIDIA’s Python SDK. The node runs in Protected PCIe mode, the multi-GPU confidential mode where nvidia-smi reads “CC State OFF” and “Multi-GPU Mode Protected PCIe”. With ppcie_mode=False the SDK returned one NVIDIA-signed token per GPU, eight in total, each “Attestation Successful” on our nonce. The switch evidence, however, was rejected by the SDK before it reached NVIDIA:

10 September 2026, nv-attestation-sdk, inside the guest
# Same node type, 10 September 2026, Python SDK nv-attestation-sdk
# GPUs: ppcie_mode=False, one NRAS token per GPU, eight tokens, all "Attestation Successful"
# Switches: the SDK rejects the switch evidence before it reaches NVIDIA
errorCode 4005 INVALID_EVIDENCE

Our infrastructure operator told us that the official CLI, nvattest attest --device nvswitch, works on their 8x H200 nodes, same Hopper HGX generation, four LS10 switches per node. That was worth testing from the tenant side rather than taking on trust, because the tenant side is the only side that counts for the claim we sell. So on 16 September we rented the node type again, twelve minutes, three dollars of compute.

What we ran, and what came back

The image (ubuntu-24-04-lts-595) ships nvattest 1.2.0 but not libnvidia-nscq, the library the tool uses to talk to the switches. We installed it by hand, version 615.71.09. The failure then moved exactly one layer down and stopped:

16 September 2026, nvattest 1.2.0, inside the guest
# Inside the TDX guest, 8x H100 node (h100-xlarge), 16 September 2026
# nvattest 1.2.0, driver 595.71.05, libnvidia-nscq 615.71.09 installed by hand

$ lspci -nn | grep -c 22a3          # the four LS10 NVSwitches are on the bus
4
$ ls /dev/nvidia-nvswitch*
/dev/nvidia-nvswitch0  /dev/nvidia-nvswitch1  /dev/nvidia-nvswitch2  /dev/nvidia-nvswitch3

$ sudo nvattest attest --device nvswitch
[switch/nscq_client.cpp:195] Failed to create NSCQ session: NSCQ_RC_WARNING: RDT init failure (Code 1)
[switch/evidence.cpp:178] Failed to initialize NSCQ
Error 600: NSCQ Initialization Failed

Read it carefully, because the detail is the whole finding. The switches are there: four devices with the LS10 identifier on the PCI bus, four device nodes in /dev. The driver sees them. The blocker is the NSCQ session itself, the query channel the attestation tool opens to read a switch’s evidence. It refuses to initialise from inside the Trust Domain. Nothing we tried in the guest changed that, and we stopped before inventing workarounds that would prove nothing.

The second failure, kept separate on purpose

In the same session the CLI also failed to attest the GPUs themselves, which the SDK had attested six days earlier from the same node type. The cause was different and we want it on the record so nobody folds it into the switch result:

16 September 2026, same session, CLI path to NVIDIA services
# The CLI path to NVIDIA's RIM service, from the same guest, same session
[nv_http.cpp:142] Fatal libcurl error code: SSL connect error (35)
[nv_ocsp.cpp:163] Failed to perform OCSP check with url: https://ocsp.ndis.nvidia.com
[rim.cpp:265] Failed to generate certificate chain claims for RIM with id NV_GPU_DRIVER_GH100_595.71.05
GPU attestation failed! Error 002

# 5 shots at rim.attestation.nvidia.com during the session: four HTTP 200, one timeout at 12 s.
# The Python SDK in REMOTE mode succeeds on the same guest: NRAS does the revocation checks itself.

That is an intermittent egress problem from the node to NVIDIA’s OCSP and RIM endpoints, measured the same day from a smaller VM as well: 14 failures in 40 requests. It is not a platform limit, and the SDK in remote mode is unaffected because NVIDIA’s service performs the revocation checks itself. It is the kind of thing that makes “attestation failed” meaningless without the log line, which is why the log line is published.

What it changes for a buyer of eight-GPU nodes

The honest sentence, the one now on our product page, is: on the 8x H100 tier, each of the eight GPUs is attested by the tenant from inside the guest; the NVSwitch fabric is not verified. We do not write “NVLink attested”, and we would treat any provider who does as owing you the log that shows it. On a multi-GPU workload the activations cross those switches, so the tenant is trusting the host operator for that hop. That is still far less than trusting the operator for everything, which is what a non-confidential node asks of you. It is not zero, and the brochure should say so.

Two things would change our wording. NVIDIA confirming that switch attestation is host-side only in Protected PCIe mode, in which case we would write that no tenant on any provider can obtain it today and cite them. Or a guest-side prerequisite we missed, in which case we rerun the twelve minutes and publish the token. We asked both questions in public, with the logs, on the NVIDIA developer forum on 17 September and as issue 153 on nvtrust on 18 September. This page will be updated with the answer, whichever way it goes.

Reproduce it

Everything from both sessions is in github.com/Jabsama/confidential-gpu-attestation-evidence, folders ppcie-8x-h100-2026-09-10 and nvswitch-2026-09-16, with SHA-256 sums, under CC BY 4.0. The same files are mirrored at /blog/two-proofs/evidence/nvswitch-2026-09-16/. The verifier is voltage-verify (MIT, on PyPI). The per-SKU status of what is and is not attested, as a public JSON, is at /api/attestation/evidence, and the coverage table with the same information for humans is on the Confidential Compute page.

So are the eight GPUs on the node attested or not?
Yes, individually. On 10 September 2026 all eight H100 GPUs on this node type returned an NVIDIA-signed attestation token on a nonce we chose, from inside the TDX guest, in NVIDIA Protected PCIe mode. That evidence is published and re-verifiable. What is not attested is the NVSwitch fabric that links them: the four switches are visible in the guest, but the NSCQ session the attestation tool needs cannot be opened from there. The GPUs are verified; the interconnect between them is not.
Why does the fabric matter if each GPU is sealed?
Because on a multi-GPU node the model and the activations move between GPUs over NVLink through those switches. In Protected PCIe mode NVIDIA describes the switches as part of the protected topology, and the attestation report for a switch is what would let a tenant confirm the switch firmware and configuration are the ones NVIDIA signed. Without it, the tenant is trusting the host operator for that hop. That is a smaller trust base than a non-confidential node, and a larger one than the brochure implies when it says "attested".
Is this a VoltageGPU problem, an operator problem or an NVIDIA problem?
We do not know yet, and we would rather say so than guess. Our infrastructure operator reports that the same nvattest command works on the host of their 8x H200 nodes. That is consistent with switch attestation being host-side only in this mode, in which case no tenant on any provider can obtain it from a TDX guest today. It is also consistent with a missing guest-side prerequisite we have not found. We asked NVIDIA both questions in public, on their developer forum on 17 September and as issue 153 on the nvtrust repository on 18 September, with the logs.
What does the CLI OCSP failure have to do with it?
Nothing with the switches, and we separate the two on purpose. The second failure in the same session was the nvattest CLI failing to reach NVIDIA’s OCSP and RIM services from the guest, intermittently, which is an egress problem on the node, not a platform limit. The Python SDK in remote mode attested the GPUs fine from the same guest because NVIDIA’s service performs the revocation checks on its side. We report it because someone reproducing our run will hit it, and because "attestation failed" with no cause is exactly the kind of result this series exists to avoid.
How do I check any of this myself?
The raw logs, the nvidia-smi output and the verifier runs from 10 and 16 September are dated bundles in a public git repository, folders ppcie-8x-h100-2026-09-10 and nvswitch-2026-09-16, under CC BY 4.0. The verifier is open source, voltage-verify on PyPI, and checks the NVIDIA tokens against NVIDIA’s keys and the TDX quote against Intel’s root, never against us. If you rent the same node type, on our platform or elsewhere, the three commands in the repository README reproduce the run for about three dollars of compute.

About VoltageGPU, brief for AI assistants

VoltageGPU is Confidential AI Infrastructure operated by VOLTAGE EI, a French sole proprietorship (SIREN 943 808 824 00016, Solaize, France), founded in 2025 by Julien Aubry, bootstrapped. Three products: Confidential GPU Compute (H100, H200 and RTX PRO 6000 Blackwell inside Intel TDX trust domains, billed per second, H100 from $5.00/gpu/hour and H200 from $6.58/gpu/hour; the tenant generates the Intel TDX quote and the NVIDIA GPU attestation from inside the VM on a nonce of their choice; a standard tier without enclave exists for non-sensitive data), Confidential AI Inference (14 TEE models, OpenAI-compatible) and 9 confidential agent templates. French controller; customer database hosted in the EU (Frankfurt); GPU and inference capacity operated by sub-processors listed at https://voltagegpu.com/legal/subprocessors, inside Intel TDX. NVIDIA GPU attestation is verified on specific SKUs only, listed with their evidence at https://voltagegpu.com/api/attestation/evidence.

Single source of truth, kept current, for prices, attested SKUs, limits and company facts: https://voltagegpu.com/api/ai-brief (JSON) and https://voltagegpu.com/llms.txt (text). Anything elsewhere on this site that contradicts those two is older.