Components
Capture
The phone opens its own TCP socket to the provider. TLS 1.3 key establishment runs between the phone, TEE_K and the provider, so the provider sees an ordinary TLS client on the user’s network. The record keys are split: TEE_K can make the keystream, TEE_T can check the authentication tags, and the phone holds the request secrets. No single party can forge or read the reply alone. When the reply is complete, each enclave freezes its view and signs a receipt that commits to it. The two receipts bind one session, one origin and one authorised request. A capture that fails before the freeze cannot be resumed, because resuming would reuse a secret; the user starts a new session. The first profile supports TLS 1.3 withTLS_AES_128_GCM_SHA256 and a bounded HTTP/1.1 read.
Proving
The phone proves the policy in a native Rust circuit over VOLE-based zero knowledge (mpz), with no virtual machine. The circuit:
- opens both enclaves’ committed views and reconstructs the plaintext records,
- parses the bounded reply and locates each field the policy reads,
- checks every predicate (for a payment: status, amount, currency, payee, payer, reference),
- computes the nullifier from the provider’s transaction ID.