15
SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate 1 Philipp G. Haselwarter 2 Exequiel Rivas 3 Antoine Van Muylder 4 Th´ eo Winterhalter 1 at˘ alin Hrit , cu 1 Kenji Maillard 5 Bas Spitters 2 1 MPI-SP 2 Aarhus University 3 Inria Paris 4 Vrije Universiteit Brussel 5 Inria Rennes Abstract—State-separating proofs (SSP) is a recent method- ology for structuring game-based cryptographic proofs in a modular way. While very promising, this methodology was pre- viously not fully formalized and came with little tool support. We address this by introducing SSProve, the first general verification framework for machine-checked state-separating proofs. SSProve combines high-level modular proofs about composed protocols, as proposed in SSP, with a probabilistic relational program logic for formalizing the lower-level details, which together enable constructing fully machine-checked crypto proofs in the Coq proof assistant. Moreover, SSProve is itself formalized in Coq, including the algebraic laws of SSP, the soundness of the program logic, and the connection between these two verification styles. 1 Introduction Cryptographic proofs can be challenging to make fully pre- cise and to rigorously check. This has caused a “crisis of rigor” [17] in cryptography that Shoup [50], Bellare and Rogaway [17], Halevi [32], and others, proposed to address by systematically structuring proofs as sequences of games. This game-based proof methodology is not only ubiquitous in provable cryptography nowadays, but also amenable to full machine-checking in proof assistants such as Coq [9, 44] and Isabelle/HOL [16]. It has also led to the development of spe- cialized proof assistants [13] and automated verification tools for crypto proofs [12, 15, 22]. There are two key ideas behind these tools: (i) formally representing games and the adversaries against them as code in a probabilistic programming language, and (ii) using program verification techniques to conduct all game transformation steps in a machine-checked manner. For a long time however, game-based proofs have lacked modularity, which made them hard to scale to large, composed protocols such as TLS [47] or the upcoming MLS [8]. To address this issue, Brzuska et al. [23] have recently introduced state-separating proofs (SSP), a methodology for modular game-based proofs, inspired by the paper proofs in the miTLS project [20, 21, 30], by prior compositional cryptography frameworks [24, 40], and by process algebras [41]. In the SSP methodology, the code of cryptographic games is split into packages, which are modules made up of procedures sharing state. Packages can call each other’s procedures (also known as oracles) and can operate on their own state, but cannot directly access other packages’ state. Packages have natural notions of sequential and parallel composition that satisfy simple algebraic laws, such as associativity of sequential composition. This law is used to define cryptographic reductions not only in SSP, but also in the The Joy of Cryptography textbook [49], which teaches crypto proofs in a style very similar to SSP. While the SSP methodology is very promising, the lack of a complete formalization makes it currently only usable for informal paper proofs, not for machine-checked ones. The SSP paper [23] defines package composition and the syntax of a cryptographic pseudocode language for games and adversaries, but the semantics of this language is not formally defined, and the meaning of their assert operator is not even clear, given the probabilistic setting. Moreover, while SSP provides a good way to structure proofs at the high-level, using algebraic laws such as associativity, the low-level details of such proofs are usually treated very casually on paper. Yet none of the existing crypto verification tools that could help machine-check these low-level details supports the high-level part of SSP proofs: equational reasoning about composed packages (i.e., modules) is either not possible at all [9, 32, 44, 53], or does not exactly match the SSP package abstraction [13, 36] (see §6 for details). The main contribution of this work is to introduce SSProve, the first general verification framework for machine-checked state-separating proofs. SSProve brings together two different proof styles into a single unified framework: (1) high-level proofs are modular, done by reasoning equationally about composed packages, as proposed in SSP [23]; (2) low-level de- tails are formally proved in a probabilistic relational program logic [9, 13, 44]. Importantly, we show a formal connection between these two proof styles in Theorem 1. SSProve is a foundational framework, fully formalized in Coq. To achieve this, we define the syntax of crypto pseu- docode in terms of a free monad, in which external calls are represented as algebraic operations [45]. This gives us a principled way to define sequential composition of packages based on an algebraic effect handler [46] and to give machine- checked proofs of the SSP package laws [23], some of which were treated informally on paper. Moreover, we make precise the minimal state-separation requirements between adversaries and the games with which they are composed—this reduces the proof burden and allows us to prove more meaningful security results, that do not require the adversary’s state to be disjoint from intermediate games in the proof. Beyond just syntax, we also give a denotational semantics to crypto code in terms of stateful probabilistic functions that can signal assertion failures by sampling from the empty

SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

SSProve: A Foundational Frameworkfor Modular Cryptographic Proofs in Coq

Carmine Abate1 Philipp G. Haselwarter2 Exequiel Rivas3 Antoine Van Muylder4 Theo Winterhalter1

Catalin Hrit,cu1 Kenji Maillard5 Bas Spitters2

1MPI-SP 2Aarhus University 3Inria Paris 4Vrije Universiteit Brussel 5Inria Rennes

Abstract—State-separating proofs (SSP) is a recent method-ology for structuring game-based cryptographic proofs in amodular way. While very promising, this methodology was pre-viously not fully formalized and came with little tool support. Weaddress this by introducing SSProve, the first general verificationframework for machine-checked state-separating proofs. SSProvecombines high-level modular proofs about composed protocols,as proposed in SSP, with a probabilistic relational program logicfor formalizing the lower-level details, which together enableconstructing fully machine-checked crypto proofs in the Coqproof assistant. Moreover, SSProve is itself formalized in Coq,including the algebraic laws of SSP, the soundness of the programlogic, and the connection between these two verification styles.

1 IntroductionCryptographic proofs can be challenging to make fully pre-cise and to rigorously check. This has caused a “crisis ofrigor” [17] in cryptography that Shoup [50], Bellare andRogaway [17], Halevi [32], and others, proposed to addressby systematically structuring proofs as sequences of games.This game-based proof methodology is not only ubiquitousin provable cryptography nowadays, but also amenable to fullmachine-checking in proof assistants such as Coq [9, 44] andIsabelle/HOL [16]. It has also led to the development of spe-cialized proof assistants [13] and automated verification toolsfor crypto proofs [12, 15, 22]. There are two key ideas behindthese tools: (i) formally representing games and the adversariesagainst them as code in a probabilistic programming language,and (ii) using program verification techniques to conduct allgame transformation steps in a machine-checked manner.

For a long time however, game-based proofs have lackedmodularity, which made them hard to scale to large, composedprotocols such as TLS [47] or the upcoming MLS [8]. Toaddress this issue, Brzuska et al. [23] have recently introducedstate-separating proofs (SSP), a methodology for modulargame-based proofs, inspired by the paper proofs in the miTLSproject [20, 21, 30], by prior compositional cryptographyframeworks [24, 40], and by process algebras [41]. In the SSPmethodology, the code of cryptographic games is split intopackages, which are modules made up of procedures sharingstate. Packages can call each other’s procedures (also known asoracles) and can operate on their own state, but cannot directlyaccess other packages’ state. Packages have natural notionsof sequential and parallel composition that satisfy simplealgebraic laws, such as associativity of sequential composition.

This law is used to define cryptographic reductions not onlyin SSP, but also in the The Joy of Cryptography textbook [49],which teaches crypto proofs in a style very similar to SSP.

While the SSP methodology is very promising, the lackof a complete formalization makes it currently only usable forinformal paper proofs, not for machine-checked ones. The SSPpaper [23] defines package composition and the syntax of acryptographic pseudocode language for games and adversaries,but the semantics of this language is not formally defined, andthe meaning of their assert operator is not even clear, giventhe probabilistic setting. Moreover, while SSP provides a goodway to structure proofs at the high-level, using algebraic lawssuch as associativity, the low-level details of such proofs areusually treated very casually on paper. Yet none of the existingcrypto verification tools that could help machine-check theselow-level details supports the high-level part of SSP proofs:equational reasoning about composed packages (i.e., modules)is either not possible at all [9, 32, 44, 53], or does not exactlymatch the SSP package abstraction [13, 36] (see §6 for details).

The main contribution of this work is to introduce SSProve,the first general verification framework for machine-checkedstate-separating proofs. SSProve brings together two differentproof styles into a single unified framework: (1) high-levelproofs are modular, done by reasoning equationally aboutcomposed packages, as proposed in SSP [23]; (2) low-level de-tails are formally proved in a probabilistic relational programlogic [9, 13, 44]. Importantly, we show a formal connectionbetween these two proof styles in Theorem 1.

SSProve is a foundational framework, fully formalized inCoq. To achieve this, we define the syntax of crypto pseu-docode in terms of a free monad, in which external callsare represented as algebraic operations [45]. This gives us aprincipled way to define sequential composition of packagesbased on an algebraic effect handler [46] and to give machine-checked proofs of the SSP package laws [23], some of whichwere treated informally on paper. Moreover, we make precisethe minimal state-separation requirements between adversariesand the games with which they are composed—this reducesthe proof burden and allows us to prove more meaningfulsecurity results, that do not require the adversary’s state tobe disjoint from intermediate games in the proof.

Beyond just syntax, we also give a denotational semanticsto crypto code in terms of stateful probabilistic functionsthat can signal assertion failures by sampling from the empty

Page 2: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

probability subdistribution. Finally, we prove the soundnessof a probabilistic relational program logic for relating pairs ofcrypto code fragments.

For this soundness proof we build a semantic model basedon relational weakest-precondition specifications. Our model ismodular with respect to the considered side-effects (currentlyprobabilities, state, and assertion failures). To obtain it, wefollow a general recipe by Maillard et al. [38], who recentlyproposed to characterize such semantic models as relativemonad morphisms, mapping two monadic computations totheir canonical relational specification. This allows us to firstdefine a relative monad morphism for probabilistic, potentiallyfailing computations and then to extend this to state by sim-ply applying a relative monad transformer. Working out thisinstance of Maillard et al.’s [38] recipe involved formalizingvarious non-standard categorical constructs in Coq, in anorder-enriched context: lax functors, lax natural transforma-tions, left relative adjunctions, lax morphisms between suchadjunctions, state transformations of such adjunctions, etc.This formalization is of independent interest and should alsoallow us to more easily add extra side-effects and F?-stylesub-effecting [53] to SSProve in the future.

We have already started reaping the benefits of formalizingSSP in a proof assistant: our recently completed SSProveformalization of the KEM-DEM case study presented in [23]has led us to find—in conjunction with the authors of [23]—an error in the originally published proof. The authors of [23]have since proposed a revised version of their theorem, whichwe have adapted and fully proved in SSProve. We will describethis case study in a future publication.

