2026-04-05ยท10 min readยทsota.io team

Deploy ProVerif to Europe โ€” Bruno Blanchet ๐Ÿ‡ซ๐Ÿ‡ท (INRIA Paris), the Cryptographic Protocol Verifier that Formally Proved TLS 1.3, on EU Infrastructure in 2026

In 2016, before RFC 8446 was published, the IETF TLS working group faced a question that years of interoperability testing could not answer: is TLS 1.3 actually secure? The protocol was designed to eliminate the vulnerabilities that made TLS 1.2 โ€” and its predecessors โ€” targets of POODLE, BEAST, DROWN, FREAK, and Logjam. But "designed to be secure" and "proved to be secure" are different claims.

The answer came from ProVerif โ€” an automated cryptographic protocol verifier developed by Bruno Blanchet at INRIA Paris. In a landmark analysis conducted jointly by Karthikeyan Bhargavan ๐Ÿ‡ฎ๐Ÿ‡ณ (INRIA Paris ๐Ÿ‡ซ๐Ÿ‡ท), Bruno Blanchet ๐Ÿ‡ซ๐Ÿ‡ท (INRIA Paris ๐Ÿ‡ซ๐Ÿ‡ท), Nadim Kobeissi ๐Ÿ‡ฑ๐Ÿ‡ง, and colleagues, ProVerif was used to formally verify the security properties of the TLS 1.3 handshake and record layer against a symbolic Dolev-Yao adversary. The results, published as the Verified Models and Reference Implementations for the TLS 1.3 Standard (IEEE S&P 2017), provided the IETF TLS working group with formal evidence that the new protocol achieved its security goals โ€” and caught a subtle flaw in an earlier draft that was corrected before standardisation.

TLS 1.3 protects virtually every HTTPS connection on the internet. Every time a user's browser loads a web page over HTTPS, a TLS 1.3 handshake occurs โ€” and that handshake has been formally proved secure by a tool built at INRIA Paris, France's national computer science research institute.

Bruno Blanchet: Applied Pi-Calculus and Automated Protocol Verification

Bruno Blanchet ๐Ÿ‡ซ๐Ÿ‡ท is a senior researcher (Directeur de Recherche) at INRIA Paris (Institut National de Recherche en Informatique et en Automatique). He completed his PhD at the ร‰cole Normale Supรฉrieure Paris in 2001, supervised by Franรงois Fages ๐Ÿ‡ซ๐Ÿ‡ท (INRIA Rocquencourt).

ProVerif grew from Blanchet's doctoral work on type-based verification of cryptographic protocols. The first public version appeared at CSFW 2001 (IEEE Computer Security Foundations Workshop) as An Efficient Cryptographic Protocol Verifier Based on Prolog Rules. The theoretical foundation was formalised jointly with Martรญn Abadi ๐Ÿ‡ฆ๐Ÿ‡ท (DEC Systems Research Center, later UC Santa Cruz and Google) in the applied pi-calculus: a process calculus for cryptographic protocols that extends Milner's ฯ€-calculus with equational theories over cryptographic terms.

The applied pi-calculus paper โ€” Mobile Values, New Names, and Secure Communication (Abadi + Blanchet, POPL 2001, predecessor to the full theory in JACM 2018) โ€” established the theoretical basis. Where Milner's CCS/ฯ€-calculus (Blog #133/#136) reasons about process communication abstractly, the applied pi-calculus adds the ability to reason about cryptographic operations (encryption, signatures, MACs, Diffie-Hellman) under equational theories that capture what an adversary can compute.

The INRIA institutional context matters: INRIA Paris is home to the Prosecco project team (now Cascade), which has produced ProVerif, the miTLS reference implementation of TLS, the HACL* formally verified cryptographic library (used in Firefox and the Linux kernel), and the tls13-spec ProVerif models. This is a single institution โ€” a French national research institute โ€” providing the formal foundations for internet security at global scale.

The Dolev-Yao Model and Applied Pi-Calculus

