Verify the enclave
Check that the key your prompts are sealed to is bound into the enclave's live Intel TDX quote, then check the Solana receipt for one sealed call.
"Solrouter says my prompt is opened only inside an enclave. How do I know that is true?"
You do not have to take our word for it. Your device seals every prompt to the enclave's public key. The enclave publishes that key together with a quote signed by Intel TDX hardware, and the key is bound into the quote. This page checks the binding, then points you at Intel's signature and at the Solana receipt for a single call.
Check 1: the enclave key
/tee/attestation from your browser.In words
- Your browser fetches
GET https://api.solrouter.com/tee/attestation. - It reads the quote header: version 4 and TEE type
0x81mean an Intel TDX quote. - It computes
sha256(teePublicKey)and compares it withreportDataHex. - It computes
sha512("app-data:" || reportData)and compares it with the 64 bytes ofreport_dataat byte 568 of the quote. - All three passing means the key you seal to is the key named inside this quote, not a key swapped in by a machine in the middle.
This check does not verify Intel's signature on the quote. Step 3 below does.
The key changes on every restart
The enclave makes a fresh key pair each time it starts, and the private half never leaves it. Two different keys on two different days is expected.
Check it by hand
Fetch the attestation
curl -s https://api.solrouter.com/tee/attestation > att.jsonThe response has teeType (INTEL-TDX-PHALA), teePublicKey (base64 X25519 key), teePublicKeySha256, reportDataHex, tdxQuote, and generatedAt. tdxQuote holds quote (hex), event_log, hash_algorithm (sha512), and prefix (app-data).
Recompute the binding
The enclave asks Phala's dstack guest agent for a quote over reportData = sha256(teePublicKey). The agent writes sha512("app-data:" || reportData) into the quote's 64-byte report_data field. In a version 4 TDX quote that field starts at byte 568: a 48-byte header, then 520 bytes into the TD report body.
// node check.mjs
import { createHash } from 'node:crypto';
import { readFileSync } from 'node:fs';
const a = JSON.parse(readFileSync('att.json', 'utf8'));
const quote = Buffer.from(a.tdxQuote.quote, 'hex');
const keyHash = createHash('sha256').update(Buffer.from(a.teePublicKey, 'base64')).digest('hex');
const bound = createHash('sha512')
.update(Buffer.concat([Buffer.from(`${a.tdxQuote.prefix}:`), Buffer.from(a.reportDataHex, 'hex')]))
.digest('hex');
const inQuote = quote.subarray(568, 632).toString('hex');
console.log('TDX v4 quote:', quote.readUInt16LE(0) === 4 && quote.readUInt32LE(4) === 0x81);
console.log('sha256(key) == reportDataHex:', keyHash === a.reportDataHex);
console.log('report_data bound:', bound === inQuote);Verify Intel's signature
Copy tdxQuote.quote and paste it into Phala's verifier at proof.t16z.com. It checks the quote's signature chain back to Intel, which proves the quote came from real TDX hardware and not from a simulator. Intel DCAP tools do the same offline.
Compare the measurements (Soon)
A full audit compares the measurements inside the quote with published reference values for Solrouter's enclave image. Solrouter does not publish those values yet. Until it does, these checks prove real hardware and a correct key binding, but not which image is running.
Check 2: the receipt for one sealed call
Each sealed call writes a Light Protocol compressed attestation to Solana under program ATMRatMtsKX4bHax7U4FRdhbE4mjU4NKpDZGqZqAhBKb. Inside the enclave, a signing key that exists nowhere else signs the hash of your exact ciphertext. The backend pays for the transaction but cannot produce that signature.
Paste a receipt address, a transaction signature, or the 64-character hash of a ciphertext. A POST /tee/process reply carries the address and signature under onchainAttestation. A lock link from a chat reply works too.
Paste a Solana Explorer link, the Light attestation address, or the 64-character encrypted-prompt hash. We fetch the on-chain record and verify the enclave’s signature in your browser — nothing is sent anywhere except the public read endpoint.
What a passing check means:
- An Intel TDX enclave received your exact ciphertext and signed for it.
- The receipt is on Solana, so nobody can quietly edit it later.
- The signing key is bound into the enclave's per-request quote, so an impostor cannot sign in its place.
What it does not mean:
- The Solana program stores the receipt fields without checking the signature. Your browser checks the signature.
- It does not verify Intel's signature chain. Check 1, step 3 covers that.
Verify one receipt by hand
Read the receipt with GET /attestation/by-tx/<signature>. Rebuild the signed bytes: "SOLR-ATTEST-v2", the SHA-256 of the ciphertext, the enclave sealing key, the nonce, your ephemeral key, then the model and provider names with one length byte each. Verify the 64-byte signature (enclaveSigR plus enclaveSigS) against enclavePubkey with any Ed25519 library.
The per-request quote in a /tee/process reply binds both enclave keys: its reportData is sha256(X25519 key || ed25519 key), wrapped the same way as above, sha512("app-data:" || reportData).
Read more
Models
Qwen3.5 122B runs in an H200 GPU enclave on Phala. The three smaller models run on Nosana nodes outside the enclave, and their GPU host can read inference text. SDK attestation verification is not built.
Use cases
What people, developers, agents, traders, and teams do with Solrouter today, and what is still on the way.