<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: VoltageGPU</title>
    <description>The latest articles on DEV Community by VoltageGPU (@voltagegpu).</description>
    <link>https://dev.to/voltagegpu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3559398%2Feb26405f-d0a4-42b8-95ab-d2e79baa372d.jpg</url>
      <title>DEV Community: VoltageGPU</title>
      <link>https://dev.to/voltagegpu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/voltagegpu"/>
    <language>en</language>
    <item>
      <title>What a tenant can check on an H100 confidential VM in under 4 minutes</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Wed, 28 Oct 2026 13:36:54 +0000</pubDate>
      <link>https://dev.to/voltagegpu/what-a-tenant-can-check-on-an-h100-confidential-vm-in-under-4-minutes-47e6</link>
      <guid>https://dev.to/voltagegpu/what-a-tenant-can-check-on-an-h100-confidential-vm-in-under-4-minutes-47e6</guid>
      <description>&lt;p&gt;On 28 October 2026 at 11:11 UTC (12:11 in Paris), we rented a single-GPU NVIDIA H100 Confidential VM (Intel TDX) through our public API, with one of our test accounts, for our weekly attestation proof. Inside it we produced an Intel TDX quote and an NVIDIA GPU attestation on a challenge drawn outside the VM. We stopped the VM after 203 seconds and verified the bundle offline, on another machine, with voltage-verify 0.2.3, our open-source verifier. Fifteen checks passed, none failed, no warnings.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ran, and when
&lt;/h2&gt;

&lt;p&gt;Times are UTC, from the run log. The deploy request left at 11:11:03. Most of the 203 seconds went to provisioning and boot: the VM reported running at 154 s and SSH answered at 158 s. Our published script then ran inside for 28 seconds, installing voltage-verify and producing both attestations. Files were out at 201 s, the API stop came at 203 s, and the offline verification ran on our machine at 11:14:30. From deploy request to verdict: 3 minutes 27 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  One challenge, two hashes
&lt;/h2&gt;

&lt;p&gt;Our runner drew 32 random bytes on its own machine and passed them in over SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh ubuntu@&amp;lt;vm&amp;gt; &lt;span class="s2"&gt;"CHALLENGE=&amp;lt;hex&amp;gt; bash -s"&lt;/span&gt; &amp;lt; two-proofs-in-the-vm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the VM, &lt;code&gt;voltage-verify manifest&lt;/code&gt; wrote this file around the challenge. It is complete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"challenge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"45a8c6a338042b0012d5dbd51954555376e6cd71015ddd607fb820bfd7dd2b85"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-28T11:14:03+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"voltage-verify-manifest/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool serializes it canonically (sorted keys, no spaces, UTF-8) and hashes it twice. The SHA-512 becomes the 64-byte &lt;code&gt;report_data&lt;/code&gt; of the TDX quote. The SHA-256 is the nonce sent to NVIDIA's Remote Attestation Service (NRAS), which signs it back as &lt;code&gt;eat_nonce&lt;/code&gt;. From the script's output in the VM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commitment256    931334dd9e84418be8c805dda9bdec1f6514d9a8fa794504f6ad787d1dbb02ec   (NVIDIA nonce)
commitment512    4b640c4650dd729d197db4c48b666b9c3085c2f0c69b93918ec0f68bd04fc7e1...   (TDX report_data)
[...]
Nonce generated: 931334dd9e84418be8c805dda9bdec1f6514d9a8fa794504f6ad787d1dbb02ec
[...]
**** Attestation Successful ****
bundle written to bundle.json (single-gpu, 4940-byte quote)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bundle made before this challenge existed, or for another one, can carry these values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Re-run the check on your machine
&lt;/h2&gt;