Outline. The remainder of this paper is structured as fol-lows. §2 illustrates the key ideas of how to use SSProveon two simple crypto proofs, showing semantic security ofElGamal and PRF-based encryption. In §3 we formalizethe SSP methodology: cryptographic pseudocode, packages,sequential and parallel composition, and the algebraic lawsthey satisfy. In §4 we introduce the rules of our probabilisticrelational program logic and use them to prove Theorem 1,which formally connects SSP to this program logic. In §5 weoutline the effect-modular semantic model we use to prove thesoundness of the program logic. Finally, §6 discusses relatedwork and §7 future directions.

The full formalization of SSProve and of the examples fromthis paper (circa 20K lines of Coq code including comments)are available under the MIT open source license at https://github.com/SSProve/ssprove/tree/csf-paper.

2 Using SSProve: Key Ideas and ExamplesFormalizing the SSP methodology for high-level proofs allowsus to formally link it to the methodology of probabilistic rela-tional program logics for low-level proofs. In this section, webegin with a brief introduction to SSP (§2.1). Then, we presentour new theorem connecting SSP to a probabilistic relationalprogram logic (§2.2). Finally, by way of two examples, weshow how the two methodologies are used together to obtainfully formal security proofs. The first example looks at a

package: Pmem: n : nat

X(b):if b then

return 1else

return Z(n)

Y():return 5

Figure 2. Possible pseudocode implementation for P .

symmetric encryption scheme built out of a pseudo-randomfunction (§2.3), while the second looks at ElGamal, a popularasymmetric encryption scheme (§2.4).

2.1 An introduction to SSP

We begin by introducing (our variant of) the SSP method-ology of Brzuska et al. [23]. The main concept behind thismethodology is the package, which is a collection of pro-cedure implementations that together manipulate a commonpiece of state, and that may depend on a set of externalprocedures. We refer to the set of external procedures onwhich the package can depend as the imports of the package.

X

YZ

P

Figure 1. Package P .

In Figure 1, we can see a high-levelpicture of a package P : it implementsand exports the procedures X and Y,and it imports the external procedureZ. The arrows indicate the directionof calls. We use import(P ) to de-note the set of procedure names the

package P imports, and export(P ) to denote the names ofthe procedures it exports. The term interface is used to refer tosuch a set of procedure names.1 While the import and exportinterfaces of a package tell us where it can be used, in theSSP papers, the package implementations are usually given inseparate figures, which describe, in pseudocode, each of theprocedures exported by the package. For example, a possiblepseudocode implementation corresponding to the package Pcan be found in Figure 2. We refer to the code of the procedureX exported by package P as P.X.

Package algebra. Packages can be combined as algebraicobjects. We can build complex packages out of simpler onesusing the following composition operations.2

• Sequential composition: given two packages P1 and P2

with import(P1) ⊆ export(P2), then P1◦P2 is obtainedby inlining procedure definitions, each time P1 calls aprocedure in P2.

• Parallel composition: given two packages P1 and P2 suchthat export(P1) and export(P2) are disjoint, then P1 ‖P2 is the union of P1 and P2: it provides the proceduresfrom both P1 and P2.

1In SSProve the procedure names within interfaces are also associated withargument and result types, but we omit this detail until §3.1.

2In the SSProve formalization, composition can actually be performed onarbitrary packages, but the obtained packages are guaranteed to be valid onlywhen the requirements stated here are met, as detailed in §3.3.

2

Page 3: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

......

...P1 P2

P1

P2

...

......

...

Figure 3. Sequential and parallel composition.

• Identity package: given an interface I , we have a packagethat simply forwards all calls in this interface. We refer toit as the identity package on the interface I , written IDI ,and we have that import(IDI) = export(IDI) = I .

These operations have graphical counterparts which weshow in Figure 3. Moreover, there are natural algebraic lawsthat hold between these operators. For example, sequentialcomposition is an associative operator. Such laws are con-venient for cryptographic proofs, since they allow the com-positional structure of a package to be manipulated withouthaving to look at all at the implementation of its procedures.

Games and distinguishers. A package with no importsis called a game. A game pair contains two games thatexport the same procedures, i.e. a tuple (G0, G1) suchthat export(G0) = export(G1) and import(G0) =import(G1) = ∅. A distinguisher for a game pair is a packageD with import(D) = export(G0) = export(G1) andexport(D) = {run}, where run is an entry-point procedurethat can call the procedures exported by the games and returnsa boolean value: true or false. When a game G (so withoutimports) exports a single procedure run : unit → bool asabove, we denote by Pr [b← G] the probability that G.runreturns the boolean value b when running on initial memory.We can quantify how much a distinguisher can distinguish thetwo packages in a game pair:

Definition 1 (Distinguisher advantage). The advantage of adistinguisher D against a game pair G = (G0, G1) is

α(G)(D) =∣∣Pr[true← D ◦G0

]− Pr

[true← D ◦G1

]∣∣Reasoning about advantage. Next, we review the two mainresults used for equational-like reasoning about advantageagainst games in SSP:

Lemma 1 (Triangle Inequality). Let G0, G1 and G2 be games,we have that for every distinguisher D,

α(G0, G2)(D) ≤ α(G0, G1)(D) + α(G1, G2)(D).

Proof. By unfolding Definition 1 we haveα(G0, G2)(D)

=∣∣Pr[true←D ◦G0

]− Pr

[true←D ◦G2

]∣∣= |Pr

[true←D ◦G0

]− Pr

[true←D ◦G1

]+ Pr

[true←D ◦G1

]− Pr

[true←D ◦G2

]|

≤∣∣Pr[true←D ◦G0

]− Pr

[true←D ◦G1

]∣∣+∣∣Pr[true←D ◦G1

]− Pr

[true←D ◦G2

]∣∣= α(G0, G1)(D) + α(G1, G2)(D)

In general, we want to bound the advantage to distinguishG0 and Gn (i.e., the advantage α(G0, Gn)(D) against gamepair (G0, Gn)). In order to do so, by repeatedly apply-ing Lemma 1, it is enough to exhibit a chain of gamesG0, G1, G2, . . . , Gn so that a bound for α(G0, Gn)(D) canbe given by

α(G0, G1)(D) + α(G1, G2)(D) + . . .+ α(Gn−1, Gn)(D).

Lemma 2 (Reduction).Let (G0, G1) be a game pair and let M be an arbitrarypackage. Then, for every distinguisher D, we have

α(M ◦G0,M ◦G1)(D) = α(G0, G1)(D ◦M).

Proof. By unfolding Definition 1 and applying the associativitylaw of sequential composition, we have

α(M ◦G0,M ◦G1)(D)=∣∣Pr[true← D ◦ (M ◦G0

)]− Pr

[true← D ◦

(M ◦G1

)]∣∣=∣∣Pr[true← (D ◦M) ◦G0

]− Pr

[true← (D ◦M) ◦G1

]∣∣= α(G) (D ◦M)

As its name indicates, Lemma 2 is used to reduce theadvantage of the distinguisher over a composed game (M◦Gb),to the advantage over part of the game (M ), for which weknow a bound. We will use both these SSP lemmas in §2.3.

One difference in SSProve with respect to the SSP papersis that up to this point we made no “state separation” assump-tions. We proved instead in Coq that the algebraic laws forpackage composition as well as the two lemmas above holdeven when the involved packages share state.

Adversaries. State separation is, however, still crucial fordefining adversaries against game pairs. Formally, an adver-sary A for a game pair is a distinguisher whose state is disjointfrom the state of each game in the pair.

Perfect game indistinguishability. We say that the gamesG0 and G1 of a game pair are perfectly indistinguishablewhen α(G0, G1)(A) = 0 for every adversary A. Perfectindistinguishability is a form of observational equivalence andstates that no adversary can learn any information about whichgame in the pair it is interacting with.

2.2 Proving perfect indistinguishability steps in aprobabilistic relational program logic

We now present a novel result brought by SSProve. The SSPlaws above deal only with the high-level structure of composedpackages. However we often also need to show that two con-crete games are equivalent with respect to what an adversarycan learn from using them, i.e. perfect indistinguishability.In SSProve we formally verify this kind of equivalence byreducing it to proving a family of semantic judgments ina probabilistic relational program logic. The logic we useis a variant of pRHL, a probabilistic relational Hoare logicintroduced by Barthe et al. [9]. Judgments of this logic are ofthe form

� {{{(m0,m1). φ}}} c0 ∼ c1 {{{((m′0, a0), (m′1, a1)). ψ}}},

3

Page 4: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

and intuitively mean that after separately running the two codefragments c0 and c1 on the corresponding component of apair of memories m0,m1 satisfying a precondition φ, the finalmemories m′0,m

′1 and results a0, a1 satisfy the postcondition

ψ. In this paper write as p.M a function that binds p andhas body M (usually denoted by λp.M in the functionalprogramming community). This notation will be handy forwriting postconditions, which depend on final memories andon final results. We adopt the convention that the variablesm0 and m1 stand for the state associated to c0 and c1 inpreconditions, and m′0,m

′1 stand for the corresponding state

in postconditions. We will omit them from judgments whenno ambiguity can arise.

We now state the main theorem of SSProve:

Theorem 1. Let G = (G0, G1) be a game pair with respect toexport interface E = export(G0) = export(G1). Moreover,assume that ψ is a stable invariant that relates the memoriesof G0 and G1, and that it holds on the initial memories.

If for each provided procedure f : A → B ∈ E , we havethat for all a ∈ A,

� {{{ψ}}} G0.f(a) ∼ G1.f(a) {{{(b0, b1). b0 = b1 ∧ ψ(m′0,m′1)}}}then we can conclude that α(G0, G1)(A) = 0 for any A.

Intuitively, we ask that both procedures, run on memoriessatisfying ψ, yield results drawn from the same distributionand memories still satisfying ψ. We leave the precise definitionof stable invariants and how this theorem is proved to §4.2,but the main idea behind this invariant is that it keeps track ofa relation between the memories of G0 and G1, and that thisrelation is preserved as different procedures from the interfaceare called during the execution. We illustrate how this theoremis used in the examples from the next two subsections.

2.3 Security proof of PRF-based encryption in SSProveWe first illustrate the key ideas of SSProve on a crypto proofby Brzuska et al. [23] that we have verified in Coq using ourframework. In this proof, reasoning about composed packages(using Lemmas 1 and 2 above) allows for a high level ofabstraction that drives the proof argument. Some steps of thisproof are, however, justified by perfect indistinguishabilitybetween games, which involves inspecting the procedures ofthe games and applying program transformations to show theequivalence. In the previous paper proof [23] these steps wereonly justified informally by code inspection. Instead, we haveformally verified these steps too, using Theorem 1 and ourrelational program logic.

