[Extension proposal] : Hardware based Remote Attestation for A2A: Mutual Runtime Trust
- Dominant language
- Shell
- Stars
- 25.7k
- Forks
- 2.6k
- Avg merge
- 3d 6h
- Merged PRs (30d)
- 16
Description
**Summary**
Propose an opt-in, A2A extension that lets two agents each prove to the other that they are genuine, unmodified code running inside a verified Trusted Execution Environment (TEE), with the proof bound to the live channel and to the agent's published Agent Card identity. Built on RATS (RFC 9334) and existing verifiers (Azure Attestation, Google Confidential Space, Intel Trust Authority) — no new verifier, no core-protocol change.
**Problem**
A2A today gives us TLS (encrypted channel) and Agent Card JWS signatures (key custody). Together these answer "who signed the card" and "is the transport encrypted" — but not "what code is actually running on the other end right now?" An attacker controlling the host, operator, or a co-tenant can present a valid card over a valid TLS session while running modified code, a swapped model, or a debugger-attached process. Existing software efforts (CTEF #1786, OATR #1677, evidence envelope #1734) attest who and what is authorized — none produces or verifies a hardware quote or measures the runtime.
**Confidential A2A communication in short steps**
Agent B wants to talk to Agent A, and B's policy requires hardware proof:
1. Discover. B fetches A's Agent Card, verifies its JWS signature, and sees the attestation extension advertised. (If B's policy requires attestation and the card doesn't offer it, B stops — no downgrade.)
2. Connect (trust nothing yet). B opens a TLS connection and signals it wants the attestation extension. B sends nothing sensitive — the endpoint is untrusted until it proves itself.
3. Challenge. B sends a fresh single-use nonce and records this connection's tls-exporter fingerprint.
4. Prove (A's side). Inside its TEE, A builds the binding object (B's nonce, the channel fingerprint, A's in-TEE identity-key hash, card fingerprint, aud = B), hashes it into report_data, and has the hardware sign a quote.
5. Appraise. A sends the raw quote to its own verifier, which checks the measurements and returns a short-lived signed Attestation Result. A forwards that token (plus its own challenge nonce_A) to B.
6. Verify. B runs its checks: verifier signature (against B's pinned anchor), recomputed binding == report_data, channel match, identity_key == card key, measurements in policy, nonce fresh, token not expired. Any failure ⇒ B tears down, releases nothing.
7. Make it mutual. Roles flip — A challenges B, B proves itself the same way, A verifies. When both directions pass, trust is mutual.
8. Release & transact. Only now does the relying party release protected resources — task data, capability grants, or a payload key HPKE-sealed to the peer's attested identity key (so only the genuine attested agent can open it). Tokens keep refreshing during the session; if the runtime changes, it fails closed.
**How it fits the extension model**
Declared in capabilities.extensions[] with params (accepted TEE types, verifier hints, channelBinding, policyRef).
Opt-in via the A2A-Extensions header; challenge/result data flows in Message.metadata[extensionURI].
Adds no core types or enums — composes with §8.4, CTEF, and OATR rather than forking them. A peer that ignores the extension still interoperates.
Happy to discuss more details. If needed I can add a detailed doc describing end to end flow.
Contributor guide
Assessment
This issue has not been assessed yet.