<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cas Cremers</title>
    <description>Cas Cremers: Security protocols, formal methods, and applied cryptography at CISPA</description>
    <link>https://people.cispa.io/cas.cremers/</link>
    <atom:link href="https://people.cispa.io/cas.cremers/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 18 Aug 2026 07:57:13 +0000</pubDate>
    <lastBuildDate>Tue, 18 Aug 2026 07:57:13 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Verification At Scale: Secure Protocol Composition, Dynamic Corruption, and TLS 1.3 ECH</title>
        <description>&lt;p&gt;In most branches of formal methods, life is beautiful: You model a system to prove its properties, then you model another system and prove its properties. Afterwards, you combine both systems to create a third one, and you know that this combined system still has all the properties of the two original systems.&lt;/p&gt;

&lt;p&gt;When we analyse security protocols, we don’t have this luxury: Even if two protocols are perfectly secure, simply running them one after the other might break all their security guarantees. The problem here is the &lt;strong&gt;adversary&lt;/strong&gt;: They can read, block and manipulate all messages sent over the network, and even fabricate entirely new messages from their knowledge. If two protocols are now used to assemble a new protocol – we say that the protocols are &lt;strong&gt;composed&lt;/strong&gt; – the adversary can use the messages sent from both original protocols to break their respective guarantees.&lt;/p&gt;

&lt;p&gt;The adversary is also the reason why classical composition results are not applicable to security protocols: Technically, we are not only composing two protocols, but parts of two systems with a third. The two systems under composition each consist of the actual protocol and the adversary, both under infinite replication, executed in parallel. The composed system however consists of the two protocols and the adversary, all three of which are not only executed in parallel, but also under infinite replication. This contrived setup is not covered by classical composition results.&lt;/p&gt;