Brzuska et al. [23] show how to construct a symmetricencryption scheme out of a pseudo-random function (PRF)and use the SSP methodology to reduce security of the en-cryption scheme to the security of the PRF, expressed as beingindistinguishable from a package doing random sampling.

The scheme assumes a PRF, with the following signature,

prf : {0, 1}n × {0, 1}n → {0, 1}n

where {0, 1}n represents the set of n-bit sequences. It ispossible to formalize and quantify the security of PRF as the

package: PRF0

mem: k : option KEY

EVAL(x):if k = ⊥ then

k <$ uniform {0, 1}nreturn prf(k, x)

package: PRF1

mem: T : map [KEY -> KEY]

EVAL(x):if T[x] = ⊥ then

T[x] <$ uniform{0, 1}nreturn T[x]

Figure 4. Packages PRF0 and PRF1.

enc(k, m):r <$ uniform {0, 1}npad ← prf(k, r)c ← m xor padreturn (r, c)

kgen():k <$ uniform {0, 1}nreturn k

dec(k, (r, c)):pad ← prf(k, r)m ← c xor padreturn m

Figure 5. Algorithms for prf-based encryption scheme.

probability for an adversary to distinguish it from a packagethat samples from an uniform distribution (real vs randomparadigm [49]). Formally, given the packages PRF0 and PRF1

as in Figure 4, the security of PRF, α(PRF)(A) is defined usingDefinition 1 as the advantage of an adversary for the game pairPRF = (PRF0, PRF1):

α(PRF)(A) =∣∣Pr[true← A ◦ PRF0]− Pr

[true← A ◦ PRF1

]∣∣The three basic algorithms constructing a symmetric encryp-tion scheme out of prf are given in Figure 5. These are notpackages themselves, but rather code used inside packages.The security property proposed for this encryption schemeis defined as the advantage on a game pair that capturesindistinguishability under chosen-plaintext attack (IND-CPA).We refer to this game pair as (IND-CPA0, IND-CPA1), and thepackages involved are introduced in Figure 6. Notice thatin procedure IND-CPA1.ENC the argument m is never used,the encryption procedure is run on a random m’. Thereforethe advantage of an adversary w.r.t. the game (IND-CPA0,IND-CPA1) represents the probability that the adversary is ableto distinguish the encryption of m from the encryption of arandom bit-string. The security of the encryption procedurewith respect to an adversary A is then α(IND-CPA)(A).

Brzuska et al. [23] use a sequence of game-hops to boundα(IND-CPA) in terms of (a linear function of) α(PRF). Thistechnique of game-hops follows the style of inequality rea-

package: IND-CPA0

mem: k : option KEY

ENC(m):if k = ⊥ then

k <$ uniform {0, 1}n(r,c) ← enc(k, m)return (r,c)

package: IND-CPA1

mem: k : option KEY

ENC(m):if k = ⊥ then

k <$ uniform {0, 1}nm’ <$ uniform {0, 1}n(r,c) ← enc(k, m’)return (r,c)

Figure 6. Packages IND-CPA0 and IND-CPA1.

4

Page 5: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

package: MOD-CPA0

mem:

ENC(m):r <$ uniform {0, 1}npad ← EVAL(r)c ← m xor padreturn (r, c)

ENC EVALMOD-CPAb PRFi

package: MOD-CPA1

mem:

ENC(m):m’ <$ uniform {0, 1}nr <$ uniform {0, 1}npad ← EVAL(r)c ← m’ xor padreturn (r, c)

Figure 7. Packages MOD-CPAb import EVAL from PRFi

soning chains from §2.1 (Lemma 1 in particular), where eachstep involves establishing the advantage on a game pair, andas a result we obtain a bound on the advantage of the gameconsisting of the initial and final game.

In this example, IND-CPAb is shown equivalent to a variant,MOD-CPAb, that gets the secret key through the PRF, i.e., witha call to EVAL of the package PRF0 or PRF1 (see Figure 7).By repeatedly applying Lemma 1, we bound α(IND-CPA)(A)by

α(IND-CPA0, MOD-CPA0 ◦ PRF0)(A)+α(MOD-CPA0 ◦ PRF0, MOD-CPA0 ◦ PRF1)(A)+α(MOD-CPA0 ◦ PRF1, MOD-CPA1 ◦ PRF1)(A)+α(MOD-CPA1 ◦ PRF1, MOD-CPA1 ◦ PRF0)(A)+α(MOD-CPA1 ◦ PRF0, IND-CPA1)(A)

By observing that α(IND-CPA0, MOD-CPA0 ◦ PRF0)(A) = 0,and α(MOD-CPA1 ◦ PRF0, IND-CPA1)(A) = 0, and by usingLemma 2 twice, we reduce this bound to

α(PRF)(A ◦ MOD-CPA0) + εstat.(A) + α(PRF)(A ◦ MOD-CPA1).

where εstat.=α(MOD-CPA0 ◦ PRF1, MOD-CPA1 ◦ PRF1). The ad-vantage of an attacker w.r.t MOD-CPA0 and MOD-CPA1 is usuallyreferred to as statistical gap—a polynomial function of thenumber of calls from the adversary (see [23, appendix A]).

It remains to justify the two perfect indistinguishabilitiesstated above. These steps involve replacing an informal argu-ment [23] by a fully formal one, moving to our probabilis-tic relational program logic, as such we will detail one ofthem: α(IND-CPA0, MOD-CPA0 ◦ PRF0)(A) = 0. The other oneα(MOD-CPA1 ◦ PRF0, IND-CPA1)(A) = 0 is analogous.

In order to prove this equivalence, Brzuska et al. [23] noticethat the ENC procedures of IND-CPA0 and MOD-CPA0◦PRF0 (seeFigure 8) return the same ciphertext when called on the samem. The two procedures are obtained by “inlining” the code ofPRF0.EVAL inside MOD-CPA0, and by “unfolding” the code ofenc.

The only difference between the left and the right sideis in the case k = ⊥ and w.r.t. k <$ uniform {0,1}n thaton the left is the first command to be executed and onthe right only comes after r <$ uniform {0,1}n, anotherindependent random sampling. Here Brzuska et al. [23] con-clude informally that independence allows to “swap” the twooperations. We instead use Theorem 1 to formally reduce

IND-CPA0.ENC(m)if k = ⊥ then

k <$ uniform {0, 1}nr <$ uniform {0, 1}npad ← prf(k,r)c ← m xor padreturn (r, c)

(MOD-CPA0 ◦ PRF0).ENC(m)r <$ uniform {0, 1}nif k = ⊥ then

k <$ uniform {0, 1}npad ← prf(k,r)c ← m xor padreturn (r, c)

Figure 8. ENC procedures expanded

KeyGen ():sk <$ uniform {0,..n-1}

pk ← gsk

return (pk , sk)

Enc(A, M):b <$ uniform {0,..n-1}

B ← gb

return (B, M * Ab)

Dec(a, (B, X)):

return X * (Ba)-1

Figure 9. Algorithms for ElGamal encryption scheme.

α(IND-CPA0, MOD-CPA0 ◦ PRF0)(A)=0 to showing the equiv-alence of the two ENC procedures from Figure 8. In ourprobabilistic relational program logic, this comes down toproving the following judgment for all plaintext messages m,

� {{{m0 = m1}}}IND-CPA0.ENC(m) ∼

(MOD-CPA0 ◦ PRF0

).ENC(m)

{{{(c0, c1).m′0 = m′1 ∧ c0 = c1}}}.This judgment intuitively states that encrypting m with thesame initial memories “m0 = m1”, terminates still inmemories and ciphertexts drawn from the same distribution,“m′0 = m′1 ∧ c0 = c1”. We use the following instance of theswap rule from Figure 13, to formally justify this swapping:

� {{{m0 = m1}}} k <$ uniform {0,1}n ∼ r <$ uniform {0,1}n {{{m′0 = m′1 ∧ c0 = c1}}}� {{{m0 = m1}}} r <$ uniform {0,1}n ∼ k <$ uniform {0,1}n {{{m′0 = m′1 ∧ c0 = c1}}}

� {{{m0 = m1}}}k <$ uniform {0,1}n ; r <$ uniform {0,1}n ∼r <$ uniform {0,1}n ; k <$ uniform {0,1}n

{{{m′0 = m′1 ∧ c0 = c1}}}

2.4 Security proof of ElGamal in SSProve

We also illustrate the key ideas of SSProve on a security prooffor the ElGamal public-key encryption scheme inspired by TheJoy of Cryptography textbook [49, Chapter 15.3]. ElGamal isparameterized by a multiplicative cyclic group (G, *) with nelements and generated by g, usually denoted by 〈g〉 = G.Plaintexts are elements M ∈ G and ciphertexts are pairsof group elements C = (C1, C2) ∈ G × G. Secret keysare elements of Zn, while public keys are group elementsonce again, A ∈ G. The key generation algorithm (KeyGenin Figure 9) generates a secret key that is a random numbera ∈ {0, . . . , n − 1} and a public key that is ga. Encryptionand decryption (Enc and Dec Figure 9) involve the groupoperation (_*_), exponentiation (_)_ and the multiplicativeinverse (_)-1.

Under the Decisional Diffie–Hellman (DDH) assumptionfor the group G, i.e. DDH0 and DDH1 from Figure 10 arecomputationally indistinguishable, one can prove that an ad-

5

Page 6: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

package: DDH0

mem:pk : option PUBKEYa : option SECKEY

QUERY()a <$ uniform {0,..n-1}b <$ uniform {0,..n-1}pk ← ga

return (ga,gb,gab)

package: DDH1

mem:pk : option PUBKEYa : option SECKEY

QUERY()a <$ uniform {0,..n-1}b <$ uniform {0,..n-1}c <$ uniform {0,..n-1}pk ← ga

return (ga,gb,gc)

Figure 10. The DDH assumption states that DDH0 and DDH1

are computationally indistinguishable.

package: CPA0

mem:pk : option PUBKEYsk : option SECKEYcounter : nat

ENC(M):assert counter = 0(pk , sk) ← KeyGen ()(B, C) ← Enc (pk, M)counter ++return (B, C)

package: CPA1

mem:pk : option PUBKEYsk : option SECKEYcounter : nat

ENC(M):assert counter = 0(pk , sk) ← KeyGen ()(B, C) <$ uniform GxGcounter ++return (B, C)

Figure 11. Packages CPA0 and CPA1 in ElGamal.

versary cannot distinguish messages encrypted with the El-Gamal scheme from ciphertexts that are randomly sampled(CPA). Our formalization only considers the case in which theadversary can see a single ciphertext (one-time CPA, writtenOT-CPA), as it is known that this suffices for public-keyencryption schemes to satisfy CPA [49, Claim 15.5]. We leavethe formalization of this last result as future work and discusshereafter our proof of OT-CPA in SSProve.

