Verification
Getting a quote back is not the same as trusting it. Verification is the set of
checks that turn a raw TDX quote into a verdict: that it was produced by genuine Intel
TDX hardware, that it is fresh (not replayed), that its measurements are the ones you
expect, and that they match a known release. Mero TEE ships a
public attestation verifier — a web app plus a stateless /api/verify serverless
function — that performs these checks on a KMS attestation or against a live node.
The quote-production step this consumes is described in Attestation Flow; the register model is shared with Calimero Core’s TEE Attestation page.
What the verifier checks
Section titled “What the verifier checks”The verifier establishes four independent properties. A quote is only trustworthy when all four hold.
-
Freshness (nonce binding). When the verifier fetches a node’s attestation itself, it generates a fresh 32-byte nonce, sends it, and then confirms the first 32 bytes of the quote’s own
report_dataequal that nonce. For a pasted KMS attestation it does the same with the nonce the operator sent to/attest, when given (nonce_b64). A mismatch means the attestation was not produced for this request — a possible replay — and is rejected.report_data, MRTD and RTMR0–3 are always read from the quote bytes Intel Trust Authority appraises, never from fields returned beside them (a node’squote.body, a pastedreportDataHex).Freshness does not say the URL is the attested TD: a server there can forward the attest call to a genuine node. So a node is also asked to bind its transport key (
bindTransportKey), the quote must commit to it, and the verifier opens a sealed session to that key over the same URL (/sealed/v2, one request to/admin-api/health). Only the holder of the key completes it, sotransport_verified: truemeans the server at the URL is the attested TD, andfalsethat it is not. A node that serves no sealed transport (only relay nodes do) reportsnull: the page then says the verifier cannot tell. -
Quote authenticity (signature chain). The verifier submits the quote to Intel Trust Authority (ITA) (
https://api.trustauthority.intel.com/appraisal/v2/attestby default, keyed byITA_API_KEY). ITA cryptographically appraises that the quote came from genuine Intel TDX hardware and returns a signed JWT. The verifier then verifies that JWT’s signature against Intel’s published JWKS (https://portal.trustauthority.intel.com/certs, issuerhttps://portal.trustauthority.intel.com). Intel’s signature on the JWT is the trust anchor — if it does not verify, the result is reported as unverified. -
Measurements. The ITA claims carry the quote’s measurement registers — MRTD, RTMR0–3 — and the TCB status (
attester_tcb_status, e.g.UpToDate,SWHardeningNeeded,OutOfDate). The verifier surfaces these, parsed from the quote itself and cross-checked against the claims. -
Release policy match. The verifier compares MRTD and RTMR0–3 against a signed release: for a KMS, the
kms_allowed_*lists of the release’skms-attestation-policy.<profile>.json; for a node, the profile’s entry inpublished-mrtds.json. All five registers pin the image — firmware, kernel, the dm-verity root hash on the command line, and the role/profile/root-hash event in RTMR3 — so a match identifies the release and profile the instance runs; no match means it is not a released image.
verifier ── nonce (32 random bytes) ──▶ node /admin-api/tee/attest (or: operator ── nonce ──▶ KMS /attest inside the VPC, pastes the response)verifier ◀── { quoteB64 } ──
1. quote report_data[0..32] == nonce ? -> freshness / anti-replay2. quote ──▶ Intel Trust Authority ──▶ signed JWT verify JWT signature vs Intel JWKS -> quote authenticity3. read MRTD / RTMR0-3 / tcb_status -> measurements4. MRTD / RTMR0-3 vs signed release policy -> known-release matchInputs the verifier accepts
Section titled “Inputs the verifier accepts”/api/verify works from any one of:
node_url— the verifier fetches/admin-api/tee/attestfrom amerodnode (nonce generated server-side, freshness checked). Hosts are constrained by an allow-list (NODE_ALLOWED_HOSTS) and must be public addresses, redirects are not followed, and a failing node’s response body is not echoed (SSRF protection).attestation(+ optionalnonce_b64) — a pre-fetched attestation JSON, pasted. This is the only way to verify a KMS: replicas listen only inside their VPC, so the verifier never fetches from one. Call/attestfrom inside the VPC with a nonce you chose and paste the response together with that nonce.
Two internal trust planes
Section titled “Two internal trust planes”The public verifier is the operator-facing tool. Inside the system, two automated verification relationships run continuously (see the trust model):
- A node verifies the KMS before requesting a key: it pulls a quote via
/attestwith a fresh nonce, refuses a debug TD, and compares the KMS’s TCB status and MRTD / RTMR0–3 against thekms_allowed_*lists of the signed release policy — the same check as step 4 above, enforced on every key fetch. - The KMS verifies a node on every key request: the quote signature, the nonce binding, and the full measurement policy are checked in Key Release.
The public verifier reproduces the node-verifies-KMS check in an independent, third-party way by chaining through Intel Trust Authority rather than trusting any Calimero-operated component.
Release verification is separate
Section titled “Release verification is separate”Runtime attestation proves what a live instance is running. It says nothing about whether a release artifact is authentic — that is established separately by the release pipeline’s Sigstore signatures and SHA-256 checksums, which prove provenance and integrity but not runtime state. Full operator trust needs both: verify the release artifacts, then attest the running instance against them. The measurement reference values and version pairings used for that comparison are managed in Policy Management.