&lt;p&gt;Overall, this makes it very cumbersome to formally analyse large security protocols. Without composition results, we always have to verify the protocol &lt;strong&gt;monolithically&lt;/strong&gt;. While there are powerful verifiers like Tamarin [&lt;a href=&quot;tamarin-prover.com&quot;&gt;TAM&lt;/a&gt;] or ProVerif [&lt;a href=&quot;https://bblanche.gitlabpages.inria.fr/proverif/&quot;&gt;PV&lt;/a&gt;] which can handle highly complex protocols, there are real-world protocols that make them reach their limits (see, e.g., [&lt;a href=&quot;https://doi.org/10.1145/3719027.3744865&quot;&gt;SPDM&lt;/a&gt;]). We need new approaches to the formal verification of security protocols, and using composition results is one of them.&lt;/p&gt;

&lt;p&gt;Of course, this is not a particularly new insight, and the community has been looking into &lt;strong&gt;secure protocol composition&lt;/strong&gt; since the 1990s. There are in fact quite a few composition theorems which state conditions under which it is safe to compose security protocols. However, they are very rarely used in protocol verification. A common argument is that their requirements are unrealistic and hard to meet in practice. Many results require the two protocols to be composed to use &lt;strong&gt;disjoint primitives&lt;/strong&gt;, i.e., if one of the protocols uses a cryptographic primitive, the same primitive cannot be used by the other protocol. Additionally, these results are not able to reason about all relevant security properties. Notably, &lt;strong&gt;Forward Secrecy&lt;/strong&gt; (FS) and &lt;strong&gt;Post-Compromise Security&lt;/strong&gt; [&lt;a href=&quot;https://eprint.iacr.org/2016/221&quot;&gt;PCS&lt;/a&gt;] are not covered by existing composition theorems.&lt;/p&gt;

&lt;p&gt;We tackle both problems in our paper &lt;strong&gt;Secure Protocol Composition under Dynamic Corruption: Scaling Up Symbolic Analysis for Real-World Security Protocols&lt;/strong&gt; [&lt;a href=&quot;https://eprint.iacr.org/2026/900&quot;&gt;SPC&lt;/a&gt;], which will appear at USENIX Security next month. In it, we do two things:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;We use the Applied Pi-Calculus to describe and prove a composition theorem in the symbolic model of cryptography; the theorem is applicable even if we consider an adversary capable of &lt;strong&gt;dynamic corruption&lt;/strong&gt;, which is necessary to specify FS and PCS.&lt;/li&gt;
  &lt;li&gt;We demonstrate that even though our theorem requires disjoint primitives, it can be used to compositionally verify a large-scale, real-world security protocol by proving FS of TLS 1.3 with the ECH extension.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this post, we will have a look at what we have proven and how we have applied it to TLS 1.3 ECH. We will not go into the nitty-gritty technical details here; rather, the goal is to give an overview of our work and some first orientation for anyone who wants to take a closer look at our paper. This means that we will use as little formal notation as possible; we will even abstain from using Applied Pi or any other process calculus! If this disappoints you, then just have a look at our paper – there is plenty of both in there.&lt;/p&gt;

&lt;h2 id=&quot;the-composition-theorem&quot;&gt;The Composition Theorem&lt;/h2&gt;

&lt;p&gt;We just promised to use as little formal notation as possible, so let’s briefly define a few things and then be (almost) done with it. We consider two protocols &lt;em&gt;P&lt;/em&gt; and &lt;em&gt;Q&lt;/em&gt;, where &lt;em&gt;P&lt;/em&gt; uses some output of &lt;em&gt;Q&lt;/em&gt;; to make this explicit, we write &lt;em&gt;P&lt;/em&gt;[] if we consider protocol &lt;em&gt;P&lt;/em&gt; on its own and &lt;em&gt;P&lt;/em&gt;[&lt;em&gt;Q&lt;/em&gt;] for the composition of &lt;em&gt;P&lt;/em&gt; with &lt;em&gt;Q&lt;/em&gt;. Slightly oversimplified: &lt;em&gt;P&lt;/em&gt; uses the output of &lt;em&gt;Q&lt;/em&gt;. &lt;em&gt;P&lt;/em&gt; could be some data exchange or messaging protocol and &lt;em&gt;Q&lt;/em&gt; a key-exchange protocol. If &lt;em&gt;P&lt;/em&gt; and &lt;em&gt;Q&lt;/em&gt; are simply executed in parallel, we denote this by &lt;em&gt;P&lt;/em&gt; ∥ &lt;em&gt;Q&lt;/em&gt;; if there is no cryptographic primitive and no data item (e.g., encryption key) that is used by both protocols, then &lt;em&gt;P&lt;/em&gt; ∥ &lt;em&gt;Q&lt;/em&gt; is called a &lt;strong&gt;disjoint composition&lt;/strong&gt;. Security properties are denoted by &lt;em&gt;α&lt;/em&gt;. Finally, a &lt;strong&gt;trace&lt;/strong&gt; is a record of all outputs a protocol makes to and inputs it receives from the public network during its execution.&lt;/p&gt;

&lt;p&gt;First of all, we have to make precise what we mean by &lt;strong&gt;dynamic corruption&lt;/strong&gt;. In our paper, we define it as follows.&lt;/p&gt;

&lt;blockquote&gt;

  &lt;p&gt;Consider a protocol &lt;em&gt;P&lt;/em&gt; that uses some secret data item &lt;em&gt;d&lt;/em&gt;. An adversary is capable of dynamic corruption of &lt;em&gt;d&lt;/em&gt; if they can gain knowledge of &lt;em&gt;d&lt;/em&gt; at any point in time during the execution of &lt;em&gt;P&lt;/em&gt;.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;By this definition, dynamic corruption is a capability of the adversary and thus part of a threat model. If we have to assume that an adversary is able to reveal a secret &lt;em&gt;d&lt;/em&gt; whenever they like (or need), we assume dynamic corruption. This is not unrealistic: Regularly, users are careless with their passwords, courts order secrets to be handed over to law-enforcement agencies, and cryptographic material is simply stolen as the result of a successful attack on a vulnerable system. In all these cases we want to know what a person or party can do with our secret data, and specifically, what protected information they can learn with it; in other words, what security properties a protocol has. To model these properties, we also have to model dynamic corruption, which we do by slightly manipulating the protocols we are investigating.&lt;/p&gt;

&lt;p&gt;Let’s assume a protocol &lt;em&gt;P&lt;/em&gt; and some data &lt;em&gt;ω&lt;/em&gt; which we assume an adversary might get hold of. Since for our purposes, &lt;em&gt;ω&lt;/em&gt; is a set of variables, we call it a set of &lt;strong&gt;corruptible variables&lt;/strong&gt;. In our modification, we add an operation to &lt;em&gt;P&lt;/em&gt; for every item in &lt;em&gt;ω&lt;/em&gt; which can be executed at any time; this operations simply sends the respective item to the network, and with it, to the adversary. We call this event a &lt;strong&gt;leak&lt;/strong&gt;; the modified protocol is denoted as &lt;em&gt;ς(P, ω)&lt;/em&gt; (this is the last new bit of formal notation, we promise).&lt;/p&gt;

&lt;p&gt;That’s it already. With this tiny modification we can specify FS and PCS and any other property that might be relevant under dynamic corruption. What these properties look like is not important for us, since our composition theorem does not depend on a specific security property. It simply states that if some property &lt;em&gt;α&lt;/em&gt; holds for the individual protocols, then it also holds for their composition even if the adversary is capable of dynamic corruption. We merely assume two protocols &lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt;, two sets of corruptible variables &lt;em&gt;ω&lt;sub&gt;P&lt;/sub&gt;&lt;/em&gt; and &lt;em&gt;ω&lt;sub&gt;Q&lt;/sub&gt;&lt;/em&gt;, and any security property &lt;em&gt;α&lt;/em&gt;. They have to fulfill five requirements:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt; have to use disjoint primitives. As mentioned already, this means that the two protocols cannot use the same cryptographic primitives. While this seems like a very severe restriction (more on that in the following section where we discuss our case study), it makes life harder for the adversary: The protocols are mutually unintelligible now, so the adversary cannot abuse messages from one of the protocols to confuse the other.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt; have to abide by some syntactic requirements which enforce that &lt;em&gt;Q&lt;/em&gt; is actually able to provide all data it is supposed to send to &lt;em&gt;P&lt;/em&gt;, and that all data shared between &lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt; is either corruptible in both protocols or in neither. Since anything else would imply an inconsistent threat model between the analysis of the two protocols, this is a natural assumption anyways.&lt;/li&gt;
  &lt;li&gt;This is a more technical one: &lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt; may not use shared data to exchange &lt;strong&gt;channel names&lt;/strong&gt;; i.e., they may not open any new, possibly secret, communication channels. This avoids unintended behavior of &lt;em&gt;P&lt;/em&gt;[&lt;em&gt;Q&lt;/em&gt;] that is not present in the two individual protocols alone.&lt;/li&gt;
  &lt;li&gt;Shared data has to be kept secret in the uncorrupted versions of both &lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt;. Otherwise, the adversary could use some of the shared data to retrieve information from one of the protocols they could not otherwise (imagine &lt;em&gt;P&lt;/em&gt;[] using some key &lt;em&gt;k&lt;/em&gt; for encryption, but &lt;em&gt;Q&lt;/em&gt; just blurting &lt;em&gt;k&lt;/em&gt; out to the network).&lt;/li&gt;
  &lt;li&gt;This is a &lt;em&gt;very&lt;/em&gt; technical one: Data shared between &lt;em&gt;P&lt;/em&gt;[] and &lt;em&gt;Q&lt;/em&gt; has to consist entirely of &lt;strong&gt;fresh variables&lt;/strong&gt;. The reason for this is also very technical; essentially, we need this in our proof to keep track of shared data and whether it has been leaked to the adversary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If these all hold, then the following implication holds as well.&lt;/p&gt;

&lt;blockquote&gt;

  &lt;p&gt;If &lt;em&gt;α&lt;/em&gt; holds for &lt;em&gt;ς(P&lt;/em&gt;[]&lt;em&gt;, ω&lt;sub&gt;P&lt;/sub&gt;)&lt;/em&gt;, and &lt;em&gt;α&lt;/em&gt; holds for &lt;em&gt;ς(Q, ω&lt;sub&gt;Q&lt;/sub&gt;)&lt;/em&gt;, then &lt;em&gt;α&lt;/em&gt; holds for &lt;em&gt;ς(P&lt;/em&gt;[&lt;em&gt;Q&lt;/em&gt;]&lt;em&gt;, ω&lt;sub&gt;P&lt;/sub&gt; ∪ ω&lt;sub&gt;Q&lt;/sub&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;To prove this, we show that every attack on &lt;em&gt;P&lt;/em&gt;[&lt;em&gt;Q&lt;/em&gt;] already contains an attack on either &lt;em&gt;P&lt;/em&gt;[] or &lt;em&gt;Q&lt;/em&gt; alone. For this, we first show that we can repeat leaks without any ramifications; notably, we cannot “fix” an attack by giving the same information to an adversary twice. Then, we show that for any trace of &lt;em&gt;P&lt;/em&gt;[&lt;em&gt;Q&lt;/em&gt;] where leaks are instantly repeated, there is a corresponding trace of the disjoint composition &lt;em&gt;P&lt;/em&gt; ∥ &lt;em&gt;Q&lt;/em&gt; which shares the same properties. We conclude by using a well-known composition result which states that two disjoint protocols can be securely composed.&lt;/p&gt;

&lt;p&gt;This last step actually required us to generalize said result. So far, it was only proven that disjoint composition works if the two protocols use a limited, specific set of cryptographic protocols – we lift this to arbitrary primitives.&lt;/p&gt;

&lt;p&gt;Both proofs can be found in full length in [&lt;a href=&quot;https://eprint.iacr.org/2026/900&quot;&gt;SPC&lt;/a&gt;].&lt;/p&gt;

&lt;h2 id=&quot;a-real-world-case-study&quot;&gt;A Real-World Case Study&lt;/h2&gt;

&lt;p&gt;A composition theorem is all nice and well, but what can we actually do with it? Can we use it to perform a &lt;strong&gt;compositional analysis&lt;/strong&gt; of a large-scale, real-world protocol using an automated protocol verifier? If yes, how much do we actually benefit from using a composition theorem? We mentioned earlier that composition theorems are often considered too difficult to apply if they require disjoint primitives, which is exactly what we do. Still, we found a prominent protocol that matches the requirements of our composition theorem: TLS 1.3.&lt;/p&gt;

&lt;p&gt;But how can this large, complex protocol match our composition theorem?&lt;/p&gt;

&lt;p&gt;First of all, “disjoint primitives” sounds worse than it is. It does not require cryptographic primitives to be completely and conceptually different, just that they are sufficiently different to be modeled as two different function symbols in the symbolic model. In practice this already is the case if two hash functions produce hashes of different length (say, 256bit and 512bit hashes) or two HKDFs use different constant tags. This distinction enables us to apply our composition theorem to TLS 1.3 ECH.&lt;/p&gt;

&lt;p&gt;TLS 1.3 ECH can roughly be split into three parts: An initial &lt;strong&gt;Key Exchange&lt;/strong&gt;, an &lt;strong&gt;Authentication Phase&lt;/strong&gt;, and a &lt;strong&gt;Data Exchange&lt;/strong&gt;. For the key exchange, TLS 1.3 ECH uses HPKE, modular exponentiation, and three different KDFs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KDF0&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KDFhs&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KDFms&lt;/code&gt;. During the Authentication Phase and the Data Exchange the protocol uses symmetric encryption, signatures, MACs, and the KDFs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KDFk&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KDFpsk&lt;/code&gt;. So even though KDFs are used across the entire protocol, we can still take out the Key Exchange from the rest of the protocol, keeping the primitives disjoint, and do a compositional analysis!&lt;/p&gt;

&lt;p&gt;That is, of course, if we can model it such that the remaining four requirements are also fulfilled, and if there is a protocol verifier that is compatible with our composition theorem. Since we used the Applied Pi-Calculus for our result, we actually have two options: ProVerif and SAPIC+ [&lt;a href=&quot;https://www.usenix.org/conference/usenixsecurity22/presentation/cheval&quot;&gt;SAPIC&lt;/a&gt;]. Both use dialects of the Applied Pi-Calculus that are equivalent to the plain Applied Pi-Calculus (proven in [&lt;a href=&quot;https://doi.org/10.1561/3300000004&quot;&gt;PVe&lt;/a&gt;] for ProVerif and [&lt;a href=&quot;https://www.usenix.org/conference/usenixsecurity22/presentation/cheval&quot;&gt;SAPIC&lt;/a&gt;] for SAPIC+). Even better, there already is a comprehensive ProVerif model of TLS 1.3, even including the Encrypted Client Hello extension, covering a plethora of different scenarios: [&lt;a href=&quot;https://doi.org/10.1145/3548606.3559360&quot;&gt;TLS&lt;/a&gt;]. We skip over the very technical details here, but this model also fulfills requirements 2 through 5 of our composition theorem!&lt;/p&gt;

&lt;p&gt;We therefore based our analysis on this model, enhanced it with a composition mode which analyses the two parts of TLS 1.3 separately, and added a query for FS of TLS 1.3 ECH’s master secret. Then, for all relevant scenarios, we performed a compositional analysis and compared the respective resource consumption. Let’s have a look at the results of a few of the 32 scenarios we analysed; the first four columns encode the respective scenarios.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;scenario&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;monolithic&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;compositional&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;improvement&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(hh:mm)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(GB)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(hh:mm)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(GB)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;time&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;memory&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2  2 2 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;00:11&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;02.64&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0:06&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.66&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;45%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;75%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2  2 2 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;00:16&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;03.49&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0:07&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.76&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;56%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;78%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2  2 3 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;00:48&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;08.08&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0:06&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.79&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;88%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;90%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2  2 3 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;01:22&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12.25&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0:08&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.79&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;90%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;94%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7  2 3 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;14:10&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;32.65&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2:50&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;80%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;86%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7  2 3 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;16:29&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;43.10&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:32&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5.31&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;79%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;88%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9  2 2 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;25:01&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;49.53&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2:51&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;89%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;91%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9  2 2 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;28:51&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;65.67&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:30&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;88%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;93%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9  2 3 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;timeout&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;132.06&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2:54&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9  2 3 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;timeout&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;151.72&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:41&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5.31&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;10 2 3 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;timeout&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;132.06&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:02&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;10 2 3 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;timeout&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;151.71&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:39&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5.31&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Unsurprisingly, ProVerif needs much less time and memory if it only has to consider parts of the model; on average, the compositional analysis was 71% faster and needed 86% less memory than the monolithic analysis. Both improvements are very consistent – there is a substantial speed-up in almost all scenarios, and memory consumption is at least 90% lower in half the scenarios, never dropping below 57%. ProVerif is even able to prove Forward Secrecy in all scenarios considered, while the monolithic analysis times out after 48h in four cases.&lt;/p&gt;

&lt;p&gt;We observed four outliers in which the compositional analysis is only a tiny bit faster, exactly as fast, and even slightly slower than the monolithic analysis.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;scenario&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;monolithic&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;compositional&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;improvement&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt; &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(hh:mm)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(GB)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(hh:mm)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;(GB)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;time&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;memory&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7 2 2 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;02:55&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;10.66&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2:47&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;05%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;57%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7 2 2 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;03:22&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12.25&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:22&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;00%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;62%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;8 2 2 2&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;02:51&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;10.66&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2:50&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;01%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;57%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;8 2 2 4&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;03:22&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12.25&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3:30&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.62&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;-4%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;62%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;These four scenarios cover barely any post-handshake interaction, however, so compositional and monolithic analysis have to take very similar parts of the model into account. Still, memory consumption is down by roughly 60% in all four cases.&lt;/p&gt;

&lt;p&gt;Nonetheless, compositional analysis saves a lot of resources, and sometimes even enables a proof in the first place. For the complete data, see [&lt;a href=&quot;https://eprint.iacr.org/2026/900&quot;&gt;SPC&lt;/a&gt;].&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;Let’s take a step back: Overall, we identified and proved a composition theorem in the symbolic model that holds under dynamic corruption, and we used it to compositionally prove Forward Secrecy in TLS 1.3 ECH. So where do we go from here?&lt;/p&gt;

&lt;p&gt;On the one hand, it would be very interesting to see further, possibly more comprehensive case studies of compositional analyses. Taking a closer look at TLS 1.3 ECH would be viable – we focused on a single out of the many properties TLS guarantees – but also other complex protocols like the aforementioned SPDM. Was TLS 1.3 ECH a lucky outlier or does our result, do composition results in general work with other protocols, too? Do they also work when combining complementary protocols like key-exchanges and data transfer? If they do not, does this mean that there is an attack? As far as we know, this has not been surveyed yet.&lt;/p&gt;

&lt;p&gt;On the other hand, improving our current composition result will be helpful. As of now, it only covers situations in which one protocol transfers data to the other, but not vice versa. It might also be valuable to try to replace the disjoint primitives requirement with something else – whatever that might be. A protocol composition survey as described above could be very helpful for identifying possible replacements.&lt;/p&gt;

&lt;p&gt;Secure protocol composition still has a lot of open problems, and it might very well be possible that we will never enjoy the same luxuries in security protocol verification as in other branches of formal methods. If we get compositional reasoning to work, however, it can pave the path for automated protocol verification at scale.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For further details, read the &lt;a href=&quot;https://eprint.iacr.org/2026/900.pdf&quot;&gt;full paper&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;p&gt;[SAPIC] Vincent Cheval, Charlie Jacomme, Steve Kremer, and Robert Künnemann. 2022. “SAPIC+: Protocol Verifiers of the World, Unite!” Proceedings of the USENIX Security Symposium 2022. &lt;a href=&quot;https://www.usenix.org/conference/usenixsecurity22/presentation/cheval&quot;&gt;https://www.usenix.org/conference/usenixsecurity22/presentation/cheval&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[SPC] Cas Cremers, Erik Pallas, and Aleksi Peltonen. “Secure Protocol Composition under Dynamic Corruption: Scaling Up Symbolic Analysis of Real-World Security Protocols.” To appear in the proceedings of the USENIX Security Symposium 2026. &lt;a href=&quot;https://eprint.iacr.org/2026/900&quot;&gt;IACR ePrint 2026/900&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[SPDM] Cas Cremers, Alexander Dax, and Aurora Naska. “Breaking and Provably Restoring Authentication: A Formal Analysis of SPDM 1.2 Including Cross-Protocol Attacks.” Proceedings of the 2025 ACM SIGSAC Conference on Computer and Communications Security. 2025. DOI: &lt;a href=&quot;https://doi.org/10.1145/3719027.3744865&quot;&gt;10.1145/3719027.3744865&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[TAM] &lt;a href=&quot;tamarin-prover.com&quot;&gt;tamarin-prover.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[TLS] Karthikeyan Bhargavan, Vincent Cheval, and Christopher Wood. 2022. “A Symbolic Analysis of Privacy for TLS 1.3 with Encrypted Client Hello.” Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security. 2022. DOI: &lt;a href=&quot;https://doi.org/10.1145/3548606.3559360&quot;&gt;10.1145/3548606.3559360&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[PCS] Katriel Cohn-Gordon, Cas Cremers, and Luke Garratt. 2016. “Post-Compromise Security.” &lt;a href=&quot;https://eprint.iacr.org/2016/221&quot;&gt;IACR ePrint 2016/221&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[PV] &lt;a href=&quot;https://bblanche.gitlabpages.inria.fr/proverif/&quot;&gt;https://bblanche.gitlabpages.inria.fr/proverif/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[PVe] Bruno Blanchet. 2016. “Modeling and Verifying Security Protocols with the Applied Pi Calculus and ProVerif.” Foundations and Trends® in Privacy and Security 1, 1–2 (2016), 1–135. DOI: &lt;a href=&quot;https://doi.org/10.1561/3300000004&quot;&gt;10.1561/3300000004&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Jul 2026 09:00:00 +0000</pubDate>
        <link>https://people.cispa.io/cas.cremers/2026/07/02/Protocol-Composition-Dynamic-Corruption.html</link>
        <guid isPermaLink="true">https://people.cispa.io/cas.cremers/2026/07/02/Protocol-Composition-Dynamic-Corruption.html</guid>
        
        
      </item>
    
      <item>
        <title>Tamarin Prover team wins the Levchin Prize for Real World Cryptography</title>
        <description>&lt;p&gt;We are proud to share that the &lt;a href=&quot;https://www.tamarin-prover.com/&quot;&gt;Tamarin Prover&lt;/a&gt; team won the  International Association for Cryptologic Research (IACR) Real World Cryptography &lt;a href=&quot;https://rwc.iacr.org/LevchinPrize/&quot;&gt;2026 Levchin Prize&lt;/a&gt; for “developing the Tamarin prover, and its use in the analysis of real world security protocols”.&lt;/p&gt;

&lt;p&gt;The award ceremony took place at the &lt;a href=&quot;https://rwc.iacr.org/2026/&quot;&gt;IACR Real World Crypto&lt;/a&gt; (RWC) conference in Taipei, Taiwan. Watch the &lt;a href=&quot;https://www.youtube.com/watch?v=QQhyxFj4xJQ&amp;amp;t=7899s&quot;&gt;award ceremony&lt;/a&gt; and the &lt;a href=&quot;https://www.youtube.com/live/QQhyxFj4xJQ?si=_jH9dJh0s7UfepyL&amp;amp;t=8770&quot;&gt;keynote on Tamarin&lt;/a&gt; given by Cas Cremers.&lt;/p&gt;

&lt;p&gt;We are extremely grateful to all of our developers, contributors, and users, who have made Tamarin a success throughout the years. We look forward to many exciting new features and use cases in the future.&lt;/p&gt;

&lt;p&gt;Thank you all!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/cas.cremers/images/tamarin-team-levchin.jpg&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Mar 2026 09:00:00 +0000</pubDate>
        <link>https://people.cispa.io/cas.cremers/2026/03/09/Levchin-Prize.html</link>
        <guid isPermaLink="true">https://people.cispa.io/cas.cremers/2026/03/09/Levchin-Prize.html</guid>
        
        
      </item>
    
  </channel>
</rss>
