Proxy Mode
MPC-TLS remains the default TLSNotary protocol. Proxy mode is an alternative offered for use cases where prover-verifier bandwidth is the binding constraint, and where the stronger MPC-TLS security guarantees can be relaxed in exchange.
In proxy mode, the Verifier acts as a network proxy between the Prover and the Server. The Verifier forwards encrypted TLS packets (without being able to decrypt them) and, after the TLS session ends, validates a zero-knowledge proof that binds the observed traffic to a legitimate TLS session.
When to use proxy mode
- Prover-verifier bandwidth is constrained
- Verification latency is the priority (e.g. high-frequency identity checks)
- You control the verifier infrastructure
- You do not need the security guarantees of MPC
Use MPC-TLS when you need the strongest guarantees, blind verification (the verifier should not learn which server), or when the server might block requests originating from the verifier's IP.
Protocol phases
Proxy mode has three phases:
- Preprocessing. Before the TLS connection begins, the
ProverandVerifierset up the zero-knowledge circuits used later to verify key derivation. Lighter than MPC-TLS preprocessing (no garbled circuits), but not instant. - TLS session. The
Proverperforms a standard TLS handshake through theVerifier, which forwards encrypted packets in both directions. TheVerifierrecords all traffic but cannot decrypt it. TheProvercaptures the master secret from the key exchange. - Verification. After the session ends, the
ProverandVerifierrun a ZK protocol in three steps:- 3a. The
Proverproves, in zero knowledge, the TLS 1.2 PRF derivation: master secret → session keys →verify_datafor both Finished messages. The master secret is the only private input. - 3b. The
Verifierdecrypts the Finished records using the keys from step 3a and checks that their plaintext matches the derivedverify_data. This proves that the private master secret input of the prover can indeed reproduce the handshake that the verifier observed during the online phase and binds the prover to the session keys, which are later used as private inputs for selective disclosure. - 3c. The
Proverproves the server's GHASH key to theVerifierin zero knowledge, using the server-side session keys as private input. TheVerifierthen uses this GHASH key to recompute the AES-GCM authentication tags on every server application-data record it observed, and compares them to the tags seen on the wire. This links the forwarded server data to the authenticated handshake.
- 3a. The
Selective disclosure works identically to MPC-TLS: the Prover can reveal or redact arbitrary parts of the transcript.
Trust model
Running the Verifier yourself is sufficient to rule out collusion: the ZK proof prevents the Prover from forging data. The remaining attack surface is the network path between the Verifier and the Server. An adversary who can make the Verifier's TCP connection terminate at a server impersonating the claimed domain can fool the Verifier. This is a well-understood class of attack against TLS infrastructure in general, not specific to TLSNotary.
If a third party operates the Verifier, the Prover and the third-party Verifier must not collude — the same trust requirement as MPC-TLS.
See also
- Introducing Proxy Mode (blog post) — full narrative, trade-offs, and when to choose which mode
- Rust quick start: Proxy Verifier example