This browser verifies here
- The challenge is fresh for this request
- The domain and in-TEE proxy SPKI are in the transcript
- The evidence REPORT_DATA matches the browser derivation
- A mismatched or replayed binding fails closed
Live evidence, explained
This workload shows every value used to bind fresh attestation evidence to your browser request—and clearly separates that binding check from full AMD hardware appraisal.
Run the verificationProbing the runtime and attestation surface.
The protocol
Green means this browser observed the step during the current verification. Nothing is hidden behind a single “secure” label.
The browser creates 32 unpredictable bytes with WebCrypto.
nonceThe domain, nonce and in-TEE proxy key become a CE-v1 transcript.
SHA-256(transcript)The attestation path places the derived value in SEV-SNP REPORT_DATA.
evidence.report_dataThis page repeats the derivation independently with WebCrypto.
web/verify.jsBrowser, server and evidence values must agree byte-for-byte.
A = B = CThe complete trust path
A verifier starts from an AMD certificate it already trusts, then follows signatures down to this specific report before checking the request binding.
The verifier pins AMD’s public root certificate. Trust starts here—not at this website.
The ARK signature authenticates AMD’s SEV signing certificate.
A chip- and TCB-specific certificate chains back to AMD.
The VCEK verifies the report signature; policy checks its TCB and measurement.
Commits to this domain, browser nonce and in-TEE keys.
Authorize only when appraisal and request binding both pass.
Read the verdict correctly
Honest verdict: this demo proves the freshness and consistency of the binding. Treat the hardware as trusted only after an independent appraiser accepts the signed evidence and policy.
Infrastructure isolation
Application code does not enforce this boundary. CAP, Kata/SEV-SNP, Kubernetes and Cilium do.
Sends HTTPS and a fresh nonce. Receives public evidence only.
Only explicit DNS, KBS, certificate and control-plane paths are reachable.
A signed app image cannot grant itself host access, Kubernetes credentials or broader egress. Those controls belong to the platform and must remain enforced even when the payload is malicious.
Live inventory
Try it
Watch the protocol above turn green as each observed value is validated.
A new nonce is generated every time. The response stays visible below so you can inspect the exact evidence and claims used by the demo.
The tenant page, its binding demo, and any appraiser verdict are untrusted claims. Download fresh raw evidence here, then open the independently obtained CAP HTML/WASM verifier with your own policy—or use enclava verify for live TLS-channel binding.
Developer blueprint
Keep evidence, policy and verdict separate in your API. Let users inspect why a decision passed.
Create the nonce in the browser or independent verifier—not inside the workload being checked.
Include the nonce, binding inputs, raw signed evidence, endorsements, identity claims and policy result.
Authorize only after signature, TCB, freshness, measurement and binding checks all pass.
browser.jsimport { randomNonceBytes, bytesToBase64, hexToBytes, reportDataHex } from "/verify.js";
const nonce = randomNonceBytes(32);
const response = await fetch("/api/verify", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ nonce_b64: bytesToBase64(nonce), domain: location.hostname })
}).then(r => r.json());
const browserValue = await reportDataHex(
location.hostname,
nonce,
hexToBytes(response.leaf_spki_sha256),
hexToBytes(response.receipt_pubkey_sha256)
);
if (!response.match || browserValue !== response.evidence_report_data_hex) {
throw new Error("attestation binding failed");
}
// Production: independently appraise response.evidence and endorsements,
// then enforce the expected measurement/image policy before authorizing.
Run live verification to populate this response.