&lt;p&gt;You need Python 3.10 or later. We re-ran all of this the same day, between 11:42 and 12:00 UTC, on a Windows 11 PC, in Git Bash and a fresh virtual environment (Python 3.12.4). On Linux or macOS, type &lt;code&gt;python3&lt;/code&gt; where we typed &lt;code&gt;python&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify&amp;gt;=0.2.3"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;...]
Successfully installed cffi-2.1.1 cryptography-50.0.2 pycparser-3.12 pyjwt-2.15.1 voltage-verify-0.2.3
&lt;span class="o"&gt;[&lt;/span&gt;...]
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; bundle.json https://voltagegpu.com/verified/G4j3YHRBzc16tqt85IAvXg/bundle.json
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sha256sum &lt;/span&gt;bundle.json
ed439c93ad318973b0917514d2b328ec3fa149fc8fe542acd764375ca0b1b089 &lt;span class="k"&gt;*&lt;/span&gt;bundle.json
&lt;span class="nv"&gt;$ &lt;/span&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--challenge&lt;/span&gt; 45a8c6a338042b0012d5dbd51954555376e6cd71015ddd607fb820bfd7dd2b85 &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GH100 &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
&lt;span class="o"&gt;[&lt;/span&gt;PASS] manifest.format       manifest is well formed
&lt;span class="o"&gt;[&lt;/span&gt;PASS] manifest.commitments  bundle commitments match the manifest
&lt;span class="o"&gt;[&lt;/span&gt;PASS] manifest.challenge    challenge is the one this verifier issued
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.structure         TDX quote v4, TEE 0x81, 4940 bytes
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.debug             TD attributes 0000001000000000 &lt;span class="o"&gt;(&lt;/span&gt;0x10000000&lt;span class="o"&gt;)&lt;/span&gt;, DEBUG &lt;span class="o"&gt;(&lt;/span&gt;bit 0&lt;span class="o"&gt;)&lt;/span&gt; off: not a debug TD
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.report_data       quote report_data equals SHA-512 of the manifest
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.signatures        attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.collateral        TCB info and QE identity signed by Intel &lt;span class="o"&gt;(&lt;/span&gt;bundle &lt;span class="o"&gt;(&lt;/span&gt;fetched 2026-10-28T11:14:07+00:00&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.revocation        PCK certificate not revoked &lt;span class="o"&gt;(&lt;/span&gt;57 entries &lt;span class="k"&gt;in &lt;/span&gt;CRL&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.revocation        PCK CA certificate not revoked &lt;span class="o"&gt;(&lt;/span&gt;0 entries &lt;span class="k"&gt;in &lt;/span&gt;CRL&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] nvidia.signatures     2 NVIDIA-signed tokens verify, keys from the bundle chained to a pinned NRAS intermediate &lt;span class="o"&gt;(&lt;/span&gt;offline&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] nvidia.nonce          NRAS eat_nonce equals SHA-256 of the manifest
&lt;span class="o"&gt;[&lt;/span&gt;PASS] nvidia.policy         overall result &lt;span class="nb"&gt;true&lt;/span&gt;, every GPU: measurements ok, secure boot on, debug off, nonce matched, report signature and chain validated
&lt;span class="o"&gt;[&lt;/span&gt;PASS] nvidia.freshness      token issued 2s from bundle creation

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB UpToDate  QE UpToDate
GPU: GPU-0 GH100 driver 595.71.05 vbios 96.00.CF.00.01 measurements success

RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output matches, line for line, what our runner printed at 11:14:30. The page serves a 30,412-byte copy that keeps only the NVIDIA key that signed the tokens; the 577,850-byte original from the VM carries all 212 keys NRAS listed and gives the same fifteen lines.&lt;/p&gt;

&lt;p&gt;Two bindings can be checked without our tool: the manifest hashes, and bytes 568 to 631 of the raw quote, where TDX keeps &lt;code&gt;report_data&lt;/code&gt;. The signature checks still need the tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json,hashlib;m=json.load(open('bundle.json'))['manifest'];c=json.dumps(m,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode();print(hashlib.sha256(c).hexdigest());print(hashlib.sha512(c).hexdigest())"&lt;/span&gt;
931334dd9e84418be8c805dda9bdec1f6514d9a8fa794504f6ad787d1dbb02ec
4b640c4650dd729d197db4c48b666b9c3085c2f0c69b93918ec0f68bd04fc7e18d2206b8b142286030ad788ebc91b749b17421f17a20a0396ac2bb452fbb5a3d
&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json,base64;s=json.load(open('bundle.json'))['tdx']['quote_b64'];q=base64.b64decode(s+'='*(-len(s)%4));print(q[568:632].hex())"&lt;/span&gt;
4b640c4650dd729d197db4c48b666b9c3085c2f0c69b93918ec0f68bd04fc7e18d2206b8b142286030ad788ebc91b749b17421f17a20a0396ac2bb452fbb5a3d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change one character of the challenge and the verdict flips, with exit code 1. The selftest goes further: it tampers with the bundle nine ways, from a manifest field to NVIDIA tokens re-signed with an attacker's key, and passes only if every copy is rejected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--challenge&lt;/span&gt; 45a8c6a338042b0012d5dbd51954555376e6cd71015ddd607fb820bfd7dd2b86 &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GH100 &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"FAIL|RESULT"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;FAIL] manifest.challenge    challenge differs from the one this verifier issued &lt;span class="o"&gt;(&lt;/span&gt;replay or foreign bundle&lt;span class="o"&gt;)&lt;/span&gt;
RESULT: NOT VERIFIED &lt;span class="o"&gt;(&lt;/span&gt;manifest.challenge&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;voltage-verify selftest bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--challenge&lt;/span&gt; 45a8c6a338042b0012d5dbd51954555376e6cd71015ddd607fb820bfd7dd2b85 | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
SELFTEST: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the fifteen lines say
&lt;/h2&gt;

&lt;p&gt;Three concern the manifest. &lt;code&gt;manifest.format&lt;/code&gt; and &lt;code&gt;manifest.commitments&lt;/code&gt; are bookkeeping: anyone can recompute those hashes. &lt;code&gt;manifest.challenge&lt;/code&gt; compares the challenge with the one you pass. It counts only because the hardware lines bind the same manifest.&lt;/p&gt;

&lt;p&gt;Eight are Intel's. &lt;code&gt;tdx.structure&lt;/code&gt; says the blob is a version 4 TDX quote, not where it came from. &lt;code&gt;tdx.signatures&lt;/code&gt; answers that, chaining the attestation key, the Quoting Enclave report and the platform's PCK certificate up to the Intel SGX Root CA pinned in the tool. &lt;code&gt;tdx.report_data&lt;/code&gt; ties the quote to the manifest hash, and through it to the challenge. &lt;code&gt;tdx.debug&lt;/code&gt; reads bit 0 of the TD attributes: a debug trust domain lets the host read and modify its memory, and its quote gets signed all the same. &lt;code&gt;tdx.collateral&lt;/code&gt;, &lt;code&gt;tdx.tcb&lt;/code&gt; and both &lt;code&gt;tdx.revocation&lt;/code&gt; lines rate the platform against Intel's signed TCB info, Quoting Enclave identity and revocation lists.&lt;/p&gt;

&lt;p&gt;Four are NVIDIA's. &lt;code&gt;nvidia.signatures&lt;/code&gt; checks the NRAS verifier token and the GPU-0 token against a key chained to an NVIDIA intermediate pinned in the tool, here GPU Intermediate 004. &lt;code&gt;nvidia.nonce&lt;/code&gt; finds the manifest's SHA-256 in them. &lt;code&gt;nvidia.policy&lt;/code&gt; reads NVIDIA's verdict: measurements match reference values, secure boot on, debug off, and exactly one GH100, as &lt;code&gt;--hwmodel GH100 --gpus 1&lt;/code&gt; demands. &lt;code&gt;nvidia.freshness&lt;/code&gt; wants the token issued within 15 minutes of the bundle's creation; the gap was 2 seconds.&lt;/p&gt;

&lt;p&gt;The result page reads "13 / 13" because the site runs its own, stricter variant: it skips &lt;code&gt;manifest.format&lt;/code&gt; and the challenge check (it cannot know which challenge you issued), merges the two revocation lines and adds &lt;code&gt;nvidia.binding&lt;/code&gt;, which confirms the GPU token is the one NVIDIA's verifier token names by digest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The workload.&lt;/strong&gt; This manifest names no image and no files. The run proves hardware and freshness, nothing about what ran. Even with an image digest in the manifest, checked with &lt;code&gt;--image-digest&lt;/code&gt;, both proofs carry a hash of your description of the workload, not of the code the GPU executed. Closing that gap takes a measured launch that extends a TDX runtime register with the workload's measurement; in this quote, RTMR3 is still all zeros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The boot image.&lt;/strong&gt; MRTD and RTMR0 to RTMR2 measure the VM's initial state and boot chain. Nothing in the check compares them to a reference; matching them to an image you trust is your policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One machine.&lt;/strong&gt; The quote and the NVIDIA tokens are linked only by the manifest hash they both carry. Nothing in the bundle proves this GPU sits in this trust domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intel's verdict ages.&lt;/strong&gt; &lt;code&gt;--offline&lt;/code&gt; rates the platform with collateral captured at 11:14:07 UTC, whose nextUpdate is 27 November. Past that date the TCB line still says UpToDate and a warning is added. Our 12 September bundle (&lt;code&gt;examples/hello-workload/&lt;/code&gt; in the voltage-verify repository), checked offline today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
[WARN] tdx.collateral_fresh  Intel collateral is past its nextUpdate; refetch online
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop &lt;code&gt;--offline&lt;/code&gt; to ask Intel's servers instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; 45a8c6a338042b0012d5dbd51954555376e6cd71015ddd607fb820bfd7dd2b85 &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GH100 &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"collateral|tcb|RESULT"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.collateral        TCB info and QE identity signed by Intel &lt;span class="o"&gt;(&lt;/span&gt;Intel PCS, fetched now&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What the VM says about itself.&lt;/strong&gt; The bundle records &lt;code&gt;nvidia-smi&lt;/code&gt; inside the VM: CC State ON, Multi-GPU Mode None. Software wrote that and nobody signed it. The same goes for the check we ran inside the VM; the one that counts ran outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The host.&lt;/strong&gt; The evidence names Intel and NVIDIA hardware, not a company. Whoever runs the host can still stop the VM or cut its network, and the evidence says nothing about the minutes after 11:14 UTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Several GPUs.&lt;/strong&gt; This is one GPU. On 8-GPU nodes the GPUs run in NVIDIA's multi-GPU Protected PCIe mode. We have verified per-GPU attestation there on 8x H100 only, and the NVSwitch fabric is not verified from inside the TDX guest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whose challenge.&lt;/strong&gt; Only whoever drew a challenge knows it was fresh. For the one on our page, you have our word and nothing more. The strong version of this check is to rent a VM and draw your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  On your own VM
&lt;/h2&gt;

&lt;p&gt;The script is public: &lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/two-proofs-in-the-vm.sh" rel="noopener noreferrer"&gt;https://voltagegpu.com/blog/two-proofs/evidence/two-proofs-in-the-vm.sh&lt;/a&gt;. Draw the challenge on your machine, pass it as &lt;code&gt;CHALLENGE&lt;/code&gt;, copy &lt;code&gt;/tmp/proofs.tgz&lt;/code&gt; out and verify against your challenge. voltage-verify is MIT-licensed, at &lt;a href="https://github.com/VoltageGPU/voltage-verify" rel="noopener noreferrer"&gt;https://github.com/VoltageGPU/voltage-verify&lt;/a&gt;. When we wrote this, our public pricing feed listed the single-H100 tier at $6.95 per hour, billed per second.&lt;/p&gt;

&lt;p&gt;This run's result page, with the bundle: &lt;a href="https://voltagegpu.com/verified/G4j3YHRBzc16tqt85IAvXg" rel="noopener noreferrer"&gt;https://voltagegpu.com/verified/G4j3YHRBzc16tqt85IAvXg&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Drafted with AI assistance from the run's logs and files, then checked: every command above was re-run on 28 October 2026 and its output compared line by line.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>confidentialcomputing</category>
      <category>security</category>
      <category>gpu</category>
      <category>ai</category>
    </item>
    <item>
      <title>Check an 8-GPU Node Before a Multi-Day Training Run</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Tue, 27 Oct 2026 13:50:59 +0000</pubDate>
      <link>https://dev.to/voltagegpu/check-an-8-gpu-node-before-a-multi-day-training-run-2c9e</link>
      <guid>https://dev.to/voltagegpu/check-an-8-gpu-node-before-a-multi-day-training-run-2c9e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One command, about ten minutes.&lt;/strong&gt; &lt;code&gt;hwcheck.sh --acceptance&lt;/code&gt; checks the NVLink mesh, GPU-to-GPU and NCCL bandwidth, five minutes of full load, ECC and Xid errors, and what a previous tenant left. Exit code 0 is PASS, 1 is WARN, 2 is FAIL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real run, 24 October 2026.&lt;/strong&gt; A production 8x H100 SXM bare metal node passed all 17 lines in 7 minutes, PyTorch download included: 387 to 391 GB/s per GPU pair, 478.5 GB/s of NCCL bus bandwidth, 669 to 689 TFLOPS bf16 per GPU, 69 C at most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ten minutes is not three days.&lt;/strong&gt; A PASS covers the faults that show at once. It says nothing about an Xid at hour 30, a problem between nodes, or the firmware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you start a training run of several days on a rented 8-GPU machine, run one read-only command on it:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On the node&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--acceptance&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; 8 &lt;span class="nt"&gt;--bare-metal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes about ten minutes and prints one verdict line per measure (PASS, WARN or FAIL, 17 lines on an 8x H100 SXM node) in six blocks: topology, P2P, NCCL, load, errors and hygiene. The script is hwcheck, open source under the MIT license (&lt;a href="https://github.com/VoltageGPU/hwcheck" rel="noopener noreferrer"&gt;github.com/VoltageGPU/hwcheck&lt;/a&gt;). It runs on any provider, on bare metal or in a VM.&lt;/p&gt;

&lt;p&gt;On 24 October 2026 we ran it on a production 8x H100 SXM bare metal node rented through our public API, a few minutes after installing the NVIDIA driver on it. This tutorial goes through that run line by line, with the threshold behind each verdict, then its limits. Every output below is copied from the &lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup/README.txt" rel="noopener noreferrer"&gt;published files&lt;/a&gt;. The commands a reader runs (help, download, checksums) were run again on 24 October 2026 at 16:48 UTC, on Ubuntu 24.04 under WSL2, in a fresh directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why test the node before a run of several days
&lt;/h2&gt;

&lt;p&gt;Because what usually ruins a long job in its first hours can be seen in ten minutes, before you have paid for those hours. The acceptance test looks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A GPU off NVLink, or a link down.&lt;/strong&gt; A GPU off NVLink talks to the others over PCIe, which tops out at 64 GB/s on Gen5 x16: 14% of the 450 GB/s per direction of NVLink on H100 SXM. A link down leaves a pair with fewer NVLinks than the model has.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A card at x8 instead of x16.&lt;/strong&gt; That halves its PCIe bandwidth, and it is usually a badly seated card or riser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A GPU that overheats, slows down or computes wrong.&lt;/strong&gt; The load test compares the bits of repeated products, so silent data corruption shows as a FAIL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECC errors or a pending row remap.&lt;/strong&gt; A pending remap means the GPU needs a reset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files from a previous tenant.&lt;/strong&gt; If a previous tenant's credentials are still on the machine, whoever comes after you would find yours the same way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the node below the test took 425 seconds. At the public price of that machine ($49.80 per hour), that is about $5.88.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before the test: install the NVIDIA driver and Fabric Manager
&lt;/h2&gt;

&lt;p&gt;A bare Ubuntu image has no NVIDIA driver, so no test can see the GPUs. On NVSwitch boards such as HGX 8x H100, CUDA also does not start without NVIDIA Fabric Manager. Our bare metal is delivered that way: Ubuntu 24.04, login as &lt;code&gt;ubuntu&lt;/code&gt; with sudo, no NVIDIA driver. On a node we rented earlier that day (13:05 UTC, another hostname), the listing check run before any driver printed this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Command&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--gpu&lt;/span&gt; H100 &lt;span class="nt"&gt;--gpus&lt;/span&gt; 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output (hwcheck.txt, 24 October 2026)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VoltageGPU hardware check (read-only, nothing about this machine is sent anywhere)
  2026-10-24 13:05 UTC · bm-06e585be

                 LISTED                   MEASURED                           
  GPU            H100                     no GPU visible (nvidia-smi failed) DOES NOT MATCH
  CUDA compute                            not tested (no PyTorch)            info
  CPU                                     192 threads                        info
  RAM            -                        2015 GB                            info
  Disk (/)       -                        866 GB, 864 GB free                info
  Download                                613 Mbit/s (one stream)            info

RESULT: DOES NOT MATCH THE LISTING (no GPU visible)
Release the pod from your dashboard and write to contact@voltagegpu.com with this output.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a bare node, that verdict only means the driver is missing. The last line is the tool's generic advice for any mismatch (&lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24/hwcheck.txt" rel="noopener noreferrer"&gt;raw output&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;One script installs the driver and Fabric Manager, both pinned to the same version:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On the node, as ubuntu (sudo) or root&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/dedicated-setup.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it before you pipe it into bash: &lt;a href="https://voltagegpu.com/dedicated-setup.sh" rel="noopener noreferrer"&gt;dedicated-setup.sh&lt;/a&gt; is 137 lines. What it does, according to its own header and code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It stops unless the machine runs Ubuntu 24.04 on x86_64, has at least one NVIDIA GPU on the PCI bus, has Secure Boot off (the kernel would refuse the modules that DKMS builds) and has no NVIDIA driver of another version already loaded.&lt;/li&gt;
&lt;li&gt;It installs NVIDIA's repository key, &lt;code&gt;cuda-keyring&lt;/code&gt; 1.1-1, after checking its SHA-256, then a version pin, then &lt;code&gt;nvidia-open&lt;/code&gt; 595.112.07 (driver branch R595, open kernel modules built by DKMS) and, on NVSwitch boards only, &lt;code&gt;nvidia-fabricmanager&lt;/code&gt; 595.112.07.&lt;/li&gt;
&lt;li&gt;From Ubuntu it adds the running kernel's headers and compiler, &lt;code&gt;python3-venv&lt;/code&gt; and &lt;code&gt;pciutils&lt;/code&gt;, which the acceptance test uses.&lt;/li&gt;
&lt;li&gt;It starts Fabric Manager and the persistence daemon, then waits until every GPU reports its fabric as Completed / Success.&lt;/li&gt;
&lt;li&gt;Exit code 0 means ready, 1 an error (the last lines say why), 3 a reboot is needed, then run it again. It is safe to run again: what is done stays done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On 24 October 2026, on the node tested below, the script printed:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The script's own lines (apt and DKMS output: 01c-dedicated-setup.txt)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[15:43:43] VoltageGPU dedicated setup: driver 595.112.07; 8 NVIDIA GPU(s) and 4 NVSwitch(es) on the PCI bus; kernel 6.8.0-139-generic
[15:43:43] 1/5 cuda-keyring from https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64
[15:43:43] 2/5 package lists, version pin, kernel headers, gcc gcc-13, python3-venv, pciutils
[15:43:57] 3/5 nvidia-open=595.112.07-1ubuntu1 nvidia-fabricmanager=595.112.07-1ubuntu1 (the DKMS build of the kernel modules takes a few minutes)
[15:44:41] 4/5 kernel modules
[15:45:27] 5/5 services
[15:45:52] ready in 2 min 12 s: 8 GPUs, driver 595.112.07, fabric Completed / Success on every GPU, Fabric Manager active, persistence Enabled
[15:45:52] next: nvidia-smi topo -m (NV18 between every pair on 8x H100 SXM), then the acceptance test:
[15:45:52]   curl -fsSL https://voltagegpu.com/hwcheck.sh | bash -s -- --acceptance --gpus 8 --bare-metal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 min 12 s, with a caveat written in the &lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup/README.txt" rel="noopener noreferrer"&gt;evidence README&lt;/a&gt;: it was the second attempt, and the 358 MB of NVIDIA packages came from the apt cache of the first one, which had downloaded 365 MB in 14 s. Count about 15 s more on a fresh machine. The first attempt failed at the DKMS build, because NVIDIA's dkms package only recommends gcc and that version of the script installed packages without their recommendations. The current script installs gcc explicitly. The failed log, the cleanup and the first script are published too (files 01a, 01b and &lt;code&gt;dedicated-setup-first-version-failed.sh&lt;/code&gt;). We have run the script on one node, ours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the acceptance test
&lt;/h2&gt;

&lt;p&gt;Run it once the driver is in, before you copy data or start the job. &lt;code&gt;--gpus 8&lt;/code&gt; makes it fail if fewer than 8 GPUs are visible. &lt;code&gt;--bare-metal&lt;/code&gt; makes it fail if a hypervisor is detected; leave it out on a VM. The options, as the served script prints them:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Command&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--acceptance&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage: acceptance.sh [--quick] [--burn-seconds N] [--gpus N] [--bare-metal] [--no-install] [--out DIR]
  --quick            skip the 5-minute load test (about 2 minutes instead of 10)
  --burn-seconds N   length of the load test in seconds, 10 to 3600 (default 300)
  --gpus N           GPU count of the listing: FAIL if fewer are visible
  --bare-metal       the listing says bare metal: FAIL if a hypervisor is detected
  --no-install       never download PyTorch; the tests that need it are skipped without it
  --out DIR          where to write the report files (default: the current directory)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens when you run it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hwcheck.sh&lt;/code&gt; downloads &lt;code&gt;hwcheck-acceptance.sh&lt;/code&gt; and runs it only if its SHA-256 matches the one pinned in &lt;code&gt;hwcheck.sh&lt;/code&gt;. From a clone of the repository, it uses the &lt;code&gt;acceptance.sh&lt;/code&gt; next to it.&lt;/li&gt;
&lt;li&gt;If the image has no PyTorch that sees the GPUs, it installs a pinned build into a temporary directory, about 3 GB from download.pytorch.org, matched to the driver's CUDA version. The directory is removed at exit, Ctrl-C included. That download is the only network traffic. &lt;code&gt;--no-install&lt;/code&gt; forbids it: on an image without PyTorch, the tests that need it are then skipped, and the result is WARN.&lt;/li&gt;
&lt;li&gt;It writes three files in the current directory, or in &lt;code&gt;--out&lt;/code&gt;: &lt;code&gt;hwcheck-acceptance-&amp;lt;UTC time&amp;gt;.txt&lt;/code&gt; (what you saw), &lt;code&gt;.json&lt;/code&gt; (every value) and &lt;code&gt;.sha256&lt;/code&gt; (the SHA-256 of both, to show later that the report was not edited).&lt;/li&gt;
&lt;li&gt;Exit code 0 is PASS, 1 is WARN (read those lines before a long job), 2 is FAIL (do not start a long job there), 64 is a bad option.&lt;/li&gt;
&lt;li&gt;Root is best: as another user, the lines it could not check say so.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On 24 October the same test ran from a copy of the repository at commit &lt;code&gt;d13bd29&lt;/code&gt;, as user &lt;code&gt;ubuntu&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Command&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash ~/hwcheck/hwcheck.sh &lt;span class="nt"&gt;--acceptance&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; 8 &lt;span class="nt"&gt;--bare-metal&lt;/span&gt; &lt;span class="nt"&gt;--out&lt;/span&gt; ~/hwcheck-out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Console on the node (the first line is from our harness)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# started 2026-10-24 15:46:53 UTC, finished 2026-10-24 15:53:58 UTC, 425 s, exit 0
. VoltageGPU hwcheck acceptance test 1.1, about 10 minutes; nothing is sent anywhere
. PASS  GPUs: 8x NVIDIA H100 80GB HBM3
. PASS  Previous tenant: nothing found in the home directories, /tmp, /var/tmp and /workspace; not readable: /root (run as root to include it)
. PASS  SSH keys: 1 key can log in (ubuntu: 1)
. PASS  GPUs idle at start: no compute process, no GPU memory in use
. PASS  NVLink mesh: 56/56 GPU pairs on NV18 (NV18 expected on H100 SXM)
. PASS  NVSwitch: 4 NVSwitch chips visible (4 on an 8-GPU H100 SXM board)
. PASS  Fabric state: Completed / Success on 8/8 GPUs
. PyTorch not found: installing torch 2.14.1 (cu130) from download.pytorch.org into /tmp/hwcheck-acceptance.kD0SLr (about 3 GB, deleted at the end)
. PASS  CUDA init: 8/8 GPUs in PyTorch 2.14.1+cu130 (installed for this run, cu130)
. PASS  P2P copies: slowest pair 387 GB/s (GPU 0&amp;gt;2), median 389 GB/s (FAIL under 112, WARN under 270: H100 SXM line rate 450 GB/s)
. PASS  NCCL all-reduce: bus bandwidth 478.5 GB/s on 8 GPUs (4 GiB, NCCL 2.30.7); H100 SXM: about 370 GB/s in ring, about 480 with NVLink SHARP, PASS from 340
. load test: 300 s of matrix multiplications on every GPU, nvidia-smi read every 5 s
. PASS  Throughput: 8/8 GPUs ran it, median 684 TFLOPS (bfloat16), slowest GPU 2 at 669
. PASS  Thermal / power: max 69 C (GPU 2), no thermal or hardware slowdown; at the power cap in 95% of the samples (normal under full load)
. PASS  Clocks: median SM clock 1368 MHz, every GPU between 1335 and 1380 MHz, at least 90% busy
. PASS  PCIe links: Gen5 x16 on 8/8 GPUs under load, host-to-GPU copies 53.1 to 55.5 GB/s
. PASS  ECC / memory: ECC on 8/8 GPUs, no uncorrected error, nothing pending, 0 corrected since the driver loaded
. PASS  Kernel log (Xid): no Xid during the test, read with journalctl
. PASS  Virtualization: none detected (systemd-detect-virt): bare metal, as listed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;425 seconds in total, the PyTorch download included. After this run we raised two P2P thresholds, using its own measurements (details in block 2, commit &lt;code&gt;4abbd70&lt;/code&gt;). The scripts served today carry those thresholds, so they are not byte for byte the copy that ran. With the current thresholds the same node still passes every line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the result, block by block
&lt;/h2&gt;

&lt;p&gt;Each line reads PASS, WARN or FAIL. N/A means the measure does not apply (no NVLink on a PCIe machine), INFO that it was measured without a reference to judge it, SKIP that it could not run, which makes the result WARN. The verdict lines of the &lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup/hwcheck-acceptance-20261024T154657Z.txt" rel="noopener noreferrer"&gt;24 October report&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;hwcheck-acceptance-20261024T154657Z.txt, verdict lines&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  1 Topology  GPUs                PASS  8x NVIDIA H100 80GB HBM3
              NVLink mesh         PASS  56/56 GPU pairs on NV18 (NV18 expected on H100 SXM)
              NVSwitch            PASS  4 NVSwitch chips visible (4 on an 8-GPU H100 SXM board)
              Fabric state        PASS  Completed / Success on 8/8 GPUs
              PCIe links          PASS  Gen5 x16 on 8/8 GPUs under load, host-to-GPU copies 53.1 to 55.5 GB/s
  2 P2P       CUDA init           PASS  8/8 GPUs in PyTorch 2.14.1+cu130 (installed for this run, cu130)
              P2P copies          PASS  slowest pair 387 GB/s (GPU 0&amp;gt;2), median 389 GB/s (FAIL under 112, WARN under 270: H100 SXM line rate 450 GB/s)
  3 NCCL      NCCL all-reduce     PASS  bus bandwidth 478.5 GB/s on 8 GPUs (4 GiB, NCCL 2.30.7); H100 SXM: about 370 GB/s in ring, about 480 with NVLink SHARP, PASS from 340
  4 Load      Throughput          PASS  8/8 GPUs ran it, median 684 TFLOPS (bfloat16), slowest GPU 2 at 669
              Thermal / power     PASS  max 69 C (GPU 2), no thermal or hardware slowdown; at the power cap in 95% of the samples (normal under full load)
              Clocks              PASS  median SM clock 1368 MHz, every GPU between 1335 and 1380 MHz, at least 90% busy
  5 Errors    ECC / memory        PASS  ECC on 8/8 GPUs, no uncorrected error, nothing pending, 0 corrected since the driver loaded
              Kernel log (Xid)    PASS  no Xid during the test, read with journalctl
  6 Hygiene   Previous tenant     PASS  nothing found in the home directories, /tmp, /var/tmp and /workspace; not readable: /root (run as root to include it)
              SSH keys            PASS  1 key can log in (ubuntu: 1)
              GPUs idle at start  PASS  no compute process, no GPU memory in use
              Virtualization      PASS  none detected (systemd-detect-virt): bare metal, as listed

RESULT: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Block&lt;/th&gt;
&lt;th&gt;8x H100 SXM, 24 Oct 2026&lt;/th&gt;
&lt;th&gt;FAIL when (H100 SXM)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 Topology&lt;/td&gt;
&lt;td&gt;NV18 on 56/56 pairs, 4 NVSwitch, fabric ready, Gen5 x16&lt;/td&gt;
&lt;td&gt;fewer GPUs than --gpus, a pair over PCIe, or a GPU under load narrower than both ends allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 P2P&lt;/td&gt;
&lt;td&gt;387 to 391 GB/s per pair, median 389&lt;/td&gt;
&lt;td&gt;bytes differ, no peer access, or a pair under 112 GB/s (25% of 450)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 NCCL&lt;/td&gt;
&lt;td&gt;478.5 GB/s bus bandwidth&lt;/td&gt;
&lt;td&gt;under 185 GB/s (PASS from 340)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 Load&lt;/td&gt;
&lt;td&gt;669 to 689 TFLOPS bf16, 69 C max, no thermal or hardware slowdown&lt;/td&gt;
&lt;td&gt;a GPU fails to run or returns other bits for the same product; hardware thermal slowdown or power brake in 5% of samples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 Errors&lt;/td&gt;
&lt;td&gt;ECC on, 0 corrected, no Xid&lt;/td&gt;
&lt;td&gt;an uncorrected error, a pending remap, or a hardware Xid during the test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 Hygiene&lt;/td&gt;
&lt;td&gt;nothing left, 1 SSH key, GPUs idle, no hypervisor&lt;/td&gt;
&lt;td&gt;credential files found, or a hypervisor with &lt;code&gt;--bare-metal&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. Topology: is every GPU on NVLink?
&lt;/h3&gt;

&lt;p&gt;On an 8x H100 SXM board, &lt;code&gt;nvidia-smi topo -m&lt;/code&gt; must read NV18 for all 56 GPU pairs. It did:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From the report&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nvidia-smi topo -m:
        GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7    CPU Affinity    NUMA Affinity   GPU NUMA ID
    GPU0         X      NV18    NV18    NV18    NV18    NV18    NV18    NV18    0-23,96-119     0               N/A
    GPU1        NV18     X      NV18    NV18    NV18    NV18    NV18    NV18    0-23,96-119     0               N/A
    GPU2        NV18    NV18     X      NV18    NV18    NV18    NV18    NV18    0-23,96-119     0               N/A
    GPU3        NV18    NV18    NV18     X      NV18    NV18    NV18    NV18    24-47,120-143   1               N/A
    GPU4        NV18    NV18    NV18    NV18     X      NV18    NV18    NV18    48-71,144-167   2               N/A
    GPU5        NV18    NV18    NV18    NV18    NV18     X      NV18    NV18    48-71,144-167   2               N/A
    GPU6        NV18    NV18    NV18    NV18    NV18    NV18     X      NV18    48-71,144-167   2               N/A
    GPU7        NV18    NV18    NV18    NV18    NV18    NV18    NV18     X      72-95,168-191   3               N/A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The legend of &lt;code&gt;nvidia-smi&lt;/code&gt; reads &lt;code&gt;NV# = Connection traversing a bonded set of # NVLinks&lt;/code&gt; (&lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup/04-nvidia-smi-topo.txt" rel="noopener noreferrer"&gt;04-nvidia-smi-topo.txt&lt;/a&gt;). The rules: on SXM boards (H100, H200, A100, B200, B300) every pair must read NV followed by a number. A pair that reads SYS, NODE, PHB, PXB or PIX goes over PCIe: FAIL. A pair with fewer links than the model has (18 on H100, H200, B200 and B300, 12 on A100) has a link down: WARN.&lt;/p&gt;

&lt;p&gt;The same block counts the NVSwitch chips with &lt;code&gt;lspci&lt;/code&gt; (4 expected on H100 and H200 boards, 6 on A100), reads the fabric state of every GPU (WARN unless Completed / Success), and keeps the best PCIe link seen during the tests, because an idle GPU drops to Gen1:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From the report&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PCIe links, best generation and width seen:
    GPU 0: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 55.5 GB/s
    GPU 1: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 53.2 GB/s
    GPU 2: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 55.5 GB/s
    GPU 3: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 53.1 GB/s
    GPU 4: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 53.9 GB/s
    GPU 5: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 54.3 GB/s
    GPU 6: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 53.9 GB/s
    GPU 7: Gen5 x16 seen (Gen5 x16 possible), under load, host-to-GPU copies 55.3 GB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A GPU under load that runs narrower than both ends allow is a FAIL. A generation below the maximum under load, or host-to-GPU copies under 70% of the median GPU, is a WARN. Here every GPU ran at Gen5 x16, with 53.1 to 55.5 GB/s from pinned host memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. P2P: how fast is each GPU pair?
&lt;/h3&gt;

&lt;p&gt;Each pair moved 387 to 391 GB/s in one direction, median 389 GB/s: 86% of the 450 GB/s line rate of NVLink on H100 SXM. The test copies 256 MiB from every GPU to every other one, 20 times, and compares the bytes afterwards:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From the report&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GPU-to-GPU copies in GB/s (row = source GPU, column = destination GPU):
    GPU0        -    389    387    390    388    389    388    388
    GPU1      390      -    389    390    388    389    388    388
    GPU2      389    389      -    387    388    389    389    389
    GPU3      388    389    389      -    388    388    388    388
    GPU4      389    387    391    389      -    388    390    390
    GPU5      389    389    390    389    387      -    391    387
    GPU6      390    387    390    389    391    391      -    390
    GPU7      389    391    389    389    390    391    389      -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FAIL if bytes differ, if a pair lacks peer access on an NVLink mesh, or if a pair is under 25% of the line rate (112 GB/s on H100 SXM: under that, the pair is not really on NVLink). WARN if the median pair is under 75% of the line rate, or if one pair is under 90% of the median. The line rate is half the two-way figure of NVIDIA's datasheets: 900 GB/s for H100 SXM and H200 SXM, 600 GB/s for A100 SXM, 1.8 TB/s for B200 and B300, so 450, 300 and 900 GB/s per direction.&lt;/p&gt;

&lt;p&gt;The report says "WARN under 270": that was 60% of the line rate, the rule at the time. After this run, the median rule went to 75% and the pair rule from 80% to 90% of the median. The slowest pair here is at 99% of the median, so the node passes both.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. NCCL: does an all-reduce reach the expected bandwidth?
&lt;/h3&gt;

&lt;p&gt;On 8x H100 SXM, expect about 370 GB/s of bus bandwidth in ring and about 480 GB/s with NVLink SHARP. This node reached 478.5 GB/s. The test runs &lt;code&gt;torch.distributed&lt;/code&gt; with NCCL, one process per GPU, 4 GiB of float32 per GPU, 20 iterations, and checks the values:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From the report&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all-reduce of 4 GiB per GPU, 20 iterations: algorithm bandwidth 273.4 GB/s, 15709 us per all-reduce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bus bandwidth is the figure nccl-tests reports. For an all-reduce, &lt;a href="https://github.com/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md" rel="noopener noreferrer"&gt;busbw = algbw × 2(n−1)/n&lt;/a&gt;, so 273.4 × 14 / 8, about 478.5 GB/s on 8 GPUs. NCCL maintainers at NVIDIA put effective NVLink at about 370 GB/s (20% protocol overhead on 450) and the all-reduce peak with NVLink SHARP at about 480 GB/s on large sizes (&lt;a href="https://github.com/NVIDIA/nccl-tests/issues/212" rel="noopener noreferrer"&gt;nccl-tests#212&lt;/a&gt;). In &lt;a href="https://github.com/NVIDIA/nccl-tests/issues/290" rel="noopener noreferrer"&gt;nccl-tests#290&lt;/a&gt;, a result of 476 GB/s "looks to be in the expected range for H100".&lt;/p&gt;

&lt;p&gt;Thresholds: on H100 SXM and H200, PASS from 340 GB/s, FAIL under 185 (half the effective rate), WARN in between. PASS from 340 accepts a node without NVLink SHARP. On A100 SXM, PASS from 210 and FAIL under 115, from about 230 GB/s at 8 GB (&lt;a href="https://github.com/NVIDIA/nccl-tests/issues/149" rel="noopener noreferrer"&gt;nccl-tests#149&lt;/a&gt;). B200 and B300 read INFO: no reference yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Load: five minutes at full power
&lt;/h3&gt;

&lt;p&gt;All eight GPUs ran bf16 matrix products for five minutes at 669 to 689 TFLOPS each, reached 69 C at most, and stayed at their power cap in 95% of the samples, which is normal. The test multiplies 8192 by 8192 bf16 matrices on every GPU at once and reads &lt;code&gt;nvidia-smi&lt;/code&gt; every 5 seconds:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From the report&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    GPU  samples  busy  max C  HBM C  SM MHz   max W  TFLOPS  slowdown samples: power cap / thermal / hw / brake
    0         60  100%     58     49    1365     702   687.0  57 / 0 / 0 / 0
    1         60  100%     65     56    1350     701   676.3  57 / 0 / 0 / 0
    2         60  100%     69     56    1335     700   669.2  57 / 0 / 0 / 0
    3         60  100%     58     49    1372     701   684.5  57 / 0 / 0 / 0
    4         60  100%     62     53    1380     701   684.6  57 / 0 / 0 / 0
    5         60  100%     65     59    1380     701   688.7  57 / 0 / 0 / 0
    6         60  100%     65     55    1365     702   683.3  57 / 0 / 0 / 0
    7         60  100%     60     51    1380     701   682.9  58 / 0 / 0 / 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Throughput.&lt;/strong&gt; FAIL if a GPU does not run, returns non-finite values, returns other bits for the same product (silent data corruption), or runs under half the median GPU. WARN under 85% of the median, or if a GPU computes another result than an identical GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thermal and power.&lt;/strong&gt; FAIL if hardware thermal slowdown or the power brake is active in 5% of the samples or more on a GPU. WARN on any thermal slowdown, any hardware slowdown, a power limit set under the GPU's default, or a GPU 10 C hotter than the median GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clocks.&lt;/strong&gt; WARN if a GPU's median SM clock is under 85% of the median GPU, or if a GPU is under 90% busy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The power cap column is not a warning: under a full matrix load an H100 runs at its power limit (up to 702 W here), as designed. The warning signs are the thermal, hw and brake columns, all at zero. GPU 2 was the hottest (69 C, for a median of 63.5 C) and the slowest (669 TFLOPS, about 98% of the median), inside the rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Errors: ECC and Xid
&lt;/h3&gt;

&lt;p&gt;No uncorrected ECC error, nothing pending, 0 corrected errors since the driver loaded, and no Xid in the kernel log during the test. The test reads the ECC counters (volatile: since the driver loaded; aggregate: lifetime), retired pages and remapped rows, before and after the other tests.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ECC / memory.&lt;/strong&gt; FAIL on any uncorrected error since the driver loaded, a pending row remap or page retirement (the GPU needs a reset), or a failed remap. WARN on ECC disabled, corrected errors during the test, lifetime uncorrected errors, or retired or remapped rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel log (Xid).&lt;/strong&gt; Read with &lt;code&gt;dmesg&lt;/code&gt;, else &lt;code&gt;journalctl -k&lt;/code&gt;, else &lt;code&gt;sudo -n dmesg&lt;/code&gt;. FAIL on a hardware Xid during the test (48, 62, 64, 74, 79, 92, 94, 95, 119, 120 and 140 in NVIDIA's Xid catalog). WARN on another Xid during the test, or a hardware Xid earlier in the same boot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The driver had been loaded a few minutes before, so "0 corrected since the driver loaded" covers a short window. The &lt;a href="https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup/hwcheck-acceptance-20261024T154657Z.json" rel="noopener noreferrer"&gt;JSON report&lt;/a&gt; also holds the lifetime counters: 0 corrected and 0 uncorrected on all eight GPUs, and no remapped row.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Hygiene: did a previous tenant leave anything?
&lt;/h3&gt;

&lt;p&gt;Nothing was found in the home directories, &lt;code&gt;/tmp&lt;/code&gt;, &lt;code&gt;/var/tmp&lt;/code&gt; and &lt;code&gt;/workspace&lt;/code&gt;. One SSH key could log in, no process was on the GPUs, and &lt;code&gt;systemd-detect-virt&lt;/code&gt; found no hypervisor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Previous tenant.&lt;/strong&gt; The test looks for credential files, shell histories, ML caches, model files, files in a home directory, and &lt;code&gt;/tmp&lt;/code&gt; files older than the current boot. It records paths and dates only, never contents. FAIL on credential files (&lt;code&gt;.netrc&lt;/code&gt;, &lt;code&gt;.git-credentials&lt;/code&gt;, cloud and registry credentials, a Hugging Face token, private SSH keys). WARN on anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH keys.&lt;/strong&gt; WARN if more than one key can log in; their fingerprints are in the report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPUs idle at start.&lt;/strong&gt; WARN if a process, or more than 2 GiB of memory, is already on a GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtualization.&lt;/strong&gt; INFO. With &lt;code&gt;--bare-metal&lt;/code&gt;, FAIL if a hypervisor is detected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The run was made as &lt;code&gt;ubuntu&lt;/code&gt;, so &lt;code&gt;/root&lt;/code&gt; was not searched, and the line says so. Run as root to include it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shown by the published run&lt;/strong&gt;, on that node, on 24 October 2026 between 15:46 and 15:53 UTC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The driver reported eight H100 80GB HBM3 GPUs on a complete NV18 mesh, with 4 NVSwitch chips and the fabric ready on every GPU.&lt;/li&gt;
&lt;li&gt;Every GPU pair copied 387 to 391 GB/s with the bytes intact, and an 8-GPU NCCL all-reduce reached 478.5 GB/s.&lt;/li&gt;
&lt;li&gt;All eight GPUs computed bf16 matrix products at full power for five minutes, with no change of bits for the same product, no thermal or hardware slowdown, at Gen5 x16.&lt;/li&gt;
&lt;li&gt;No ECC error, no Xid, nothing left in the usual places by a previous tenant, no hypervisor detected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not shown:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;That the node will hold for days.&lt;/strong&gt; Failures that come after hours, such as an Xid 79 at hour 30 or slowly growing ECC counts, need monitoring during the job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything between machines.&lt;/strong&gt; There is no InfiniBand or Ethernet test, only what happens inside the node.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage, CPU or RAM performance.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That the disk was wiped.&lt;/strong&gt; The search looks in the usual places only, deleted files can survive in unwiped blocks, and other volumes are not searched. On our bare metal, the drives are wiped by the operator between tenants, and you cannot verify that it happened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The BMC and the firmware.&lt;/strong&gt; You cannot read the BMC or its firmware from the OS, and we publish no measurement of them. The GPU VBIOS and system firmware versions can be read, but nothing attests them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything against a host determined to lie.&lt;/strong&gt; The test reads what the driver reports, and whoever controls the machine can change that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exact figures.&lt;/strong&gt; Bandwidths come from PyTorch (copy engines, the NCCL bundled with PyTorch) and can differ by a few percent from cuda-samples or nccl-tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other nodes and other models.&lt;/strong&gt; One node is one sample. The H100 SXM thresholds come from this run; the H200, A100 SXM, B200 and B300 values are still provisional, from NVIDIA's figures only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That the published files are the unedited output of a real run.&lt;/strong&gt; They are plain text with checksums we computed, not signatures (next section).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidentiality.&lt;/strong&gt; Bare metal is not confidential: its memory is not encrypted against the operator. Need the data sealed from the operator? Use a &lt;a href="https://voltagegpu.com/confidential-vm" rel="noopener noreferrer"&gt;Confidential VM&lt;/a&gt; (Intel TDX, attestation you verify yourself).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Re-check the published files
&lt;/h2&gt;

&lt;p&gt;Download the evidence folder, check it against its &lt;code&gt;SHA256SUMS&lt;/code&gt;, then compare the report with the copy in the public repository. Run on 24 October 2026 at 16:48 UTC:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Commands&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;bm-8xh100 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;bm-8xh100
&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://voltagegpu.com/blog/hwcheck/evidence/bm-8xh100-2026-10-24-setup
curl &lt;span class="nt"&gt;-fsSO&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/SHA256SUMS"&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; SHA256SUMS&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSO&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; SHA256SUMS
&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; hwcheck-acceptance-20261024T154657Z.sha256
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00-probe.txt: OK
01a-dedicated-setup-first-version-failed.txt: OK
01b-purge-after-failed-first-version.txt: OK
01c-dedicated-setup.txt: OK
02-nvidia-smi.txt: OK
03-nvidia-smi-q-fabric.txt: OK
04-nvidia-smi-topo.txt: OK
05-nvidia-smi-nvlink-s.txt: OK
06-services-and-packages.txt: OK
07-hwcheck-files.txt: OK
07-hwcheck-listing.txt: OK
08-acceptance-console.txt: OK
README.txt: OK
dedicated-setup-first-version-failed.sh: OK
hwcheck-acceptance-20261024T154657Z.json: OK
hwcheck-acceptance-20261024T154657Z.sha256: OK
hwcheck-acceptance-20261024T154657Z.txt: OK
hwcheck-acceptance-20261024T154657Z.txt: OK
hwcheck-acceptance-20261024T154657Z.json: OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first check covers the 17 files listed in &lt;code&gt;SHA256SUMS&lt;/code&gt;. The second uses the &lt;code&gt;.sha256&lt;/code&gt; file that the tool itself wrote next to the report on the node.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Commands&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://raw.githubusercontent.com/VoltageGPU/hwcheck/main
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GH&lt;/span&gt;&lt;span class="s2"&gt;/examples/h100-8x-acceptance.txt"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum
&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GH&lt;/span&gt;&lt;span class="s2"&gt;/examples/h100-8x-acceptance.json"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum
&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | &lt;span class="nb"&gt;sha256sum
&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GH&lt;/span&gt;&lt;span class="s2"&gt;/hwcheck.sh"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum
&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck-acceptance.sh | &lt;span class="nb"&gt;sha256sum
&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GH&lt;/span&gt;&lt;span class="s2"&gt;/acceptance.sh"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bb2851566238165c198a63ce41f90e644a5f256def1b99bb19a31650444837bb  -
a656867b05e85d35454111d53bc5d51dd874032adcb63cb3ada3fee3141db507  -
23b3e11e71ce3121b66db8dc35c011f465bc4cda420cfae4bb731fdd423f0c1f  -
23b3e11e71ce3121b66db8dc35c011f465bc4cda420cfae4bb731fdd423f0c1f  -
6bce8305ebf6903eb3c46b2a12423019817d81e8182542c8ef9fa1a3544f5e9d  -
6bce8305ebf6903eb3c46b2a12423019817d81e8182542c8ef9fa1a3544f5e9d  -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The report and its JSON in the repository's &lt;code&gt;examples/&lt;/code&gt; folder are byte for byte the published ones, and the two scripts the site serves are the ones on the repository's main branch. Last, the setup script:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Commands (in the same folder)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/dedicated-setup.sh | &lt;span class="nb"&gt;sha256sum
head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; 01c-dedicated-setup.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3bd4aafcc3017a30ca09e9be5834ddcc87d02f3f873c73166cf7108002ef9011  -
$ bash -s 2&amp;gt;&amp;amp;1 &amp;lt; dedicated-setup.sh   # as: curl -fsSL https://voltagegpu.com/dedicated-setup.sh | bash (sha256 3bd4aafcc3017a30ca09e9be5834ddcc87d02f3f873c73166cf7108002ef9011)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script the site serves has the SHA-256 written on the first line of the log of the run.&lt;/p&gt;

&lt;p&gt;What this shows: the files have not changed since we computed the checksums, and the site and the public repository hold the same bytes. What it cannot show: that the files are the unedited output of a real run. Both copies come from us, and a checksum is not a signature. The run that counts is the one you make on your own node. To read a published hardware check line by line, see &lt;a href="https://voltagegpu.com/blog/recheck-published-gpu-hardware-check" rel="noopener noreferrer"&gt;Re-check a Published GPU Hardware Check&lt;/a&gt;; for the shorter listing check, see &lt;a href="https://voltagegpu.com/blog/verify-rented-gpu-matches-listing" rel="noopener noreferrer"&gt;How to Check the GPU You Rented Is the One You Paid For&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you rent the node from us
&lt;/h2&gt;

&lt;p&gt;The machine above is our dedicated bare metal offer: a whole 8x H100 SXM machine with 192 vCPU and no hypervisor, with the &lt;code&gt;ubuntu&lt;/code&gt; user and sudo over SSH. On 24 October 2026 its public price was $49.80 per hour for the whole machine, that is $6.23 per GPU-hour, billed per second from a prepaid balance. The first hour is charged at start, and if you release early the unused part comes back.&lt;/p&gt;

&lt;p&gt;For a multi-day run, note the limit: the automatic release is mandatory, 24 hours by default and 72 hours at most, and the disk does not survive it. For a longer run, save your checkpoints off the machine and deploy again. Bare metal is open to verified accounts with at least $100 of card top-ups, the first one more than 14 days old, and no disputed payment. A newer account can ask for a manual review at &lt;a href="mailto:contact@voltagegpu.com"&gt;contact@voltagegpu.com&lt;/a&gt;. Live price and availability: &lt;a href="https://voltagegpu.com/dedicated" rel="noopener noreferrer"&gt;/dedicated&lt;/a&gt;. The test itself is the same on any provider; its source and its full rules are in the &lt;a href="https://github.com/VoltageGPU/hwcheck#acceptance-test-is-this-8-gpu-node-healthy" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How long does the hwcheck acceptance test take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;About 10 minutes: a 5-minute load test plus the topology, P2P, NCCL, error and hygiene checks. --quick skips the load test (about 2 minutes). If the image has no PyTorch, add the download of a pinned build, about 3 GB. On the 8x H100 SXM node of 24 October 2026, the whole run took 425 seconds, PyTorch download included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What NCCL all-reduce bandwidth should an 8x H100 SXM node reach?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;About 370 GB/s of bus bandwidth in ring and about 480 GB/s with NVLink SHARP on large sizes, according to NCCL maintainers at NVIDIA (nccl-tests issue 212). The node tested on 24 October 2026 reached 478.5 GB/s with 4 GiB per GPU. hwcheck passes an H100 SXM node from 340 GB/s and fails it under 185 GB/s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should nvidia-smi topo -m show on an 8x H100 SXM node?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NV18 for each of the 56 GPU pairs: in the legend of nvidia-smi, NV18 is a connection through a bonded set of 18 NVLinks. A pair that reads SYS, NODE, PHB, PXB or PIX goes over PCIe, which hwcheck fails. A pair with fewer than 18 links has a link down, which hwcheck flags as WARN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it a problem if the GPUs hit their power cap during the test?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Under a full matrix load an H100 runs at its power limit, as designed. On 24 October 2026 the eight GPUs were at the cap in 95% of the samples, at up to 702 W. The warning signs are thermal slowdown, hardware slowdown and the power brake, which hwcheck counts separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the acceptance test work on other providers, or in a VM?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. It needs Linux with the NVIDIA driver (it is written for Ubuntu 22.04 and 24.04), bash, coreutils, awk and python3. In a VM that shows no NVSwitch chip, that line reads INFO and the NVLink lines judge the fabric. Pass --bare-metal only when the listing says bare metal: the run then fails if a hypervisor is detected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the script send anything about my machine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It is read-only and needs no account. Its only network traffic is the PyTorch download from download.pytorch.org when the image has none, with the usual pip user agent; --no-install forbids it. It writes three report files and a temporary directory that it removes at exit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a PASS mean the node will hold for a multi-day run?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It shows that the node was healthy during those ten minutes. Failures that come after hours, such as an Xid 79 at hour 30 or slowly growing ECC counts, need monitoring during the job. The test also does not check the network between nodes, storage, or firmware.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, which rents out the node tested here. hwcheck is open source (MIT).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gpu</category>
      <category>nvidia</category>
      <category>machinelearning</category>
      <category>linux</category>
    </item>
    <item>
      <title>Ring zero on an attested H100</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Fri, 23 Oct 2026 18:29:25 +0000</pubDate>
      <link>https://dev.to/voltagegpu/ring-zero-on-an-attested-h100-48nc</link>
      <guid>https://dev.to/voltagegpu/ring-zero-on-an-attested-h100-48nc</guid>
      <description>&lt;p&gt;By Final Boss Technology Inc. (Abraham Manzano) and VoltageGPU&lt;/p&gt;

&lt;p&gt;This is a joint write-up. Final Boss Technology Inc. (FinalBoss) wrote sections 1, 2, 3 and 8: the run, the gate, its signed receipts and the enforcement in the kernel. VoltageGPU wrote sections 4 to 7 and the "Reproduce it" box: the Intel TDX and NVIDIA proofs, how the receipt is tied to them, and what our verifier printed. In those sections, "we" means VoltageGPU. Each side approved the other's sentences about its own system before publication.&lt;/p&gt;

&lt;p&gt;The evidence is FinalBoss's public archive, GUEST_EVIDENCE_PHASE2.tar.gz at commit a1c42c2 (&lt;a href="https://github.com/805-ai/finalboss-proof/tree/a1c42c2af9d14c0c44df215414a1efe5f13f286d/ring-zero-20261018" rel="noopener noreferrer"&gt;https://github.com/805-ai/finalboss-proof/tree/a1c42c2af9d14c0c44df215414a1efe5f13f286d/ring-zero-20261018&lt;/a&gt;). A path written proof/... is a file inside that archive.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What ran, and when
&lt;/h2&gt;

&lt;p&gt;On 18 October 2026, FinalBoss loaded three eBPF cgroup hooks (connect4, sendmsg4 and sock_create) into the kernel of a VoltageGPU H100 confidential VM (Intel TDX) with one GPU, running kernel 6.8.0-110-generic. The run had two phases.&lt;/p&gt;

&lt;p&gt;Phase 1 was a bounded test. Under the hooks, 3,000 of 3,000 unpermitted socket() calls were denied, and 3,000 of 3,000 permitted loopback TCP calls went through with zero failures. The median deny time was 10.94 µs. Phase 1 used a test permit to exercise the hooks. It ended at 22:53:50 UTC.&lt;/p&gt;

&lt;p&gt;Phase 2 was the long run: 21 cycles, one every 120 seconds, from 22:53:53 to 23:34:04 UTC. Each cycle took a new hardware attestation, confirmed all three hooks attached, and ran a deny probe. All 21 cycles passed: 21 of 21 attestations succeeded, plus one attestation for the permit (cycle 0); 21 of 21 deny probes were denied; and 3 of 3 hooks were attached in every cycle. Phase 2 drew its permit from a signed gate receipt verified by permitctl. At the end, the hooks were detached. In round numbers, the long run lasted about 40 minutes.&lt;/p&gt;

&lt;p&gt;Scope: this run covers network enforcement in the kernel. It does not cover BPF-LSM, and it makes no AMD SEV-SNP claim.&lt;/p&gt;

&lt;p&gt;Sources: proof/OBSERVATIONS.json, proof/LATENCY.json, proof/LONG_RUN_SUMMARY.json, proof/CYCLES.jsonl, proof/MANIFEST.sha256 (77 files).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The gate and its signed receipts
&lt;/h2&gt;

&lt;p&gt;The FinalBoss gate sits in front of an action. In phase 2, nothing ran without a signed receipt. Before the action is allowed, the gate records the intent and signs it.&lt;/p&gt;

&lt;p&gt;The receipt published with this run names the action (connect4 127.0.0.1 worker pid 3071), an effect ID (73df5891077b86bd950ecd92b8af8f2d), an idempotency key, the phase (INTENT) and the status (INTENT_RECORDED). It also carries a signing key ID, the fingerprints of both public keys, and the signature mode, hybrid-ed25519-mldsa87.&lt;/p&gt;

&lt;p&gt;The receipt hash is SHA-256 of the canonical JSON of the receipt (sorted keys, no whitespace) with the hash and both signatures removed. For this receipt, that is f87320cf1bcea80f29ccf6675dec83c73fa62179233aa990a18f2e882dae0fbd. Both signatures are computed over the hex text of that hash.&lt;/p&gt;

&lt;p&gt;There are two signatures because one is not enough for the long term. Ed25519 is fast and widely trusted today. ML-DSA-87 is a post-quantum signature standardised by NIST. A forgery stays impossible as long as one of the two schemes holds, provided the verifier requires both signatures.&lt;/p&gt;

&lt;p&gt;The signing_key_id points to a hardware attestation. It is tdx: followed by the SHA-256 of the attestation bundle for cycle 0 (3a1e6e64d4d98ccbfbce1af128f23413b85dc23676571e725efb03b13816d390). The receipt therefore names the exact attestation it was issued against.&lt;/p&gt;

&lt;p&gt;Key custody: the gate used an external signer outside the VM. This run does not claim the keys were inside the VM.&lt;/p&gt;

&lt;p&gt;Sources: proof/gate_keys/receipt_73df5891077b86bd950ecd92b8af8f2d.json, proof/gate_keys/gate_ed25519.pub, proof/gate_keys/gate_mldsa87.pub.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Enforcement in ring zero
&lt;/h2&gt;

&lt;p&gt;The gate decides. The kernel enforces. FinalBoss attaches three cgroup hooks, each guarding one way out of the workload: sock_create blocks opening a socket, connect4 blocks opening a connection, and sendmsg4 blocks sending UDP datagrams over IPv4. The default is deny. A process can only get through if a permit for it exists in the kernel's permit map.&lt;/p&gt;

&lt;p&gt;In phase 2, permitctl checked the signed gate receipt and only then wrote the permit. Revocation works the same way in reverse. In phase 1, after the test permit was revoked, all three hooks returned EPERM: connect4, sendmsg4 and sock_create.&lt;/p&gt;

&lt;p&gt;Latency was measured with a worker in the cgroup, timing each call with perf_counter_ns: 3,000 TCP connect, send and close calls to a loopback listener for the allow path, and 3,000 socket() calls returning EPERM for the deny path.&lt;/p&gt;

&lt;p&gt;The hooks were built ahead of time on the operator's machine. No compiler was present on the target. They were loaded with bpftool v7.8.0. The SHA-256 of each object is published:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finalboss_kts_connect4.bpf.o:
b373e9be7fb3fc5a6972760ba19645b30c8d47fbe5ef0b5bf02f2f3b3876b984
finalboss_kts_sendmsg4.bpf.o:
507b10398a390739f5df3599c9bc7d679b1dcbcfc86d8e6c4c66cd78313406b7
finalboss_kts_sock_create.bpf.o:
c879aefdb4337db15e739024fdecb1dbe4badc26bc5717b032c028a96ebfa417
source: 9ce4ad08df55aaed1b7055fe4708c14c62aaf6577b83efa0d200014d25a59143
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The objects themselves are available to qualified reviewers under NDA. At the end of the run, all hooks were detached.&lt;/p&gt;

&lt;p&gt;Sources: proof/BPF_LOAD.txt, proof/CGROUP_ATTACHMENTS.txt, proof/BPF_UNLOAD.txt, proof/LONG_BPF_LOAD.txt, proof/LONG_BPF_UNLOAD.txt, proof/OBSERVATIONS.json, proof/cycles/cycle_0001.json to cycle_0021.json.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Two hardware proofs: the Intel TDX quote and the NVIDIA GPU attestation
&lt;/h2&gt;

&lt;p&gt;The run used a VoltageGPU H100 confidential VM (Intel TDX) with one GPU. The archive holds 22 attestation bundles: bundle_0000, taken for the gate permit before cycle 1, and bundle_0001 to bundle_0021, one per cycle. Each was made inside the VM with voltage-verify 0.2.1 and holds two proofs over one manifest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The manifest&lt;/strong&gt; holds a challenge, a creation time, a statement and workload fields, all written by FinalBoss. In the 22 manifests, the workload fields carry the company name, the cycle number, the session nonce 9497347602a44f2088ed53b3a885a34c and the SHA-256 fingerprints of the two gate public keys (e4baefa2… and 511d1622…).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Intel TDX quote&lt;/strong&gt; carries the SHA-512 of the canonical manifest (keys sorted, no whitespace, UTF-8) as its 64-byte report_data. Intel's Quoting Enclave signs it, the chain ends at the Intel SGX Root CA, and Intel's signed collateral rates the platform's patch level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The NVIDIA attestation&lt;/strong&gt; is a set of tokens signed by NVIDIA's attestation service (NRAS), whose eat_nonce is the SHA-256 of the same manifest. Change one byte of the manifest and neither proof matches it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What bundle_0000 shows&lt;/strong&gt; (the same values in all 22 bundles):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quote v4, 4,940 bytes. MRTD eea8b6a8…, the measurement of the VM's initial memory. RTMR3 is all zeros, so no runtime measurement was added. TD attributes 0000001000000000: debug off.&lt;/li&gt;
&lt;li&gt;Intel: platform TCB, Quoting Enclave and TDX module TDX_01 all UpToDate (TCB level of 13 August 2025); the PCK certificate and its CA are not revoked.&lt;/li&gt;
&lt;li&gt;NVIDIA: one GH100 GPU; measurements matched, secure boot on, debug disabled; driver 595.71.05, VBIOS 96.00.CF.00.01.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the VM, &lt;code&gt;nvidia-smi conf-compute&lt;/code&gt; reported CC State ON and Multi-GPU Mode None, the single-GPU confidential computing mode. The VM reported this itself; no signature covers it.&lt;/p&gt;

&lt;p&gt;The MRTD equals the one in our public reference bundle of 12 September 2026 (examples/hello-workload/ in voltage-verify): the same virtual firmware image. RTMR0 to RTMR2 differ from that bundle's, and we publish no reference values for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this proves, and what it does not.&lt;/strong&gt; The 22 quotes come from one genuine Intel TDX platform that Intel rates UpToDate, NVIDIA issued the GPU claims, and each quote and its tokens commit to the same manifest. The proofs say nothing about software loaded after boot (RTMR3 is zero) or about what the GPU computed, and they commit to FinalBoss's statement and workload fields without checking them.&lt;/p&gt;

&lt;p&gt;Sources: proof/cycles/ (manifests and bundles); section 6; docs/WHAT_IT_PROVES.md in voltage-verify; the public verification page of bundle_0000, &lt;a href="https://voltagegpu.com/verified/Bf2xU9dGOQkHqrwrVQpyTw" rel="noopener noreferrer"&gt;https://voltagegpu.com/verified/Bf2xU9dGOQkHqrwrVQpyTw&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How the gate receipt is tied to the attestation
&lt;/h2&gt;

&lt;p&gt;Section 2 describes the receipt. voltage-verify does not read it, so we checked the chain below with our own script, which recomputes each value from the published files (figure 1).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keys to manifest.&lt;/strong&gt; The SHA-256 of gate_ed25519.pub is e4baefa2… and the SHA-256 of gate_mldsa87.pub is 511d1622…: the two fingerprints in manifest_0000.json.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest to hardware.&lt;/strong&gt; The quote in bundle_0000.json carries the SHA-512 of that manifest as its report_data, and both NVIDIA tokens carry its SHA-256 as eat_nonce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receipt to attestation.&lt;/strong&gt; The receipt's signing_key_id is tdx: followed by 3a1e6e64…, the SHA-256 of the file bundle_0000.json.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receipt to keys.&lt;/strong&gt; The receipt's two fingerprints equal the two key-file hashes. We recomputed the receipt hash as section 2 defines it and got f87320cf…, the value in the receipt, and both signatures verify over its hex text with the published public keys (Python cryptography 50.0.2). The hash covers signing_key_id and the fingerprints: when we changed one character of either, the hash changed and both signatures failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every cycle.&lt;/strong&gt; The 22 manifests carry the same two fingerprints and the same session nonce, so all 22 quotes and NVIDIA attestations commit to the same gate keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time.&lt;/strong&gt; The receipt contains the hash of bundle_0000.json, which holds an NVIDIA token issued at 22:53:57 UTC, so the receipt was signed after that time. The receipt has no time field of its own.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F929r9awycdzztu8ur1y1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F929r9awycdzztu8ur1y1.png" alt="Figure 1. From the gate keys to the hardware proofs and back to the receipt." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. From the gate keys to the hardware proofs and back to the receipt. Values from FinalBoss's archive at commit a1c42c2; every arrow was recomputed by our script.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Legend: solid border, signed by Intel or NVIDIA; dashed border, signed with the gate keys; no border, unsigned file.&lt;/p&gt;

&lt;p&gt;Figure 1 sources: proof/cycles/manifest_0000.json to manifest_0021.json, proof/cycles/bundle_0000.json and proof/gate_keys/ (commit a1c42c2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this proves, and what it does not.&lt;/strong&gt; The receipt names the attestation in bundle_0000.json, and it is signed by the two keys whose fingerprints the attested VM put in its manifest. The keys were held by an external signer outside the VM, and this run makes no claim that they were inside it. The quote shows that software in the VM asked for a quote over a manifest holding those fingerprints, not who held the private keys. Nor does it show that the permit the kernel enforced came from this receipt: that rests on FinalBoss's logs.&lt;/p&gt;

&lt;p&gt;Sources: proof/gate_keys/ (receipt and public keys); proof/cycles/ (manifests and bundle_0000.json); our check, in part 2 of the "Reproduce it" box.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What voltage-verify printed
&lt;/h2&gt;

&lt;p&gt;We ran the "Reproduce it" box below on 22 October 2026, each time in a new directory with a new virtual environment: on Windows 11 with Git Bash (21:00:02 to 21:00:25 UTC) and on Ubuntu 24.04.1 (21:02:00 to 21:02:17 UTC). pip installed voltage-verify 0.2.3. Both runs printed the archive hash, 77 (every file in MANIFEST.sha256 matches) and RESULT: VERIFIED for all 22 bundles. voltage-verify 0.2.2 gives the same 22 results; on bundle_0000, its output differs from that of 0.2.3 only in the wording of the nvidia.signatures line.&lt;/p&gt;

&lt;p&gt;The full output for bundle_0000 (offline, 0.2.3):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ voltage-verify verify proof/cycles/bundle_0000.json --offline --challenge cb2f9a15fb882c3f1e9e3d5867b596d105f215d0bcad1bec2db437a3eebd37c6 --hwmodel GH100 --gpus 1
[PASS] manifest.format       manifest is well formed
[PASS] manifest.commitments  bundle commitments match the manifest
[PASS] manifest.challenge    challenge is the one this verifier issued
[PASS] tdx.structure         TDX quote v4, TEE 0x81, 4940 bytes
[PASS] tdx.debug             TD attributes 0000001000000000 (0x10000000), DEBUG (bit 0) off: not a debug TD
[PASS] tdx.report_data       quote report_data equals SHA-512 of the manifest
[PASS] tdx.signatures        attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[PASS] tdx.collateral        TCB info and QE identity signed by Intel (bundle (fetched 2026-10-18T22:53:59+00:00))
[PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
[PASS] tdx.revocation        PCK certificate not revoked (57 entries in CRL)
[PASS] tdx.revocation        PCK CA certificate not revoked (0 entries in CRL)
[PASS] nvidia.signatures     2 NVIDIA-signed tokens verify, keys from the bundle chained to a pinned NRAS intermediate (offline)
[PASS] nvidia.nonce          NRAS eat_nonce equals SHA-256 of the manifest
[PASS] nvidia.policy         overall result true, every GPU: measurements ok, secure boot on, debug off, nonce matched, report signature and chain validated
[PASS] nvidia.freshness      token issued 3s from bundle creation

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB UpToDate  QE UpToDate
GPU: GPU-0 GH100 driver 595.71.05 vbios 96.00.CF.00.01 measurements success

RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All 22 bundles, 18 October 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle&lt;/th&gt;
&lt;th&gt;NVIDIA token issued (UTC, signed by NVIDIA)&lt;/th&gt;
&lt;th&gt;Intel collateral fetched (UTC, recorded in the bundle)&lt;/th&gt;
&lt;th&gt;voltage-verify 0.2.3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0000&lt;/td&gt;
&lt;td&gt;22:53:57&lt;/td&gt;
&lt;td&gt;22:53:59&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0001&lt;/td&gt;
&lt;td&gt;22:54:03&lt;/td&gt;
&lt;td&gt;22:54:05&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0002&lt;/td&gt;
&lt;td&gt;22:56:03&lt;/td&gt;
&lt;td&gt;22:56:05&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0003&lt;/td&gt;
&lt;td&gt;22:58:02&lt;/td&gt;
&lt;td&gt;22:58:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0004&lt;/td&gt;
&lt;td&gt;23:00:02&lt;/td&gt;
&lt;td&gt;23:00:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0005&lt;/td&gt;
&lt;td&gt;23:02:02&lt;/td&gt;
&lt;td&gt;23:02:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0006&lt;/td&gt;
&lt;td&gt;23:04:02&lt;/td&gt;
&lt;td&gt;23:04:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0007&lt;/td&gt;
&lt;td&gt;23:06:02&lt;/td&gt;
&lt;td&gt;23:06:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0008&lt;/td&gt;
&lt;td&gt;23:08:02&lt;/td&gt;
&lt;td&gt;23:08:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0009&lt;/td&gt;
&lt;td&gt;23:10:02&lt;/td&gt;
&lt;td&gt;23:10:12&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0010&lt;/td&gt;
&lt;td&gt;23:12:02&lt;/td&gt;
&lt;td&gt;23:12:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0011&lt;/td&gt;
&lt;td&gt;23:14:02&lt;/td&gt;
&lt;td&gt;23:14:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0012&lt;/td&gt;
&lt;td&gt;23:16:02&lt;/td&gt;
&lt;td&gt;23:16:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0013&lt;/td&gt;
&lt;td&gt;23:18:02&lt;/td&gt;
&lt;td&gt;23:18:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0014&lt;/td&gt;
&lt;td&gt;23:20:02&lt;/td&gt;
&lt;td&gt;23:20:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0015&lt;/td&gt;
&lt;td&gt;23:22:02&lt;/td&gt;
&lt;td&gt;23:22:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0016&lt;/td&gt;
&lt;td&gt;23:24:02&lt;/td&gt;
&lt;td&gt;23:24:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0017&lt;/td&gt;
&lt;td&gt;23:26:02&lt;/td&gt;
&lt;td&gt;23:26:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0018&lt;/td&gt;
&lt;td&gt;23:28:02&lt;/td&gt;
&lt;td&gt;23:28:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0019&lt;/td&gt;
&lt;td&gt;23:30:02&lt;/td&gt;
&lt;td&gt;23:30:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0020&lt;/td&gt;
&lt;td&gt;23:32:02&lt;/td&gt;
&lt;td&gt;23:32:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bundle_0021&lt;/td&gt;
&lt;td&gt;23:34:02&lt;/td&gt;
&lt;td&gt;23:34:04&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 22 quotes share one MRTD, one set of RTMR0 to RTMR3, one PCK certificate chain and one set of TCB values, and the 22 sets of NVIDIA tokens name one GPU (the same ueid). The 22 challenges are all different.&lt;/p&gt;

&lt;p&gt;The selftest makes nine tampered copies of each bundle (manifest changes, a replayed challenge, an altered byte of the quote, an altered GPU claim, re-signed tokens, a duplicated signing key, stripped certificate chains) and checks that each one is rejected: 198 of 198 were.&lt;/p&gt;

&lt;p&gt;Online, with Intel collateral fetched on 22 October 2026 at 21:04 UTC, bundle_0000 still verifies with the same ratings. We ran this for bundle_0000 only; the other 21 quotes come from the same platform with the same security version numbers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyd91r56d2qmqbfwrzn3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyd91r56d2qmqbfwrzn3g.png" alt="Figure 2. The run on 18 October 2026, in UTC." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. The run on 18 October 2026, in UTC. Filled marks: times signed by NVIDIA. Hollow marks: times written by FinalBoss's harness or by the VM, not signed. Phase 1 ended before the first attestation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Figure 2 sources: proof/OBSERVATIONS.json, proof/LONG_RUN_SUMMARY.json, proof/cycles/manifest_*.json, bundle_*.json and cycle_*.json (commit a1c42c2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this proves, and what it does not.&lt;/strong&gt; Each bundle answers the challenge in its own manifest, but FinalBoss set those challenges, not an outside verifier, so they do not show freshness to a reader. NVIDIA's signed timestamps do: from 22:53:57 to 23:34:02 UTC on 18 October 2026 (2,405 seconds), 6 seconds between bundle_0000 and bundle_0001, then 119 to 120 seconds between cycles (figure 2). Twenty-two quotes from one platform with one set of measurements fit one VM running for about 40 minutes, but they do not formally prove a single VM instance. Phase 1 (section 1) ended at 22:53:50 UTC, 7 seconds before the first attestation in the archive, so no hardware proof covers it.&lt;/p&gt;

&lt;p&gt;Sources: our runs of 22 October 2026 (box below); voltage-verify 0.2.3 and 0.2.2 from PyPI; proof/OBSERVATIONS.json.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. What the hardware side proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;This is the list from docs/WHAT_IT_PROVES.md in voltage-verify 0.2.3 (&lt;a href="https://github.com/VoltageGPU/voltage-verify/blob/v0.2.3/docs/WHAT_IT_PROVES.md" rel="noopener noreferrer"&gt;https://github.com/VoltageGPU/voltage-verify/blob/v0.2.3/docs/WHAT_IT_PROVES.md&lt;/a&gt;), for the checks printed in section 6.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Proves&lt;/th&gt;
&lt;th&gt;Does not prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;manifest.format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the bundle is parseable&lt;/td&gt;
&lt;td&gt;anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;manifest.commitments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bookkeeping is consistent&lt;/td&gt;
&lt;td&gt;anything: an attacker can recompute them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;manifest.challenge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the bundle was made for this session&lt;/td&gt;
&lt;td&gt;anything without the TDX and NVIDIA checks below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.structure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;it is a TDX quote&lt;/td&gt;
&lt;td&gt;anything about its origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the TD does not run in debug mode, in which the host can read and modify its memory and CPU state&lt;/td&gt;
&lt;td&gt;anything on its own: the TD attributes are only Intel's word once &lt;code&gt;tdx.signatures&lt;/code&gt; passes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.report_data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the quote was requested with your manifest hash, so after your challenge&lt;/td&gt;
&lt;td&gt;who requested it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.signatures&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the quote was produced by a genuine Intel TDX Quoting Enclave on Intel-provisioned hardware&lt;/td&gt;
&lt;td&gt;that the platform's firmware is current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.collateral&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the collateral is Intel's&lt;/td&gt;
&lt;td&gt;freshness (see &lt;code&gt;tdx.collateral_fresh&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.tcb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the platform is patched to a level Intel accepts&lt;/td&gt;
&lt;td&gt;that no unknown vulnerability exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tdx.revocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Intel has not revoked this platform's provisioning identity&lt;/td&gt;
&lt;td&gt;anything if CRLs are missing (then the line says NOT checked)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia.signatures&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NVIDIA issued these claims&lt;/td&gt;
&lt;td&gt;when, until &lt;code&gt;nvidia.freshness&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia.nonce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the claims were issued for your manifest hash, after your challenge&lt;/td&gt;
&lt;td&gt;which VM: the TDX side does that&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia.policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NVIDIA's service accepted the GPU's measurements and configuration&lt;/td&gt;
&lt;td&gt;that the GPU executed your workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nvidia.freshness&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the token belongs to this attestation session&lt;/td&gt;
&lt;td&gt;anything if the VM clock is wrong (the check then fails, which is the safe direction)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The quote's &lt;code&gt;MRTD&lt;/code&gt; and &lt;code&gt;RTMR0..3&lt;/code&gt; are printed as facts. They measure the VM's initial state and boot chain. This tool does not compare them to a reference: whether a given &lt;code&gt;MRTD&lt;/code&gt; is the image you expect is a policy decision that belongs to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap this tool does not close.&lt;/strong&gt; Both proofs are bound to a description of the workload. Neither proof says that the described image or model was what the GPU computed on. Closing that gap requires a measured launch: a component inside the VM that measures the container image and the model before starting them and extends a TDX runtime measurement (&lt;code&gt;RTMR&lt;/code&gt;) with the result, so that the quote itself carries the measurement. The Confidential Containers project (Kata + Trustee) and similar stacks do this. &lt;code&gt;voltage-verify&lt;/code&gt; stops one step earlier on purpose, and says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Part 1: the archive and the 22 hardware attestations
&lt;/h3&gt;

&lt;p&gt;These lines download FinalBoss's archive at the pinned commit, check its hash and its 77 files, and verify the 22 hardware attestations offline, each against the challenge in its own manifest. On Windows with Git Bash, start with &lt;code&gt;python -m venv vv &amp;amp;&amp;amp; . vv/Scripts/activate&lt;/code&gt; instead; the rest is unchanged. &lt;code&gt;python -I&lt;/code&gt; keeps Python from importing modules from the current directory, which holds downloaded files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m venv vv &amp;amp;&amp;amp; . vv/bin/activate &amp;amp;&amp;amp; pip install "voltage-verify&amp;gt;=0.2.2"
voltage-verify --version
curl -sLO https://github.com/805-ai/finalboss-proof/raw/a1c42c2af9d14c0c44df215414a1efe5f13f286d/ring-zero-20261018/GUEST_EVIDENCE_PHASE2.tar.gz
sha256sum GUEST_EVIDENCE_PHASE2.tar.gz      # 6019ef19363e76ca1ea3cc0114c29d0b7afd9312cc0d363548b1bcaf10c66dc9
tar -xzf GUEST_EVIDENCE_PHASE2.tar.gz
(cd proof &amp;amp;&amp;amp; sha256sum -c MANIFEST.sha256 | grep -c ': OK$')      # 77
for n in $(seq -w 0 21); do
  c=$(python -I -c 'import json,sys; print(json.load(open(sys.argv[1]))["challenge"])' proof/cycles/manifest_00$n.json)
  printf '%s ' "bundle_00$n"; voltage-verify verify proof/cycles/bundle_00$n.json --offline --challenge "$c" --hwmodel GH100 --gpus 1 | tail -n 1
done                                         # 22 x "RESULT: VERIFIED"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on Ubuntu 24.04.1, 22 October 2026, 21:02:00 to 21:02:17 UTC, without pip's own lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;voltage-verify 0.2.3
6019ef19363e76ca1ea3cc0114c29d0b7afd9312cc0d363548b1bcaf10c66dc9  GUEST_EVIDENCE_PHASE2.tar.gz
77
bundle_0000 RESULT: VERIFIED
bundle_0001 RESULT: VERIFIED
bundle_0002 RESULT: VERIFIED
bundle_0003 RESULT: VERIFIED
bundle_0004 RESULT: VERIFIED
bundle_0005 RESULT: VERIFIED
bundle_0006 RESULT: VERIFIED
bundle_0007 RESULT: VERIFIED
bundle_0008 RESULT: VERIFIED
bundle_0009 RESULT: VERIFIED
bundle_0010 RESULT: VERIFIED
bundle_0011 RESULT: VERIFIED
bundle_0012 RESULT: VERIFIED
bundle_0013 RESULT: VERIFIED
bundle_0014 RESULT: VERIFIED
bundle_0015 RESULT: VERIFIED
bundle_0016 RESULT: VERIFIED
bundle_0017 RESULT: VERIFIED
bundle_0018 RESULT: VERIFIED
bundle_0019 RESULT: VERIFIED
bundle_0020 RESULT: VERIFIED
bundle_0021 RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Part 2: the receipt chain
&lt;/h3&gt;

&lt;p&gt;To check the receipt chain of section 5 as well, run this in the same directory. It needs only the Python cryptography package, which pip installed with voltage-verify.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -I - proof/gate_keys proof/cycles &amp;lt;&amp;lt;'EOF'
import base64, hashlib, json, sys
from pathlib import Path
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
from cryptography.hazmat.primitives.asymmetric.mldsa import MLDSA87PublicKey
keys, cycles = Path(sys.argv[1]), Path(sys.argv[2])
sha = lambda p: hashlib.sha256(p.read_bytes()).hexdigest()
r = json.loads(next(keys.glob("receipt_*.json")).read_text())
body = {k: v for k, v in r.items() if k not in ("hash", "signature_ed25519", "signature_pq")}
h = hashlib.sha256(json.dumps(body, sort_keys=True, separators=(",", ":")).encode()).hexdigest()
print("hash recomputed:", h == r["hash"], h)
print("signing_key_id is tdx: + SHA-256(bundle_0000.json):", r["signing_key_id"] == "tdx:" + sha(cycles / "bundle_0000.json"))
files = (sha(keys / "gate_ed25519.pub"), sha(keys / "gate_mldsa87.pub"))
print("receipt fingerprints = SHA-256 of the key files:", (r["public_key_fingerprint_ed25519"], r["public_key_fingerprint_pq"]) == files)
extras = [json.loads(m.read_text())["workload"]["extra"] for m in sorted(cycles.glob("manifest_*.json"))]
print("manifests carrying both fingerprints:", sum((e["ed25519_fpr"], e["mldsa87_fpr"]) == files for e in extras), "of", len(extras))
pub = lambda f: base64.b64decode((keys / f).read_text().strip())
Ed25519PublicKey.from_public_bytes(pub("gate_ed25519.pub")).verify(base64.b64decode(r["signature_ed25519"]), h.encode())
MLDSA87PublicKey.from_public_bytes(pub("gate_mldsa87.pub")).verify(base64.b64decode(r["signature_pq"]), h.encode())
print("Ed25519 and ML-DSA-87 signatures over the hex hash: valid")
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on Ubuntu 24.04.1, 22 October 2026, 21:12:32 UTC (cryptography 50.0.2):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hash recomputed: True f87320cf1bcea80f29ccf6675dec83c73fa62179233aa990a18f2e882dae0fbd
signing_key_id is tdx: + SHA-256(bundle_0000.json): True
receipt fingerprints = SHA-256 of the key files: True
manifests carrying both fingerprints: 22 of 22
Ed25519 and ML-DSA-87 signatures over the hex hash: valid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a copy of the receipt with one character changed (pid 3071 became pid 3072 in the action field), the recomputed hash no longer matched and the Ed25519 check stopped with InvalidSignature.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What the kernel run proves, and next steps
&lt;/h2&gt;

&lt;p&gt;What this run shows, according to FinalBoss's logs: a signed gate receipt, which names a hardware attestation by its key ID, was checked before the kernel allowed network access. Three kernel hooks denied calls without a permit, stayed attached through 21 cycles, each with its own hardware attestation, and returned EPERM after the phase 1 permit was revoked.&lt;/p&gt;

&lt;p&gt;Its scope: network hooks only, on Intel TDX. BPF-LSM was not part of this run, and there is no AMD SEV-SNP claim. Phase 1 used a test permit, and the receipt-to-permit binding comes from the FinalBoss logs.&lt;/p&gt;

&lt;p&gt;What a reader can check today: the archive hash, all 77 file hashes and all 22 hardware attestations with the Reproduce it box, and the receipt hash and both signatures with the format given in section 2.&lt;/p&gt;

&lt;p&gt;Next steps: FinalBoss plans to extend hardware attestation to cover the enforcement layer itself.&lt;/p&gt;

&lt;p&gt;Contact: Abraham Manzano, Final Boss Technology Inc., &lt;a href="mailto:Abraham@finalbosstech.com"&gt;Abraham@finalbosstech.com&lt;/a&gt;, (805) 420-5140.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;FinalBoss's archive, pinned to commit a1c42c2af9d14c0c44df215414a1efe5f13f286d: &lt;a href="https://github.com/805-ai/finalboss-proof/tree/a1c42c2af9d14c0c44df215414a1efe5f13f286d/ring-zero-20261018" rel="noopener noreferrer"&gt;https://github.com/805-ai/finalboss-proof/tree/a1c42c2af9d14c0c44df215414a1efe5f13f286d/ring-zero-20261018&lt;/a&gt; (GUEST_EVIDENCE_PHASE2.tar.gz, SHA-256 6019ef19363e76ca1ea3cc0114c29d0b7afd9312cc0d363548b1bcaf10c66dc9, 77 files listed in MANIFEST.sha256).&lt;/li&gt;
&lt;li&gt;voltage-verify, the open-source verifier used in sections 4 to 7: &lt;a href="https://github.com/VoltageGPU/voltage-verify" rel="noopener noreferrer"&gt;https://github.com/VoltageGPU/voltage-verify&lt;/a&gt; (package: &lt;a href="https://pypi.org/project/voltage-verify/" rel="noopener noreferrer"&gt;https://pypi.org/project/voltage-verify/&lt;/a&gt;). What each check proves: &lt;a href="https://github.com/VoltageGPU/voltage-verify/blob/v0.2.3/docs/WHAT_IT_PROVES.md" rel="noopener noreferrer"&gt;https://github.com/VoltageGPU/voltage-verify/blob/v0.2.3/docs/WHAT_IT_PROVES.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The public verification page of bundle_0000: &lt;a href="https://voltagegpu.com/verified/Bf2xU9dGOQkHqrwrVQpyTw" rel="noopener noreferrer"&gt;https://voltagegpu.com/verified/Bf2xU9dGOQkHqrwrVQpyTw&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Every proof VoltageGPU publishes, with the command that rechecks it: &lt;a href="https://voltagegpu.com/proofs" rel="noopener noreferrer"&gt;https://voltagegpu.com/proofs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final Boss Technology Inc. (Abraham Manzano) and VoltageGPU&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://voltagegpu.com/blog/ring-zero-attested-h100" rel="noopener noreferrer"&gt;voltagegpu.com&lt;/a&gt;. A joint write-up by Final Boss Technology Inc. and VoltageGPU.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ebpf</category>
      <category>linux</category>
      <category>confidentialcomputing</category>
    </item>
    <item>
      <title>Calling open models inside a TEE with the OpenAI Python SDK</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:16:28 +0000</pubDate>
      <link>https://dev.to/voltagegpu/calling-open-models-inside-a-tee-with-the-openai-python-sdk-18k5</link>
      <guid>https://dev.to/voltagegpu/calling-open-models-inside-a-tee-with-the-openai-python-sdk-18k5</guid>
      <description>&lt;p&gt;If you already call OpenAI from Python, switching to an open model that runs in a trusted execution environment (TEE) is two lines: the base URL and the key. Here is what that looks like, with real output captured on 23 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two lines that change
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.voltagegpu.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VOLTAGEGPU_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;   &lt;span class="c1"&gt;# a vgpu_... key, never commit it
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google/gemma-4-31B-turbo-TEE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;In one sentence, what does a TEE protect?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every model id ends in &lt;code&gt;-TEE&lt;/code&gt;: the model runs in an Intel TDX guest with confidential-computing NVIDIA GPUs. Streaming works as usual (&lt;code&gt;stream=True&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What came back
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-voltagegpu-model: google/gemma-4-31B-turbo-TEE
x-voltagegpu-confidential: tee
x-voltagegpu-cost-usd: 0.000025
answer: A TEE protects sensitive data and code from being accessed or modified by the rest of the device's operating system.
usage: 36 prompt + 25 completion tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response headers tell you which model actually ran and what the call cost, so you can log it next to your own usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listing the models
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /v1/models&lt;/code&gt; is public and returns, for each model, its live status (available, busy, saturated, unavailable), the price per million tokens and the context length. On 23 October there were 14 models, from small ones such as Mistral Nemo up to Qwen3.5-397B, DeepSeek V3.2 and Kimi K3.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the TEE does and does not give you
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /v1/attestation&lt;/code&gt; returns the Intel and NVIDIA evidence of the running instances, bound to a nonce you choose. It proves genuine TDX guests with confidential-computing GPUs. It does not prove which instance served a given response, nor which code runs inside. If you need to check the hardware evidence yourself, offline, the open-source &lt;a href="https://github.com/VoltageGPU/voltage-verify" rel="noopener noreferrer"&gt;voltage-verify&lt;/a&gt; verifies an Intel TDX quote and NVIDIA attestation tokens against a manifest you control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same thing with LiteLLM, LangChain or LlamaIndex
&lt;/h2&gt;

&lt;p&gt;Because the API is OpenAI-compatible, the usual integrations work by pointing them at the base URL. Tested examples for each, with their unedited output, are in the cookbook: &lt;a href="https://github.com/VoltageGPU/voltagegpu-cookbook" rel="noopener noreferrer"&gt;github.com/VoltageGPU/voltagegpu-cookbook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build VoltageGPU.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>privacy</category>
      <category>python</category>
    </item>
    <item>
      <title>Read an Intel TDX Quote, Field by Field</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:21:50 +0000</pubDate>
      <link>https://dev.to/voltagegpu/read-an-intel-tdx-quote-field-by-field-56nn</link>
      <guid>https://dev.to/voltagegpu/read-an-intel-tdx-quote-field-by-field-56nn</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://voltagegpu.com/blog/read-intel-tdx-quote-field-by-field" rel="noopener noreferrer"&gt;voltagegpu.com&lt;/a&gt;, where the bundle and every raw file are linked.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every value below comes from one public quote, checked with voltage-verify 0.2.2.&lt;/li&gt;
&lt;li&gt;Six things matter to a tenant: MRTD, RTMR0 to RTMR3, REPORTDATA, the TD attributes, the TCB status and the certificate chain.&lt;/li&gt;
&lt;li&gt;Each proves something narrow. None shows that the VM runs software you trust.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;voltage-verify reduces a TDX quote to one line: &lt;code&gt;RESULT: VERIFIED&lt;/code&gt;. Here we open one: a quote captured on 17 September 2026 in a VoltageGPU Confidential VM with one NVIDIA RTX PRO 6000 Blackwell Server Edition. We check it, then read each field for what it proves and what it does not. The bundle is public; all outputs date from 22 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a TDX quote is, and who signs it
&lt;/h2&gt;

&lt;p&gt;Intel TDX runs a VM as a trust domain (TD). A CPU-attested software module, the TDX module, sits between the host and the guest. It gives the guest a TD report: the TD's measurements, the platform's security versions and 64 bytes chosen by the guest, called REPORTDATA. A MAC protects the report, and only the local platform can check it.&lt;/p&gt;

&lt;p&gt;So a Quoting Enclave, an Intel SGX enclave on the same host, checks the report and turns it into a quote anyone can verify. A version 4 quote has three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a 48-byte header: version 4, key type 2 (ECDSA P-256), TEE type 0x81 (TDX);&lt;/li&gt;
&lt;li&gt;the 584-byte TD report;&lt;/li&gt;
&lt;li&gt;the signature data: quote signature, attestation key, the Quoting Enclave's report and the platform's certificate chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The attestation key signs the header and the TD report. The Quoting Enclave's report vouches for that key: its data starts with a SHA-256 of the key and the enclave's authentication data. The platform's PCK key signs that report. Intel issues the PCK certificate, whose chain ends at the Intel SGX Root CA. VoltageGPU appears nowhere in this chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: verify the bundle
&lt;/h2&gt;

&lt;p&gt;The bundle holds the quote, a manifest, NVIDIA's GPU tokens and Intel's documents from the day of capture (&lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-09-17/README.txt" rel="noopener noreferrer"&gt;README&lt;/a&gt;). The commands are written for Linux and macOS. We ran them on Windows 11 in Git Bash, where the interpreter is &lt;code&gt;python&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify&amp;gt;=0.2.2"&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSLO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-09-17/bundle.json
voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; d807768657e40ee62d430d9dc5eb924d520ba1d07e351bc44ee59dbe611085a7 &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GB20X &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it printed on 22 October 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] manifest.format       manifest is well formed
[PASS] manifest.commitments  bundle commitments match the manifest
[PASS] manifest.challenge    challenge is the one this verifier issued
[PASS] tdx.structure         TDX quote v4, TEE 0x81, 4940 bytes
[PASS] tdx.debug             TD attributes 0000001000000000 (0x10000000), DEBUG (bit 0) off: not a debug TD
[PASS] tdx.report_data       quote report_data equals SHA-512 of the manifest
[PASS] tdx.signatures        attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[PASS] tdx.collateral        TCB info and QE identity signed by Intel (Intel PCS, fetched now)
[PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_03 UpToDate
[PASS] tdx.revocation        PCK certificate not revoked (57 entries in CRL)
[PASS] tdx.revocation        PCK CA certificate not revoked (0 entries in CRL)
[PASS] nvidia.signatures     2 NVIDIA-signed tokens verify, keys from the bundle chained to the pinned NRAS intermediate (NVIDIA's live JWKS fetched for its intermediates)
[PASS] nvidia.nonce          NRAS eat_nonce equals SHA-256 of the manifest
[PASS] nvidia.policy         overall result true, every GPU: measurements ok, secure boot on, debug off, nonce matched, report signature and chain validated
[PASS] nvidia.freshness      token issued 0s from bundle creation

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB UpToDate  QE UpToDate
GPU: GPU-0 GB20X driver 595.71.05 vbios 98.02.9E.00.01 measurements success

RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fifteen checks pass. This article reads the &lt;code&gt;tdx.*&lt;/code&gt; lines. The &lt;code&gt;nvidia.*&lt;/code&gt; lines are covered in the &lt;a href="https://voltagegpu.com/blog/verify-confidential-gpu-attestation-offline" rel="noopener noreferrer"&gt;bundle tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: print every field
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;--json&lt;/code&gt;, voltage-verify lists the main fields under &lt;code&gt;facts.tdx&lt;/code&gt;, not the whole TD report or the certificates. This script prints everything, using the standard library and &lt;code&gt;cryptography&lt;/code&gt;, which voltage-verify installs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Print every field of the Intel TDX quote carried by a voltage-verify bundle.

Usage: python3 -I read_quote.py bundle.json
Layout of a TDX quote v4: a 48-byte header, the 584-byte TD report, then the
signature data. Standard library only, plus `cryptography` (installed with
voltage-verify) to read the certificates.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cryptography&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cryptography.hazmat.primitives&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashes&lt;/span&gt;

&lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tdx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote_b64&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b64&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tee_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;HHI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;header: version &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, key type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, TEE type 0x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tee_type&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# TD report fields: (name, offset in the quote, size in bytes)
&lt;/span&gt;&lt;span class="n"&gt;FIELDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TEE_TCB_SVN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MRSEAM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MRSIGNERSEAM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SEAMATTRIBUTES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TDATTRIBUTES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XFAM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;176&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MRTD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;184&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MRCONFIGID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MROWNER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MROWNERCONFIG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;328&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTMR0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;376&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTMR1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTMR2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTMR3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REPORTDATA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;568&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;FIELDS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;attrs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;176&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;little&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TD attributes 0x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: DEBUG (bit 0) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, SEPT_VE_DISABLE (bit 28) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;canonical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manifest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;separators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REPORTDATA == SHA-512(manifest):&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha512&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;568&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;632&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;sig_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;I&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;632&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;636&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;636&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sig_len&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# quote signature (64), attestation key (64), certification data
&lt;/span&gt;&lt;span class="n"&gt;cert_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cert_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;HI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cert_len&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# QE report (384), its signature (64), auth data, PCK chain
&lt;/span&gt;&lt;span class="n"&gt;prod_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isv_svn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;HH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signature data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sig_len&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes, certification data type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QE report: MRSIGNER &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;qe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, ISVPRODID &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prod_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, ISVSVN &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;isv_svn&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;auth_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;448&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;inner_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inner_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;HI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;auth_len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;456&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;auth_len&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;456&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;auth_len&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;inner_len&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;certification data type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inner_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_pem_x509_certificates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfc4514_string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (valid until &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;not_valid_after_utc&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;root SHA-256:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fingerprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SHA256&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;python3 -I read_quote.py bundle.json&lt;/code&gt; printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header: version 4, key type 2, TEE type 0x81, 4940 bytes
TEE_TCB_SVN    05030400000000000000000000000000
MRSEAM         476a2997c62bccc78370913d0a80b956e3721b24272bc66c4d6307ced4be2865c40e26afac75f12df3425b03eb59ea7c
MRSIGNERSEAM   000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
SEAMATTRIBUTES 0000000000000000
TDATTRIBUTES   0000001000000000
XFAM           e702060000000000
MRTD           eea8b6a814569a52bd1e12f6b869bb2d9c0c8a7a43e658ffc3b42c199f116157ea7f04d359c7fdfd8ac483152cc13542
MRCONFIGID     000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MROWNER        000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MROWNERCONFIG  000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
RTMR0          f9ac3522e05572c2ede103eb9f243bebddee62d8e8db65a526736ea2bd5eb6dbe69a5ff8082c8050865b5ddadae4fa8a
RTMR1          965b54adf526d37237906189a31d9b058c39fac8909d9689e3340505aac4176deed2c2f3374b226304b23137d4832ae9
RTMR2          c2f56e0459db5660608f8f3a312f67decc0d210d55e93d3d106fe7f939941c524b0b370d53c4a6d6290e2df3b9511397
RTMR3          000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
REPORTDATA     832791479ad739ef2c1d51e1fb1da7a7a1422b6c88afaf2ca1c292f1ae9ee7dbe5e571b9926390cfdd7f62672c696ccda0c004a0c779a30c16ff80ce461790b8
TD attributes 0x10000000: DEBUG (bit 0) = 0, SEPT_VE_DISABLE (bit 28) = 1
REPORTDATA == SHA-512(manifest): True
signature data: 4304 bytes, certification data type 6
QE report: MRSIGNER dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c5, ISVPRODID 2, ISVSVN 7
certification data type 5:
  C=US,ST=CA,L=Santa Clara,O=Intel Corporation,CN=Intel SGX PCK Certificate  (valid until 2033-03-13)
  C=US,ST=CA,L=Santa Clara,O=Intel Corporation,CN=Intel SGX PCK Platform CA  (valid until 2033-05-21)
  C=US,ST=CA,L=Santa Clara,O=Intel Corporation,CN=Intel SGX Root CA  (valid until 2049-12-31)
root SHA-256: 44a0196b2b99f889b8e149e95b807a350e7424964399e885a7cbb8ccfab674d3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The offsets match voltage-verify's parser (TD attributes at byte 168, REPORTDATA at 568), and the sizes add up: 48 + 584 + 4 (a length field) + 4,304 = 4,940 bytes. MRCONFIGID, MROWNER and MROWNERCONFIG, immutable software-defined IDs in Linux's description, are zero: they carry nothing here. We do not interpret XFAM or SEAMATTRIBUTES.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1v98yhhsk771am1itvjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1v98yhhsk771am1itvjz.png" alt="Anatomy of an Intel TDX quote v4 of 4,940 bytes: a 48-byte header and the 584-byte TD report, both covered by the quote signature, then a 4-byte length and 4,304 bytes of signature data. TDATTRIBUTES, MRTD, RTMR0 to RTMR3 and REPORTDATA are the fields a tenant checks; the signature chain runs from the attestation key through the QE report and the PCK certificate to the pinned Intel SGX Root CA." width="800" height="550"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The quote of the 17 Sep 2026 bundle, byte by byte. Offsets as read by read_quote.py above. The cloud provider is not in the signature chain.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The fields, one by one
&lt;/h2&gt;
&lt;h3&gt;
  
  
  MRTD: what the TD started from
&lt;/h3&gt;

&lt;p&gt;Value: &lt;code&gt;eea8b6a8…2cc13542&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The TDX module computes MRTD while the host builds the TD, before the TD runs. Linux documents it as the measurement of the TD's initial contents: its initial configuration and firmware image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it proves.&lt;/strong&gt; The TD started from contents with this hash, measured by the TDX module, not reported by the host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not prove.&lt;/strong&gt; That this firmware is one you trust: that needs a reference value, ideally rebuilt from source, and we publish none for this image. Our data only shows stability: the same MRTD appears in all four RTX PRO 6000 bundles we have published.&lt;/p&gt;
&lt;h3&gt;
  
  
  RTMR0 to RTMR3: the boot chain
&lt;/h3&gt;

&lt;p&gt;Values: RTMR0 &lt;code&gt;f9ac3522…dae4fa8a&lt;/code&gt;, RTMR1 &lt;code&gt;965b54ad…d4832ae9&lt;/code&gt;, RTMR2 &lt;code&gt;c2f56e04…b9511397&lt;/code&gt;, RTMR3 all zeros.&lt;/p&gt;

&lt;p&gt;RTMRs are run-time registers that software in the TD can extend, mixing new data into the current value. The UEFI specification (2.10, section 38.4.1), as implemented in the EDK2 firmware, maps PCR 1 and 7 to RTMR0, PCR 2 to 6 to RTMR1 and PCR 8 to 15 to RTMR2. Nothing maps to RTMR3. Typically, RTMR0 holds the firmware configuration, RTMR1 the boot loader and kernel, RTMR2 the kernel command line and initrd.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they prove.&lt;/strong&gt; The boot events recorded by firmware and the boot loader hash to these values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do not prove.&lt;/strong&gt; Which events those were. A hash chain cannot be read backwards: you replay the firmware's event log and compare, and the bundle does not include that log.&lt;/p&gt;

&lt;p&gt;The published bundles show the limit. RTMR0 and RTMR1 are identical in all four, RTMR3 is zero in all four, and RTMR2 differs every time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle&lt;/th&gt;
&lt;th&gt;RTMR2, first 16 hex digits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;17 Sep, 00:00 UTC (this one)&lt;/td&gt;
&lt;td&gt;c2f56e0459db5660&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 Sep, 12:28 UTC (deployed by API)&lt;/td&gt;
&lt;td&gt;c67f740f73f8d900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9 Oct&lt;/td&gt;
&lt;td&gt;d9d5a5c17828c2b8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 Oct (weekly run)&lt;/td&gt;
&lt;td&gt;49b10f1d50c9b0fe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We have not published the event log that would explain the change. Pinning RTMR2 would have accepted at most one of these VMs. Pinning MRTD, RTMR0 and RTMR1 would have accepted all four; expect them to change with image updates.&lt;/p&gt;
&lt;h3&gt;
  
  
  REPORTDATA: your challenge
&lt;/h3&gt;

&lt;p&gt;Value: &lt;code&gt;83279147…461790b8&lt;/code&gt; (64 bytes).&lt;/p&gt;

&lt;p&gt;The guest software chooses these 64 bytes. voltage-verify writes there the SHA-512 of the manifest, serialized canonically (keys sorted, no spaces, UTF-8). The manifest holds a 32-byte challenge, here &lt;code&gt;d8077686…611085a7&lt;/code&gt;, and the script confirms the hash. The SHA-256 of the same manifest is the nonce in NVIDIA's GPU tokens: that manifest is the only link between the two proofs.&lt;/p&gt;

&lt;p&gt;A challenge the bundle was not made for fails (output trimmed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ voltage-verify verify bundle.json --offline --challenge 0000000000000000000000000000000000000000000000000000000000000000
[FAIL] manifest.challenge    challenge differs from the one this verifier issued (replay or foreign bundle)
RESULT: NOT VERIFIED (manifest.challenge)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it proves.&lt;/strong&gt; The quote was requested for this exact manifest. If you generated the challenge, the quote was produced after you asked, not replayed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not prove.&lt;/strong&gt; Freshness to you, unless the challenge is yours: here it was drawn inside the VM. Generate yours on your machine; the published script &lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/two-proofs-in-the-vm.sh" rel="noopener noreferrer"&gt;two-proofs-in-the-vm.sh&lt;/a&gt; accepts it as &lt;code&gt;CHALLENGE&lt;/code&gt;. The field also means only what the guest software decided: our &lt;a href="https://voltagegpu.com/inference-proofs/2026-10-16" rel="noopener noreferrer"&gt;inference run of 16 October&lt;/a&gt; puts a SHA-256 of a nonce and the instance's public key in its first 32 bytes.&lt;/p&gt;

&lt;h3&gt;
  
  
  TD attributes: the debug bit
&lt;/h3&gt;

&lt;p&gt;Value: &lt;code&gt;0000001000000000&lt;/code&gt;, read as a little-endian 64-bit integer: &lt;code&gt;0x10000000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Only bit 28 is set. Linux calls it SEPT_VE_DISABLE; in Linux 6.8, a guest not in debug mode panics at boot without it (this guest runs 6.8.0-110-generic). Bit 0, DEBUG, is 0.&lt;/p&gt;

&lt;p&gt;A debug TD gives no confidentiality: the host can read and modify its memory and CPU state, and Intel's Quoting Enclave still signs its quote. voltage-verify 0.2.1 and earlier printed this field without checking it. Version 0.2.2, released on 21 October 2026, fails a quote with bit 0 set unless you pass &lt;code&gt;--allow-debug&lt;/code&gt;. Here is a copy of the quote with bit 0 flipped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 -I -c "import json,base64;s=json.load(open('bundle.json'))['tdx']['quote_b64'];open('quote.bin','wb').write(base64.b64decode(s+'='*(-len(s)%4)))"
$ python3 -I -c "q=bytearray(open('quote.bin','rb').read()); q[168]|=1; open('quote-debug.bin','wb').write(q)"
$ voltage-verify quote quote-debug.bin --offline
[PASS] tdx.structure   TDX quote v4, TEE 0x81, 4940 bytes
[FAIL] tdx.debug       TD attributes 0100001000000000 (0x10000001), DEBUG (bit 0) ON: a debug TD gives no confidentiality, the host can read and modify its memory
[FAIL] tdx.signatures  quote signature does not verify with the attestation key: 

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB ?  QE ?

RESULT: NOT VERIFIED (tdx.debug, tdx.signatures)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tdx.debug&lt;/code&gt; fails because the bit is set; &lt;code&gt;tdx.signatures&lt;/code&gt; fails because the attestation key signed the original bytes. A genuine debug TD has a validly signed quote, so only &lt;code&gt;tdx.debug&lt;/code&gt; would catch it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it proves.&lt;/strong&gt; The TD was not created in debug mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not prove.&lt;/strong&gt; Anything about the software inside it.&lt;/p&gt;

&lt;h3&gt;
  
  
  TCB status: is the platform current?
&lt;/h3&gt;

&lt;p&gt;TEE_TCB_SVN, &lt;code&gt;05030400000000000000000000000000&lt;/code&gt;, records the TDX module's security version at TD launch. voltage-verify reads the module's major version from its second byte (03, hence &lt;code&gt;TDX_03&lt;/code&gt;) and its security version from the first (05). The PCK certificate adds the CPU's SGX security versions and the FMSPC, &lt;code&gt;20a06d080000&lt;/code&gt;, which identifies the platform family.&lt;/p&gt;

&lt;p&gt;Intel publishes signed TCB info per FMSPC: a list of levels, newest first, where the first level the platform meets gives its status. In the copy stored in the bundle (issued 16 September 2026), the UpToDate level, dated 13 August 2025, requires TDX components of at least 05 00 04. This quote has 05 03 04.&lt;/p&gt;

&lt;p&gt;Online on 22 October, Intel's current documents give &lt;code&gt;platform TCB UpToDate, QE UpToDate, TDX_03 UpToDate&lt;/code&gt;, with no advisory IDs. Offline, the stored documents give the same verdict plus a warning, as they passed their &lt;code&gt;nextUpdate&lt;/code&gt; date on 16 October 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARN] tdx.collateral_fresh  Intel collateral is past its nextUpdate; refetch online
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it proves.&lt;/strong&gt; On the date of Intel's documents, Intel rated the platform, the TDX module and the Quoting Enclave UpToDate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not prove.&lt;/strong&gt; That this lasts. In the same TCB info, the level dated 14 May 2025 is rated OutOfDate. An offline check is only as current as the documents it reads.&lt;/p&gt;

&lt;h3&gt;
  
  
  The certificate chain: who vouches
&lt;/h3&gt;

&lt;p&gt;The script output ends with the chain: PCK Certificate, PCK Platform CA, Intel SGX Root CA. voltage-verify checks each signature and validity date, and compares the root with the copy of Intel's root it ships, pinned by its SHA-256 (&lt;code&gt;44a0196b…fab674d3&lt;/code&gt;). The Quoting Enclave's MRSIGNER (&lt;code&gt;dc9e2a7c…0e54a8c5&lt;/code&gt;) and product ID (2) match Intel's signed identity for it, and its security version (7) meets the UpToDate level (4 in the stored identity). Last, the PCK certificate is not among the 57 entries of Intel's revocation list, and the root's list is empty. &lt;code&gt;voltage-verify selftest&lt;/code&gt; also alters one byte of the quote body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] quote-tamper       one byte of the TDX quote body altered  -&amp;gt;  rejected on tdx.signatures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it proves.&lt;/strong&gt; A genuine Intel platform, with an identity Intel issued, signed this quote, and the quote has not changed since.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not prove.&lt;/strong&gt; Who operates the machine, or where. The certificates name Intel, not a cloud provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;Together, the fields prove that on 17 September 2026 a trust domain, not in debug mode, ran on an Intel platform that Intel rated UpToDate, with the measurements above, and produced this quote for this manifest.&lt;/p&gt;

&lt;p&gt;They do not prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that the firmware and kernel are ones you trust: no reference values are published for this image, and RTMR2 changes from one VM to the next;&lt;/li&gt;
&lt;li&gt;anything about the GPU: the NVIDIA tokens are a separate proof, tied to the quote only by the manifest, so the two are not shown to share a machine;&lt;/li&gt;
&lt;li&gt;which code ran after boot: RTMR3 is zero and the manifest names no image;&lt;/li&gt;
&lt;li&gt;freshness to you, since this challenge was drawn inside the VM;&lt;/li&gt;
&lt;li&gt;the state of the TD today: a quote describes the TD when it was produced.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;Tested on 22 October 2026 on Windows 11 (Git Bash, Python 3.12.4), with &lt;code&gt;python&lt;/code&gt; for &lt;code&gt;python3&lt;/code&gt; and &lt;code&gt;. vv/Scripts/activate&lt;/code&gt; for the venv.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv vv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; vv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify&amp;gt;=0.2.2"&lt;/span&gt;
&lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-09-17
curl &lt;span class="nt"&gt;-fsSLO&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$B&lt;/span&gt;&lt;span class="s2"&gt;/bundle.json"&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSLO&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$B&lt;/span&gt;&lt;span class="s2"&gt;/SHA256SUMS"&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;' bundle.json$'&lt;/span&gt; SHA256SUMS | &lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; -
&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d807768657e40ee62d430d9dc5eb924d520ba1d07e351bc44ee59dbe611085a7
voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; &lt;span class="nv"&gt;$C&lt;/span&gt; &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GB20X &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; &lt;span class="nv"&gt;$C&lt;/span&gt; &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
voltage-verify selftest bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--challenge&lt;/span&gt; &lt;span class="nv"&gt;$C&lt;/span&gt;
python3 &lt;span class="nt"&gt;-I&lt;/span&gt; read_quote.py bundle.json   &lt;span class="c"&gt;# the script from Step 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: &lt;code&gt;bundle.json: OK&lt;/code&gt;, &lt;code&gt;RESULT: VERIFIED&lt;/code&gt;, &lt;code&gt;"ok": true&lt;/code&gt; with the &lt;code&gt;tdx.collateral_fresh&lt;/code&gt; warning, &lt;code&gt;SELFTEST: PASS&lt;/code&gt;, then the fields of Step 2. To compare RTMR2, run the script on the bundles in &lt;code&gt;rtx6000b-api-2026-09-17/&lt;/code&gt; and &lt;code&gt;rtx6000b-2026-10-09/&lt;/code&gt;, next to this one, and on the weekly run listed on &lt;a href="https://voltagegpu.com/proofs" rel="noopener noreferrer"&gt;/proofs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voltagegpu.com/proofs" rel="noopener noreferrer"&gt;/proofs&lt;/a&gt;: every proof we publish, with the command that rechecks it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voltagegpu.com/blog/two-proofs/voltage-verify" rel="noopener noreferrer"&gt;voltage-verify&lt;/a&gt;: what the tool checks, its changelog and its source (MIT).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voltagegpu.com/inference-proofs/2026-10-16" rel="noopener noreferrer"&gt;Inference proofs, 16 October 2026&lt;/a&gt;: the same Intel checks on every instance serving three TEE models, with another REPORTDATA convention.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>security</category>
      <category>gpu</category>
      <category>python</category>
      <category>confidentialcomputing</category>
    </item>
    <item>
      <title>Re-check a Published GPU Hardware Check, Line by Line</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:27:25 +0000</pubDate>
      <link>https://dev.to/voltagegpu/re-check-a-published-gpu-hardware-check-line-by-line-4ilo</link>
      <guid>https://dev.to/voltagegpu/re-check-a-published-gpu-hardware-check-line-by-line-4ilo</guid>
      <description>&lt;p&gt;On 16 and 17 October 2026 we rented one standard machine per GPU model and ran hwcheck on each. hwcheck is our open-source hardware check. The outputs are public. This tutorial takes one of them, the H100 run, and shows what you can check from the public files alone. You can confirm that the script is the open-source one. You can confirm that the printed result follows from its rules. You can see how the same tool behaves on your own machine. Then come the limits, and they are real: a published output is a text file, not a signature.&lt;/p&gt;

&lt;p&gt;If you only want the one-liner to run on a machine you rent, &lt;a href="https://voltagegpu.com/blog/verify-rented-gpu-matches-listing" rel="noopener noreferrer"&gt;How to Check the GPU You Rented Is the One You Paid For&lt;/a&gt; explains it. Every command below was run on 20 October 2026 on Ubuntu 24.04, in a fresh directory, exactly as printed. Outputs are pasted as printed, except our workstation's name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: read the published run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;hwcheck-audit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;hwcheck-audit
curl &lt;span class="nt"&gt;-sSfO&lt;/span&gt; https://voltagegpu.com/hwcheck-proofs/2026-10-17/h100.txt
&lt;span class="nb"&gt;cat &lt;/span&gt;h100.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VoltageGPU hwcheck proof
date: 2026-10-17T18:20:18.246Z
machine: d4093d0c-8d7c-448a-b4e0-a34e44468ea8 (standard tier, rented directly from our standard provider: the machines our listing shows)
listing: 1x H100 (rented on a node of 8 GPUs)
command: curl -fsSL https://voltagegpu.com/hwcheck.sh | bash -s -- --gpu "H100" --gpus 1 --no-net
exit code: 0 (0 = matches the listing, 2 = does not)
VoltageGPU hardware check (read-only, nothing about this machine is sent anywhere)
  2026-10-17 18:20 UTC · 09c3eb27fd21

                 LISTED                   MEASURED                           
  GPU model      H100                     NVIDIA H100 80GB HBM3              OK
  GPU count      1                        1                                  OK
  VRAM per GPU   -                        80 GB                              info
  Driver / CUDA                           580.173.02 / 13.0                  OK
  CUDA compute                            matmul on 1/1 GPU                  OK
  CPU                                     192 threads                        info
  RAM            -                        124 GB (container limit)           info
  Disk (/)       -                        118 GB, 118 GB free                info

RESULT: MATCHES THE LISTING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first six lines were written by our publishing script. The machine was one GPU of an 8-GPU node, rented directly from the provider behind our standard listing, not through a customer account. The command passed the model and the GPU count, and nothing else. The rest is what hwcheck printed. The short hex string after the date is the machine's hostname. The &lt;a href="https://voltagegpu.com/hwcheck-proofs/2026-10-17/README.txt" rel="noopener noreferrer"&gt;index of the 17 October runs&lt;/a&gt; lists the other models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: check that the script is the open-source one
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh &lt;span class="nt"&gt;-o&lt;/span&gt; hwcheck-site.sh
git clone &lt;span class="nt"&gt;-q&lt;/span&gt; https://github.com/VoltageGPU/hwcheck
&lt;span class="nb"&gt;sha256sum &lt;/span&gt;hwcheck-site.sh hwcheck/hwcheck.sh
git &lt;span class="nt"&gt;-C&lt;/span&gt; hwcheck log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%h %ad %s'&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;iso-strict &lt;span class="nt"&gt;--&lt;/span&gt; hwcheck.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a8120ccf8b1a33034ed836cbbd6ed5c55b901bafbfce8321c07c769d8053feeb  hwcheck-site.sh
a8120ccf8b1a33034ed836cbbd6ed5c55b901bafbfce8321c07c769d8053feeb  hwcheck/hwcheck.sh
9378d1a 2026-10-16T08:43:58+02:00 hwcheck 1.0: check a rented GPU machine against its listing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file the site serves today is byte for byte the one on GitHub. The repository has a single version of the script, committed on 16 October, the day before the H100 run. The two test runs we published that morning print the first 16 hex characters of the script's hash, and they match: &lt;code&gt;a8120ccf8b1a3303&lt;/code&gt; (&lt;a href="https://voltagegpu.com/hwcheck-proofs/2026-10-16/rtx3060ti-match.txt" rel="noopener noreferrer"&gt;rtx3060ti-match.txt&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;What this cannot show is which file the site served on 17 October. Git dates are also declared by whoever commits. They are a record, not a proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: compare a published file with the repository copy
&lt;/h2&gt;

&lt;p&gt;The 16 October runs are also in the repository's &lt;code&gt;examples/&lt;/code&gt; folder. Take the RTX 4090 run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://voltagegpu.com/hwcheck-proofs/2026-10-16/rtx-4090.txt | &lt;span class="nb"&gt;sha256sum
sha256sum &lt;/span&gt;hwcheck/examples/rtx-4090.txt
git &lt;span class="nt"&gt;-C&lt;/span&gt; hwcheck log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%h %ad %s'&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;iso-strict &lt;span class="nt"&gt;--&lt;/span&gt; examples/rtx-4090.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2884bfeed0f5e18dbd39a75d3ae586e522eba367f023901a74e03f248d0f9408  -
2884bfeed0f5e18dbd39a75d3ae586e522eba367f023901a74e03f248d0f9408  hwcheck/examples/rtx-4090.txt
fa2e458 2026-10-16T17:03:06+02:00 docs: four real runs on rented RTX 4090, RTX 5090, H200 and B300 machines, all matching
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two copies are identical. The repository copy was committed at 15:03 UTC, ten minutes after the run's timestamp (14:53 UTC). If we edited the site copy later, it would stop matching. Both copies still come from us, so this is not independent evidence. The 17 October runs, the H100 included, exist only on the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: see which lines were actually compared
&lt;/h2&gt;

&lt;p&gt;Not every row in the output is a check. The script shows which ones are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'row "(VRAM per GPU|Driver / CUDA|CUDA compute)"'&lt;/span&gt; hwcheck-site.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;71:    if at_least "$VRAM_GB" "$VRAM" 0.93; then row "VRAM per GPU" "$VRAM GB" "$VRAM_GB GB" "OK"
72:    else row "VRAM per GPU" "$VRAM GB" "$VRAM_GB GB" "DOES NOT MATCH"; fail "VRAM"; fi
73:  else row "VRAM per GPU" "-" "$VRAM_GB GB" "info"; fi
75:  row "Driver / CUDA" "" "${DRIVER:-?} / ${CUDA:-?}" "OK"
97:  if [ "$OKGPUS" -ge "$COUNT" ]; then row "CUDA compute" "" "matmul on $OKGPUS/$COUNT GPU" "OK"
98:  else row "CUDA compute" "" "matmul on $OKGPUS/$COUNT GPU" "DOES NOT MATCH"; fail "CUDA compute"; fi
100:  row "CUDA compute" "" "not tested (no PyTorch)" "info"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read against the H100 run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU model&lt;/strong&gt;: compared. The rule is in step 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU count&lt;/strong&gt;: compared. The machine must show at least the listed number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VRAM per GPU&lt;/strong&gt;: compared only when &lt;code&gt;--vram&lt;/code&gt; is passed (line 71). The H100 run did not pass it, so "80 GB" is information (line 73).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Driver / CUDA&lt;/strong&gt;: always OK once &lt;code&gt;nvidia-smi&lt;/code&gt; answers (line 75). It is information, not a check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUDA compute&lt;/strong&gt;: a 2048 by 2048 matrix product on each GPU, when the image has PyTorch. "matmul on 1/1 GPU" means it ran on the one GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU, RAM, disk&lt;/strong&gt;: information, unless &lt;code&gt;--ram&lt;/code&gt; or &lt;code&gt;--disk&lt;/code&gt; is passed. Neither was.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No download line&lt;/strong&gt;: &lt;code&gt;--no-net&lt;/code&gt; skips the speed test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So in this run, three things were checked against the listing: the model name, the GPU count, and that CUDA work runs on every GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: replay the model rule
&lt;/h2&gt;

&lt;p&gt;The model check is two small shell functions. Extract them and feed them names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'/^norm()/p; /^model_matches()/,/^}/p'&lt;/span&gt; hwcheck-site.sh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; match.sh
&lt;span class="nb"&gt;.&lt;/span&gt; ./match.sh
&lt;span class="k"&gt;for &lt;/span&gt;pair &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"H100|NVIDIA H100 80GB HBM3"&lt;/span&gt; &lt;span class="s2"&gt;"RTX 4090|NVIDIA GeForce RTX 3060 Ti"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
            &lt;span class="s2"&gt;"H100|NVIDIA H100 PCIe"&lt;/span&gt; &lt;span class="s2"&gt;"H100 80GB HBM3|NVIDIA H100 PCIe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;listed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;%%|*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;measured&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;#*|&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;model_matches &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$listed&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$measured&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OK&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;else &lt;/span&gt;&lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DOES NOT MATCH"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%-16s vs %-28s %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$listed&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$measured&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H100             vs NVIDIA H100 80GB HBM3        OK
RTX 4090         vs NVIDIA GeForce RTX 3060 Ti   DOES NOT MATCH
H100             vs NVIDIA H100 PCIe             OK
H100 80GB HBM3   vs NVIDIA H100 PCIe             DOES NOT MATCH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every word of the listed name that contains a digit must appear in the name the driver reports. The first line is the published H100 run: it follows from the rule. The second is the case the tool exists for: a cheaper card under a bigger name. The last two show the rule's reach. "H100" alone also accepts a card whose driver reports "NVIDIA H100 PCIe", a different board. Passing the full name, "H100 80GB HBM3", rejects it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: run it on your own machine
&lt;/h2&gt;

&lt;p&gt;This needs a Linux machine with an NVIDIA GPU. Ours is a workstation with an RTX 3060 Ti, under WSL2, without PyTorch. First the true listing, then a false one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--gpu&lt;/span&gt; &lt;span class="s2"&gt;"RTX 3060 Ti"&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1 &lt;span class="nt"&gt;--vram&lt;/span&gt; 8 &lt;span class="nt"&gt;--no-net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exit code: &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://voltagegpu.com/hwcheck.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--gpu&lt;/span&gt; &lt;span class="s2"&gt;"RTX 4090"&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1 &lt;span class="nt"&gt;--vram&lt;/span&gt; 24 &lt;span class="nt"&gt;--no-net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"exit code: &lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VoltageGPU hardware check (read-only, nothing about this machine is sent anywhere)
  2026-10-20 13:13 UTC · &amp;lt;hostname&amp;gt;

                 LISTED                   MEASURED                           
  GPU model      RTX 3060 Ti              NVIDIA GeForce RTX 3060 Ti         OK
  GPU count      1                        1                                  OK
  VRAM per GPU   8 GB                     8 GB                               OK
  Driver / CUDA                           610.88 / ?                         OK
  CUDA compute                            not tested (no PyTorch)            info
  CPU                                     12 threads                         info
  RAM            -                        16 GB                              info
  Disk (/)       -                        1007 GB, 936 GB free               info

RESULT: MATCHES THE LISTING
exit code: 0
VoltageGPU hardware check (read-only, nothing about this machine is sent anywhere)
  2026-10-20 13:13 UTC · &amp;lt;hostname&amp;gt;

                 LISTED                   MEASURED                           
  GPU model      RTX 4090                 NVIDIA GeForce RTX 3060 Ti         DOES NOT MATCH
  GPU count      1                        1                                  OK
  VRAM per GPU   24 GB                    8 GB                               DOES NOT MATCH
  Driver / CUDA                           610.88 / ?                         OK
  CUDA compute                            not tested (no PyTorch)            info
  CPU                                     12 threads                         info
  RAM            -                        16 GB                              info
  Disk (/)       -                        1007 GB, 936 GB free               info

RESULT: DOES NOT MATCH THE LISTING (GPU model, VRAM)
Release the pod from your dashboard and write to contact@voltagegpu.com with this output.
exit code: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These match the two workstation files we published on 16 October (&lt;a href="https://voltagegpu.com/hwcheck-proofs/2026-10-16/rtx3060ti-match.txt" rel="noopener noreferrer"&gt;match&lt;/a&gt;, &lt;a href="https://voltagegpu.com/hwcheck-proofs/2026-10-16/rtx3060ti-mismatch.txt" rel="noopener noreferrer"&gt;mismatch&lt;/a&gt;). Only the date and the free disk space differ. Note the "Driver / CUDA" row. The CUDA version shows as "?" because this driver's &lt;code&gt;nvidia-smi&lt;/code&gt; labels it "CUDA UMD Version: 13.3", and the script looks for "CUDA Version:". The row still says OK, as line 75 predicts. Because the exit code is 0 or 2, you can put the command at the top of a startup script and stop as soon as a machine is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Proved from the public files:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The script on the site is byte for byte the only version in the public repository, which was committed before the H100 run.&lt;/li&gt;
&lt;li&gt;The published H100 result follows from that script's rules and the printed values. The driver name contains "H100", one GPU is visible, and a CUDA matrix product ran on it.&lt;/li&gt;
&lt;li&gt;The tool says DOES NOT MATCH, and exits 2, when a card is listed under a bigger name. You can see that on your own machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not proved:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;That the published file is the unedited output of a real run.&lt;/strong&gt; It is plain text, not signed. For that you trust us. The 16 October runs have a second copy in git; the H100 file does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which script ran on 17 October.&lt;/strong&gt; You can only check that today's site copy equals the public one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything a host determined to cheat would hide.&lt;/strong&gt; hwcheck reads what the driver reports, and whoever controls the machine can change that. Proof against the operator needs hardware attestation: a confidential VM where NVIDIA's service signs the GPU's evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VRAM, RAM and disk in the H100 run.&lt;/strong&gt; They were printed, not compared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which H100 board it was.&lt;/strong&gt; The rule accepts any name containing "h100". The printed name, "NVIDIA H100 80GB HBM3", is the only clue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything about another machine, or this one later.&lt;/strong&gt; It is one machine at one moment, and the run used a direct rental, not a customer account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidentiality.&lt;/strong&gt; Standard machines have no enclave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The run that counts is yours: rent the machine, pass every value from its listing (&lt;code&gt;--gpu&lt;/code&gt;, &lt;code&gt;--gpus&lt;/code&gt;, &lt;code&gt;--vram&lt;/code&gt;, &lt;code&gt;--ram&lt;/code&gt;, &lt;code&gt;--disk&lt;/code&gt;), and keep the output. If you need proof that does not rest on what the host's driver says, rent a Confidential VM and generate the attestation yourself: &lt;a href="https://voltagegpu.com/quickstart" rel="noopener noreferrer"&gt;https://voltagegpu.com/quickstart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, which published these runs. hwcheck is open source (MIT).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gpu</category>
      <category>linux</category>
      <category>bash</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Verify a Confidential AI Inference Attestation Yourself</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:26:19 +0000</pubDate>
      <link>https://dev.to/voltagegpu/verify-a-confidential-ai-inference-attestation-yourself-16ko</link>
      <guid>https://dev.to/voltagegpu/verify-a-confidential-ai-inference-attestation-yourself-16ko</guid>
      <description>&lt;p&gt;On 16 October 2026 we drew a random nonce and asked for the attestation evidence of every instance serving three confidential models. We published the raw responses, the nonce and the script that checked them. This tutorial re-checks one of the three, DeepSeek V3.2: nine instances, eight NVIDIA Hopper GPUs each. First online, against Intel and NVIDIA, the way the original run did it. Then the parts that need no network at all. You need no account, no API key and no GPU. At the end, what a pass proves and what it does not.&lt;/p&gt;

&lt;p&gt;Every command below was run on 20 October 2026 on Ubuntu 24.04 with Python 3.12.3, in a fresh directory, exactly as printed. Outputs are pasted as printed; &lt;code&gt;[...]&lt;/code&gt; marks a cut.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was published
&lt;/h2&gt;

&lt;p&gt;The files live under &lt;code&gt;https://voltagegpu.com/inference-proofs/2026-10-16/&lt;/code&gt;. That path has no index page, so start with the &lt;a href="https://voltagegpu.com/inference-proofs/2026-10-16/README.txt" rel="noopener noreferrer"&gt;README&lt;/a&gt;. For each model there are five files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;model&amp;gt;.nonce.txt&lt;/code&gt;: our nonce, 32 random bytes in hex.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;model&amp;gt;.request.txt&lt;/code&gt;: the request, its time and its HTTP status.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;model&amp;gt;.evidence.json&lt;/code&gt;: the raw response, byte for byte. One entry per instance: an Intel TDX quote, the NVIDIA GPU evidence, a certificate, a signature and a signed body.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;model&amp;gt;.e2e-instances.json&lt;/code&gt;: each instance's end-to-end public key, read from the provider's instance listing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;model&amp;gt;.verify.txt&lt;/code&gt;: the report printed on 16 October.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus the script, &lt;code&gt;verify_inference_evidence.py&lt;/code&gt;, and &lt;code&gt;SHA256SUMS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One rule ties a quote to the nonce. The first 32 bytes of the quote's &lt;code&gt;report_data&lt;/code&gt; must equal &lt;code&gt;SHA256(nonce + e2e_pubkey)&lt;/code&gt;, the nonce and the key joined as text. The GPU evidence uses the same value as its nonce. The rule comes from the model provider's public verification guide, which our &lt;a href="https://docs.voltagegpu.com/inference#attestation" rel="noopener noreferrer"&gt;inference docs&lt;/a&gt; point to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: install the two verifiers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;inference-check &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;inference-check
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; voltage-verify&lt;span class="o"&gt;==&lt;/span&gt;0.2.1 nv-attestation-sdk cryptography
voltage-verify &lt;span class="nt"&gt;--version&lt;/span&gt;
pip show nv-attestation-sdk | &lt;span class="nb"&gt;grep &lt;/span&gt;Version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;voltage-verify 0.2.1
Version: 2.7.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;voltage-verify&lt;/code&gt; checks the Intel side. It is our open-source verifier (MIT, &lt;a href="https://github.com/VoltageGPU/voltage-verify" rel="noopener noreferrer"&gt;source&lt;/a&gt;). &lt;code&gt;nv-attestation-sdk&lt;/code&gt; is NVIDIA's package for the GPU side. These are the versions the original run used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: download one model's files and check the checksums
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;inference-2026-10-16 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;inference-2026-10-16
&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://voltagegpu.com/inference-proofs/2026-10-16
&lt;span class="nv"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-ai_DeepSeek-V3.2-TEE
&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in &lt;/span&gt;README.txt SHA256SUMS verify_inference_evidence.py &lt;span class="nv"&gt;$M&lt;/span&gt;.nonce.txt &lt;span class="nv"&gt;$M&lt;/span&gt;.request.txt &lt;span class="se"&gt;\&lt;/span&gt;
         &lt;span class="nv"&gt;$M&lt;/span&gt;.evidence.json &lt;span class="nv"&gt;$M&lt;/span&gt;.e2e-instances.json &lt;span class="nv"&gt;$M&lt;/span&gt;.verify.txt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;curl &lt;span class="nt"&gt;-sSfO&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; SHA256SUMS &lt;span class="nt"&gt;--ignore-missing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;README.txt: OK
deepseek-ai_DeepSeek-V3.2-TEE.e2e-instances.json: OK
deepseek-ai_DeepSeek-V3.2-TEE.evidence.json: OK
deepseek-ai_DeepSeek-V3.2-TEE.nonce.txt: OK
deepseek-ai_DeepSeek-V3.2-TEE.request.txt: OK
deepseek-ai_DeepSeek-V3.2-TEE.verify.txt: OK
verify_inference_evidence.py: OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The checksums come from the same site as the files. They catch a broken download, not a dishonest publisher. The checks below do not depend on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: re-run the published check
&lt;/h2&gt;

&lt;p&gt;The script writes its report to &lt;code&gt;&amp;lt;model&amp;gt;.verify.txt&lt;/code&gt; and replaces the published one, so keep a copy first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt;.verify.txt published.verify.txt
python verify_inference_evidence.py &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt; voltage-verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each instance, the script runs &lt;code&gt;voltage-verify quote&lt;/code&gt;, which fetches Intel's current data for that platform. Then it sends the GPU evidence to NVIDIA's attestation service. Nine instances took about a minute and a half. Here is what our replay of these exact commands printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.../verify_inference_evidence.py:60: DeprecationWarning: nv-attestation-sdk is deprecated and will reach end of support on September 15, 2026. Please migrate to the C++ SDK: https://github.com/NVIDIA/attestation-sdk. Migration guide: https://docs.nvidia.com/attestation/attestation-client-tools-sdk/latest/migration_guide.html
  client = Attestation()
Using default Remote verifier URL: https://nras.attestation.nvidia.com/v3/attest/gpu
**** Attestation Successful ****
[... NVIDIA's progress lines, cut ...]
verified_at: 2026-10-20T13:08:06+00:00
nonce (ours, random 32 bytes): 28231ce10fdb9cfd72bf1199f05fdf46705966b74efe0c24fe2ee37490772b69
verifiers: voltage-verify 0.2.1; nv-attestation-sdk (NVIDIA NRAS, remote)
instances returned: 9

instance 2124d84a-d402-4914-9db4-fa4d94e2b24f
  intel tdx quote  : PASS (platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate)
  nonce binding    : PASS report_data[0:32] = fda470f1a58bd95116f318242689e0370436322b753816ae4ca1ef7a659a191e
  debug bit        : OFF (td_attributes 0000001000000000)
  key possession   : PASS
  nvidia gpus      : PASS (8 GPU(s), arch HOPPER)
  mr_td            : 261ce538b435e2d0e85fc97e254bc99154c507b7a8e13d59b69f8532384f1d0bfaadfddf3fccc6e0a411203840bbee8d

[... 3 instances with the same lines ...]

instance 4c1f21af-821a-4d25-99a3-d0451a146db9
  intel tdx quote  : FAIL tdx.tcb ()
  nonce binding    : PASS report_data[0:32] = b6476aacc2f17f27113cb7f5aa3a9067b8e18aaa6064fe8ce9e0b6c6aee6b1e0
  debug bit        : OFF (td_attributes 0000001000000000)
  key possession   : PASS
  nvidia gpus      : PASS (8 GPU(s), arch HOPPER)
  mr_td            : 261ce538b435e2d0e85fc97e254bc99154c507b7a8e13d59b69f8532384f1d0bfaadfddf3fccc6e0a411203840bbee8d

[... 4 instances with the same lines as the first ...]

RESULT: 8 of 9 instance(s) fully verified (Intel quote, our nonce, key possession, NVIDIA GPUs)
        1 instance(s) FAILED a check, see above
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each instance gets five checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;intel tdx quote&lt;/strong&gt;: the quote's signature chain up to Intel's root, the platform's security level according to Intel's current data, and revocation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nonce binding&lt;/strong&gt;: the rule above, &lt;code&gt;report_data[0:32] == SHA256(nonce + e2e_pubkey)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;debug bit&lt;/strong&gt;: the guest's debug attribute is off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;key possession&lt;/strong&gt;: the signed body verifies with the instance's certificate, and it carries our nonce and this same quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nvidia gpus&lt;/strong&gt;: NVIDIA's service accepted the GPU evidence for the same nonce value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The NVIDIA deprecation notice is printed by NVIDIA's own package. The remote check still answered on 20 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  If one instance fails: check it alone
&lt;/h2&gt;

&lt;p&gt;One instance failed &lt;code&gt;tdx.tcb&lt;/code&gt;, with nothing in the parentheses. Take its quote out and check it on its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.evidence[] | select(.instance_id == "4c1f21af-821a-4d25-99a3-d0451a146db9") | .quote'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$M&lt;/span&gt;.evidence.json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; failed.b64
voltage-verify quote failed.b64
python verify_inference_evidence.py &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt; voltage-verify 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;RESULT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] tdx.structure   TDX quote v4, TEE 0x81, 4936 bytes
[PASS] tdx.signatures  attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[PASS] tdx.collateral  TCB info and QE identity signed by Intel (Intel PCS, fetched now)
[PASS] tdx.tcb         platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
[PASS] tdx.revocation  PCK certificate not revoked (57 entries in CRL)
[PASS] tdx.revocation  PCK CA certificate not revoked (0 entries in CRL)

TDX: MRTD 261ce538b435e2d0e85fc97e254bc991...  TCB UpToDate  QE UpToDate

RESULT: VERIFIED
RESULT: 9 of 9 instance(s) fully verified (Intel quote, our nonce, key possession, NVIDIA GPUs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The quote is fine, and the second full run passed all nine. The first failure was not about the quote. Each check makes four requests to Intel: platform data, quoting enclave identity and two revocation lists. &lt;code&gt;voltage-verify&lt;/code&gt; does not retry them. If one request fails, the result is a &lt;code&gt;tdx.tcb&lt;/code&gt; failure that carries the reason. The published script prints the detail of the fourth check in the list. In a normal run that is the TCB line. When the Intel data cannot be fetched, there is no fourth check, so the parentheses stay empty and the reason is lost. That day we also ran 54 direct checks with &lt;code&gt;voltage-verify quote --json&lt;/code&gt;. One failed, and its JSON report gave this detail for &lt;code&gt;tdx.tcb&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cannot reach https://api.trustedservices.intel.com/sgx/certification/v4/pckcrl?ca=platform&amp;amp;encoding=pem: [Errno 111] Connection refused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two of our five full runs on 20 October hit one such failure, each on a different instance. The other three passed nine of nine. Once the run passes, compare it with the published report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff published.verify.txt &lt;span class="nv"&gt;$M&lt;/span&gt;.verify.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1c1
&amp;lt; verified_at: 2026-10-16T08:05:27+00:00
---
&amp;gt; verified_at: 2026-10-20T13:11:08+00:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the date differs. Intel's view of a platform can change over time, so a re-check reflects Intel's data on the day you run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: the parts that need no network
&lt;/h2&gt;

&lt;p&gt;Some checks need no outside service. We ran this step inside &lt;code&gt;unshare -n&lt;/code&gt;, a shell with no network (&lt;code&gt;curl&lt;/code&gt; could not resolve any host: exit code 6). The outputs were the same.&lt;/p&gt;

&lt;p&gt;First, the quote signatures, up to the Intel root that &lt;code&gt;voltage-verify&lt;/code&gt; pins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;0 8&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;".evidence[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;].quote"&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt;.evidence.json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; quote-&lt;span class="nv"&gt;$i&lt;/span&gt;.b64&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done
&lt;/span&gt;voltage-verify quote quote-0.b64 &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;0 8&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;voltage-verify quote quote-&lt;span class="nv"&gt;$i&lt;/span&gt;.b64 &lt;span class="nt"&gt;--offline&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] tdx.structure   TDX quote v4, TEE 0x81, 4940 bytes
[PASS] tdx.signatures  attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[WARN] tdx.collateral  Intel collateral skipped (--offline): TCB status and revocation not checked

TDX: MRTD 261ce538b435e2d0e85fc97e254bc991...  TCB ?  QE ?

RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first block is quote 0 in full. The nine lines after it are one per quote. The WARN line says plainly what offline mode skips.&lt;/p&gt;

&lt;p&gt;Next, the nonce binding and the debug bit, without any of our tools. A TDX quote is a fixed binary layout: a 48-byte header, then the guest's report. The attributes start at byte 168, the MRTD at byte 184 and &lt;code&gt;report_data&lt;/code&gt; at byte 568. Save this as &lt;code&gt;offline_check.py&lt;/code&gt; in the &lt;code&gt;inference-check&lt;/code&gt; folder, one level above the evidence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Offline re-check of published inference evidence: nonce binding and debug bit,
read straight from the TDX quote bytes. Standard library only, no network.
Usage: python3 offline_check.py &amp;lt;folder&amp;gt; &amp;lt;model-file-prefix&amp;gt; [nonce]&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nf"&gt;else &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.nonce.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;evidence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.evidence.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;evidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;listing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.e2e-instances.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instances&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instance_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;e2e_pubkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;bound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;inst&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# TDX quote v4: 48-byte header, then the TD report (attributes, MRTD, ..., report_data).
&lt;/span&gt;    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;little&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;little&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;td_attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mr_td&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;report_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;176&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;184&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;232&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;568&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;632&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instance_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;report_data&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;bound&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instance_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  v&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tee=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tee&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;#x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  nonce &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOUND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOT BOUND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
          &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debug &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;td_attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  mr_td &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mr_td&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bound&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; quotes carry SHA256(nonce + e2e_pubkey) in report_data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 ../offline_check.py &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt;
python3 ../offline_check.py &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$M&lt;/span&gt; 0000000000000000000000000000000000000000000000000000000000000000 | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2124d84a-d402-4914-9db4-fa4d94e2b24f  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
8fe1275c-a5a2-47e9-9d47-091f3242ef5a  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
e2db3683-5be1-4a33-a47c-cd422caadf3a  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
8c94bf65-2006-4de3-a526-f9f4e55c2604  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
4c1f21af-821a-4d25-99a3-d0451a146db9  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
b45cd4dc-7e41-468d-bc42-39aa7d6cfb3a  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
bd6f497a-64a1-4b5c-8ca6-45657db054dd  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
2bd97006-3ea4-4973-8f15-04ecb856f5e8  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
c39fa043-d22c-4ed5-bb71-d46644793740  v4 tee=0x81  nonce BOUND  debug off  mr_td 261ce538b435e2d0...
9 of 9 quotes carry SHA256(nonce + e2e_pubkey) in report_data
c39fa043-d22c-4ed5-bb71-d46644793740  v4 tee=0x81  nonce NOT BOUND  debug off  mr_td 261ce538b435e2d0...
0 of 9 quotes carry SHA256(nonce + e2e_pubkey) in report_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the published nonce, all nine quotes are bound. With any other nonce, none is. The MRTD values match the published report.&lt;/p&gt;

&lt;p&gt;Reading &lt;code&gt;report_data&lt;/code&gt; from the bytes only counts if those bytes are covered by Intel's signature. Flip one bit of &lt;code&gt;report_data&lt;/code&gt; and check again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 - quote-0.b64 tampered.b64 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PY&lt;/span&gt;&lt;span class="sh"&gt;'
import base64, sys
q = bytearray(base64.b64decode(open(sys.argv[1]).read()))
q[568] ^= 1  # flip one bit of report_data
open(sys.argv[2], "w").write(base64.b64encode(q).decode())
&lt;/span&gt;&lt;span class="no"&gt;PY
&lt;/span&gt;voltage-verify quote tampered.b64 &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] tdx.structure   TDX quote v4, TEE 0x81, 4940 bytes
[FAIL] tdx.signatures  quote signature does not verify with the attestation key: 

TDX: MRTD 261ce538b435e2d0e85fc97e254bc991...  TCB ?  QE ?

RESULT: NOT VERIFIED (tdx.signatures)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the two offline checks work together. The signature proves the bytes are Intel's. The byte reading proves those bytes commit to the nonce. Two things cannot be checked offline. The platform's security level and revocation need Intel's current data. The GPU evidence needs NVIDIA's service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Proved&lt;/strong&gt;, for DeepSeek V3.2 at 08:04 UTC on 16 October 2026. Each of the nine instances serving the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;returned a genuine Intel TDX quote. Its signature chain verifies up to Intel's root (offline), and Intel's data on 20 October rates the platform UpToDate (online);&lt;/li&gt;
&lt;li&gt;had debug off;&lt;/li&gt;
&lt;li&gt;put &lt;code&gt;SHA256(our nonce + its E2E public key)&lt;/code&gt; in its quote. So the quote was made after that nonce existed, and it commits to that key;&lt;/li&gt;
&lt;li&gt;signed a body carrying our nonce and that same quote;&lt;/li&gt;
&lt;li&gt;had eight NVIDIA Hopper GPUs whose evidence NVIDIA's attestation service accepted, for the same nonce value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All nine report the same MRTD (&lt;code&gt;261ce538...&lt;/code&gt;), the TDX measurement of the guest's initial contents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not proved:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Which code the instances run.&lt;/strong&gt; No reference measurements are published yet. The MRTD is a value you can compare over time, not a verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That a given chat response came from one of these instances.&lt;/strong&gt; The evidence covers the instances, not each response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything about the path from you to the instance.&lt;/strong&gt; Requests go through VoltageGPU's API over TLS. There is no end-to-end encryption from your client into the enclave.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness relative to you.&lt;/strong&gt; We drew this nonce, so you trust our date. For your own guarantee, draw your own nonce and call &lt;code&gt;GET /v1/attestation&lt;/code&gt;. That needs an inference key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who issued the signing certificate.&lt;/strong&gt; The certificate behind "key possession" arrives in the same response, issued by the provider's own certificate authority. The script checks the signature, not that issuer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instances missing from the provider's key listing.&lt;/strong&gt; Their binding cannot be recomputed. In the same run, 12 of 55 Qwen 3.8 instances are reported NOT CHECKABLE for that reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A GPU result that will last.&lt;/strong&gt; The GPU check depends on NVIDIA's service and on a Python package NVIDIA no longer supports. It still answered on 20 October 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every proof we publish, with the command to rerun it, is at &lt;a href="https://voltagegpu.com/proofs" rel="noopener noreferrer"&gt;https://voltagegpu.com/proofs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To fetch evidence for your own nonce, create an inference key and start here: &lt;a href="https://voltagegpu.com/quickstart" rel="noopener noreferrer"&gt;https://voltagegpu.com/quickstart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, which published this evidence.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Watch GPU Prices and Availability From a Public JSON</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:26:11 +0000</pubDate>
      <link>https://dev.to/voltagegpu/watch-gpu-prices-and-availability-from-a-public-json-ooa</link>
      <guid>https://dev.to/voltagegpu/watch-gpu-prices-and-availability-from-a-public-json-ooa</guid>
      <description>&lt;p&gt;VoltageGPU publishes its live prices and stock as one public JSON document at &lt;a href="https://voltagegpu.com/api/pricing/snapshot" rel="noopener noreferrer"&gt;https://voltagegpu.com/api/pricing/snapshot&lt;/a&gt;. There is no key and no account. The site's pricing pages are built from the same snapshot. This tutorial walks through its structure and explains what each field means, checked against the code that builds it. Then it gives you a 35-line Python script. The script prints the cheapest GPU in stock for each model and alerts you when a model comes back in stock.&lt;/p&gt;

&lt;p&gt;Every command below was run on 20 October 2026 on Ubuntu 24.04 with Python 3.12.3 and jq 1.7, in a fresh directory, exactly as printed. Outputs are pasted as printed. Prices and stock are live, so yours will differ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: fetch it once
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://voltagegpu.com/api/pricing/snapshot &lt;span class="nt"&gt;-o&lt;/span&gt; snapshot.json
jq &lt;span class="s1"&gt;'keys'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  "confidential",
  "confidentialCpu",
  "confidentialVm",
  "gpus",
  "inference",
  "meta",
  "teeModelCount"
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;confidentialVm&lt;/code&gt;: Confidential VMs (Intel TDX), one entry per size in &lt;code&gt;tiers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;confidential&lt;/code&gt;: the same VMs, summed up as one row per GPU model.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpus&lt;/code&gt;: standard GPUs, with no enclave.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;confidentialCpu&lt;/code&gt;: confidential CPU servers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inference&lt;/code&gt;: per-token prices of the confidential (TEE) models.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;teeModelCount&lt;/code&gt;: how many confidential models there are.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;meta&lt;/code&gt;: when the snapshot was built, plus notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: read the metadata
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.meta'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "updatedAt": "2026-10-20T13:07:49.258Z",
  "stale": false,
  "scope": "rentable",
  "notes": [
    "Only what can be rented today.",
    "confidential: one row per GPU model, derived from the Confidential VM tiers (pricePerGpuHour = VM price / GPU count, available = free GPUs). The confidential container tier retired on 2026-10-01 is no longer listed.",
    "confidentialVm.tiers[].pricePerHour is the whole VM per hour; pricePerGpuHour = pricePerHour / gpuCount.",
    "gpus: standard GPUs with no enclave (not confidential), live stock only.",
    "B200 and B300 are listed only when in stock, and NVIDIA GPU attestation is not verified on them."
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;updatedAt&lt;/code&gt; is when the server built this snapshot. &lt;code&gt;stale&lt;/code&gt; turns true when the server got no live standard GPUs or no live model prices, and used stored values instead. It does not cover the Confidential VM inventory. If that read fails, &lt;code&gt;confidentialVm.tiers&lt;/code&gt; comes back empty. &lt;code&gt;scope: "rentable"&lt;/code&gt; means the feed lists only what can be rented today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: the Confidential VMs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.confidentialVm.tiers[0]'&lt;/span&gt; snapshot.json
jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'.confidentialVm.tiers[] | {resourceName, gpuCount, pricePerHour, pricePerGpuHour, available, gpuAttestation}'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "resourceName": "rtx6000b-small",
  "model": "RTX 6000B",
  "gpuCount": 1,
  "vram": "96 GB",
  "pricePerHour": 3.8,
  "available": 7,
  "gpuAttestation": true,
  "pricePerGpuHour": 3.8,
  "enclave": "intel-tdx",
  "label": "Confidential VM (Intel TDX)"
}
{"resourceName":"rtx6000b-small","gpuCount":1,"pricePerHour":3.8,"pricePerGpuHour":3.8,"available":7,"gpuAttestation":true}
{"resourceName":"h100-small","gpuCount":1,"pricePerHour":6.95,"pricePerGpuHour":6.95,"available":6,"gpuAttestation":true}
{"resourceName":"h200-small","gpuCount":1,"pricePerHour":8.08,"pricePerGpuHour":8.08,"available":0,"gpuAttestation":true}
{"resourceName":"h100-xlarge","gpuCount":8,"pricePerHour":55.62,"pricePerGpuHour":6.95,"available":0,"gpuAttestation":true}
{"resourceName":"h200-xlarge","gpuCount":8,"pricePerHour":64.62,"pricePerGpuHour":8.08,"available":0,"gpuAttestation":false}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resourceName&lt;/code&gt; is the size's name. It is the value you pass as &lt;code&gt;resource_name&lt;/code&gt; when you deploy; the quickstart uses &lt;code&gt;rtx6000b-small&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pricePerHour&lt;/code&gt; is the whole VM, per hour, in US dollars. &lt;code&gt;pricePerGpuHour&lt;/code&gt; is that price divided by &lt;code&gt;gpuCount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;available&lt;/code&gt; is how many VMs of that size are free right now. A size at 0 stays in the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpuAttestation&lt;/code&gt; is true when we have run NVIDIA GPU attestation successfully inside a VM of that model and size. It is false for &lt;code&gt;h200-xlarge&lt;/code&gt;, the 8x H200 node, where we have not run it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enclave&lt;/code&gt; is &lt;code&gt;intel-tdx&lt;/code&gt; on every VM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next to &lt;code&gt;tiers&lt;/code&gt;, &lt;code&gt;confidentialVm&lt;/code&gt; repeats the fields of a single size (&lt;code&gt;h200-small&lt;/code&gt;) for older readers of the feed. Read &lt;code&gt;tiers&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: the same VMs, per GPU model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'.confidential[]'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"model":"H200","vram":"141 GB","pricePerGpuHour":8.08,"available":0,"maxGpuCount":8,"provider":"confidential"}
{"model":"H100","vram":"80 GB","pricePerGpuHour":6.95,"available":6,"maxGpuCount":8,"provider":"confidential"}
{"model":"RTX 6000B","vram":"96 GB","pricePerGpuHour":3.8,"available":7,"maxGpuCount":1,"provider":"confidential"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row is computed from the tiers above. &lt;code&gt;pricePerGpuHour&lt;/code&gt; is the cheapest GPU-hour among the sizes in stock, or among all sizes when none is (H200 here). &lt;code&gt;available&lt;/code&gt; counts free GPUs: free VMs times GPUs per VM. For H100 that is six free &lt;code&gt;h100-small&lt;/code&gt; VMs with one GPU each. &lt;code&gt;maxGpuCount&lt;/code&gt; is the largest size, here the 8-GPU &lt;code&gt;h100-xlarge&lt;/code&gt;, even though none is free. Rows are sorted most expensive first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: the standard GPUs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.gpus[] | select(.model == "RTX 4090")'&lt;/span&gt; snapshot.json
jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'.gpus[] | {model, pricePerHour, available}'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "model": "RTX 4090",
  "vram": "24 GB",
  "pricePerHour": 1.12,
  "available": 13,
  "provider": "standard",
  "enclave": "none",
  "gpuAttestation": false,
  "label": "Standard GPU (no enclave, not confidential)"
}
{"model":"RTX A4000","pricePerHour":0.24,"available":8}
{"model":"RTX 5060 Ti","pricePerHour":0.34,"available":6}
{"model":"RTX 5070 Ti","pricePerHour":0.8,"available":1}
{"model":"B300","pricePerHour":19,"available":32}
{"model":"B200","pricePerHour":9,"available":41}
{"model":"H100","pricePerHour":4,"available":66}
{"model":"A100","pricePerHour":2.38,"available":16}
{"model":"RTX PRO 6000","pricePerHour":4.18,"available":8}
{"model":"RTX 5090","pricePerHour":1.6,"available":9}
{"model":"RTX 4090","pricePerHour":1.12,"available":13}
{"model":"L40S","pricePerHour":0.76,"available":1}
{"model":"L40","pricePerHour":0.66,"available":1}
{"model":"RTX 6000","pricePerHour":1.6,"available":13}
{"model":"A6000","pricePerHour":0.84,"available":3}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Standard machines have no enclave. The feed says so in &lt;code&gt;enclave&lt;/code&gt;, &lt;code&gt;gpuAttestation&lt;/code&gt; and &lt;code&gt;label&lt;/code&gt;, so you can filter them out.&lt;/p&gt;

&lt;p&gt;Here &lt;code&gt;pricePerHour&lt;/code&gt; is per GPU-hour: the lowest per-GPU price among free machines of that model. &lt;code&gt;available&lt;/code&gt; counts the GPUs on machines that can be rented whole right now. A standard machine is rented whole, so a machine with 8 GPUs costs 8 times its per-GPU price, per hour. A model with no free machine is left out of &lt;code&gt;gpus&lt;/code&gt; entirely, unlike a VM size, which stays at 0. &lt;code&gt;vram&lt;/code&gt; can be an empty string when the site has no figure for a model; that was the case for the RTX A4000 that day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: inference prices
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.inference[0]'&lt;/span&gt; snapshot.json
jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'[(.inference | length), .teeModelCount]'&lt;/span&gt; snapshot.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "id": "42ee92ba-a537-5a73-8741-876067750db7",
  "name": "google/gemma-4-31B-turbo-TEE",
  "category": "LLM",
  "priceInputPerM": 0.22,
  "priceOutputPerM": 0.68
}
[14,14]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are US dollars per million input and output tokens, for the confidential models. &lt;code&gt;name&lt;/code&gt; is the exact model id the API expects. The list is read from the model catalog, at most 15 rows. &lt;code&gt;teeModelCount&lt;/code&gt; is the number of confidential models. On 20 October both were 14.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: how fresh it is
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; - &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null https://voltagegpu.com/api/pricing/snapshot | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'^(cache-control|age|x-vercel-cache):'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;age: 331
cache-control: public, max-age=60, s-maxage=300, stale-while-revalidate=600
x-vercel-cache: STALE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The edge keeps a copy for 5 minutes. For 10 more minutes it may serve that copy while it fetches a new one in the background. That is what &lt;code&gt;STALE&lt;/code&gt; and an age of 331 seconds mean here. The server also keeps its own build for 5 minutes. So asking more often than every 5 minutes gets you the same answer, and the data can be several minutes old. &lt;code&gt;meta.updatedAt&lt;/code&gt; tells you how old.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: a watcher in 35 lines
&lt;/h2&gt;

&lt;p&gt;Save this as &lt;code&gt;gpu_watch.py&lt;/code&gt;. It uses only Python's standard library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Cheapest in-stock GPU per model, from VoltageGPU&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s public pricing feed.
Run it every 5 minutes at most (the feed is cached for 5). It prints an ALERT
for each model in stock now that was not in stock on the previous run.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;FEED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://voltagegpu.com/api/pricing/snapshot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;STATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpu-watch-state.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FEED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpu-watch/1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Confidential VM tiers stay listed at 0 when sold out; standard rows only when in stock.
&lt;/span&gt;&lt;span class="n"&gt;offers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; confidential&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pricePerGpuHour&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
           &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resourceName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; VM free, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpuCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GPU each&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidentialVm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tiers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;offers&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; standard&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pricePerHour&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GPU free, no enclave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;cheapest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;  &lt;span class="c1"&gt;# "H100 confidential" -&amp;gt; (price per GPU-hour, details)
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;offers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cheapest&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;feed built &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;meta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;updatedAt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, stale: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;meta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stale&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;standard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/GPU-h  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALERT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is in stock again, $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/GPU-h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cheapest&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It keeps only offers that are in stock: VM sizes with &lt;code&gt;available &amp;gt; 0&lt;/code&gt;, and standard rows.&lt;/li&gt;
&lt;li&gt;It keys each offer by model and kind. "H100 confidential" and "H100 standard" are different products, and they stay apart.&lt;/li&gt;
&lt;li&gt;For each key, it keeps the lowest price per GPU-hour. For a VM it also keeps the size to deploy.&lt;/li&gt;
&lt;li&gt;It prints confidential offers first, then standard ones, each sorted by price.&lt;/li&gt;
&lt;li&gt;It saves the keys that are in stock to a small state file. On the next run, a key that is in stock now but was not last time prints an ALERT. The first run only creates the file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 gpu_watch.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feed built 2026-10-20T13:07:49.258Z, stale: False
RTX 6000B confidential   $  3.80/GPU-h  rtx6000b-small: 7 VM free, 1 GPU each
H100 confidential        $  6.95/GPU-h  h100-small: 6 VM free, 1 GPU each
RTX A4000 standard       $  0.24/GPU-h  8 GPU free, no enclave
RTX 5060 Ti standard     $  0.34/GPU-h  6 GPU free, no enclave
L40 standard             $  0.66/GPU-h  1 GPU free, no enclave
L40S standard            $  0.76/GPU-h  1 GPU free, no enclave
RTX 5070 Ti standard     $  0.80/GPU-h  1 GPU free, no enclave
A6000 standard           $  0.84/GPU-h  3 GPU free, no enclave
RTX 4090 standard        $  1.12/GPU-h  13 GPU free, no enclave
RTX 5090 standard        $  1.60/GPU-h  9 GPU free, no enclave
RTX 6000 standard        $  1.60/GPU-h  13 GPU free, no enclave
A100 standard            $  2.38/GPU-h  16 GPU free, no enclave
H100 standard            $  4.00/GPU-h  66 GPU free, no enclave
RTX PRO 6000 standard    $  4.18/GPU-h  8 GPU free, no enclave
B200 standard            $  9.00/GPU-h  41 GPU free, no enclave
B300 standard            $ 19.00/GPU-h  32 GPU free, no enclave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The H200 Confidential VM is missing from the list because none was free. The state file and a second run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;gpu-watch-state.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;["A100 standard", "A6000 standard", "B200 standard", "B300 standard", "H100 confidential", "H100 standard", "L40 standard", "L40S standard", "RTX 4090 standard", "RTX 5060 Ti standard", "RTX 5070 Ti standard", "RTX 5090 standard", "RTX 6000 standard", "RTX 6000B confidential", "RTX A4000 standard", "RTX PRO 6000 standard"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 gpu_watch.py | &lt;span class="nb"&gt;grep &lt;/span&gt;ALERT &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"no alert"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;no alert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 9: leave it running
&lt;/h2&gt;

&lt;p&gt;Run it every 5 minutes. A loop is enough to try it; for good, use cron or a systemd timer. Here is the loop we left running for an hour on 20 October:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%FT%TZ &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; watch.log
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;12&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;python3 gpu_watch.py | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"^(feed built|ALERT)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;300&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; watch.log 2&amp;gt;&amp;amp;1
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%FT%TZ &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; watch.log
&lt;span class="nb"&gt;cat &lt;/span&gt;watch.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-10-20T12:55:00Z
feed built 2026-10-20T12:53:11.535Z, stale: False
feed built 2026-10-20T12:58:48.555Z, stale: False
feed built 2026-10-20T13:04:13.105Z, stale: False
ALERT: L40S standard is in stock again, $0.76/GPU-h
feed built 2026-10-20T13:07:49.258Z, stale: False
feed built 2026-10-20T13:13:38.191Z, stale: False
feed built 2026-10-20T13:13:38.191Z, stale: False
feed built 2026-10-20T13:21:00.445Z, stale: False
feed built 2026-10-20T13:26:13.620Z, stale: False
ALERT: H200 standard is in stock again, $8.14/GPU-h
feed built 2026-10-20T13:31:26.465Z, stale: False
feed built 2026-10-20T13:36:39.415Z, stale: False
feed built 2026-10-20T13:41:52.421Z, stale: False
feed built 2026-10-20T13:47:06.377Z, stale: False
2026-10-20T13:57:31Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is twelve polls, five minutes apart. The times are when each snapshot was built, not when we polled. Two polls in a row got the same snapshot (13:13:38): that is the cache from step 7. Two alerts fired. An L40S standard GPU came into stock in the snapshot built at 13:04, and an H200 standard GPU in the one built at 13:26. No alert concerned a Confidential VM. The five full snapshots we read that afternoon show the same five sizes, prices and stock.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this tells you, and what it does not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It tells you&lt;/strong&gt; the prices and stock the site shows, as of &lt;code&gt;meta.updatedAt&lt;/code&gt;. GPU prices are public hourly prices in US dollars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It does not tell you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;That a GPU will still be free when you deploy.&lt;/strong&gt; Stock is a snapshot, and someone else can take the last VM between your read and your deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What a standard machine costs in total.&lt;/strong&gt; &lt;code&gt;gpus[].pricePerHour&lt;/code&gt; is per GPU. The machine you rent may have several GPUs, and you pay for all of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That a confidential alert is real after a failed read.&lt;/strong&gt; If the VM inventory cannot be read, &lt;code&gt;confidentialVm.tiers&lt;/code&gt; comes back empty, and &lt;code&gt;meta.stale&lt;/code&gt; does not flag it. The script then sees every confidential model as gone, and the next good read raises alerts for models that never left. Check that &lt;code&gt;tiers&lt;/code&gt; is not empty before you act on a confidential alert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything about the machine you will get.&lt;/strong&gt; &lt;code&gt;gpuAttestation: true&lt;/code&gt; means we have run NVIDIA GPU attestation successfully inside a VM of that model and size. It does not attest your VM. You generate that attestation yourself, inside your VM. The proofs we publish are listed at &lt;a href="https://voltagegpu.com/proofs" rel="noopener noreferrer"&gt;https://voltagegpu.com/proofs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidentiality for standard GPUs.&lt;/strong&gt; They have no enclave. The feed labels them so.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the GPU you want shows up, the quickstart deploys a Confidential VM in three API calls: &lt;a href="https://voltagegpu.com/quickstart" rel="noopener noreferrer"&gt;https://voltagegpu.com/quickstart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, whose public feed this is.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gpu</category>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Verify an Intel TDX Quote From Any Cloud in One Command</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:42:46 +0000</pubDate>
      <link>https://dev.to/voltagegpu/verify-an-intel-tdx-quote-from-any-cloud-in-one-command-2739</link>
      <guid>https://dev.to/voltagegpu/verify-an-intel-tdx-quote-from-any-cloud-in-one-command-2739</guid>
      <description>&lt;p&gt;A TDX quote is the CPU's signed statement that a virtual machine is a genuine Intel TDX trust domain, with its measurements and 64 bytes of data the guest chose. Any provider selling confidential VMs can hand you one. The useful part is checking it yourself, without trusting the provider or its tooling. That takes one command, and it works on a quote from any cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: get a quote and the tool
&lt;/h2&gt;

&lt;p&gt;This uses a public quote captured on 4 September 2026 inside an Intel TDX VM with one H200, together with the 64-byte report_data the tenant chose (&lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/README.txt" rel="noopener noreferrer"&gt;README&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/quote.bin
curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/report_data.bin
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify&amp;gt;=0.2.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: verify it against Intel
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify quote quote.bin &lt;span class="nt"&gt;--report-data&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;xxd &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 64 report_data.bin&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it printed on my machine on 19 October 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] tdx.structure    TDX quote v4, TEE 0x81, 4936 bytes
[PASS] tdx.report_data  quote report_data equals the expected value
[PASS] tdx.signatures   attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[PASS] tdx.collateral   TCB info and QE identity signed by Intel (Intel PCS, fetched now)
[PASS] tdx.tcb          platform TCB UpToDate, QE UpToDate, TDX_01 UpToDate
[PASS] tdx.revocation   PCK certificate not revoked (57 entries in CRL)
[PASS] tdx.revocation   PCK CA certificate not revoked (0 entries in CRL)

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB UpToDate  QE UpToDate

RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Structure first, then your report_data, then the signature chain up to the pinned Intel SGX root. Last, the verifier fetches Intel's current collateral and confirms the platform security level is up to date and nothing in the chain is revoked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: see it refuse
&lt;/h2&gt;

&lt;p&gt;The same quote, with a challenge it was not issued for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify quote quote.bin &lt;span class="nt"&gt;--report-data&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'00%.0s'&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;64&lt;span class="si"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;# [FAIL] tdx.report_data  quote report_data does NOT equal the expected value: not issued for your nonce&lt;/span&gt;
&lt;span class="c"&gt;# RESULT: NOT VERIFIED (tdx.report_data)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without network, structure and signatures still verify, but the verifier says what it skipped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify quote quote.bin &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;span class="c"&gt;# [WARN] tdx.collateral  Intel collateral skipped (--offline): TCB status and revocation not checked&lt;/span&gt;
&lt;span class="c"&gt;# RESULT: VERIFIED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: do it on your own TDX guest
&lt;/h2&gt;

&lt;p&gt;On a Linux TDX guest that exposes configfs TSM (kernel 6.7 or later), pick a challenge, write its SHA-512 into a fresh report entry, read the quote back, and verify it on another machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NONCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;RD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; %s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NONCE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sha512sum&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /sys/kernel/config/tsm/report/q1
&lt;span class="nb"&gt;printf&lt;/span&gt; %s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | xxd &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /sys/kernel/config/tsm/report/q1/inblob &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /sys/kernel/config/tsm/report/q1/outblob &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; quote.bin

voltage-verify quote quote.bin &lt;span class="nt"&gt;--report-data&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What a quote does not prove
&lt;/h2&gt;

&lt;p&gt;It proves a genuine TDX guest on a platform Intel rates, and that the quote was not altered. It does not prove which software runs in the guest unless you compare MRTD and RTMR0 to 3 with a reference you trust, and it says nothing about a GPU: that takes a separate NVIDIA attestation, covered in &lt;a href="https://voltagegpu.com/blog/verify-confidential-gpu-attestation-offline" rel="noopener noreferrer"&gt;the bundle tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Source of the tool: &lt;a href="https://github.com/VoltageGPU/voltage-verify" rel="noopener noreferrer"&gt;github.com/VoltageGPU/voltage-verify&lt;/a&gt; (MIT).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, where this quote was captured. The verifier is open source and does not trust us.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cloud</category>
      <category>tutorial</category>
      <category>linux</category>
    </item>
    <item>
      <title>Verify a Confidential GPU Attestation Offline in Five Minutes, No Account Needed</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Mon, 19 Oct 2026 00:12:31 +0000</pubDate>
      <link>https://dev.to/voltagegpu/verify-a-confidential-gpu-attestation-offline-in-five-minutes-no-account-needed-3g1h</link>
      <guid>https://dev.to/voltagegpu/verify-a-confidential-gpu-attestation-offline-in-five-minutes-no-account-needed-3g1h</guid>
      <description>&lt;p&gt;Every confidential computing vendor says your workload runs in a sealed enclave. The useful question is whether you can check that claim without trusting the vendor.&lt;/p&gt;

&lt;p&gt;This tutorial does exactly that with a real bundle captured on 9 October 2026 inside an Intel TDX virtual machine with one NVIDIA RTX PRO 6000 Blackwell GPU, rented through a public API like any customer would. You verify it with an MIT-licensed tool, on your laptop, offline if you like. No account, no GPU rental, about five minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in a bundle
&lt;/h2&gt;

&lt;p&gt;Two proofs, both tied to the same manifest. The manifest holds a random challenge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Intel TDX quote&lt;/strong&gt; carries the SHA-512 of the manifest in its &lt;code&gt;report_data&lt;/code&gt;, signed by the platform's quoting enclave with a key that chains to Intel.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;NVIDIA tokens&lt;/strong&gt; carry the SHA-256 of the same manifest as their nonce, signed by NVIDIA's attestation service after it checked the GPU's own report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bundle also embeds the Intel collateral captured at attest time (TCB info, QE identity, revocation lists), which is what makes an offline check possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: download it and check the checksums
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;bundle &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;bundle
curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-10-09/bundle.json
curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-10-09/manifest.json
curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-10-09/SHA256SUMS
&lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; SHA256SUMS &lt;span class="nt"&gt;--ignore-missing&lt;/span&gt;
&lt;span class="c"&gt;# manifest.json: OK&lt;/span&gt;
&lt;span class="c"&gt;# bundle.json: OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The checksums were computed inside the VM before download. The same folder has what the script printed inside the VM, &lt;code&gt;nvidia-smi&lt;/code&gt; output and kernel details (&lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-2026-10-09/README.txt" rel="noopener noreferrer"&gt;README.txt&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: install the verifier
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify&amp;gt;=0.2.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python 3.10 or later. Use 0.2.1 or later: 0.2.0 and earlier trusted the NVIDIA signing keys a bundle carried, 0.2.1 chains them to a pinned NVIDIA attestation service intermediate. Source: &lt;a href="https://github.com/Jabsama/voltage-verify" rel="noopener noreferrer"&gt;github.com/Jabsama/voltage-verify&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: verify, offline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--challenge&lt;/span&gt; 627ba9c51d4719038e917c7431675b183ac576c819d712178dc8a100f4409a45 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GB20X &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it printed on my machine on 19 October 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PASS] manifest.format       manifest is well formed
[PASS] manifest.commitments  bundle commitments match the manifest
[PASS] manifest.challenge    challenge is the one this verifier issued
[PASS] tdx.structure         TDX quote v4, TEE 0x81, 4940 bytes
[PASS] tdx.report_data       quote report_data equals SHA-512 of the manifest
[PASS] tdx.signatures        attestation key, QE binding, QE report and PCK chain verify up to the pinned Intel SGX Root CA
[PASS] tdx.collateral        TCB info and QE identity signed by Intel (bundle (fetched 2026-10-09T21:54:01+00:00))
[PASS] tdx.tcb               platform TCB UpToDate, QE UpToDate, TDX_03 UpToDate
[PASS] tdx.revocation        PCK certificate not revoked (57 entries in CRL)
[PASS] tdx.revocation        PCK CA certificate not revoked (0 entries in CRL)
[PASS] nvidia.signatures     2 NVIDIA-signed tokens verify, keys from the bundle chained to the pinned NRAS intermediate (offline)
[PASS] nvidia.nonce          NRAS eat_nonce equals SHA-256 of the manifest
[PASS] nvidia.policy         overall result true, every GPU: measurements ok, secure boot on, debug off, nonce matched, report signature and chain validated
[PASS] nvidia.freshness      token issued 0s from bundle creation

TDX: MRTD eea8b6a814569a52bd1e12f6b869bb2d...  TCB UpToDate  QE UpToDate
GPU: GPU-0 GB20X driver 595.71.05 vbios 98.02.9E.00.01 measurements success

RESULT: VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it in three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manifest&lt;/code&gt;: the bundle belongs to this manifest and to the challenge you passed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tdx&lt;/code&gt;: the quote's structure, that it embeds the manifest hash, its signature chain up to the pinned Intel SGX root, the Intel-signed platform status (TCB UpToDate), and that nothing in the chain is revoked.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvidia&lt;/code&gt;: NVIDIA's signatures, the nonce, and NVIDIA's own verdict on the GPU: measurements ok, secure boot on, debug off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: try to fool it
&lt;/h2&gt;

&lt;p&gt;A verifier that never says no is worth nothing. First, pretend the bundle answers a different challenge, which is what a replayed bundle looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--challenge&lt;/span&gt; 0000000000000000000000000000000000000000000000000000000000000000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GB20X &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
&lt;span class="c"&gt;# [FAIL] manifest.challenge    challenge differs from the one this verifier issued (replay or foreign bundle)&lt;/span&gt;
&lt;span class="c"&gt;# RESULT: NOT VERIFIED (manifest.challenge)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then change a single character inside the signed part of the quote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PY&lt;/span&gt;&lt;span class="sh"&gt;'
import json
b = json.load(open("bundle.json"))
q = b["tdx"]["quote_b64"]
b["tdx"]["quote_b64"] = q[:300] + ("A" if q[300] != "A" else "B") + q[301:]
json.dump(b, open("tampered.json", "w"))
&lt;/span&gt;&lt;span class="no"&gt;PY

&lt;/span&gt;voltage-verify verify tampered.json &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--challenge&lt;/span&gt; 627ba9c51d4719038e917c7431675b183ac576c819d712178dc8a100f4409a45 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--hwmodel&lt;/span&gt; GB20X &lt;span class="nt"&gt;--gpus&lt;/span&gt; 1
&lt;span class="c"&gt;# [FAIL] tdx.signatures        quote signature does not verify with the attestation key&lt;/span&gt;
&lt;span class="c"&gt;# RESULT: NOT VERIFIED (tdx.signatures)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both outputs are the ones I got. Each failure names the exact check.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it proves, and what it does not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Proved:&lt;/strong&gt; this manifest was bound by a genuine Intel TDX guest on a platform Intel rates up to date, with an NVIDIA GPU in confidential-computing mode whose measurements NVIDIA accepted, and the bundle has not been altered since.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not proved by this check alone:&lt;/strong&gt; which software ran in the guest (compare the printed MRTD and RTMR values with a reference you trust), and freshness relative to you, because here the challenge was drawn by the publisher's script. For your own guarantee, draw the challenge yourself on your own VM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do it on your own machine next
&lt;/h2&gt;

&lt;p&gt;Renting the same tier takes three API calls (&lt;a href="https://voltagegpu.com/quickstart" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt;). Inside the VM, &lt;code&gt;voltage-verify manifest --challenge auto&lt;/code&gt; and &lt;code&gt;voltage-verify attest&lt;/code&gt; produce your own bundle; the full run, which cost $0.60, is written up in &lt;a href="https://voltagegpu.com/blog/confidential-gpu-from-the-api-alone-deploy-attest-verify" rel="noopener noreferrer"&gt;Confidential GPU by API alone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on VoltageGPU, which runs the VM this bundle came from. The verifier is open source and does not trust us: if the bundle lied, it would say so.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>gpu</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>Verifying Intel TDX and NVIDIA GPU attestation from inside a rented VM, and what it can't prove</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:37:50 +0000</pubDate>
      <link>https://dev.to/voltagegpu/verifying-intel-tdx-and-nvidia-gpu-attestation-from-inside-a-rented-vm-and-what-it-cant-prove-1b1e</link>
      <guid>https://dev.to/voltagegpu/verifying-intel-tdx-and-nvidia-gpu-attestation-from-inside-a-rented-vm-and-what-it-cant-prove-1b1e</guid>
      <description>&lt;p&gt;I run a small confidential GPU cloud. We rent Intel TDX virtual machines with an H100, H200 or RTX PRO 6000 Blackwell passed through, and customers kept asking the only question that matters: how do I know the enclave is real, and that the provider is not in the loop?&lt;/p&gt;

&lt;p&gt;"Trust our dashboard" is not an answer to that question. So I wrote a verifier the tenant runs themselves, with nothing from us in the trust chain. It's open source: &lt;a href="https://github.com/Jabsama/voltage-verify" rel="noopener noreferrer"&gt;voltage-verify&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;On your laptop, write a manifest with a fresh challenge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify manifest &lt;span class="nt"&gt;--image&lt;/span&gt; ghcr.io/you/app:1.4.2 &lt;span class="nt"&gt;--artifact&lt;/span&gt; model.safetensors &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--statement&lt;/span&gt; &lt;span class="s2"&gt;"inference run for customer X"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; manifest.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy it into the VM, then as root inside the VM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; voltage_verify attest &lt;span class="nt"&gt;--manifest&lt;/span&gt; manifest.json &lt;span class="nt"&gt;-o&lt;/span&gt; bundle.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the bundle back and verify it anywhere, offline if you like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; &amp;lt;the challenge printed by manifest&amp;gt;
voltage-verify verify bundle.json &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code 0 means verified, 1 means a required check failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the two proofs are bound together
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The manifest carries a random challenge.&lt;/li&gt;
&lt;li&gt;Inside the VM, the tool asks the kernel's TDX interface (configfs TSM, &lt;code&gt;/sys/kernel/config/tsm/report&lt;/code&gt;) for a quote whose &lt;code&gt;report_data&lt;/code&gt; is the SHA-512 of that manifest. The quote is verified up to the pinned Intel SGX Root CA, with Intel's PCS collateral (TCB info, QE identity, CRLs) embedded in the bundle so it also verifies offline.&lt;/li&gt;
&lt;li&gt;It asks NVIDIA's Remote Attestation Service for GPU tokens whose nonce is the SHA-256 of the same manifest, and checks measurements, secure boot, debug off, signature and certificate chain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both proofs answer the same challenge, so a bundle can't be replayed from another machine or another day. Neither path goes through our API: it's the Linux kernel and NVIDIA's own service. The same commands should work on any TDX host with a GPU in confidential mode, though we haven't tried every cloud.&lt;/p&gt;

&lt;p&gt;Published bundles anyone can re-verify, a single H200, a single H100, an 8x H100 node and an RTX PRO 6000 Blackwell, plus a weekly run, are listed here: &lt;a href="https://voltagegpu.com/api/attestation/evidence" rel="noopener noreferrer"&gt;https://voltagegpu.com/api/attestation/evidence&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not prove
&lt;/h2&gt;

&lt;p&gt;Our VMs boot a stock Ubuntu image and the tenant gets root. So this attests the hardware and the enclave, not which application runs inside. If someone with root on the VM wants to put a different hash in &lt;code&gt;report_data&lt;/code&gt;, they can.&lt;/p&gt;

&lt;p&gt;Proving workload identity to a third party would need a customer-supplied measured image (your own kernel, initramfs and a dm-verity root, no SSH), so the measurements cover the whole workload. We don't offer that today. I'd rather say it here than have someone discover it in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things I learned the hard way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NVSwitch doesn't verify from inside the guest.&lt;/strong&gt; On 8-GPU HGX nodes the GPUs run in NVIDIA's multi-GPU "Protected PCIe" mode, and all eight attest fine. The NVSwitch fabric is another story. With the right &lt;code&gt;libnvidia-nscq&lt;/code&gt; (unsuffixed, pinned to the driver version) the NSCQ session opens and switch evidence is collected, but it then fails certificate-chain validation because &lt;code&gt;ocsp.ndis.nvidia.com&lt;/code&gt; is unreachable over TLS from the guest. So a tenant VM can't prove the NVLink fabric today. Raw logs: &lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/nscq-retest-2026-09-19-10h11/README.txt" rel="noopener noreferrer"&gt;nscq-retest-2026-09-19&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Random" attestation failures are often egress.&lt;/strong&gt; The same OCSP problem makes &lt;code&gt;nvattest&lt;/code&gt;'s local check fail intermittently inside a CVM, while the remote path through NRAS succeeds, because NVIDIA runs the revocation checks on its side. If your GPU attestation fails one run in three, look at the guest's outbound network before you look at the GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify[attest]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MIT, Python 3.10+. The repo has example bundles you can verify right away without renting anything. If you go into the TDX quote format or the NRAS token claims and something looks off, tell me in the comments, I'd rather fix it than defend it.&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>gpu</category>
      <category>ai</category>
    </item>
    <item>
      <title>I asked whether my own API could get a customer both attestation proofs with nothing but a key. It could not. Here is what was missing.</title>
      <dc:creator>VoltageGPU</dc:creator>
      <pubDate>Thu, 17 Sep 2026 13:34:25 +0000</pubDate>
      <link>https://dev.to/voltagegpu/i-asked-whether-my-own-api-could-get-a-customer-both-attestation-proofs-with-nothing-but-a-key-it-5am6</link>
      <guid>https://dev.to/voltagegpu/i-asked-whether-my-own-api-could-get-a-customer-both-attestation-proofs-with-nothing-but-a-key-it-5am6</guid>
      <description>&lt;p&gt;I sell Intel TDX virtual machines with a NVIDIA GPU passed through, and the whole pitch is "you generate the attestation yourself, on a challenge you chose, and you verify it without trusting me". Yesterday a customer asked a simple question: does that also work through the API, end to end, no dashboard? I said yes. Then I checked, following only my own public documentation, and the honest answer was: not quite. Two things were broken. Both are fixed now, and the run that found them is public, so here is the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;Rules I set myself: an API key, the documentation page, nothing else. No internal tools, no peeking at the provider console.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;GET /api/confidential/vm/tiers&lt;/code&gt; returns the live inventory with price and, since this week, an &lt;code&gt;attestation&lt;/code&gt; block per SKU: verified or not, on what date, the URL of the published evidence, and the exact commands to reproduce it inside the VM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/volt/ssh-keys&lt;/code&gt; registers the tenant's ed25519 public key. A confidential VM binds the key at creation and cannot be given one later.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/confidential/vm/deploy&lt;/code&gt; with &lt;code&gt;{"resource_name":"rtx6000b-small","hardstop_hours":1}&lt;/code&gt;. One hour (3.80 dollars) is charged upfront.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/volt/pods&lt;/code&gt; polled every 15 seconds until the VM answers.&lt;/li&gt;
&lt;li&gt;SSH in, generate both proofs.&lt;/li&gt;
&lt;li&gt;Copy the bundle out, verify it on my laptop.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/volt/pods/{id}/stop&lt;/code&gt;, unused part of the hour refunded per second.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1 to 3 went through in seconds. Step 4 is where it broke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broken thing number one: the SSH command the API gave was wrong
&lt;/h2&gt;

&lt;p&gt;The pod listing returned a ready-made command, &lt;code&gt;ssh wrk-xxx@ssh.voltagegpu.com&lt;/code&gt;. That gateway is for the container tier. A VM is reached directly, &lt;code&gt;ssh -p &amp;lt;port&amp;gt; ubuntu@&amp;lt;ip&amp;gt;&lt;/code&gt;, and the listing simply did not contain the IP or the port. The dashboard knew them, because it reads a session-only route. An API user had no way to learn them at all. So the documentation said "ready to use SSH command" and the command answered &lt;code&gt;Permission denied (publickey)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The fix is in production: the listing now returns &lt;code&gt;provider_status&lt;/code&gt;, &lt;code&gt;ssh_ready&lt;/code&gt;, &lt;code&gt;ssh_host&lt;/code&gt;, &lt;code&gt;ssh_port&lt;/code&gt;, &lt;code&gt;ssh_user&lt;/code&gt; and a working &lt;code&gt;ssh_command&lt;/code&gt;. One more detail I only learned by re-running the test: the address is assigned about 16 seconds after deploy, but sshd only answers once the provider reports &lt;code&gt;running&lt;/code&gt;, around two minutes later. Between the two, &lt;code&gt;ssh_ready&lt;/code&gt; is false and the command is null, so a script cannot connect too early.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broken thing number two: the first reproduce command failed
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;attestation&lt;/code&gt; block listed four commands, starting with &lt;code&gt;pip install "voltage-verify[attest]"&lt;/code&gt;. The VM image ships without pip. Anyone following the API to the letter would have failed on line one. The list now reflects what actually runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://bootstrap.pypa.io/get-pip.py | python3 - &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nt"&gt;--break-system-packages&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nt"&gt;--break-system-packages&lt;/span&gt; &lt;span class="s2"&gt;"voltage-verify[attest]"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.local/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
voltage-verify manifest &lt;span class="nt"&gt;--challenge&lt;/span&gt; auto &lt;span class="nt"&gt;-o&lt;/span&gt; manifest.json
&lt;span class="nb"&gt;sudo env &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt; &lt;span class="nv"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import site;print(site.getusersitepackages())'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  voltage-verify attest &lt;span class="nt"&gt;--manifest&lt;/span&gt; manifest.json &lt;span class="nt"&gt;--mode&lt;/span&gt; single-gpu &lt;span class="nt"&gt;-o&lt;/span&gt; bundle.json
voltage-verify verify bundle.json &lt;span class="nt"&gt;--challenge&lt;/span&gt; &amp;lt;the challenge printed above&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the VM this took 19 seconds wall clock, including the pip bootstrap. The manifest step prints a random challenge; the TDX quote carries its SHA-512 in &lt;code&gt;report_data&lt;/code&gt;, the NVIDIA tokens carry its SHA-256 as nonce, so both proofs are bound to the same value the tenant chose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that matters: verifying outside the VM
&lt;/h2&gt;

&lt;p&gt;A proof you can only check on the machine that produced it proves nothing about the machine. So the bundle came out over scp, and on a Windows laptop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;voltage-verify verify bundle.json --challenge ac7258...7389 --hwmodel GB20X --gpus 1
RESULT: VERIFIED

voltage-verify verify bundle.json --challenge 0000...0000
RESULT: NOT VERIFIED (manifest.challenge)

voltage-verify verify bundle.json --offline --challenge ac7258...7389
RESULT: VERIFIED
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wrong challenge is the interesting line: a replayed bundle from another run, or another provider, is rejected. The offline run works because the Intel collateral (TCB info, QE identity, CRLs) is embedded in the bundle at attest time.&lt;/p&gt;

&lt;p&gt;Then the stop call, and the refund: 3.20 of the 3.80 dollars came back. The whole run, deploy to verified bundle on my laptop to release, cost 0.60 dollars. Two more control runs after the fixes cost 0.14 dollars in total, one of them was stopped at 16 seconds and refunded in full because the machine had never actually started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is public
&lt;/h2&gt;

&lt;p&gt;The bundle, the manifest, the checksums computed inside the VM, and the verification output from the laptop are at &lt;a href="https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-api-2026-09-17/README.txt" rel="noopener noreferrer"&gt;https://voltagegpu.com/blog/two-proofs/evidence/rtx6000b-api-2026-09-17/README.txt&lt;/a&gt;. Anyone can re-run &lt;code&gt;verify&lt;/code&gt; on it. The public index of which SKUs have a published attestation, and which do not and why (8x H200, B200, B300 never available to test; the NVSwitch fabric not attestable from inside a TDX guest), is at &lt;a href="https://voltagegpu.com/api/attestation/evidence" rel="noopener noreferrer"&gt;https://voltagegpu.com/api/attestation/evidence&lt;/a&gt;, no account needed.&lt;/p&gt;

&lt;p&gt;The verifier is MIT, on PyPI and GitHub: &lt;a href="https://github.com/Jabsama/voltage-verify" rel="noopener noreferrer"&gt;https://github.com/Jabsama/voltage-verify&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take from it
&lt;/h2&gt;

&lt;p&gt;"It works through the API" is a claim like any other. The only test that counts is the one that knows nothing but the documentation, and it found in ten minutes what a week of reading the code had not. If you sell attestation, run that test before a customer does.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cloud</category>
      <category>gpu</category>
      <category>python</category>
    </item>
  </channel>
</rss>
