Only the platform's word to rely on
- Was the model replaced?
- Were prompts added or removed?
- Was the response rewritten?
TrustedAIProxy observes real traffic between gateways and model providers, binds it to verified upstream TLS, and signs it with an Ed25519 key inside Google Confidential Space.
proof-J4vLQ0p…cY9Q
HTTPS proves that a user connected to the gateway. It cannot tell them what happened beyond it.
TAP sits at the gateway's egress and verifies the model provider's TLS connection. It signs only complete protocol semantics that can be parsed deterministically.
The gateway routes upstream traffic through TAP using an HTTP(S) proxy. Outbound TLS still verifies hostnames and certificate chains.
Provider protocols are normalized into a stable model and ordered messages. Ambiguous, oversized, or unsupported content remains unsigned.
Canonicalize the upstream certificate fingerprint, domain, path, and messages with RFC 8785 JCS to create reproducible claims.
The workload key produces an Ed25519 signature and proof_ref. Attestations return in headers; the API response body stays unchanged.
The trust chain has two layers. Cache workload proofs for the public key or workload lifecycle; verify each API response and check for replay.
Extract X-Attestation-Proof-Ref from the API response; fetch a proof bundle if there is no valid local cache entry.
Call /.well-known/confidential-attestation with a unique, customer-generated challenge each time.
Check the signature, issuer, audience, validity, image digest, project, instance, service account, hardware, and Secure Boot.
Recompute the public key binding nonce and confirm that the Google token's eat_nonce binds both the challenge and the public key.
Normalize the request and response for the profile, apply JCS, verify Ed25519, enforce route/model policies, and check the nonce for replay.
Verifiers reconstruct the same signed payload from the public protocol, so the evidence can be checked independently.
Read the full verification guide →{
"version": "trusted-ai-proxy-v1",
"profile": "llm-conversation-text-v1",
"tls_certificate_sha256": "8f9a…d21e",
"domain": "api.openai.com",
"request_path": "/v1/chat/completions",
"request_fields": ["model", "messages"],
"response_fields": ["messages"],
"timestamp": 1787749200,
"nonce": "R6I8…F0qw"
}
A signature proves only what its profile explicitly covers. Unsigned fields cannot be inferred from the proof.
llm-request-upstream-v1 attests to the request reaching the specified upstream and its response metadata. It does not cover any SSE event or streaming body. Clients must label streaming content as unverified.
Versioned extractors handle provider message formats and normalize them into public, reproducible signature semantics.
openai-chat-conversation-v1Supportedopenai-responses-conversation-v1Supportedanthropic-messages-conversation-v1Supportedbedrock-invoke-conversation-v1Supportedbedrock-converse-conversation-v1SupportedExplore the signing flow locally, deploy to Google Confidential Space, and give customers the policies they need to verify it.