Init.lean
SPQR V1: initial state (spqrV1Init) and session instances
Trusted: definitions used by the statement. SpqrModel. (LibsignalTripleRatchet.lean) sets Spqr. to the empty state of spqr::Version::V0, whereas libsignal initializes SPQR with version = V1 and min_version = V1 (rust/). This file defines libsignal's V1 initial state (spqrV1Init) and the resulting Spqr instances (spqrV1Session and spqrV1SessionUniformCoins).
@[expose] public sectionnamespace CryptoVerification.LibsignalSpqrV1open CryptoGames.LibsignalSession (Spqr SpqrDirection ShaCompress)open CryptoVerification.LibsignalTripleRatchet (SpqrModel)
def Direction.
Converts the session model's SpqrDirection to spqr::Direction.
def Direction.ofSpqrDirection : SpqrDirection → Direction
| .a2b => .a2b
| .b2a => .b2adef libsignalChainParams
spqr_chain_params(self_connection) (rust/).
def libsignalChainParams (selfSession : Bool) : ChainParams :=
{ maxJump := if selfSession then BitVec.allOnes 32 else 25000#32, maxOooKeys := 2000#32 }1 declaration not shown (lines 40–40): theorems, which Lean checks, or definitions that no headline statement uses
CryptoVerification.
def libsignalSpqrParams
spqr::Params passed by libsignal's session constructors (ratchet.rs:83–89, 146–152).
def libsignalSpqrParams (selfSession : Bool) (dir : SpqrDirection) (k : BitVec 256) : Params where
direction := Direction.ofSpqrDirection dir
version := .v1
minVersion := .v1
authKey := CryptoGames.HMAC.keyToBytes32 k
chainParams := libsignalChainParams selfSessiondef spqrV1InitialStateFor
V1 initial SPQR state for a non-self libsignal session (spqr::initial_state, spqr/), falling back to [] only on unreachable init_inner errors.
def spqrV1InitialStateFor (D : SpqrApiDeps) (dir : SpqrDirection) (k : BitVec 256) : List (BitVec 8) :=
match initialState D (libsignalSpqrParams false dir k) with
| .ok st => st
| .error _ => []def spqrV1Init
spqrV1InitialStateFor instantiated at spqrDeps F K.
def spqrV1Init (F : ShaCompress) (K : MlKem) (dir : SpqrDirection) (k : BitVec 256) :
List (BitVec 8) :=
spqrV1InitialStateFor (spqrDeps F K) dir k3 declarations not shown (lines 62–73): theorems, which Lean checks, or definitions that no headline statement uses
CryptoVerification., CryptoVerification., CryptoVerification.
Uniform coins: spqrV1SessionUniformCoins
abbrev coinBytes
Little-endian 64-byte view of r : BitVec 512 (toLEBytes 64 r).
abbrev coinBytes (r : BitVec 512) : List (BitVec 8) :=
CryptoVerification.LibsignalAesCbc.toLEBytes 64 rdef spqrV1SessionUniformCoins
SPQR V1 Spqr session instance parameterized by uniform 512-bit coins (coinBytes r), which suffice for every States. branch (generate reads 64 bytes, encaps1 reads 32).
def spqrV1SessionUniformCoins (F : ShaCompress) (K : MlKem) : Spqr (List (BitVec 8)) (BitVec 512) :=
⟨spqrV1Init F K, fun st r => (spqrV1 F K).send st (coinBytes r), (spqrV1 F K).recv,
fun st r => (spqrV1 F K).sendPanics st (coinBytes r), (spqrV1 F K).recvPanics⟩4 declarations not shown (lines 87–98): theorems, which Lean checks, or definitions that no headline statement uses
CryptoVerification., CryptoVerification., CryptoVerification., CryptoVerification.
end CryptoVerification.LibsignalSpqrV1