OT-CPA is expressed in terms of the advantage againstgame pair (CPA0, CPA1) in Figure 11. Both packages returna ciphertext only if the counter is 0—as expressed by the useof assert—so the adversary can only see one ciphertext. Bothpackages call KeyGen to generate public and private keys, butwhile CPA0 effectively encrypts the message provided by theadversary with the public key through Enc (pk, M), CPA1

returns a randomly sampled ciphertext ( B, C) <$ uniform GxG,i.e. a pair of group elements sampled uniformly at randomfrom G × G.

The OT-CPA proof reduces the advantage of adversary A

package: Auxmem: counter : nat

ENC(M):assert counter = 0(A, B, C) ← QUERY()counter ++return (B, M * C)

ENC QUERYAux DDHb

Figure 12. Package Aux imports QUERY from DDHb.

against (CPA0, CPA1) to the advantage of A ◦ Aux against(DDH0, DDH1), with the auxiliary package Aux listed in Fig-ure 12:

α(CPA)(A) ≤ α(DDH)(A ◦ Aux).

We once again obtain this result by first repeatedly applyingLemma 1 to bound α(CPA)(A) by

α(CPA0, Aux ◦ DDH0)(A)+α(Aux ◦ DDH0, Aux ◦ DDH1)(A)+α(Aux ◦ DDH1, CPA1)(A)

We will see that the first and last advantages are null by prov-ing the packages perfectly indistinguishable, and the remainingadvantage is equal to α(DDH)(A ◦ Aux) by simple applicationof Lemma 2. It now remains to show the equivalences below:

Step α(CPA0, Aux ◦ DDH0)(A)=0: We apply Theorem 1and reduce the goal to a relational judgment betweenCPA0.ENC(M) and (Aux◦DDH0).ENC(M) for a generic plaintextM, and where the invariant ψ is equality of memories. Inliningthe code of QUERY provided by DDH0 inside Aux and unfoldingone realizes the two code fragments coincide and the judgmentholds by application of the reflexivity rule in Figure 13.

Step α(Aux◦DDH1, CPA1)(A)=0: This step is quite similar tothe one above. After inlining however the two code fragmentsare not exactly the same, since in particular CPA1 completelyignores M and returns a random ciphertext, while Aux ◦ DDH1returns M*gc for a random c. To have equality of memories asinvariant ψ, we show that in G, multiplication by g^(_) actslike a one time pad, which is a standard result [9, Section 6.2].

3 Formalizing State-Separating ProofsWe separate the programming language and thus the reasoninginto two strata: code and packages. We define the syntax ofcode (§3.1), relate it to the notation used in §2.1, and explainits semantics (§3.2). We then give a formal description ofpackages (§3.3) and the algebraic laws they obey (§3.4).

3.1 Syntax for cryptographic code (free monad)The language of the Coq system, Gallina, is a dependentlytyped, purely functional programming language. As such, wecan directly express functional code in Gallina, but not codewith side-effects such as reading from and writing to memory,probabilistic sampling, or external procedure calls. We thusrepresent cryptographic code via a combination of the ambientlanguage Gallina and a monad of effectful computations.Monads constitute an established way of adding effects to apurely functional language [42, 54]. Free monads in particularallow to separate the representation (syntax) of an embeddedlanguage from its interpretation (semantics).

Raw code We use a hybrid approach [44] of embeddingthe pure fragment of our cryptographic programming languageshallowly in Coq, and embedding the effects deeply via a freemonad. This free monad is defined as an inductive type:

Inductive raw_code A : Type :=| ret ( x : A)

6

Page 7: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

| call ( p : opsig) ( x : src p)(κ : tgt p → raw_code A)

| get ( ` : Location) (κ : type ` → raw_code A)| put ( ` : Location) ( v : type `) (κ : raw_code A)| sample ( op : Op) (κ : Arit op → raw_code A).

This type of raw code comes equipped with an inductionprinciple, which is used for instance in the proof of Theorem 1,in Theorem 2, and in the definition of the bind operation andsequential composition of packages by recursion over code.

Some more explanations about raw_code are in order. Thetype parameter A indicates the result of a computation. Thefirst clause of the above definition lets us inject any purevalue x of type A into the monad as ret x. Calls to externalprocedures are represented via call p x κ, where p : opsig

specifies the name of the procedure, the type of its argument(src p), and its return type (tgt p). The last argument κis the continuation of the program, awaiting the result ofthe call to p. The get and put operations take a (typed)location ` as argument, respectively read from and write tothat location, and continue with the continuation κ. Finally, wemay sample from a collection of probabilistic subdistributionsOp. Subdistributions constitute the base of our code semanticsand are further discussed in §3.2. The type Op is a parameterof the language that can be instantiated by the user. Samplinga subdistribution op on type Arit op can be composed with amatching continuation κ (continuations are explained below).

We will use the following two pieces of code as runningexamples to explain different aspects of the definition.

get ` (λ x` . put ` (x` + 1) ( ret x`)) (1)sample ( uniform {0, 1}n)

( λ y . call prf ( y, 101010) ( λ z . ret z)) (2)

The code in (1) increments the value stored at location ` andreturns the value before the increment. The code in (2) drawsa random bit-string y of length n, calls an external procedureprf with arguments y and 101010, and returns the result.

Valid code Raw code is merely a representation of syntax.To record which probabilistic sampling operations, importedprocedures, and locations are used, we introduce a notionof valid code. Validity is defined relatively to a collectionof sampling operations Op, a set of locations L, and fi-nally an import interface I which is a set of proceduresignatures (opsig) consisting of a name, an input type andan output type. Concretely, the code in (1) is valid withrespect to {` : nat} and the empty import interface, while(2) is valid with respect to the empty set of locationsand the interface {prf : nat × nat → nat}, assuming fur-ther that uniform {0, 1}n : Op is a valid sampling operation.The type code is then simply defined as valid raw code,i.e. codeL,I A = { c : raw_code A | is_valid c L I }, wherein the paper we sometimes omit the set of locations and theinterface. Thanks to the use of tactics and Coq’s type classes,proofs of validity for well-scoped user-written code are con-structed automatically without requiring user intervention.

Continuations A continuation is a suspended computationawaiting the result of an operation, intuitively corresponding

