A renter choosing capacity above open is asking one question: is this a real
machine with the isolation it advertises, or a string in a database? Prism
answers it with a report signed by the GPU itself. The control plane checks that
report against NVIDIA's signing keys before it will list the machine above
open, and a supplier that fails the check keeps the weakest class no matter
what it claims.
Attestation changes who is being trusted. Before, isolated rested on a node
describing its own configuration. Now it rests on a specific physical H100
signing a statement the control plane verifies for itself.
Every offer on the network is open, and the verifier's material is now half
real.
The trust roots are genuine. roots/nvidia-device-identity-root.der is the
NVIDIA Device Identity CA, self-signed and verified as such, taken from
NVIDIA's own verifier. roots/amd-ark-genoa.der is ARK-Genoa fetched from
AMD's key distribution service, self-signed, with the Genoa ASK chaining to it.
Both are pinned by the SHA-256 of their DER encoding.
The GPU measurements are real too. reference/h100-measurements.json holds the
21 active slots NVIDIA publishes for driver 580.173.02 in its reference
integrity manifest, keyed by slot index the way a report identifies them. Five
of those slots list more than one legitimate digest, and all of them are
accepted, because collapsing alternatives to a single value rejects cards that
are behaving correctly.
Two honest limits on that. They are what NVIDIA says an H100 on this driver should report, not values read off our own card, so they check conformance rather than identity. And the manifest is an XML-signed document whose signature this verifier does not check yet, so their integrity rests on the transport they arrived over rather than on NVIDIA's signature.
What is still a placeholder is the SNP side: the launch measurements and the TCB
floor are guesses, so attested cannot be earned. reference/provenance.json records the state of every
pinned artifact, and a test fails the build if the trust ceiling ever sits above
a rung whose artifacts are still placeholders. The GPU checks below run against those files today. The SEV-SNP rung
above them is specified and gated, and the conditions that would let a lease be
granted attested are listed at the end. Read all of it as what a class
requires. None of it describes capacity you can rent today.
open requires a bonded onchain identity. The registry entry must be active,
the bond must meet the minimum, the device key hash must equal the node id, and
the operator wallet, payout wallet and rate must match the offer exactly. A live
tunnel record posted by the access gateway is also required. Brokered capacity
runs without the Prism daemon and without a tunnel, so it stays at open
unconditionally.
isolated requires everything open requires, plus a current attestation
verdict from the control plane. The verdict is issued only when an NVIDIA H100
report satisfies all of the following: its certificate chain validates to the
pinned NVIDIA root, its nonce equals the digest the control plane expects for
that node, its measurements appear in the checked-in reference set, and its
device identity is bound to no other node.
Be precise about what that verdict does and does not establish, because the two
halves of isolated are earned differently.
The verdict is hardware evidence. It proves which physical GPU answered and what firmware it is running, signed by NVIDIA and checked against a pinned root by the control plane. Nothing the node says about the card is taken on trust.
The Kata VM and the VFIO passthrough are not attested. The node reports its own
isolation posture on a signed heartbeat, and that report is a supplier claim
backed by the bond, not a measurement. A host that passes the GPU to a bare
container while reporting kata_vfio would be caught by nothing in this
document. Closing that gap needs a launch measurement of the machine the renter
is actually served from, which is what attested is for.
attested requires everything isolated requires, plus a verified AMD SEV-SNP
report taken by the guest that ran the lease. It is not served. The rung is
specified below, along with the three things that have to be true before it can
be granted.
confidential requires everything attested requires, plus an NVIDIA CC-mode
report showing VRAM encryption active and the GPU locked into a confidential
state, bound to the same lease. It is not served, and no verifier for it exists.
The control plane generates a random challenge for a node, records it against
that node id, and accepts it once. The node asks the GPU for a report whose
nonce is SHA-256(challenge_nonce || node_id || device_public_key), then posts
the report on a signed submission to a dedicated endpoint. The control plane
recomputes that digest from the challenge it issued and the identity of the node
presenting it, and compares.
Two attacks close on that binding, and one does not.
A captured report cannot stand in for a fresh one against a different identity. The digest commits to the node id and device key of the node presenting the report, so evidence issued for one node produces a nonce mismatch at another.
A captured report cannot be replayed. A challenge is single use and short lived, so a second presentation of the same report finds its challenge already consumed.
What the binding does not close is a node forwarding its own nonce to a genuine
H100 somewhere else and presenting the answer. The report would be valid and the
nonce would be correct, because a GPU signs whatever nonce it is handed. This is
the ordinary limit of device attestation: it proves a real card answered, not
that the card is in the machine that answered. Two things bound it rather than
close it. A verified device identity is recorded under a unique index, so one
physical GPU backs one node id and an operator must hold a real H100 per node
they want to present. And the node stays bonded, so the claim carries a stake.
A launch measurement taken by the guest does not close it either, for the reason
given under what attested does not cover.
Attestation travels on its own submission rather than on the 30-second heartbeat. The bytes a node signs for telemetry are unchanged, so every node already in the field keeps signing exactly what it signed before, and a multi-kilobyte certificate chain never rides a loop with a 15-second timeout.
Verification is a full certificate chain walk in ECDSA P-384 over SHA-384, from the report signature up through the device certificate to an NVIDIA root certificate pinned in this repository by the SHA-256 digest of its DER encoding. The root is not fetched at verification time, so substituting a root is not a path into the network.
Any of these ends verification with no verdict, and no verdict means no class
above open:
- the chain does not terminate at the pinned root, or any signature in it fails;
- a certificate is outside its validity window at the time of the check;
- the report signature does not verify under the key in the leaf certificate;
- the nonce in the report is not equal to the expected digest;
- the challenge is unknown, expired, or already consumed;
- a reported measurement is absent from the reference set;
- the attested device identity is already bound to a different node id.
There is no partial credit. A node whose evidence fails simply holds the class
its remaining evidence supports, which is open.
A verdict is good for 24 hours. After that the node falls back to open until
it answers a fresh challenge. The class is applied when a quote is issued and
checked again when funding is confirmed, so a verdict that lapses between the
two does not leave a renter paying for a class the machine no longer holds.
The attested device identity is recorded under a unique index. A second node id
presenting the same physical GPU is refused, which stops one card from earning
isolated for several bonded identities at once.
It proves which GPU is present, that it is genuine NVIDIA silicon, and what
firmware that GPU is running. It says nothing about the host around it: which
kernel booted, what the hypervisor is doing, or whether the operator attached a
debugger to the workload. That is a different measurement rooted in a different
vendor's keys, and it is what attested is about.
Earlier versions of this document called attested a host launch measurement.
That was wrong, and the error matters because it names the wrong party as the
one being trusted. SEV-SNP has no host measurement at all. Its threat model
assumes the hypervisor is hostile, and everything it signs describes a guest:
the image that guest launched from, the policy it launched under, and the 64
bytes that guest chose when it asked for the report. A guest report is therefore
worth more to a renter than a host report would have been, because it survives a
host that is lying, and it is also narrower, because it says nothing about the
machine around the guest.
A report that passes verification proves the following, and stops there.
- Measurement. A genuine AMD processor ran
SNP_LAUNCHover an initial guest image, andMEASUREMENTis the digest of that image's page contents, guest physical layout, page types and per-vCPU VMSA. - Policy. The guest ran under the policy in the report. Debug disabled means the host cannot use the PSP debug interface to read or write guest memory.
- TCB. The processor was at the TCB version encoded in the VCEK that signed
the report, and
REPORTED_TCBmust sit at or above a pinned floor for the product line. - Chip identity.
CHIP_IDnames the physical processor, and the VCEK's HWID extension has to equal it. - Report data.
REPORT_DATAis 64 bytes the guest chose at request time. It is the only freshness and binding channel the structure has. - Host data.
HOST_DATAis 32 bytes the host fixed at launch and cannot change afterwards. - The chain. VCEK to ASK to ARK, with the ARK pinned in this repository per
product line, the VCEK's HWID extension equal to
CHIP_ID, and its four SVN extensions equal toREPORTED_TCB. Without all of that the chain proves nothing about this report.
A node-level SNP report, taken on a schedule the way the GPU report is, would be a farmable badge. An operator boots the blessed VM once a day, harvests the verdict, and then serves the renter from a bare container with the GPU on the host. Every byte of that report is genuine and nothing in it contradicts the substitution, because SNP reports describe the guest that asked, and that guest is not the one the renter is in.
The construction that survives a hostile host is the other one. The guest that
runs the renter's workload takes its own report after boot, and REPORT_DATA
is the digest of the control plane's challenge, the lease id, and the public
half of the SSH host key that guest generated during boot. The control plane
refuses to release the access grant for a lease quoted above isolated until
that verdict exists. Because the fingerprint the renter connects to is inside
the report, the report is about the session they are in, not about a machine
that booted correctly earlier that day.
Node-level SNP evidence still has a use, and it is a smaller one. A signed report of what the host's CPU supports establishes that a machine can serve the class. It never grants it.
Any of these ends verification with no verdict, and no verdict means the lease holds the class its remaining evidence supports:
- the chain does not terminate at the pinned ARK for the product line, or any signature in it fails;
- the VCEK's HWID extension is not equal to
CHIP_ID, or its SVN extensions are not equal toREPORTED_TCB; - the report signature does not verify under the VCEK;
REPORT_DATAis not the digest expected for this challenge, this lease id and the SSH host key presented with it;- the challenge is unknown, expired, or already consumed;
MEASUREMENTis absent from the reference set for the machine shape the lease was scheduled at;- the guest policy allows debug, or falls below the pinned policy floor;
REPORTED_TCBis below the pinned floor;HOST_DATAdoes not commit to the image digest the lease was quoted for.
There is no partial credit here either.
The honest sentence for the rung: the workload ran in a virtual machine launched from an image whose measurement we published and anyone can recompute, on a genuine AMD processor at or above a pinned patch level, with host debug disabled, running the container digest the renter asked for, and the SSH host key they connected to was generated inside that machine. What ran is checkable. Who was watching is not.
Secrecy. CPU memory is encrypted and GPU memory is not. Every tensor bound
for a passthrough device leaves the encrypted region through shared bounce
buffers, so weights and activations sit in host-readable memory and VRAM is
plaintext. An attested lease gives integrity of what booted. It gives no
confidentiality of what is computed, which is what confidential is for.
The channel. The attested channel is SSH end to end, because the host key it terminates on is the one inside the report. Jupyter reaches the guest through the access relay, which terminates TLS outside the guest, so a Jupyter session is not covered by the report and must not be described as if it were.
The GPU relay. A hostile host can still emulate the H100 to the guest and proxy SPDM to a real card elsewhere. SNP does not pull PCIe devices into the guest's trust boundary without TDISP and IDE, which this hardware generation does not offer. One chip backs one node and one card backs one node, both by unique index, which bounds the substitution rather than closing it.
Availability. The host still controls scheduling, power, the network path, and whether the VM launches at all. A refusal is a refund rather than a security failure, but it does mean availability is never attested.
Host data is a host input. HOST_DATA is meaningful only because the
measured guest agent refuses to run anything but the image it names. If the
guest-side image pull and that agent policy are not both live, the report is
genuine and the workload image is unverified, and the class must not be claimed.
Client enforcement. The access grant carries the SSH host key fingerprint
from the report, and the renter's client has to pin it. A client that
auto-accepts the host key makes the binding decorative. Exposing the fingerprint
is Prism's job; enforcing it is the client's, and the clients Prism ships do it:
@prismnetwork/agent-sdk, prismnetwork, @prismnetwork/mcp and the inference
gateway read the key off the wire, compare it to the fingerprint on the grant,
and refuse the session if it differs. Anything else you connect with has to make
the same comparison, or the report covers a machine you are not talking to.
Our verifier. The chain walk runs in the control plane, so attested means
we checked it, not that the renter did. SECURITY_MODEL.md
covers the zkVM route for removing us from that set.
One CPU generation. TCB semantics are pinned to Genoa. Turin changed the
TCB_VERSION encoding, so a second CPU generation needs its own ARK, its own
floor and its own measurement set rather than a widened one. The reference set
is also per vCPU count and per CPU family, model and stepping, because the VMSA
feeds the launch digest: changing the machine shape changes the expected
measurement, and an operator who cannot match a published shape cannot serve the
class.
The hardware is in place. The bare metal runs SEV-SNP host support with the RMP
table initialised, IOMMU SNP support enabled, and the H100 bound to vfio-pci
in its own IOMMU group. The missing kernel support that used to block this class
is no longer the obstacle. Three things still gate it, and all three are
observable rather than argued.
- The expected launch measurement is computed from inputs recorded with their digests, and reproduced by someone who did not build the image. It is never read off a report from the machine being attested, because observing a measurement certifies whatever happened to boot.
- A genuine Genoa report from real hardware verifies as a checked-in test vector.
- The access gate refuses to hand a renter credentials for a lease quoted above
isolatedwhen no lease-bound verdict exists, proven by a test that funds such a lease and gets nothing.
MAX_VERIFIABLE_TRUST_CLASS in prism-protocol clamps every served class to
isolated until then. A passing SNP report earns Attested, because that is
what the evidence is worth, and class_for_lease clamps the lease back to
isolated, because that is what the network can substantiate. The ceiling moves
when the evidence exists and not when the hardware capable of producing it
arrives, which is the same rule as before and now cuts the other way: the
hardware is here and the ceiling has not moved.
Filter offers:
curl "https://api.prismnetwork.tech/v1/offers?min_trust=isolated"Require it on a lease, so the decision is made before money moves:
await agent.quote({ image, durationSeconds: 3600, minTrustClass: "isolated" });If no online bonded offer holds that class, the quote is refused with no_match
and no escrow is touched. If capacity exists at that class but every machine is
busy, the answer is capacity_reserved instead, which is a different situation:
one clears on its own, the other needs supply. A request for attested or
confidential is refused today for the first reason.
Vault items carry the weakest class of workspace they may be released into, and
new items default to confidential, above anything the network serves. Handing
one to today's capacity is refused rather than quietly allowed. See
VAULT.md.
The receipt for a lease records the trust class it settled under and, when a verdict backed that class, a digest of the verdict. Raw reports are never published, because a report carries a device serial that would identify the host. See PROOF_SPEC.md for the receipt format and SECURITY_MODEL.md for what each class does and does not promise.