ProVerif works in the symbolic model of cryptography (also called the Dolev-Yao model, after Danny Dolev and Andrew Yao's 1983 paper). In this model:

This abstraction trades computational guarantees (which require the computational model โ€” reduction to hard mathematical problems) for automation: ProVerif can decide security properties automatically for a wide class of protocols, while computational proofs require significant manual effort.

Applied Pi-Calculus Syntax

A TLS 1.3 client process in applied pi-calculus notation:

(* Cryptographic primitives *)
fun encrypt(bitstring, key): bitstring.
fun decrypt(bitstring, key): bitstring.
equation forall m: bitstring, k: key;
  decrypt(encrypt(m, k), k) = m.

fun sign(bitstring, skey): bitstring.
fun verify(bitstring, bitstring, pkey): bool.
equation forall m: bitstring, sk: skey;
  verify(m, sign(m, sk), pk(sk)) = true.

(* Diffie-Hellman *)
fun exp(G, exponent): G.
equation forall a: exponent, b: exponent;
  exp(exp(g, a), b) = exp(exp(g, b), a).

(* TLS 1.3 client hello *)
let TLSClient(serverPK: pkey, csk: skey) =
  new clientNonce: nonce;
  new clientDH: exponent;
  let clientShare = exp(g, clientDH) in
  out(net, (clientNonce, clientShare));  (* ClientHello *)
  
  in(net, (serverNonce: nonce, serverShare: G, serverCert: bitstring, serverFinished: bitstring));
  
  (* Verify server certificate *)
  if verify(serverShare, serverCert, serverPK) = true then
  
  (* Derive handshake keys via HKDF (modelled as PRF) *)
  let dhSecret = exp(serverShare, clientDH) in
  let hs_secret = HKDF_extract(dhSecret, clientNonce, serverNonce) in
  let server_hs_key = HKDF_expand(hs_secret, label_s_hs) in
  let client_hs_key = HKDF_expand(hs_secret, label_c_hs) in
  
  (* Verify server finished *)
  if verify(hs_secret, serverFinished, server_hs_key) = true then
  
  (* Derive application keys *)
  let master_secret = HKDF_extract(hs_secret, zero) in
  let server_app_key = HKDF_expand(master_secret, label_s_ap) in
  let client_app_key = HKDF_expand(master_secret, label_c_ap) in
  
  (* Application data โ€” secrecy goal *)
  new appData: bitstring;
  out(net, encrypt(appData, client_app_key));
  event ClientFinished(serverPK, server_app_key, client_app_key).

Horn Clause Resolution

ProVerif translates process terms into Horn clauses โ€” logical rules of the form H1 โˆง โ€ฆ โˆง Hn โ†’ C โ€” and uses resolution to derive what an adversary can compute. The derivation procedure is a sound (and often complete) decision procedure for reachability of adversary-controlled states.

(* ProVerif internally generates Horn clauses like: *)
(* If adversary knows encrypted(m, k) and k, adversary knows m *)
attacker(decrypt(x, k)) :- attacker(x), attacker(k).

(* If attacker can compute all inputs to encrypt, can compute output *)
attacker(encrypt(x, k)) :- attacker(x), attacker(k).

(* Protocol rule: server sends encrypted response *)
attacker(encrypt(response, server_key)) :- 
  attacker(clientHello),
  ... (* server process derivation *)

The secrecy query asks: can the adversary derive the secret term? ProVerif answers this by checking if the Horn clause derivation reaches a clause of the form attacker(secret). For TLS 1.3, the query is: can the adversary derive the session application keys? ProVerif proves: no.

Security Properties ProVerif Can Verify

Secrecy

(* Is appData secret from the adversary? *)
query attacker(appData).
(* Expected result: false โ€” ProVerif cannot find a derivation *)

For TLS 1.3: ProVerif proved that the application data keys cannot be derived by a Dolev-Yao adversary, even with full control of the network โ€” including replay attacks, man-in-the-middle on unverified connections, and compromise of earlier session keys (forward secrecy).

Authentication via Correspondence Assertions

(* Injective agreement: server finished โ†” client sees matching keys *)
event ServerFinished(pkey, key, key).
event ClientFinished(pkey, key, key).

query pk: pkey, sk: key, ck: key;
  inj-event(ClientFinished(pk, sk, ck)) ==>
  inj-event(ServerFinished(pk, sk, ck)).
(* Each client completion corresponds to exactly one server completion *)

Injective correspondence captures authentication with replay protection: every client completion of the handshake corresponds to a unique server completion with the same keys. Non-injective correspondence captures weaker authentication that permits replay.

Equivalence Properties

ProVerif can also verify observational equivalence โ€” whether two processes are indistinguishable to an adversary. This captures privacy properties:

(* Are two users' sessions indistinguishable? Captures anonymity/unlinkability *)
let ProcessA = ... (* session with user A *)
let ProcessB = ... (* session with user B *)

query ProcessA โ‰ˆ ProcessB.
(* If true: adversary cannot distinguish A from B โ€” privacy holds *)

This is the property needed to verify 5G authentication privacy (IMSI/SUPI concealment) and eIDAS 2.0 selective disclosure (ZKP-based credentials where the verifier cannot link presentations).

Industrial Applications

TLS 1.3 (RFC 8446)

The tls13-spec project (INRIA Paris Prosecco team, 2016โ€“2018) modelled the TLS 1.3 specification in ProVerif + the F* proof assistant. The ProVerif models verified:

A subtle cross-protocol attack was found in an early TLS 1.3 draft via the ProVerif analysis and corrected before standardisation. The IETF TLS working group cited the formal analysis in the RFC 8446 Security Considerations section.

Signal Protocol

The Signal Protocol โ€” used by Signal, WhatsApp, and iMessage โ€” was formally verified using ProVerif. The Double Ratchet algorithm and X3DH (Extended Triple Diffie-Hellman) key agreement were modelled in applied pi-calculus and verified for:

5G Authentication (EAP-AKAโ€ฒ)

The 5G NR (New Radio) authentication protocols โ€” 5G-AKA and EAP-AKAโ€ฒ โ€” were formally analysed using ProVerif by Jannik Basin ๐Ÿ‡ฉ๐Ÿ‡ช (ETH Zurich ๐Ÿ‡จ๐Ÿ‡ญ), Jannik Dreier ๐Ÿ‡ฉ๐Ÿ‡ช (Universitรฉ de Lorraine ๐Ÿ‡ซ๐Ÿ‡ท / INRIA Nancy ๐Ÿ‡ซ๐Ÿ‡ท), Lucca Hirschi ๐Ÿ‡ซ๐Ÿ‡ท (INRIA Saclay ๐Ÿ‡ซ๐Ÿ‡ท), Sasa Radomirovic ๐Ÿ‡ท๐Ÿ‡ธ (University of Dundee ๐Ÿ‡ฌ๐Ÿ‡ง), Ralf Sasse ๐Ÿ‡ฉ๐Ÿ‡ช (ETH Zurich ๐Ÿ‡จ๐Ÿ‡ญ), and Vincent Stettler ๐Ÿ‡จ๐Ÿ‡ญ (ETH Zurich ๐Ÿ‡จ๐Ÿ‡ญ) โ€” the TAMARIN tool was the primary vehicle (using similar symbolic methods), but ProVerif models were also developed.

The analysis found that 5G-AKA had a linkability flaw: an adversary could track a user's location without breaking cryptography, just by replaying authentication messages. The 3GPP standardisation body corrected the 5G-AKA specification before finalisation. This is the kind of subtle privacy flaw โ€” not a cryptographic break, but a protocol design error โ€” that symbolic model checkers like ProVerif are specifically designed to find.

European Regulatory Context

NIS2 Directive (EU 2022/2555)

The NIS2 Directive requires operators of essential services (energy, transport, banking, health, water, digital infrastructure) to implement "appropriate and proportionate technical and organisational measures" including cryptographic protocols. ProVerif-verified protocols provide auditable evidence that the cryptographic protocols protecting critical infrastructure have been formally analysed โ€” evidence that NIS2 Article 21 risk management documentation can reference directly.

French critical infrastructure operators (EDF ๐Ÿ‡ซ๐Ÿ‡ท nuclear, SNCF ๐Ÿ‡ซ๐Ÿ‡ท railway, Thales ๐Ÿ‡ซ๐Ÿ‡ท defence communications) are NIS2-regulated entities. The INRIA/ANSSI (Agence Nationale de la Sรฉcuritรฉ des Systรจmes d'Information ๐Ÿ‡ซ๐Ÿ‡ท) ecosystem โ€” ProVerif + ATSEC evaluations + Common Criteria โ€” provides a complete French-government-backed formal verification chain for NIS2-regulated cryptographic protocols.

DORA (Digital Operational Resilience Act, EU 2022/2554)

The Digital Operational Resilience Act requires financial sector firms (banks, insurance, asset managers, CCPs) to maintain ICT risk management frameworks including cryptographic protocol resilience. DORA Article 9 requires "state-of-the-art" cryptographic protocols โ€” and ProVerif formal analysis is increasingly cited as evidence of "state-of-the-art" in DORA compliance documentation for financial sector firms under ECB and EBA supervision.

eIDAS 2.0 (EU 910/2014 revised)

The European Digital Identity Wallet (EUDI Wallet, ARF 1.4) uses OpenID4VP (Verifiable Presentations) and SD-JWT (Selective Disclosure JWTs) for credential exchange. The privacy properties of the EUDI Wallet โ€” selective disclosure (present only required attributes), unlinkability (presentations from the same credential are not linkable), holder binding (only the legitimate holder can present credentials) โ€” are exactly the kind of observational equivalence properties that ProVerif can formally verify.

ANSSI ๐Ÿ‡ซ๐Ÿ‡ท (Agence Nationale de la Sรฉcuritรฉ des Systรจmes d'Information) is the French national cybersecurity authority and ENISA partner. ANSSI has contributed to eIDAS 2.0 security analysis using ProVerif-based formal methods, making ProVerif directly relevant to the EU digital identity infrastructure rollout.

EU AI Act (Article 9) + CRA 2027

The EU AI Act Article 9 requires "state-of-the-art" risk management for high-risk AI systems. AI systems that communicate over network protocols (API security, model-serving authentication) can use ProVerif-verified protocol stacks as evidence that the communication layer meets the "state-of-the-art" bar. The Cyber Resilience Act (CRA) 2027 requires CE-marked software products to "handle, store and transmit only data, commands, functions or scripts that are necessary for the intended purpose" โ€” ProVerif verification of the protocol stack supports this requirement.

EU Verification Ecosystem

ProVerif is not isolated: it is part of a broader European ecosystem of cryptographic protocol verification tools:

TAMARIN Prover (ETH Zurich ๐Ÿ‡จ๐Ÿ‡ญ + Universitรคt Erlangen-Nรผrnberg ๐Ÿ‡ฉ๐Ÿ‡ช + INRIA Nancy ๐Ÿ‡ซ๐Ÿ‡ท + Universitat Pompeu Fabra ๐Ÿ‡ช๐Ÿ‡ธ): Schmidt + Meier + Cremers + Basin (ETH). Multiset rewriting + temporal logic. Used for 5G-AKA analysis, EMV payment protocol, WPA3 Wi-Fi. Handles unbounded sessions and stateful protocols that ProVerif approximates.

CryptoVerif (Bruno Blanchet ๐Ÿ‡ซ๐Ÿ‡ท, INRIA Paris ๐Ÿ‡ซ๐Ÿ‡ท): Blanchet's computational model companion to ProVerif. Proves protocols secure against probabilistic polynomial-time adversaries โ€” cryptographic hardness reductions rather than Dolev-Yao. Used to verify TLS 1.3 in the computational model (IEEE S&P 2017, joint with ProVerif symbolic analysis).

EasyCrypt (IMDEA Software Institute ๐Ÿ‡ช๐Ÿ‡ธ Madrid + INRIA ๐Ÿ‡ซ๐Ÿ‡ท + ETH Zurich ๐Ÿ‡จ๐Ÿ‡ญ): Gilles Barthe ๐Ÿ‡ซ๐Ÿ‡ท (IMDEA / MPI-SP Bochum) + Franรงois Dupressoir ๐Ÿ‡ซ๐Ÿ‡ท + Pierre-Yves Strub ๐Ÿ‡ซ๐Ÿ‡ท (ร‰cole Polytechnique ๐Ÿ‡ซ๐Ÿ‡ท). Proof assistant for computational cryptography. Used to verify HACL* (formally verified cryptographic implementations in F*).

HACL* (INRIA Paris Prosecco/Cascade ๐Ÿ‡ซ๐Ÿ‡ท): Karthikeyan Bhargavan ๐Ÿ‡ฎ๐Ÿ‡ณ + Jonathan Protzenko ๐Ÿ‡ฉ๐Ÿ‡ช (Microsoft Research). Formally verified implementations of ChaCha20-Poly1305, Curve25519, ECDSA, AES-GCM, BLAKE2, SHA-2 and SHA-3 in F* ๐Ÿ‡ซ๐Ÿ‡ท (Nikhil Swamy + Catalin Hritcu ๐Ÿ‡ท๐Ÿ‡ด INRIA, MSR). Deployed in Firefox, the Linux kernel, and the WireGuard VPN protocol.

The geography: Paris (INRIA) โ†’ ProVerif + CryptoVerif + HACL* + F* + miTLS. Zurich (ETH) โ†’ TAMARIN + EasyCrypt + Gobra + Nagini. Madrid (IMDEA) โ†’ EasyCrypt + formal crypto. This is a coherent EU cluster, funded through EU Horizon projects and French/Swiss national research programmes โ€” with no US Cloud Act exposure.

Deploying a ProVerif Analysis Service on sota.io

A protocol verification service that runs ProVerif analyses and stores results in EU PostgreSQL:

FROM debian:bookworm-slim AS builder

RUN apt-get update && apt-get install -y \
    ocaml ocaml-findlib \
    libocamlgraph-ocaml-dev \
    wget make git \
    && apt-get clean

# Build ProVerif from source (OCaml โ€” same stack as CompCert/Why3/Coq/Frama-C)
RUN wget https://bblanche.gitlabpages.inria.fr/proverif/proverif2.05.tar.gz && \
    tar xzf proverif2.05.tar.gz && \
    cd proverif2.05 && \
    ./build && \
    cp proverif /usr/local/bin/proverif

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y \
    postgresql-client \
    libocamlgraph-ocaml-dev \
    && apt-get clean

COPY --from=builder /usr/local/bin/proverif /usr/local/bin/proverif
COPY analyze_protocol.sh /usr/local/bin/analyze_protocol
RUN chmod +x /usr/local/bin/analyze_protocol

CMD ["analyze_protocol"]
#!/bin/bash
# analyze_protocol.sh โ€” ProVerif analysis + sota.io PostgreSQL result storage

PROTOCOLS_DIR="${PROTOCOLS_DIR:-/workspace/protocols}"
DATABASE_URL="${DATABASE_URL:-}"

for pv_file in "$PROTOCOLS_DIR"/*.pv; do
  protocol_name=$(basename "$pv_file" .pv)
  
  # Run ProVerif analysis
  output=$(proverif "$pv_file" 2>&1)
  exit_code=$?
  
  # Parse results
  if echo "$output" | grep -q "RESULT.*true"; then
    verdict="VERIFIED"
    details=$(echo "$output" | grep "RESULT" | head -20)
  elif echo "$output" | grep -q "RESULT.*false"; then
    verdict="ATTACK_FOUND"
    details=$(echo "$output" | grep "RESULT\|Attack\|trace" | head -20)
  else
    verdict="INCONCLUSIVE"
    details=$(echo "$output" | tail -20)
  fi
  
  # Count verified and falsified queries
  verified=$(echo "$output" | grep -c "RESULT.*true" || echo "0")
  falsified=$(echo "$output" | grep -c "RESULT.*false" || echo "0")
  
  # Store in EU PostgreSQL on sota.io
  psql "$DATABASE_URL" -c "
    INSERT INTO protocol_verification_results (
      protocol_name,
      pv_file_hash,
      verdict,
      verified_queries,
      falsified_queries,
      proverif_output,
      analyzed_at
    ) VALUES (
      '${protocol_name}',
      '$(sha256sum "$pv_file" | cut -d' ' -f1)',
      '${verdict}',
      ${verified},
      ${falsified},
      \$\$${details}\$\$,
      NOW()
    ) ON CONFLICT (protocol_name, pv_file_hash) DO UPDATE SET
      verdict = EXCLUDED.verdict,
      verified_queries = EXCLUDED.verified_queries,
      falsified_queries = EXCLUDED.falsified_queries,
      analyzed_at = EXCLUDED.analyzed_at;"
  
  echo "=== ${protocol_name}: ${verdict} (${verified} verified, ${falsified} attacks found) ==="
done

Protocol verification results โ€” including attack traces for falsified queries โ€” stored in EU-jurisdiction PostgreSQL. Protocol models, cryptographic design decisions, and security evidence remain under French/EU jurisdiction. NIS2 Article 21 compliance documentation, DORA ICT risk management evidence, and eIDAS 2.0 protocol security analysis all remain Cloud Act-free.


ProVerif is open source (GPLv2), maintained by Bruno Blanchet at INRIA Paris (bblanche.gitlabpages.inria.fr/proverif). Binaries and source available. CryptoVerif (computational model companion) is also maintained by Blanchet at INRIA. sota.io has a free tier โ€” deploy your first ProVerif analysis pipeline in minutes and generate formally verified cryptographic protocol evidence for NIS2, DORA, and eIDAS 2.0 compliance on EU infrastructure.


See Also


sota.io is built in Europe, for Europe. Every workload you deploy on sota.io stays under EU jurisdiction โ€” GDPR-compliant, Cloud Act-free, and operated by an EU entity. Deploy ProVerif now โ†’