to the rest of the program. Consider for instance the code (1).The get operation performs a memory lookup at the location`, and its continuation is a Coq function ( λ x` . put ...) oftype ( type ` → raw_code nat) which receives the value storedat ` as its parameter x`. The continuation in turn performs aput operation, storing the value x` + 1 at memory location`, and returns the value x`. The code thus corresponds to theexpression commonly written as `++.

Variables As demonstrated in example (1), we draw a strictdistinction between a location `, which can be accessed andupdated via get and put, and the value stored in memory atlocation `. In (1), this value is available in the continuationof get ` (λ x` . put ...) as x`. Formally speaking, x` is animmutable Coq variable, and in (1) the location ` itself is aCoq variable of type Location.

Monadic bind The bind operation of the monad, with typecode A → (A → code B) → code B, allows the composition ofeffectful code. Take for instance the following pieces of code.

Definition c : code nat :=sample ( uniform bool) ( λb. if b then ret m1 else ret m2)Definition κ : nat → code nat := λm. put ` m (ret 0)

We would like to use c as an argument to κ, but the typesdon’t match: κ expects a value of type nat as argument,not a computation of type code nat. We define a standardbind operation that achieves this by traversing the code ofc, applying κ when a returned value is encountered, andrecursively pushing κ into any other continuations.

Fixpoint bind ( c : code A) (κ : A → code B) : code B :=match c with| ret a ⇒ κ a| call p x κ’ ⇒ call p x (λ p . bind (κ’ p) κ)| get l κ’ ⇒ get l (λ v . bind (κ’ v) κ)| put l v κ’ ⇒ put l v (bind κ’ κ)| sample op κ’ ⇒ sample op (λ a . bind (κ’ a) κ)end

An easy structural induction over code allows us to prove thatbind satisfies the expected monad laws.

Loops We do not have syntax for loops in code. However,since we are embedding in Coq we take advantage of itsrecursion mechanisms to write terminating loops. The mostbasic construction we can write is a “for i := 0 to N do c”loop that repeats (n+1)-times a command c, providing to c

the value of the index i:

Fixpoint for_loop (N : nat)( c : nat → code unit) : code unit :=

match N with| 0 ⇒ c 0| S m ⇒ bind (for_loop m c) (λ _ . c N)end.

More generally, we can define a “do-while” loop that repeat-edly executes a loop body while a condition holds, checkedafter each iteration. To ensure termination in Coq we add anatural number N to bound the maximum number of iterations:

7

Page 8: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

Fixpoint do_while (N : nat)( c : code bool) : code bool :=

match N with| 0 ⇒ ret false| S n ⇒ bind c (fun b ⇒ match b with

| false ⇒ ret true| true ⇒ do_while n cend)

end.

At the end, the returned boolean signals whether there wasremaining fuel (i.e. iteration steps) available or not.

Standard subdistributions Probabilistic operations denot-ing a collection of subdistributions we may sample from areincluded in the parameter type Op. Standard subdistributionsincluding uniform sampling on finite types as well as anull subdistribution are predefined for convenience. The nullsubdistribution in particular allows us to represent assert.

Definition assert (b : bool) : code unit :=if b then ret tt else sample null ( λ F . ret F)

Here unit stands for the Coq singleton type with a uniqueinhabitant tt. If b is true, then assert returns the trivialvalue tt, but if b is false, we instead sample from thenull distribution, which assigns probability zero to the tt

values. Sampling from the null subdistribution is similar tonon-termination, and it means that the continuation will neverbe called.

Procedure calls A call to an external procedure such as prf

in (2) is represented by the call operation, taking a procedurename p annotated with type, a value matching the argumenttype of p, and a continuation κ matching the return type of p.In §3.3 we show how an implementation gets substituted forthis placeholder via sequential packages composition.

Notation The use of continuations is pervasive in monadiccode, and to alleviate the presentation we introduce the fol-lowing more familiar notation.

ret v := ret v

x ← c1 ;; c2 := bind c1 ( λx. c2)x ← call(p, a) ;; c := call p a ( λx. c)x ← get ` ;; c := get ` (λx.c)put ` := v ;; c := put ` v c

x <$ D ;; c := sample D ( λx. c)

Type safety The typing constraints imposed by the raw_code

definition enforce type-safety for user-written code, guaran-teeing that operations and their continuations are compatible.For instance, let the continuation of get in (1) be f. Then f

is only compatible with ` if its domain matches the type of `,i.e. f : type ` → raw_code A for some type A.

To see the full definition in action, we restate the procedureEVAL(x) from Figure 4 more formally.

Definition EVAL (x : {0, 1}n) : raw_code {0, 1}n :=val_k_opt ← get k ;;val_k ← (match val_k_opt with

| ⊥ ⇒ y <$ uniform {0, 1}n ;;

put k := Some y ;;ret y

| Some val_k’ ⇒ ret val_k’end) ;;

val_prf ← call(prf, (val_k, x)) ;;ret val_prf.

Here we freely mix constructors of raw_code with otherGallina terms such as the match _ with _ ⇒ _ end construct.The result of the match is made available to the continuationof the code as val_k via a use of bind.

3.2 Semantics of cryptographic codeWhen no external procedure calls (call o x k) appear in apiece of code c : code A, it is possible to interpret c as astate-transforming probability subdistribution of type

Pr_code c : mem → SD (A × mem)

This semantics is similar to that of Barthe et al. [10]. The typeSD A denotes the collection of all subdistributions over type A.Generally speaking, a subdistribution is a function d : A→ Rassigning a certain probability d(a) to each a : A in such a waythat

∫Ad ≤ 1. We use the definition of subdistributions from

mathcomp-analysis [2, 37], a Coq library for real analysis.The semantics function Pr_code is defined by recursion on thestructure of c. Its definition basically boils down to providingan effect handler that interprets state and probabilities in themonad mem → SD(− × mem).

Using this subdistribution semantics, we can formalize thenotation Pr[b← G] from §2.1 as follows: (i) Extract therun function from G (ii) Apply Pr_code to it (iii) Run iton the initial memory (iv) Extract the boolean component(first projection) from the resulting subdistribution. The finalresult has type d : SD bool, the type of subdistributions forbooleans, and we precisely define Pr[b← G] = d(b) as theprobability assigned to b by this subdistribution on booleans.

3.3 PackagesA raw package is a finite map from names to raw procedures.An interface is a finite set of operation signatures (opsig),each specifying the name, argument type, and result type ofa procedure. A package is then a raw package RP togetherwith an import interface I, an export interface E , and a setof locations L, such that each procedure in RP is valid withrespect to L and I, and each procedure name listed in E isimplemented by a procedure in RP of the appropriate type.

package: Lmem: counter : nat

ENC(M):if counter = 0 then(A,B,C) ← QUERY()counter ++return (B, M * C)

elsereturn ⊥

Consider for instance the packageL from Figure 12. The memoryused, mem(L), consists of onelocation {counter : nat}. theimport interface import(L)contains a single procedure{QUERY : unit → G × G × G}.There is one procedureimplemented by L, yielding an

export interface export(L) = {ENC : G → option (G × G)}.We define composition of packages, following Brzuska

et al. [23]. Given two raw packages P , Q we may define their

8

Page 9: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

sequential composition Q ◦ P by traversing Q and replacingeach call by the corresponding procedure implementation inP . In case P does not implement the searched for procedure,we use a dummy value instead. If the exports of P match theimports of Q, i.e. import(Q) ⊆ export(P ), and both pack-ages are valid, then so is Q◦P , in which case no dummy valueis needed. Concretely, during the traversal each ( call p a κ)node is replaced by bind ( P. p a) ( λ x . linkP (κ x)) wherelinkP stands for the recursive call of the function com-posing P with the remaining code. Experts will recog-nize this transformation as an algebraic effect handler, in-terpreting the free monad for probabilities, state and theoperations imported by P to code in the free monad forprobabilities, state, and the operations imported by Q. Wehave mem(Q ◦ P ) = mem(P ) ∪ mem(Q), import(Q ◦ P ) =import(P ) and export(Q ◦ P ) = export(Q).

Given two raw packages P and Q we may define theirparallel composition P ‖ Q by aggregating the implemen-tations and delegating calls to the respective package pro-viding it. This operation is defined even if both packageshave overlapping export signatures, in which case proceduresin P will be given priority. If they are both valid andtheir exports are disjoint, i.e. export(P ) ∩ export(Q) =∅, then this overlap situation does not happen and P ‖Q is also valid. We have mem(P ‖ Q) = mem(P ) ∪mem(Q), import(P ‖ Q) = import(Q) ∪ import(P ) andexport(P ‖ Q) = export(Q) ∪ export(P ).

Private state When formalizing composition in SSProve wedo not impose restrictions on the disjointness of the state thatP and Q manipulate. The two lemmas from §2.1 and the SSPpackage laws below hold without any such assumptions. Theessence of state separation can be thus viewed as disjointnessof state between the adversary and the games in a pair. Wethus introduce the more economical assumption that only theadversary has to have disjoint state in our security definitions(e.g., perfect indistinguishability from §2.1) and correspondingtheorem statements (e.g., Theorem 1).

Thanks to this finer-grained state separation, we not onlyremove some of the burden of formally proving disjointness,but we are also able to prove more meaningful final results. Forinstance, in the PRF example, enforcing state separation forall intermediary packages would mean in particular requiringthe adversary to have disjoint state from PRF1, which is justan intermediary game used within our proof. In SSProve suchproof internals don’t leak into the final security statements.

3.4 Package laws

We formally proved the algebraic laws obeyed by packagesas stipulated by Brzuska et al. [23]. Sequential compositionis associative and parallel composition is commutative andassociative, so for any packages P1, P2, P3:

P1 ◦ (P2 ◦ P3) = (P1 ◦ P2) ◦ P3

P1 ‖ P2 = P2 ‖ P1

P1 ‖ (P2 ‖ P3) = (P1 ‖ P2) ‖ P3.

We furthermore relate the two package operations with aninterchange law stating

(P1 ◦ P3) ‖ (P2 ◦ P4) = (P1 ‖ P2) ◦ (P3 ‖ P4).

Commutativity of parallel composition only holds if thepackages have indeed disjoint interfaces: export(P1) ∩export(P2) = ∅. The interchange law will only ask this ofP3 and P4: export(P3) ∩ export(P4) = ∅.

The identity package IDI behaves as an identity for sequen-tial composition when using the correct interface:

IDexport(P ) ◦ P = P = P ◦ IDimport(P ).

As we have hinted before, these laws do not require dis-jointness of state, because they are pretty syntactic equalities.In fact, in SSProve they hold with respect to the syntacticequality of Coq, without the need to define a separate notionof “code equality” [23].

4 Probabilistic Relational Program LogicSome of the SSP proof steps can be carried out at a high-level of abstraction relying on the package formalism from §3.The justification of other steps like perfect indistinguishabilityrequires, however, a finer, lower-level analysis. As alreadypointed out in §2.2, we can perform such analyses in arelational program logic, a deductive system in which it ispossible to show that two pieces of code c0, c1 satisfy a certainrelational specification, e.g. that they are equivalent.

In §4.1 we present some of the elementary rules constitutingour program logic. We then sketch a proof of Theorem 1, thelink between the high-level reasoning based on the packagelaws to the low-level one based on our probabilistic relationalprogram logic in §4.2.

4.1 Selected rules

Our logic exposes relational judgments of the form �{{{pre}}} c0 ∼ c1 {{{post}}}, for which a basic intuition is providedin §2.2. Formally, c0 and c1 denote probabilistic statefulcode with return type A0 and A1 respectively, and the m0 :mem,m1 : mem ` pre : P is a proposition with free variablesm0 and m1 denoting the initial state of the memory (beforeexecution of the code). The postcondition m′0 : mem,m′1 :mem ` post : A0 × A1 → P is a predicate on the valuesreturned by the executed code, which is parametrized by thevariables m′0 and m′1 representing the final state of the memory(after execution). The code fragments appearing in a judgmentare drawn from the free monad codeL,I of §3.1, and meet thefurther requirement that no oracle calls call o x k appear inthem (exactly as in §3.2). The precondition pre is defined to bea relation between initial memories (for instance, m0 = m1).Similarly the postcondition post relates final memories andfinal results, intuitively obtained after the execution of ci onmi. We describe how to assign a formal semantics for suchprobabilistic judgments in §5.2. The semantics is based on thenotion of probabilistic couplings, already adopted by Bartheet al. [14]. In the remainder of this subsection we describe aselection of our rules, displayed in Figure 13.

9

Page 10: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

c : code L Areflexivity

� {{{m0 = m1}}} c ∼ c {{{(a0, a1). m′0 = m′1 ∧ a0 = a1}}}

c0 : code L0 A0 c1 : code L1 A1

κ0 : A0 → code L0 B0 κ1 : A1 → code L1 B1

� {{{pre}}} c0 ∼ c1 {{{ψ}}}∀a0 a1. � {{{ψ(a0,m0)(a1,m1)}}} κ0(a0) ∼ κ1(a1) {{{post}}}

seq� {{{pre}}} (a0 ← c0 ; κ0(a0)) ∼ (a1 ← c1 ; κ1(a1)) {{{post}}}

c0 : code L A0 c1 : code L A1

� {{{I}}} c0 ∼ c1 {{{(a0, a1). I ∧ post(a0, a1)}}}� {{{I}}} c1 ∼ c0 {{{(a1, a0). I ∧ post(a0, a1)}}}

swap� {{{I}}} c0 ; c1 ∼ c1 ; c0 {{{(a0, a1). I ∧ post(a0, a1)}}}

c0 c′0 : code L A0 c1 : code J A1

� {{{pre}}} c0 ∼ c1 {{{post}}} Pr_code c0 = Pr_code c′0eqDistrL

� {{{pre}}} c′0 ∼ c1 {{{post}}}

c0 : code L A0 c1 : code L A1

� {{{pre(m0,m1)}}} c0 ∼ c1 {{{(a0, a1). post(m′0, a0)(m′1, a1)}}}symmetry

� {{{pre(m1,m0)}}} c1 ∼ c0 {{{(a0, a1). post(m′1, a1)(m′0, a0)}}}

c0, c1 : N→ code L unit N : N

∀i. � {{{I i}}} c0 i ∼ c1 i {{{I (i+ 1)}}}for-loop

� {{{I 0}}} for_loopN c0 ∼ for_loopN c1 {{{I (N + 1)}}}

c0, c1 : code L bool N : N

� {{{I(true, true)}}} c0 ∼ c1 {{{(b0, b1). b0 = b1 ∧ I(b0, b1)}}}do-while

� {{{I(true, true)}}} do_whileN c0 ∼do_whileN c1 {{{(b0, b1). b0 = b1 = false ∨ I(false, false)}}}

|A|, |B| < ω f : A→ B bijectiveuniform

� {{{pre}}} a <$ U(A) ∼ b <$ U(B) {{{(a, b). f(a) = b ∧ pre}}}

b0, b1 : boolasrt

� {{{b0 = b1}}} assert b0 ∼ assert b1 {{{b0 = true ∧ b1 = true}}}

b : boolasrtL

� {{{b = true}}} assert b ∼ return () {{{b = true}}}

r : unit→ code L A v : A ` : Lput-get

� {{{m0 = m1}}} put ` v ; x← get `; return x ∼put ` v ; return v {{{(a0, a1). m′0 = m′1 ∧ a0 = a1}}}

Figure 13. Selected probabilistic relational program logic rules

The rule reflexivity relates the code c to itself whenexecuted twice on identical initial memories.

The rule seq relates two sequentially composed commandsusing bind by relating each of the sub-commands.

The swap rule states that if a certain relation on memoriesI is invariant with respect to the execution of c0 and c1, thenthe order in which the commands are executed is not relevant.We used the rule swap in §2.3 to swap two independentsamplings; in that case the invariant I consisted in the equalityof memories.

The rule eqDistrL allows us to replace c_0 by c_0’ ifboth codes have the same denotational semantics as definedby Pr_code, in the sense of §3.2.

The symmetry rule simply states that the symmetric judg-ment holds if the arguments of the pre- and postconditions are

swapped accordingly.The for-loop rule relates two executions of for-loops with

the same number of iterations by maintaining a relationalinvariant through each step of the iteration. The do-while

rule relates two bounded while loops with bodies c0 and c1.Every iteration preserves a relational invariant on memories Ithat depends on a pair of booleans, and the postcondition alsostipulates that c0 and c1 return the same boolean, i.e. b0 = b1.This rule follows the pattern of the unbounded do-while ruledefined for simple imperative programs by Maillard et al. [38].We believe that, with some additional work, their ideas couldbe used to also support unbounded loops in SSProve.

The rule uniform relates sampling from uniform distribu-tions on finite sets A and B that are in a bijective correspon-dence.

The asrt rule relates two assert commands, as longas “b0 = b1” holds before the commands, and guarantees“b0 = true ∧ b0 = true” afterwards. The asrtL rule isan asynchronous variant of asrt that specifies the behaviorof assert, by relating it with return () when the booleaninvolved in the assert is true. Note that if a code frag-ment c0 is showed equivalent to a failure � {{{True}}} c0 ∼assert false {{{post}}}, c0 must necessarily contain a failurestatement as well. Indeed the (sound) model of the logicat hand, devised in §5, extends a total correctness non-termination semantics: failures only relate to failures.

Finally the put-get rule states that looking up the value atlocation ` after storing v at ` results in the value v.

4.2 Proof sketch for Theorem 1

If we denote by mem the type of memories, then a binarymemory predicate

m0 : mem,m1 : mem ` ψ : P

holds on a pair of memories (h0, h1), written (h0, h1) � ψif ψ [m0 7→ h0,m1 7→ h1] holds. Moreover, we say that suchpredicate is stable on L0 and L1 if for all h0, h1 such that(h0, h1) � ψ, we have that for all memory locations l, suchthat l 6∈ L0 and l 6∈ L1,

1) h0[l] = h1[l].2) for all v, (h0[l 7→ v] , h1[l 7→ v]) � ψ.When we want to prove that two packages with the same

interface are equivalent w.r.t. perfect indistinguishability, wewill assume that we have a stable predicate on the locations ofthe packages, and moreover, that this predicate is an invarianton the different operations of the interface. This invariantnessof the predicate is the reason why ψ appears both in thepre- and postcondition from Theorem 1. Notice that stablepredicates do not condition the intermediate states of eachprocedure in the interface of Theorem 1, e.g. two relatedprocedures could differ in their internal order of updates, aslong as the final results of computations are related.

Before giving the proof sketch for Theorem 1, we postulatea theorem that is also proved in Coq and relates the probabilis-tic relational program logic with the probabilistic semantics.

10

Page 11: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

Theorem 2. Given values a, b, if two pieces of code c0, c1 aresuch that

� {{{ψ}}} c0 ∼ c1 {{{(r0, r1). φ(r0, r1)}}},ψ holds on the initial memories, and for all x, y we have that

φ(x, y) =⇒ (x = a ⇐⇒ y = b) ,

then we have

Pr[a← c0] = Pr[b← c1] .

We are now ready to sketch the proof for Theorem 1.

Proof sketch of Theorem 1. We want to prove that for eachadversary A we have α(G0, G1)(A) = 0, i.e.,

|Pr[true← A ◦G0]− Pr[true← A ◦G1]| = 0.

Using the hypothesis and that the predicate ψ is stable, weperform an induction on the code of the procedure A.run, toestablish

� {{{ψ}}} (A ◦G0).run() ∼(A ◦G1).run() {{{(b0, b1). b0 = b1 ∧ ψ}}}.

As the induction proceeds, the rules from §4.1 are used toprove each case. We illustrate the get case, which after apply-ing the seq rule with respect to the continuation, and usingthe inductive hypothesis, reduces to the following judgment:

� {{{ψ}}} get l ( λx. ret x) ∼get l ( λx. ret x) {{{(v0, v1). v0 = v1 ∧ ψ}}}

As ψ is stable, we know that the result of get on the left andon the right will coincide (i.e. m0[l] = m1[l]), because l 6∈ L0

and l 6∈ L1 as l is a location used in the adversary’s code, andwe explicitly asked for the adversary memory mem(A) to bedisjoint from mem(G0) and mem(G1). As the memory was notchanged, the invariant ψ still holds on the final memory.

As the predicate ψ holds on the initial memories, and thepostcondition b0 = b1 ∧ ψ implies that b0 = true ⇐⇒ b1 =true, we know from Theorem 2 that

Pr[true← A ◦G0] = Pr[true← A ◦G1] ,

and therefore the advantage is 0.

5 Semantic Model and Soundness of RulesWe build a semantic model validating the rules of the effectfulrelational program logic from §4. The construction of themodel follows the effect-modular framework [38], instantiat-ing it with probabilities, simple failures, and global state. Wefirst give in §5.1 an overview of the framework of Maillardet al. [38]. We then explain how we apply it to (1) obtainmodularly a model for a probabilistic relational program logicin §5.2 and (2) enrich it with state in §5.3.

5.1 Relational effect observationThe aforementioned framework builds upon a monadic repre-sentation of effects to provide sound semantics to a large classof relational program logics. As we shall see, this class notablycontains logics for reasoning about cryptographic code: codethat can manipulate state and sample randomly (see Figure 13).

A generic relational program logic rL is a deductive systemwith a relational judgment � c0 ∼ c1 { w } asserting that pairsof effectful code fragments c0, c1 behave according to a givenspecification w. The exact shape of code and specificationsappearing in such a judgment can vary depending on whatprogramming language and logic are considered.

The recipe laid out by Maillard et al. [38] stems from therealization that not only effectful code can be modeled usingmonads, but specifications can too, and we can build semanticsfor rL using a so-called relational effect observation in 3 steps:

1) Model the effects involved in the considered left and rightprograms as monads M0 and M1.

2) Turn the collection of relational specifications w intoa relational specification monad (A0, A1)7→W (A0, A1)(RSM) ordered by entailment of specifications.

3) Finally, find an appropriate relational effect observationθ mapping computations in M0A0 ×M1A1 to specifi-cations in W (A0, A1), preserving the monadic featurespresent on both sides.

Once a relational effect observation θ is specified we candefine a semantic judgment for rL as follows :

�θ c0 ∼ c1 { w } ⇐⇒ θ(c0, c1) ≤ wwhere ci :MiAi and w :W (A0, A1).

RSM and effect observation. An RSM W maps a pairof types (A0, A1) to a preorder W (A0, A1) equipped withoperations return and bind at each pair (A0, A1), (B0, B1):retW : A0 ×A1 →W (A0, A1)bindW :W (A0, A1)→(A0×A1→W (B0, B1))→W (B0, B1)

Even though RSMs do not fit exactly in the usual presentationof a monad, they must satisfy laws similar to the usual identityand associativity monad laws. Moreover, the bind operationshould be monotonic with respect to both of its arguments.

A typical example of an RSM is the relational backwardpredicate transformer monad BP(A0, A1) := (A0 × A1 →P) → P, where P is the type of propositions. Intuitivelya backward predicate transformer w : BP(A0, A1) maps arelational postcondition φ to a precondition sufficient to ensureφ on the result of the executions of code fragments c0, c1respecting w (i.e. for which �θ c0 ∼ c1 { w } for some θ).Every pre-/postcondition pair can systematically be translatedinto a single backward predicate transformer.

A relational effect observation θ between two monadsM0,M1 and a RSM W is a mapping

θ(A0,A1) :M0A0 ×M1A1 →W (A0, A1)

laxly preserving the return and bind operations:

θ (retM0 a0, retM1 a1) ≤ retW (a0, a1)

θ (bindM0 m0 f0, bindM1 m1 f1) ≤

bindW θ (m0,m1) (θ ◦ (f0, f1))The second inequation can be understood as a semanticformulation of theseq rule defined in Figure 13. The validity proof for this

rule in our model relies directly on this inequation.

11

Page 12: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

In our Coq formalization RSMs and relational effect ob-servations are defined through the abstract algebraic structureof order-enriched relative monads and suitable morphism ofsuch. The description given here can easily be derived fromthe abstract structure.

5.2 Effect observation for probabilities and failures

The technique above can be exploited to build a model for aprobabilistic relational program logic. We model probabilisticcode using a free monad over a probabilistic signature notedFPr, reusing codeL,I mentioned in §3.1, where we require thatonly sampling operations are performed. This code can beassigned a probabilistic semantics using the monad of subdis-tributions [5, 31], following the track of §3.2, but ignoringconsiderations around state. The semantics assignment can infact be seen as a monad morphism FPr → SD.

Specifications and effect observation. To model specifi-cations for probabilistic code we use the backward pred-icate transformer RSM given by BP(A0, A1) := (A0 ×A1→P)→P. The relational effect observation θPr is basedon probabilistic couplings as mentioned in §4.1. A couplingd : coupling(d0, d1) of two subdistributions d0 : SD(A0) andd1 : SD(A1) is a subdistribution over A0 × A1 such that itsleft and right marginals correspond to d0 and d1 respectively.For ci:FPr(Ai) and di:SD(Ai) the associated subdistributions(i = 0, 1) we set:

θA0A1Pr (c0, c1) = λ(φ : A0 ×A1 → P).∃d : coupling(d0, d1)∀a0a1. d(a0, a1)>0⇒ φ(a0, a1)

If w : BP (A0, A1) is a translated (pre, post) pair, theobtained judgment holds if one can find a coupling d of d0, d1whose support validates post whenever pre is valid.

Our probabilistic model �θPrc0 ∼ c1 { w } validates state-

free accounts of several rules of Figure 13. First, since thesubdistribution monad is commutative (sampling operationsalways commute), our semantics validates a state-free variantof the swap rule. Second, as it is often the case for an arbitraryeffect observation, symmetric rules like uniform involvingsimilar effectful operations on both sides (here a <$ U(A))are validated as well. Third, failing assertions at type A canbe modeled using the zero subdistribution on A, and thisinterpretation allows us to validate the assert rule in ourmodel. Fourth, a state-free variant of the reflexivity can beestablished by building, for any subdistribution s, a couplingd : coupling(s, s) of s with itself.

5.3 Adding state

In order to extend this first model to stateful code and state-aware specifications, we adapt to our setting the classicalnotion of state monad transformer [34]. A monad transformermaps monads M to monads TM and monad morphisms θto monad morphisms T θ. Besides, it comes equipped with afamily of liftings ∀M,M → TM . We generalize this, andbuild modularly an effect observation θPr,St on top of θPr:

θ′Pr,St := StT θPr : StT(F2Pr)(A0, A1)→ StT(BP)(A0, A1)

where (Si is the left or right set of global states):

StT(F2Pr)(A0, A1) := S0×S1→FPr(A0×S0)×FPr(A1×S1),

StT(BP)(A0, A1) := (A0×S0×A1×S1→P)→S0×S1→P.

To comply with what was done for θPr in §5.2 we furtherextend θ′Pr,St by turning its domain into a product of freemonads F2

Pr,St := FPr,St×FPr,St over a stateful and probabilisticsignature. The extension FPr,St, evoked in §3.2, is obtainedfrom θ′Pr,St by precomposition: θPr,St := θ′Pr,St ◦ Pr_code.

From an abstract point of view, the existence and correctnessof the state monad transformer relies on a delicate piece ofabstract category theory: we can obtain StTm for a j-relativemonad m by simply pasting an adequate 2-cell (∗) inducedby a j-relative adjunction that exists whenever I is cartesian,C is cartesian closed and j preserves cartesian products.

I C

I C

m

j

S×− jS⇒−

j

ret

(∗)

Because this construction is modular, we can prove that thefinal model restricts exactly to the model devised in §5.2when considering code and specifications not using state.In other words there is an operation lifting every seman-tic judgment from the previous model θPr to the currentmodel θPr,St. This modularity is moreover reflected in theway θPr,St(c0, c1) evaluates. A first pass converts statefuloperations of c0, c1 and yields state-transforming probabilisticcode. A second pass interprets the remaining sampling op-erations and yields state-transforming subdistributions. Lastlya third pass uses θPr and yields the expected specificationθPr,St(c0, c1) : StT(BP)(A0, A1). Finally, θPr,St validates all ofthe rules of our relational program logic (including Figure 13).

A substantial amount of work was required for the imple-mentation of our model in Coq. To establish the existence ofthe first layer θPr of the model, we developed a mathematicaltheory of couplings and of their interaction with probabilisticprograms. This theory relies internally on the mathcomp-analysis library [1, 2], particularly on their formalizationof real numbers, subdistributions and discrete integrals. Thecustom state transformer we develop for θPr,St is built upon theformalization of several non-standard categorical constructs inan order-enriched context: lax functors, lax natural transfor-mations, left relative adjunctions, lax morphisms between suchadjunctions.

The semantic framework of Maillard et al. [38] basedon effect observations is relevant for various effectful con-texts. In our case, altough the obtained semantic judgment�θPr,St c0 ∼ c1 { w } can seem abstract at first, it can be shownlogically equivalent to a more direct formulation, such as theone used by EasyCrypt (briefly reviewed in §6). While a directad-hoc definition of the model is comparatively simpler toimplement, our categorical approach aims to provide moremodularity. Indeed, as pointed out earlier, a model of a solelyprobabilistic program logic (§5.2) faithfully embeds into our

12

Page 13: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

final, stateful model, and we claim that the same configurationholds for a model of an assertion-only logic. Moreover, itshould be possible to extend our stateful model with othereffects using a similar range of algebraic techniques. However,as things stand now, incorporating new effects in our relationalprogram logic and its associated semantics can only be doneon a case by case basis.

6 Related WorkSSProve is the first verification framework for SSP, yet theformal verification of cryptographic proofs in different styleshas been intensely investigated [6]. In this section we surveythe closest related work in this space.

CertiCrypt [10] is a foundational Coq framework for game-based crypto proofs. CertiCrypt does not support modularproofs and is no longer maintained, yet it is seminal work thathas inspired many other tools in this space, such as EasyCrypt,FCF, etc. The logic we introduce in §4 is also inspired by theprobabilistic relational Hoare logic at the core of CertiCrypt.

FCF [44] is a more recent foundational Coq framework forcrypto proofs that was used to verify the HMAC implementa-tions in OpenSSL [18] and mbedTLS [56]. In contrast to Cer-tiCrypt’s (and EasyCrypt’s) deep embedding of a probabilisticWhile language, FCF represents code with finite probabilitiesand non-termination using a monadic embedding, similar tothe free monad we use for code in §3.1. The advantage of suchan embedding is that code can be both easily manipulated as asyntactic object (e.g., to define package composition in §3.1)and easily lifted to a probability monad when needed (§3.2 and§5.2), all without leaving the internal language of Coq. Thismonadic representation of computational effects also paves theway towards a more modular treatment of programs exhibitingeffects of different nature such as communications with anexternal process. We are not aware of any formalization ofSSP on top of FCF, although it seems possible in principle.

EasyCrypt [11, 13] is a proof assistant and verification toolspecifically designed and built from scratch for game-basedcrypto proofs. This state-of-the-art tool has been used, forinstance, to prove security for Amazon Web Services’ KeyManagement Service [3]. EasyCrypt’s good integration withautomatic theorem provers (e.g., SMT solvers) is helpful forsuch large proofs, even if it does come at a cost in terms oftrusted computing base.

EasyCrypt also comes with an ML-style module system [7].EasyCrypt’s parameterized modules are, however, quite differ-ent from parameterized games in SSP (parameterized moduleinstantiation in EasyCrypt has cloning semantics, i.e., eachinstance gets a separate copy of the module’s state). Moreover,EasyCrypt functors—which can to some extent be used torepresent packages with imports—are not first class, so SSP-style laws cannot even be stated. While none of these is ashowstopper, it leads to a quite different default style forwriting modular proofs.

In very recent work, Dupressoir et al. [28] show that withenough workarounds they can code up in EasyCrypt the SSP

proof of Brzuska et al. [23] for the Cryptobox [19] KEM-DEM [27], and discuss the strengths and shortcomings ofEasyCrypt for formalizing SSP-style proofs. Our KEM-DEMexample has similar complexity, but moreover we focus onproviding a general framework for SSP proofs, includingdefinitions of SSP packages, their composition, and the cor-responding algebraic laws. SSProve also includes an assert

operation, and a faithful representation of the SSP memorymodel, allowing to express SSP proofs more naturally.

EasyUC [25] aims to address the lack of composabilityin game-based proofs by formalizing the Universal Com-posability (UC) framework [24] using EasyCrypt. EasyUCreplaces the interactive Turing machines in UC with EasyCryptmodules. It was used to prove a secure messaging protocolcomposed of Diffie-Hellman and one-time pad. More recentwork develops a DSL [26] on top of EasyUC for hidingaway the boilerplate needed to mediate between procedure-based communication in EasyCrypt and co-routine-based com-munication in the UC framework. Barbosa et al. [7] addautomatic complexity analysis to EasyCrypt and use it foranother formalization of UC. SSP was in part inspired bythe UC framework, but focuses on making game-based proofsmore modular and scalable, without targeting simulation-based security or universal composability. A more precisecomparison between SSP and UC proofs would be interesting.

CryptHOL [16] is a foundational framework for game-based proofs that uses the theory of relational parametricityto achieve automation in the Isabelle/HOL proof assistant.It also makes use of the extensive mathematical librariesof Isabelle/HOL. More proof engineering and automationwould be needed for SSProve to have a chance at matchingCryptHOL’s formalization of ElGamal or PRF-based encryp-tion. CryptHOL [36] has been also used to formalize Con-structive Cryptography [39], another composable frameworkthat inspired SSP, and the example of a one-time pad. Whilethere is some similarity between their converters and SSP’spackages, to our knowledge a more precise comparison hasnot yet been undertaken.

ILC [35] is a process calculus modeling some of thekey ideas behind the UC framework, in particular its co-routine based communication mechanism, while completelyabstracting away from interactive Turing machines. Their workhas not yet been formalized in a proof assistant.

IPDL [43] is another recent Coq framework for cryptoproofs. Although their motivation is similar to SSP and theirinteraction sets are reminiscent of packages, the relation toother composable frameworks has not been worked out.

Packages have been motivated by ML modules [48]. Nospecific theory for probabilistic programming languages withstateful modules seems to be available, but Sterling andHarper [52] provide a general module system. It would beinteresting to specialize it to probabilistic stateful programsand compare it to packages.

13

Page 14: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

7 Future WorkThe high-level proofs done on paper in the miTLS project [20,21, 30] were the main inspiration for the SSP methodologyand it would be an interesting challenge to scale SSProveto large machine-checked proofs in the future. This wouldfor a start require more work on proof engineering andautomation. The problem of verifying such large proofs allthe way down to low-level efficient executable code is evenmore challenging, also given the extreme scale of a completeimplementation for a protocol like TLS. Achieving this inCoq would probably require integrating with projects such asVST [4] or FiatCrypto [29].

An alternative would be to port SSProve to F? [53], whereat least functional correctness can be verified at that scale.Still many challenges would remain, including extending F?

to probabilistic verification, internalizing F? modules, and ex-tending the SSP methodology to support type abstraction andprocedures with specifications. In less ambitious recent workthat is still unfinished, Kohbrok et al. [33] have implementedvanilla SSP packages in F? and attempted to automate state-separating proofs based on a library for partial setoids.

In the shorter term, we plan to use our formalization ofthe KEM-DEM example from [23] to showcase the capacityof SSProve to combine high-level and low-level reasoning.KEM-DEM is more interesting than the PRF (§2.3) andElGamal (§2.4) examples in several respects. KEM-DEMuses extensively high level SSP arguments, such as parallelcomposition, package identity, and interchange laws, which arenot featured in the two examples of §2. Moreover, it also reliesheavily on our probabilistic relational framework. While thePRF and ElGamal examples use a simple invariant (equality ofheaps), KEM-DEM compares packages that work on differentmemory locations and, thus, some locations need to be ignoredby the invariant. The KEM-DEM invariant also relates in anon-trivial way different locations of programs by makingsure, for instance, that some stored value must correspondto the encryption of another stored value, with respect to astored key. This has led us to develop tools for idiomaticallyreasoning about memory.

We would also like to extend SSProve to extra side-effectssuch as non-termination and I/O and also to F?-style sub-effecting [53]. The effect-modular semantic model from §5should make this easier, and we hope to be able reuse theInteraction Trees framework [51, 55], and maybe also takeinspiration from CryptHOL [16].

AcknowledgmentsWe are grateful to Arthur Azevedo de Amorim, Theo Laurent,Nikolaj Sidorenco, and Ramkumar Ramachandra for theirtechnical support and for participating in stimulating discus-sions, and to the anonymous reviewers for their valuable feed-back. This work was in part supported by the European Re-search Council under ERC Starting Grant SECOMP (715753),by AFOSR grant Homotopy type theory and probabilistic com-putation (12595060), by the Concordium Blockchain ResearchCenter at Aarhus University, and by Nomadic Labs via a

grant on the Evolution, Semantics, and Engineering of theF* Verification System. Antoine Van Muylder holds a PhDFellowship from the Research Foundation – Flanders (FWO).

References[1] R. Affeldt, C. Cohen, M. Kerjean, A. Mahboubi,

D. Rouhling, and K. Sakaguchi. Competing inheritancepaths in dependent type theory: a case study in functionalanalysis. In IJCAR 2020 - International Joint Conferenceon Automated Reasoning, 2020.

[2] R. Affeldt, C. Cohen, M. Kerjean, A. Mahboubi,D. Rouhling, K. Sakaguchi, and P.-Y. Strub. mathcomp-analysis. Analysis library compatible with MathematicalComponents, 2021.

[3] J. B. Almeida, M. Barbosa, G. Barthe, M. Campagna,E. Cohen, B. Gregoire, V. Pereira, B. Portela, P. Strub,and S. Tasiran. A machine-checked proof of security forAWS key management service. In CCS 2019. 2019.

[4] A. W. Appel. Verified software toolchain - (invited talk).In ESOP. 2011.

[5] P. Audebaud and C. Paulin-Mohring. Proofs of random-ized algorithms in Coq. In Mathematics of ProgramConstruction. 2006.

[6] M. Barbosa, G. Barthe, K. Bhargavan, B. Blanchet,C. Cremers, K. Liao, and B. Parno. Sok: Computer-aided cryptography. IACR Cryptol. ePrint Arch., 2019,2019.

[7] M. Barbosa, G. Barthe, B. Gregoire, A. Koutsos, and P.-Y. Strub. Mechanized proofs of adversarial complexityand application to universal composability. CryptologyePrint Archive, Report 2021/156, 2021.

[8] R. Barnes, B. Beurdouche, J. Millican, E. Omara,K. Cohn-Gordon, and R. Robert. The messaging layersecurity (MLS) protocol. IETF Draft, 2020.

[9] G. Barthe, B. Gregoire, and S. Zanella-Beguelin. Formalcertification of code-based cryptographic proofs. POPL,2009.

[10] G. Barthe, B. Gregoire, and S. Zanella Beguelin. Formalcertification of code-based cryptographic proofs. InPOPL, 2009.

[11] G. Barthe, B. Gregoire, S. Heraud, and S. ZanellaBeguelin. Computer-aided security proofs for the work-ing cryptographer. In CRYPTO. 2011.

[12] G. Barthe, J. M. Crespo, B. Gregoire, C. Kunz,Y. Lakhnech, B. Schmidt, and S. Zanella Beguelin. Fullyautomated analysis of padding-based encryption in thecomputational model. In CCS’13. 2013.

[13] G. Barthe, F. Dupressoir, B. Gregoire, C. Kunz,B. Schmidt, and P. Strub. EasyCrypt: A tutorial. In Foun-dations of Security Analysis and Design VII - FOSAD2012/2013 Tutorial Lectures. 2013.

[14] G. Barthe, T. Espitau, B. Gregoire, J. Hsu, L. Stefanesco,and P. Strub. Relational reasoning via probabilisticcoupling. In LPAR-20, 2015.

[15] G. Barthe, B. Gregoire, and B. Schmidt. Automatedproofs of pairing-based cryptography. In CCS’15. 2015.

14

Page 15: SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq · 2021. 5. 26. · SSProve: A Foundational Framework for Modular Cryptographic Proofs in Coq Carmine Abate1

[16] D. A. Basin, A. Lochbihler, and S. R. Sefidgar.CryptHOL: Game-based proofs in higher-order logic. J.Cryptol., 33(2), 2020.

[17] M. Bellare and P. Rogaway. Code-based game-playingproofs and the security of triple encryption. IACRCryptol. ePrint Arch., page 331, 2004.

[18] L. Beringer, A. Petcher, K. Q. Ye, and A. W. Appel.Verified correctness and security of OpenSSL HMAC.In 24th USENIX Security Symposium. 2015.

[19] D. J. Bernstein. Cryptography in NaCl, 2009.[20] K. Bhargavan, C. Fournet, M. Kohlweiss, A. Pironti,

P. Strub, and S. Zanella Beguelin. Proving the TLShandshake secure (as it is). In CRYPTO’14. 2014.

[21] K. Bhargavan, A. Delignat-Lavaud, C. Fournet,M. Kohlweiss, J. Pan, J. Protzenko, A. Rastogi,N. Swamy, S. Zanella Beguelin, and J. K. Zinzindohoue.Implementing and proving the TLS 1.3 record layer.IEEE S&P, 2017.

[22] B. Blanchet. A computationally sound mechanizedprover for security protocols. In IEEE S&P. 2006.

[23] C. Brzuska, A. Delignat-Lavaud, C. Fournet, K. Kohbrok,and M. Kohlweiss. State separation for code-based game-playing proofs. In ASIACRYPT. 2018.

[24] R. Canetti. Universally composable security. J. ACM, 67(5), 2020.

[25] R. Canetti, A. Stoughton, and M. Varia. EasyUC: UsingEasyCrypt to mechanize proofs of universally compos-able security. In CSF. 2019.

[26] R. Canetti, A. Kfoury, A. Stoughton, M. Varia,G. Tarakaram, and T. Petrovic. UC Domain SpecificLanguage. unpublished, 2021.

[27] R. Cramer and V. Shoup. Design and analysis of practicalpublic-key encryption schemes secure against adaptivechosen ciphertext attack. SIAM J. Comput., 33(1), 2003.

[28] F. Dupressoir, K. Kohbrok, and S. Oechsner. Bringingstate-separating proofs to EasyCrypt - a security proof forCryptobox. Cryptology ePrint Archive, Report 2021/326,2021.

[29] A. Erbsen, J. Philipoom, J. Gross, R. Sloan, and A. Chli-pala. Simple high-level code for cryptographic arithmetic- with proofs, without compromises. IEEE S&P, 2019.

[30] C. Fournet, M. Kohlweiss, and P. Strub. Modular code-based cryptographic verification. CCS. 2011.

[31] M. Giry. A categorical approach to probability theory.Categorical Aspects of Topology and Analysis. 1982.

[32] S. Halevi. A plausible approach to computer-aidedcryptographic proofs. IACR Cryptol. ePrint Arch., page181, 2005.

[33] K. Kohbrok, M. Kohlweiss, T. Ramananandro, andN. Swamy. Relational F* for state separating crypto-graphic proofs. F* wiki article, 2020.

[34] S. Liang, P. Hudak, and M. P. Jones. Monad transformersand modular interpreters. POPL. 1995.

[35] K. Liao, M. A. Hammer, and A. Miller. ILC: a calculusfor composable, computational cryptography. In PLDI.2019.

[36] A. Lochbihler, S. R. Sefidgar, D. A. Basin, andU. Maurer. Formalizing constructive cryptography usingCryptHOL. In CSF. 2019.

[37] A. Mahboubi and E. Tassi. Mathematical components.Online book, 2021.

[38] K. Maillard, C. Hritcu, E. Rivas, and A. V. Muylder. Thenext 700 relational program logics. Proc. ACM Program.Lang., 4(POPL), 2020.

[39] U. Maurer. Constructive cryptography - A new paradigmfor security definitions and proofs. In Theory of Securityand Applications - Joint Workshop, TOSCA’11. 2011.

[40] U. Maurer and R. Renner. Abstract cryptography. InInnovations in Computer Science - ICS’11. 2011.

[41] R. Milner, J. Parrow, and D. Walker. A calculus of mobileprocesses, I. Inf. Comput., 100(1), 1992.

[42] E. Moggi. Computational lambda-calculus and monads.LICS. 1989.

[43] G. Morrisett, E. Shi, K. Sojakova, X. Fan, and J. Gancher.IPDL: A simple framework for formally verifying dis-tributed cryptographic protocols. Cryptology ePrintArchive, Report 2021/147, 2021.

[44] A. Petcher and G. Morrisett. The foundational cryptog-raphy framework. POST . 2015.

[45] G. D. Plotkin and J. Power. Algebraic operations andgeneric effects. Applied Categorical Structures, 11(1),2003.

[46] G. D. Plotkin and M. Pretnar. Handlers of algebraiceffects. ESOP. 2009.

[47] E. Rescorla. The transport layer security (TLS) protocolversion 1.3. IETF RFC 5246, 2018.

[48] A. Rossberg, C. V. Russo, and D. Dreyer. F-ing modules.J. Funct. Program., 24(5), 2014.

[49] M. Rosulek. The Joy of Cryptography. Online textbook,2021.

[50] V. Shoup. Sequences of games: a tool for tamingcomplexity in security proofs. IACR Cryptol. ePrintArch., page 332, 2004.

[51] L. Silver and S. Zdancewic. Dijkstra monads forever:termination-sensitive specifications for interaction trees.Proc. ACM Program. Lang., 5(POPL), 2021.

[52] J. Sterling and R. Harper. Logical relations astypes: Proof-relevant parametricity for program modules.CoRR, abs/2010.08599, 2020.

[53] N. Swamy, C. Hritcu, C. Keller, A. Rastogi, A. Delignat-Lavaud, S. Forest, K. Bhargavan, C. Fournet, P.-Y.Strub, M. Kohlweiss, J.-K. Zinzindohoue, and S. Zanella-Beguelin. Dependent types and multi-monadic effects inF*. POPL. 2016.

[54] P. Wadler. Comprehending monads. In LFP’90. 1990.[55] L. Xia, Y. Zakowski, P. He, C. Hur, G. Malecha, B. C.

Pierce, and S. Zdancewic. Interaction trees: representingrecursive and impure programs in Coq. Proc. ACMProgram. Lang., 4(POPL), 2020.

[56] K. Q. Ye, M. Green, N. Sanguansin, L. Beringer,A. Petcher, and A. W. Appel. Verified correctness andsecurity of mbedTLS HMAC-DRBG. In CCS’17. 2017.

15