9.6. SPQR
-
SPQR.EkSender.KeysUnsampled[complete] -
SPQR.EkSender.HeaderSent[complete] -
SPQR.EkSender.EkSent[complete] -
SPQR.EkSender.EkSentCt1Received[complete] -
SPQR.EkSender.sendHeader[complete] -
SPQR.EkSender.sendVector[complete] -
SPQR.EkSender.recvCt1[complete] -
SPQR.EkSender.recvCt2[complete]
\todo
send authenticated encapsulation-key header
/-- Generate a KEM key pair and return the successor state, header, and tag. -/
def sendHeader (inc : kem.IncrementalStructure)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac)
(st : KeysUnsampled AuthState) : m (HeaderSent inc AuthState × inc.PKheader × Mac) := do
let (pk, sk) ← kem.keygen
let hdr := inc.toHeader pk
pure (⟨st.ep, st.authSt, pk, sk⟩, hdr, auth.macHeader st.authSt st.ep hdr)send encapsulation-key vector
/-- Return the successor state and the vector component of the stored encapsulation key. -/
def sendVector (inc : kem.IncrementalStructure) (st : HeaderSent inc AuthState) :
EkSent inc AuthState × inc.PKvector :=
(⟨st.ep, st.authSt, st.sk⟩, inc.toVector st.pk)receive first ciphertext component
/-- Store the first ciphertext component. -/
def recvCt1 (inc : kem.IncrementalStructure) (st : EkSent inc AuthState)
(c1 : inc.C₁) : EkSentCt1Received inc AuthState :=
⟨st.ep, st.authSt, st.sk, c1⟩receive second ciphertext component and tag
/-- Decapsulate and authenticate the ciphertext, returning the next role state and epoch key. -/
def recvCt2 (inc : kem.IncrementalStructure)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac)
(deriveEpochKey : EpochKeyDerivation K EpochKey) (hDet : DeterministicDecaps kem)
(st : EkSentCt1Received inc AuthState) (c2 : inc.C₂) (tag : Mac) :
Option (CtSender.NoHeaderReceived AuthState × (ℕ × EpochKey)) :=
match hDet.decapsDet st.sk (inc.splitC.symm (st.c1, c2)) with
| none => none
| some k =>
let ik := deriveEpochKey k st.ep
let authSt' := auth.update st.authSt st.ep ik
if auth.verifyCiphertext authSt' st.ep (st.c1, c2) tag then
some (⟨st.ep + 1, authSt'⟩, (st.ep, ik))
else noneLean code for Definition9.6.1●8 definitions
Associated Lean declarations
-
SPQR.EkSender.KeysUnsampled[complete]
-
SPQR.EkSender.HeaderSent[complete]
-
SPQR.EkSender.EkSent[complete]
-
SPQR.EkSender.EkSentCt1Received[complete]
-
SPQR.EkSender.sendHeader[complete]
-
SPQR.EkSender.sendVector[complete]
-
SPQR.EkSender.recvCt1[complete]
-
SPQR.EkSender.recvCt2[complete]
-
SPQR.EkSender.KeysUnsampled[complete] -
SPQR.EkSender.HeaderSent[complete] -
SPQR.EkSender.EkSent[complete] -
SPQR.EkSender.EkSentCt1Received[complete] -
SPQR.EkSender.sendHeader[complete] -
SPQR.EkSender.sendVector[complete] -
SPQR.EkSender.recvCt1[complete] -
SPQR.EkSender.recvCt2[complete]
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.EkSender.KeysUnsampled (AuthState : Type) : Type
structure SPQR.EkSender.KeysUnsampled (AuthState : Type) : Type
State before sampling an encapsulation key.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.EkSender.HeaderSent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.EkSender.HeaderSent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after sending the authenticated encapsulation-key header.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
pk : PK
The sampled encapsulation key.
sk : SK
The decapsulation key held for this epoch.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.EkSender.EkSent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.EkSender.EkSent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after sending the encapsulation-key vector.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
sk : SK
The decapsulation key held for this epoch.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.EkSender.EkSentCt1Received.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.EkSender.EkSentCt1Received.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after sending the encapsulation key and receiving the first ciphertext component.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
sk : SK
The decapsulation key held for this epoch.
c1 : inc.C₁
The received first ciphertext component.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.EkSender.sendHeader.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.EkSender.KeysUnsampled AuthState) : m (SPQR.EkSender.HeaderSent inc AuthState × inc.PKheader × Mac)
def SPQR.EkSender.sendHeader.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.EkSender.KeysUnsampled AuthState) : m (SPQR.EkSender.HeaderSent inc AuthState × inc.PKheader × Mac)
Generate a KEM key pair and return the successor state, header, and tag.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.EkSender.sendVector.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.EkSender.HeaderSent inc AuthState) : SPQR.EkSender.EkSent inc AuthState × inc.PKvector
def SPQR.EkSender.sendVector.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.EkSender.HeaderSent inc AuthState) : SPQR.EkSender.EkSent inc AuthState × inc.PKvector
Return the successor state and the vector component of the stored encapsulation key.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.EkSender.recvCt1.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.EkSender.EkSent inc AuthState) (c1 : inc.C₁) : SPQR.EkSender.EkSentCt1Received inc AuthState
def SPQR.EkSender.recvCt1.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.EkSender.EkSent inc AuthState) (c1 : inc.C₁) : SPQR.EkSender.EkSentCt1Received inc AuthState
Store the first ciphertext component.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.EkSender.recvCt2.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (deriveEpochKey : SPQR.EpochKeyDerivation K EpochKey) (hDet : kem.DeterministicDecaps) (st : SPQR.EkSender.EkSentCt1Received inc AuthState) (c2 : inc.C₂) (tag : Mac) : Option (SPQR.CtSender.NoHeaderReceived AuthState × ℕ × EpochKey)
def SPQR.EkSender.recvCt2.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (deriveEpochKey : SPQR.EpochKeyDerivation K EpochKey) (hDet : kem.DeterministicDecaps) (st : SPQR.EkSender.EkSentCt1Received inc AuthState) (c2 : inc.C₂) (tag : Mac) : Option (SPQR.CtSender.NoHeaderReceived AuthState × ℕ × EpochKey)
Decapsulate and authenticate the ciphertext, returning the next role state and epoch key.
-
SPQR.CtSender.NoHeaderReceived[complete] -
SPQR.CtSender.HeaderReceived[complete] -
SPQR.CtSender.Ct1Sent[complete] -
SPQR.CtSender.Ct1SentEkReceived[complete] -
SPQR.CtSender.Ct2Sent[complete] -
SPQR.CtSender.recvHeader[complete] -
SPQR.CtSender.sendCt1[complete] -
SPQR.CtSender.recvVector[complete] -
SPQR.CtSender.sendCt2[complete] -
SPQR.CtSender.recvNextEpoch[complete]
\todo
receive authenticated encapsulation-key header
/-- Verify the header tag and return the successor state on success. -/
def recvHeader (inc : kem.IncrementalStructure)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac)
(st : NoHeaderReceived AuthState) (hdr : inc.PKheader) (tag : Mac) :
Option (HeaderReceived inc AuthState) :=
if auth.verifyHeader st.authSt st.ep hdr tag then some ⟨st.ep, st.authSt, hdr⟩ else nonesend first ciphertext component
/-- Run encapsulation stage one and return the successor state, ciphertext, and epoch key. -/
def sendCt1 (inc : kem.IncrementalStructure)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac)
(deriveEpochKey : EpochKeyDerivation K EpochKey) (st : HeaderReceived inc AuthState) :
m (Ct1Sent inc AuthState × inc.C₁ × (ℕ × EpochKey)) := do
let (encapsSt, c1, k) ← inc.encaps1 st.hdr
let ik := deriveEpochKey k st.ep
pure (⟨st.ep, auth.update st.authSt st.ep ik, st.hdr, encapsSt, c1⟩, c1, (st.ep, ik))receive encapsulation-key vector
/-- Validate the encapsulation-key vector and return the successor state on success. -/
def recvVector (inc : kem.IncrementalStructure) (st : Ct1Sent inc AuthState)
(vec : inc.PKvector) : Option (Ct1SentEkReceived inc AuthState) :=
if inc.validPK st.hdr vec then
some ⟨st.ep, st.authSt, st.hdr, st.encapsSt, st.c1, vec⟩
else nonesend second ciphertext component and tag
/-- Run encapsulation stage two and return the successor state, ciphertext, and tag. -/
def sendCt2 (inc : kem.IncrementalStructure)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac)
(st : Ct1SentEkReceived inc AuthState) : m (Ct2Sent AuthState × inc.C₂ × Mac) := do
let c2 ← inc.encaps2 st.encapsSt st.hdr st.vec
pure (⟨st.ep, st.authSt⟩, c2, auth.macCiphertext st.authSt st.ep (st.c1, c2))advance to the next epoch
/-- Return the encapsulation-key-sender state exactly when `t` is the successor epoch. -/
def recvNextEpoch (st : Ct2Sent AuthState) (t : ℕ) : Option (EkSender.KeysUnsampled AuthState) :=
if t = st.ep + 1 then some ⟨st.ep + 1, st.authSt⟩ else noneLean code for Definition9.6.2●10 definitions
Associated Lean declarations
-
SPQR.CtSender.NoHeaderReceived[complete]
-
SPQR.CtSender.HeaderReceived[complete]
-
SPQR.CtSender.Ct1Sent[complete]
-
SPQR.CtSender.Ct1SentEkReceived[complete]
-
SPQR.CtSender.Ct2Sent[complete]
-
SPQR.CtSender.recvHeader[complete]
-
SPQR.CtSender.sendCt1[complete]
-
SPQR.CtSender.recvVector[complete]
-
SPQR.CtSender.sendCt2[complete]
-
SPQR.CtSender.recvNextEpoch[complete]
-
SPQR.CtSender.NoHeaderReceived[complete] -
SPQR.CtSender.HeaderReceived[complete] -
SPQR.CtSender.Ct1Sent[complete] -
SPQR.CtSender.Ct1SentEkReceived[complete] -
SPQR.CtSender.Ct2Sent[complete] -
SPQR.CtSender.recvHeader[complete] -
SPQR.CtSender.sendCt1[complete] -
SPQR.CtSender.recvVector[complete] -
SPQR.CtSender.sendCt2[complete] -
SPQR.CtSender.recvNextEpoch[complete]
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.CtSender.NoHeaderReceived (AuthState : Type) : Type
structure SPQR.CtSender.NoHeaderReceived (AuthState : Type) : Type
State before receiving an encapsulation-key header.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.CtSender.HeaderReceived.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.CtSender.HeaderReceived.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after receiving an authenticated encapsulation-key header.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state entering the epoch.
hdr : inc.PKheader
Stored encapsulation-key header.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.CtSender.Ct1Sent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.CtSender.Ct1Sent.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after deriving the epoch key and sending the first ciphertext component.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state after the update with this epoch's key.
hdr : inc.PKheader
Stored encapsulation-key header.
encapsSt : inc.St
The encapsulation state carried from the first stage to the second.
c1 : inc.C₁
The first ciphertext component, kept for the ciphertext tag.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.CtSender.Ct1SentEkReceived.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
structure SPQR.CtSender.Ct1SentEkReceived.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} (inc : kem.IncrementalStructure) (AuthState : Type) : Type
State after sending the first ciphertext component and validating the encapsulation key.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state after the update with this epoch's key.
hdr : inc.PKheader
Stored encapsulation-key header.
encapsSt : inc.St
The encapsulation state carried from the first stage to the second.
c1 : inc.C₁
The first ciphertext component, kept for the ciphertext tag.
vec : inc.PKvector
Stored encapsulation-key vector.
-
structuredefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
structure SPQR.CtSender.Ct2Sent (AuthState : Type) : Type
structure SPQR.CtSender.Ct2Sent (AuthState : Type) : Type
State after sending the second ciphertext component and its tag.
Fields
ep : ℕ
The epoch in progress.
authSt : AuthState
Authenticator state after the update with this epoch's key.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.CtSender.recvHeader.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.CtSender.NoHeaderReceived AuthState) (hdr : inc.PKheader) (tag : Mac) : Option (SPQR.CtSender.HeaderReceived inc AuthState)
def SPQR.CtSender.recvHeader.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.CtSender.NoHeaderReceived AuthState) (hdr : inc.PKheader) (tag : Mac) : Option (SPQR.CtSender.HeaderReceived inc AuthState)
Verify the header tag and return the successor state on success.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.CtSender.sendCt1.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (deriveEpochKey : SPQR.EpochKeyDerivation K EpochKey) (st : SPQR.CtSender.HeaderReceived inc AuthState) : m (SPQR.CtSender.Ct1Sent inc AuthState × inc.C₁ × ℕ × EpochKey)
def SPQR.CtSender.sendCt1.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (deriveEpochKey : SPQR.EpochKeyDerivation K EpochKey) (st : SPQR.CtSender.HeaderReceived inc AuthState) : m (SPQR.CtSender.Ct1Sent inc AuthState × inc.C₁ × ℕ × EpochKey)
Run encapsulation stage one and return the successor state, ciphertext, and epoch key.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.CtSender.recvVector.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.CtSender.Ct1Sent inc AuthState) (vec : inc.PKvector) : Option (SPQR.CtSender.Ct1SentEkReceived inc AuthState)
def SPQR.CtSender.recvVector.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {AuthState : Type} (inc : kem.IncrementalStructure) (st : SPQR.CtSender.Ct1Sent inc AuthState) (vec : inc.PKvector) : Option (SPQR.CtSender.Ct1SentEkReceived inc AuthState)
Validate the encapsulation-key vector and return the successor state on success.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.CtSender.sendCt2.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.CtSender.Ct1SentEkReceived inc AuthState) : m (SPQR.CtSender.Ct2Sent AuthState × inc.C₂ × Mac)
def SPQR.CtSender.sendCt2.{u} {m : Type → Type u} [Monad m] {K PK SK C : Type} {kem : KEMScheme m K PK SK C} {InitKey EpochKey AuthState Mac : Type} (inc : kem.IncrementalStructure) (auth : RatchetedAuthenticator InitKey EpochKey AuthState inc.PKheader (inc.C₁ × inc.C₂) Mac) (st : SPQR.CtSender.Ct1SentEkReceived inc AuthState) : m (SPQR.CtSender.Ct2Sent AuthState × inc.C₂ × Mac)
Run encapsulation stage two and return the successor state, ciphertext, and tag.
-
defdefined in SecureMessaging/SCKA/SPQR/Unchunked.leancomplete
def SPQR.CtSender.recvNextEpoch {AuthState : Type} (st : SPQR.CtSender.Ct2Sent AuthState) (t : ℕ) : Option (SPQR.EkSender.KeysUnsampled AuthState)
def SPQR.CtSender.recvNextEpoch {AuthState : Type} (st : SPQR.CtSender.Ct2Sent AuthState) (t : ℕ) : Option (SPQR.EkSender.KeysUnsampled AuthState)
Return the encapsulation-key-sender state exactly when `t` is the successor epoch.
-
SPQR.Chunked.Payload[complete] -
SPQR.Chunked.Message[complete] -
SPQR.Chunked.PartyState[complete] -
SPQR.Chunked.Error[complete] -
SPQR.Chunked.SendResult[complete] -
SPQR.Chunked.RecvResult[complete] -
SPQR.Chunked.completeCt2[complete]
\todo
wire payload
inductive Payload (Sym : Type) where
/-- `None`: no payload (paper `type = None`, `data = none`). -/
| none
/-- `Hdr(chunk)`: indexed symbol of the header and tag stream. -/
| hdr (chunk : ℕ × Sym)
/-- `Ek(chunk)`: indexed symbol of the encapsulation-key vector. -/
| ek (chunk : ℕ × Sym)
/-- `EkCt1Ack(chunk)`: vector symbol, and the sender holds all of `ct₁`. -/
| ekCt1Ack (chunk : ℕ × Sym)
/-- `Ct1Ack(true)`: the sender holds all of `ct₁`; the false flag is unreachable
(`states.rs:182`, `serialize.rs:268`). -/
| ct1Ack
/-- `Ct1(chunk)`: indexed symbol of the first ciphertext component. -/
| ct1 (chunk : ℕ × Sym)
/-- `Ct2(chunk)`: indexed symbol of the second ciphertext component and its tag. -/
| ct2 (chunk : ℕ × Sym)wire message
structure Message (Sym : Type) where
/-- The epoch being negotiated. -/
epoch : ℕ
/-- The typed payload. -/
payload : Payload Symparty state
inductive PartyState (P : MLKEMBraid.Parameters m) (AuthState : Type) where
/-- Before sampling an encapsulation key (`states.rs:17`). -/
| keysUnsampled (core : EkSender.KeysUnsampled AuthState)
/-- Sending the authenticated header stream (`states.rs:18`). -/
| keysSampled (core : EkSender.HeaderSent P.inc AuthState)
(sendingHdr : EncoderState (P.inc.PKheader × P.Mac) P.Sym)
/-- Sending the vector and receiving the first ciphertext component (`states.rs:19-20`). -/
| headerSent (core : EkSender.EkSent P.inc AuthState)
(sendingEk : EncoderState P.inc.PKvector P.Sym)
(receivingCt1 : DecoderState P.inc.C₁ P.Sym)
/-- Sending vector chunks that acknowledge complete first-ciphertext receipt
(`states.rs:21`). -/
| ct1Received (core : EkSender.EkSentCt1Received P.inc AuthState)
(sendingEk : EncoderState P.inc.PKvector P.Sym)
/-- Receiving the second ciphertext component (`states.rs:22`). -/
| ekSentCt1Received (core : EkSender.EkSentCt1Received P.inc AuthState)
(receivingCt2 : DecoderState (P.inc.C₂ × P.Mac) P.Sym)
/-- Receiving the authenticated header stream (`states.rs:23`). -/
| noHeaderReceived (core : CtSender.NoHeaderReceived AuthState)
(receivingHdr : DecoderState (P.inc.PKheader × P.Mac) P.Sym)
/-- Receiving the encapsulation-key vector after authenticating the header
(`states.rs:24`). -/
| headerReceived (core : CtSender.HeaderReceived P.inc AuthState)
(receivingEk : DecoderState P.inc.PKvector P.Sym)
/-- Sending the first ciphertext component while receiving the vector
(`states.rs:25`). -/
| ct1Sampled (core : CtSender.Ct1Sent P.inc AuthState)
(sendingCt1 : EncoderState P.inc.C₁ P.Sym)
(receivingEk : DecoderState P.inc.PKvector P.Sym)
/-- Sending the first ciphertext after validating the vector (`states.rs:26`). -/
| ekReceivedCt1Sampled (core : CtSender.Ct1SentEkReceived P.inc AuthState)
(sendingCt1 : EncoderState P.inc.C₁ P.Sym)
/-- Receiving the vector after the first ciphertext is acknowledged (`states.rs:27`). -/
| ct1Acknowledged (core : CtSender.Ct1Sent P.inc AuthState)
(receivingEk : DecoderState P.inc.PKvector P.Sym)
/-- Sending the second ciphertext component (`states.rs:28`). -/
| ct2Sampled (core : CtSender.Ct2Sent AuthState)
(sendingCt2 : EncoderState (P.inc.C₂ × P.Mac) P.Sym)receive errors
inductive Error where
/-- The message epoch is ahead of the state. -/
| epochOutOfRange (epoch : ℕ)
/-- A header or ciphertext tag was rejected, or deterministic decapsulation refused the
ciphertext; ML-KEM never refuses. -/
| macVerifyFailed
/-- The received vector failed validation. -/
| erroneousDataReceivedsend result
structure SendResult (P : MLKEMBraid.Parameters m) (AuthState : Type) where
/-- The message sent. -/
msg : Message P.Sym
/-- The latest epoch the receiver is guaranteed to know on receipt of `msg`: the entry epoch
minus one (`lib.rs:298`). -/
sendingEpoch : ℕ
/-- The epoch key derived by this send, if any. -/
outputKey : Option (ℕ × P.EpochKey)
/-- The state after the send. -/
state : PartyState P AuthStatereceive result
structure RecvResult (P : MLKEMBraid.Parameters m) (AuthState : Type) where
/-- The incoming message epoch minus one. -/
receivingEpoch : ℕ
/-- The epoch key derived by this receive, if any. -/
outputKey : Option (ℕ × P.EpochKey)
/-- The state after the receive. -/
state : PartyState P AuthStatecomplete incremental encapsulation stage two
def completeCt2 (P : MLKEMBraid.Parameters m)
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(core : CtSender.Ct1SentEkReceived P.inc AuthState) : PartyState P AuthState :=
let c2 := P.hEnc2.encaps2Det core.encapsSt core.hdr core.vec
let tag := auth.macCiphertext core.authSt core.ep (core.c1, c2)
.ct2Sampled ⟨core.ep, core.authSt⟩ (EncoderState.init P.ecpCt2 (c2, tag))Lean code for Definition9.6.3●7 definitions
Associated Lean declarations
-
SPQR.Chunked.Payload[complete]
-
SPQR.Chunked.Message[complete]
-
SPQR.Chunked.PartyState[complete]
-
SPQR.Chunked.Error[complete]
-
SPQR.Chunked.SendResult[complete]
-
SPQR.Chunked.RecvResult[complete]
-
SPQR.Chunked.completeCt2[complete]
-
SPQR.Chunked.Payload[complete] -
SPQR.Chunked.Message[complete] -
SPQR.Chunked.PartyState[complete] -
SPQR.Chunked.Error[complete] -
SPQR.Chunked.SendResult[complete] -
SPQR.Chunked.RecvResult[complete] -
SPQR.Chunked.completeCt2[complete]
-
inductivedefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
inductive SPQR.Chunked.Payload (Sym : Type) : Type
inductive SPQR.Chunked.Payload (Sym : Type) : Type
Wire payload, one constructor per Rust `MessagePayload` variant (`states.rs:31-39`). It replaces the paper's separate `type` and `data` fields with a typed sum and represents only the reachable `Ct1Ack(true)` value.
Constructors
SPQR.Chunked.Payload.none {Sym : Type} : SPQR.Chunked.Payload Sym
`None`: no payload (paper `type = None`, `data = none`).
SPQR.Chunked.Payload.hdr {Sym : Type} (chunk : ℕ × Sym) : SPQR.Chunked.Payload Sym
`Hdr(chunk)`: indexed symbol of the header and tag stream.
SPQR.Chunked.Payload.ek {Sym : Type} (chunk : ℕ × Sym) : SPQR.Chunked.Payload Sym
`Ek(chunk)`: indexed symbol of the encapsulation-key vector.
SPQR.Chunked.Payload.ekCt1Ack {Sym : Type} (chunk : ℕ × Sym) : SPQR.Chunked.Payload Sym
`EkCt1Ack(chunk)`: vector symbol, and the sender holds all of `ct₁`.
SPQR.Chunked.Payload.ct1Ack {Sym : Type} : SPQR.Chunked.Payload Sym
`Ct1Ack(true)`: the sender holds all of `ct₁`; the false flag is unreachable (`states.rs:182`, `serialize.rs:268`).
SPQR.Chunked.Payload.ct1 {Sym : Type} (chunk : ℕ × Sym) : SPQR.Chunked.Payload Sym
`Ct1(chunk)`: indexed symbol of the first ciphertext component.
SPQR.Chunked.Payload.ct2 {Sym : Type} (chunk : ℕ × Sym) : SPQR.Chunked.Payload Sym
`Ct2(chunk)`: indexed symbol of the second ciphertext component and its tag.
-
structuredefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
structure SPQR.Chunked.Message (Sym : Type) : Type
structure SPQR.Chunked.Message (Sym : Type) : Type
Rust `Message` (`states.rs:41`).
Fields
epoch : ℕ
The epoch being negotiated.
payload : SPQR.Chunked.Payload Sym
The typed payload.
-
inductivedefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
inductive SPQR.Chunked.PartyState.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
inductive SPQR.Chunked.PartyState.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
The eleven states of Rust `States` (`states.rs:16-29`), combining an unchunked core with the stream states stored by Rust.
Constructors
SPQR.Chunked.PartyState.keysUnsampled.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.EkSender.KeysUnsampled AuthState) : SPQR.Chunked.PartyState P AuthState
Before sampling an encapsulation key (`states.rs:17`).
SPQR.Chunked.PartyState.keysSampled.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.EkSender.HeaderSent P.inc AuthState) (sendingHdr : ErasureCodePayload.Streaming.EncoderState (P.inc.PKheader × P.Mac) P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending the authenticated header stream (`states.rs:18`).
SPQR.Chunked.PartyState.headerSent.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.EkSender.EkSent P.inc AuthState) (sendingEk : ErasureCodePayload.Streaming.EncoderState P.inc.PKvector P.Sym) (receivingCt1 : ErasureCodePayload.Streaming.DecoderState P.inc.C₁ P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending the vector and receiving the first ciphertext component (`states.rs:19-20`).
SPQR.Chunked.PartyState.ct1Received.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.EkSender.EkSentCt1Received P.inc AuthState) (sendingEk : ErasureCodePayload.Streaming.EncoderState P.inc.PKvector P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending vector chunks that acknowledge complete first-ciphertext receipt (`states.rs:21`).
SPQR.Chunked.PartyState.ekSentCt1Received.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.EkSender.EkSentCt1Received P.inc AuthState) (receivingCt2 : ErasureCodePayload.Streaming.DecoderState (P.inc.C₂ × P.Mac) P.Sym) : SPQR.Chunked.PartyState P AuthState
Receiving the second ciphertext component (`states.rs:22`).
SPQR.Chunked.PartyState.noHeaderReceived.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.NoHeaderReceived AuthState) (receivingHdr : ErasureCodePayload.Streaming.DecoderState (P.inc.PKheader × P.Mac) P.Sym) : SPQR.Chunked.PartyState P AuthState
Receiving the authenticated header stream (`states.rs:23`).
SPQR.Chunked.PartyState.headerReceived.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.HeaderReceived P.inc AuthState) (receivingEk : ErasureCodePayload.Streaming.DecoderState P.inc.PKvector P.Sym) : SPQR.Chunked.PartyState P AuthState
Receiving the encapsulation-key vector after authenticating the header (`states.rs:24`).
SPQR.Chunked.PartyState.ct1Sampled.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.Ct1Sent P.inc AuthState) (sendingCt1 : ErasureCodePayload.Streaming.EncoderState P.inc.C₁ P.Sym) (receivingEk : ErasureCodePayload.Streaming.DecoderState P.inc.PKvector P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending the first ciphertext component while receiving the vector (`states.rs:25`).
SPQR.Chunked.PartyState.ekReceivedCt1Sampled.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.Ct1SentEkReceived P.inc AuthState) (sendingCt1 : ErasureCodePayload.Streaming.EncoderState P.inc.C₁ P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending the first ciphertext after validating the vector (`states.rs:26`).
SPQR.Chunked.PartyState.ct1Acknowledged.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.Ct1Sent P.inc AuthState) (receivingEk : ErasureCodePayload.Streaming.DecoderState P.inc.PKvector P.Sym) : SPQR.Chunked.PartyState P AuthState
Receiving the vector after the first ciphertext is acknowledged (`states.rs:27`).
SPQR.Chunked.PartyState.ct2Sampled.{u} {m : Type → Type u} [Monad m] {P : MLKEMBraid.Parameters m} {AuthState : Type} (core : SPQR.CtSender.Ct2Sent AuthState) (sendingCt2 : ErasureCodePayload.Streaming.EncoderState (P.inc.C₂ × P.Mac) P.Sym) : SPQR.Chunked.PartyState P AuthState
Sending the second ciphertext component (`states.rs:28`).
-
inductivedefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
inductive SPQR.Chunked.Error : Type
inductive SPQR.Chunked.Error : Type
The three Rust public errors reachable from `States::recv` (`lib.rs:96-122`).
Constructors
SPQR.Chunked.Error.epochOutOfRange (epoch : ℕ) : SPQR.Chunked.Error
The message epoch is ahead of the state.
SPQR.Chunked.Error.macVerifyFailed : SPQR.Chunked.Error
A header or ciphertext tag was rejected, or deterministic decapsulation refused the ciphertext; ML-KEM never refuses.
SPQR.Chunked.Error.erroneousDataReceived : SPQR.Chunked.Error
The received vector failed validation.
-
structuredefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
structure SPQR.Chunked.SendResult.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
structure SPQR.Chunked.SendResult.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
Rust `Send` (`states.rs:46`) with the SCKA send report.
Fields
msg : SPQR.Chunked.Message P.Sym
The message sent.
sendingEpoch : ℕ
The latest epoch the receiver is guaranteed to know on receipt of `msg`: the entry epoch minus one (`lib.rs:298`).
outputKey : Option (ℕ × P.EpochKey)
The epoch key derived by this send, if any.
state : SPQR.Chunked.PartyState P AuthState
The state after the send.
-
structuredefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
structure SPQR.Chunked.RecvResult.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
structure SPQR.Chunked.RecvResult.{u} {m : Type → Type u} [Monad m] (P : MLKEMBraid.Parameters m) (AuthState : Type) : Type
Rust `Recv` (`states.rs:52`) with the SCKA receive report.
Fields
receivingEpoch : ℕ
The incoming message epoch minus one.
outputKey : Option (ℕ × P.EpochKey)
The epoch key derived by this receive, if any.
state : SPQR.Chunked.PartyState P AuthState
The state after the receive.
-
defdefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
def SPQR.Chunked.completeCt2.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (core : SPQR.CtSender.Ct1SentEkReceived P.inc AuthState) : SPQR.Chunked.PartyState P AuthState
def SPQR.Chunked.completeCt2.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (core : SPQR.CtSender.Ct1SentEkReceived P.inc AuthState) : SPQR.Chunked.PartyState P AuthState
Complete stage two at the receive site: `send_ct2` (`unchunked/send_ct.rs:177-195`) and the encoder at the three completion sites (`chunked/send_ct.rs:177-184`, `:233-239`, `:266-272`).
-
SPQR.Chunked.initA[complete] -
SPQR.Chunked.initB[complete] -
SPQR.Chunked.send[complete] -
SPQR.sendRleak[complete] -
SPQR.Chunked.recv[complete] -
SPQR.recvSCKA[complete] -
SPQR.scheme[complete]
initial encapsulation-key sender
def initA (P : MLKEMBraid.Parameters m)
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(ik : InitKey) : PartyState P AuthState := .keysUnsampled ⟨1, auth.init ik 1⟩initial ciphertext sender
def initB (P : MLKEMBraid.Parameters m)
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(ik : InitKey) : PartyState P AuthState :=
.noHeaderReceived ⟨1, auth.init ik 1⟩ (DecoderState.empty P.ecpHdr)send transition
def send (P : MLKEMBraid.Parameters m)
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(st : PartyState P AuthState) : m (SendResult P AuthState) := match st with
| .keysUnsampled core => do
-- states.rs:120-136
let (core', hdr, tag) ← EkSender.sendHeader P.inc auth core
let (chunk, enc) := (EncoderState.init P.ecpHdr (hdr, tag)).nextChunk
pure ⟨⟨core.ep, .hdr chunk⟩, core.ep - 1, none, .keysSampled core' enc⟩
| .keysSampled core enc =>
-- states.rs:138-148
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .hdr chunk⟩, core.ep - 1, none, .keysSampled core enc'⟩
| .headerSent core enc dec =>
-- states.rs:150-160
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .ek chunk⟩, core.ep - 1, none, .headerSent core enc' dec⟩
| .ct1Received core enc =>
-- states.rs:162-173
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .ekCt1Ack chunk⟩, core.ep - 1, none, .ct1Received core enc'⟩
| .ekSentCt1Received core dec =>
-- states.rs:175-189
pure ⟨⟨core.ep, .ct1Ack⟩, core.ep - 1, none, .ekSentCt1Received core dec⟩
| .noHeaderReceived core dec =>
-- states.rs:191-201
pure ⟨⟨core.ep, .none⟩, core.ep - 1, none, .noHeaderReceived core dec⟩
| .headerReceived core dec => do
-- states.rs:203-219
let (core', c1, key) ← CtSender.sendCt1 P.inc auth P.kdfOK core
let (chunk, enc) := (EncoderState.init P.ecpCt1 c1).nextChunk
pure ⟨⟨core.ep, .ct1 chunk⟩, core.ep - 1, some key, .ct1Sampled core' enc dec⟩
| .ct1Sampled core enc dec =>
-- states.rs:221-232
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .ct1 chunk⟩, core.ep - 1, none, .ct1Sampled core enc' dec⟩
| .ekReceivedCt1Sampled core enc =>
-- states.rs:234-245
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .ct1 chunk⟩, core.ep - 1, none, .ekReceivedCt1Sampled core enc'⟩
| .ct1Acknowledged core dec =>
-- states.rs:247-257
pure ⟨⟨core.ep, .none⟩, core.ep - 1, none, .ct1Acknowledged core dec⟩
| .ct2Sampled core enc =>
-- states.rs:259-271
let (chunk, enc') := enc.nextChunk
pure ⟨⟨core.ep, .ct2 chunk⟩, core.ep - 1, none, .ct2Sampled core enc'⟩send with disclosed randomness
def sendRleak (P : MLKEMBraid.Parameters m) (irl : P.kem.IncrementalRandLeak P.inc)
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(st : PartyState P AuthState) :
m (SendResult P AuthState × SendRand irl.KeygenRand irl.Encaps1Rand) := match st with
| .keysUnsampled core => do
let ((pk, sk), r) ← irl.keygenRleak
let hdr := P.inc.toHeader pk
let tag := auth.macHeader core.authSt core.ep hdr
let core' : EkSender.HeaderSent P.inc AuthState :=
⟨core.ep, core.authSt, pk, sk⟩
let (chunk, enc) := (EncoderState.init P.ecpHdr (hdr, tag)).nextChunk
pure (⟨⟨core.ep, .hdr chunk⟩, core.ep - 1, none, .keysSampled core' enc⟩, .keygen r)
| .headerReceived core dec => do
let ((encapsSt, c1, k), r) ← irl.encaps1Rleak core.hdr
let ik := P.kdfOK k core.ep
let core' : CtSender.Ct1Sent P.inc AuthState :=
⟨core.ep, auth.update core.authSt core.ep ik, core.hdr, encapsSt, c1⟩
let (chunk, enc) := (EncoderState.init P.ecpCt1 c1).nextChunk
pure (⟨⟨core.ep, .ct1 chunk⟩, core.ep - 1, some (core.ep, ik),
.ct1Sampled core' enc dec⟩, .encaps1 r)
| _ => (fun r => (r, .none)) <$> send P auth streceive transition
def recv (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym]
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(st : PartyState P AuthState) (msg : Message P.Sym) :
Except Error (RecvResult P AuthState) :=
let ignore : Except Error (RecvResult P AuthState) :=
.ok ⟨msg.epoch - 1, none, st⟩
if msg.epoch < st.epoch then
-- states.rs:282-531, stale rows
ignore
else if st.epoch < msg.epoch then
match st with
| .ct2Sampled core _ =>
-- states.rs:522-531, successor epoch with any payload
match CtSender.recvNextEpoch core msg.epoch with
| some next => .ok ⟨msg.epoch - 1, none, .keysUnsampled next⟩
| none => .error (.epochOutOfRange msg.epoch)
| _ =>
-- states.rs:284-481, future epoch
.error (.epochOutOfRange msg.epoch)
else
match st, msg.payload with
| .keysUnsampled _, _ =>
-- states.rs:282-287, cell 1
ignore
| .keysSampled core _, .ct1 chunk =>
-- states.rs:289-305, cell 2
let (core', vec) := EkSender.sendVector P.inc core
.ok ⟨msg.epoch - 1, none,
.headerSent core' (EncoderState.init P.ecpEk vec)
((DecoderState.empty P.ecpCt1).addChunk chunk)⟩
| .headerSent core enc dec, .ct1 chunk =>
-- states.rs:307-330, cell 3
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some c1 => .ok ⟨msg.epoch - 1, none, .ct1Received (EkSender.recvCt1 P.inc core c1) enc⟩
| none => .ok ⟨msg.epoch - 1, none, .headerSent core enc dec'⟩
| .ct1Received core _, .ct2 chunk =>
-- states.rs:332-348, cell 4
.ok ⟨msg.epoch - 1, none,
.ekSentCt1Received core ((DecoderState.empty P.ecpCt2).addChunk chunk)⟩
| .ekSentCt1Received core dec, .ct2 chunk =>
-- states.rs:350-380, cell 5
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some (c2, tag) =>
match EkSender.recvCt2 P.inc auth P.kdfOK P.hDet core c2 tag with
| some (next, key) =>
.ok ⟨msg.epoch - 1, some key,
.noHeaderReceived next (DecoderState.empty P.ecpHdr)⟩
| none => .error .macVerifyFailed
| none => .ok ⟨msg.epoch - 1, none, .ekSentCt1Received core dec'⟩
| .noHeaderReceived core dec, .hdr chunk =>
-- states.rs:380-405, cell 6
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some (hdr, tag) =>
match CtSender.recvHeader P.inc auth core hdr tag with
| some core' =>
.ok ⟨msg.epoch - 1, none,
.headerReceived core' (DecoderState.empty P.ecpEk)⟩
| none => .error .macVerifyFailed
| none => .ok ⟨msg.epoch - 1, none, .noHeaderReceived core dec'⟩
| .headerReceived _ _, _ =>
-- states.rs:405-412, cell 7
ignore
| .ct1Sampled core enc dec, .ek chunk =>
-- states.rs:412-458, cell 8
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some vec =>
match CtSender.recvVector P.inc core vec with
| some core' => .ok ⟨msg.epoch - 1, none, .ekReceivedCt1Sampled core' enc⟩
| none => .error .erroneousDataReceived
| none => .ok ⟨msg.epoch - 1, none, .ct1Sampled core enc dec'⟩
| .ct1Sampled core _ dec, .ekCt1Ack chunk =>
-- states.rs:412-458, cell 9
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some vec =>
match CtSender.recvVector P.inc core vec with
| some core' => .ok ⟨msg.epoch - 1, none, completeCt2 P auth core'⟩
| none => .error .erroneousDataReceived
| none => .ok ⟨msg.epoch - 1, none, .ct1Acknowledged core dec'⟩
| .ct1Sampled _ _ _, .ct1Ack =>
-- states.rs:421, cell 10
ignore
| .ekReceivedCt1Sampled core _, .ct1Ack =>
-- states.rs:460-478 and states.rs:466-473, cell 11
.ok ⟨msg.epoch - 1, none, completeCt2 P auth core⟩
| .ekReceivedCt1Sampled core _, .ekCt1Ack _ =>
-- states.rs:460-478, cell 12
.ok ⟨msg.epoch - 1, none, completeCt2 P auth core⟩
| .ekReceivedCt1Sampled _ _, .ek _ =>
-- states.rs:460-478, cell 13
ignore
| .ct1Acknowledged core dec, .ek chunk =>
-- states.rs:479-520 and states.rs:487, cell 14
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some vec =>
match CtSender.recvVector P.inc core vec with
| some core' => .ok ⟨msg.epoch - 1, none, completeCt2 P auth core'⟩
| none => .error .erroneousDataReceived
| none => .ok ⟨msg.epoch - 1, none, .ct1Acknowledged core dec'⟩
| .ct1Acknowledged core dec, .ekCt1Ack chunk =>
-- states.rs:479-520, cell 15
let dec' := dec.addChunk chunk
match dec'.decodedPayload with
| some vec =>
match CtSender.recvVector P.inc core vec with
| some core' => .ok ⟨msg.epoch - 1, none, completeCt2 P auth core'⟩
| none => .error .erroneousDataReceived
| none => .ok ⟨msg.epoch - 1, none, .ct1Acknowledged core dec'⟩
| .ct2Sampled _ _, _ =>
-- states.rs:522-531, cell 16
ignore
| _, _ =>
-- states.rs:275-533, cell 17
ignorereceive adapted to SCKA: an error refuses the delivery
def recvSCKA (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym]
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(st : PartyState P AuthState) (msg : Message P.Sym) :
Option (Option (ℕ × P.EpochKey) × ℕ × PartyState P AuthState) := match recv P auth st msg with
| .error _ => none
| .ok r => some (r.outputKey, r.receivingEpoch, r.state)the SCKA scheme
def scheme (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym]
(auth : RatchetedAuthenticator InitKey P.EpochKey AuthState
P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac)
(irl : P.kem.IncrementalRandLeak P.inc) (sampleInitKey : m InitKey) :
SCKAScheme m InitKey (PartyState P AuthState) (PartyState P AuthState)
P.EpochKey (Message P.Sym) (SendRand irl.KeygenRand irl.Encaps1Rand) :=
let sendSCKA (st : PartyState P AuthState) := do
let r ← send P auth st
pure (some (r.outputKey, r.msg, r.sendingEpoch, r.state))
let sendRleakSCKA (st : PartyState P AuthState) := do
let (r, rand) ← sendRleak P irl auth st
pure (some (r.outputKey, r.msg, r.sendingEpoch, r.state, rand))
{ initKeyGen := sampleInitKey
initA := fun ik => pure (initA P auth ik)
initB := fun ik => pure (initB P auth ik)
sendA := sendSCKA
sendArleak := sendRleakSCKA
recvA := recvSCKA P auth
sendB := sendSCKA
sendBrleak := sendRleakSCKA
recvB := recvSCKA P auth }Lean code for Definition9.6.4●7 definitions
Associated Lean declarations
-
SPQR.Chunked.initA[complete]
-
SPQR.Chunked.initB[complete]
-
SPQR.Chunked.send[complete]
-
SPQR.sendRleak[complete]
-
SPQR.Chunked.recv[complete]
-
SPQR.recvSCKA[complete]
-
SPQR.scheme[complete]
-
SPQR.Chunked.initA[complete] -
SPQR.Chunked.initB[complete] -
SPQR.Chunked.send[complete] -
SPQR.sendRleak[complete] -
SPQR.Chunked.recv[complete] -
SPQR.recvSCKA[complete] -
SPQR.scheme[complete]
-
defdefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
def SPQR.Chunked.initA.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (ik : InitKey) : SPQR.Chunked.PartyState P AuthState
def SPQR.Chunked.initA.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (ik : InitKey) : SPQR.Chunked.PartyState P AuthState
Direction A2B starts at epoch one (`lib.rs:200-203`, `unchunked/send_ek.rs:76-79`).
-
defdefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
def SPQR.Chunked.initB.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (ik : InitKey) : SPQR.Chunked.PartyState P AuthState
def SPQR.Chunked.initB.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (ik : InitKey) : SPQR.Chunked.PartyState P AuthState
Direction B2A starts at epoch one with an empty header decoder.
-
defdefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
def SPQR.Chunked.send.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) : m (SPQR.Chunked.SendResult P AuthState)
def SPQR.Chunked.send.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) : m (SPQR.Chunked.SendResult P AuthState)
Rust `States::send` (`states.rs:115-273`), one arm per state. The `ekSentCt1Received` arm sends `Ct1Ack(true)`.
-
defdefined in SecureMessaging/SCKA/SPQR/Construction.leancomplete
def SPQR.sendRleak.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (irl : P.kem.IncrementalRandLeak P.inc) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) : m (SPQR.Chunked.SendResult P AuthState × MLKEMBraid.SendRand irl.KeygenRand irl.Encaps1Rand)
def SPQR.sendRleak.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) (irl : P.kem.IncrementalRandLeak P.inc) (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) : m (SPQR.Chunked.SendResult P AuthState × MLKEMBraid.SendRand irl.KeygenRand irl.Encaps1Rand)
`Chunked.send` paired with the disclosed randomness.
-
defdefined in SecureMessaging/SCKA/SPQR/Chunked.leancomplete
def SPQR.Chunked.recv.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) (msg : SPQR.Chunked.Message P.Sym) : Except SPQR.Chunked.Error (SPQR.Chunked.RecvResult P AuthState)
def SPQR.Chunked.recv.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) (msg : SPQR.Chunked.Message P.Sym) : Except SPQR.Chunked.Error (SPQR.Chunked.RecvResult P AuthState)
Rust `States::recv` (`states.rs:275-533`). Stale epochs are ignored, and future epochs are errors except for the `ct2Sampled` successor transition. At an equal epoch, a standalone `ct1Ack` can complete stage two, and `ct1Acknowledged` accepts plain `ek` chunks.
-
defdefined in SecureMessaging/SCKA/SPQR/Construction.leancomplete
def SPQR.recvSCKA.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) (msg : SPQR.Chunked.Message P.Sym) : Option (Option (ℕ × P.EpochKey) × ℕ × SPQR.Chunked.PartyState P AuthState)
def SPQR.recvSCKA.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (st : SPQR.Chunked.PartyState P AuthState) (msg : SPQR.Chunked.Message P.Sym) : Option (Option (ℕ × P.EpochKey) × ℕ × SPQR.Chunked.PartyState P AuthState)
Adapt `Chunked.recv` to SCKA; an error refuses delivery and a success forwards its report.
-
defdefined in SecureMessaging/SCKA/SPQR/Construction.leancomplete
def SPQR.scheme.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (irl : P.kem.IncrementalRandLeak P.inc) (sampleInitKey : m InitKey) : SCKAScheme m InitKey (SPQR.Chunked.PartyState P AuthState) (SPQR.Chunked.PartyState P AuthState) P.EpochKey (SPQR.Chunked.Message P.Sym) (MLKEMBraid.SendRand irl.KeygenRand irl.Encaps1Rand)
def SPQR.scheme.{u} {m : Type → Type u} [Monad m] {InitKey AuthState : Type} (P : MLKEMBraid.Parameters m) [DecidableEq P.Sym] (auth : RatchetedAuthenticator InitKey P.EpochKey AuthState P.inc.PKheader (P.inc.C₁ × P.inc.C₂) P.Mac) (irl : P.kem.IncrementalRandLeak P.inc) (sampleInitKey : m InitKey) : SCKAScheme m InitKey (SPQR.Chunked.PartyState P AuthState) (SPQR.Chunked.PartyState P AuthState) P.EpochKey (SPQR.Chunked.Message P.Sym) (MLKEMBraid.SendRand irl.KeygenRand irl.Encaps1Rand)
SPQR as an `SCKAScheme`; both parties use the same algorithms and distinct initial states.
-
SPQR.v1Incremental[complete] -
SPQR.v1ErasureCodePayload[complete] -
SPQR.v1Parameters[complete] -
SPQR.v1Scheme[complete]
\todo
incremental ML-KEM-768
abbrev v1Incremental : MLKEM.mlkem768Scheme.IncrementalStructure :=
MLKEM.mlkemIncremental .MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768PrimitivesSPQR Reed-Solomon payload code
noncomputable def v1ErasureCodePayload {M : Type} (k : ℕ) (hk : k ≤ 2 ^ 16) (hk_pos : 0 < k)
(serialize : M → Fin k → Chunk GF16) (parse : (Fin k → Chunk GF16) → Option M)
(parse_serialize : ∀ payload, parse (serialize payload) = some payload) :
ErasureCodePayload M (Chunk GF16) :=
{ ec := erasureCode k hk hk_pos, serialize, parse, parse_serialize }SPQR v1 parameters
noncomputable def v1Parameters {EpochKey Mac : Type}
(kdfOK : MLKEM.SharedSecret → ℕ → EpochKey)
(serializeHdr : v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16)
(parseHdr : (Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac))
(parseHdr_serializeHdr : ∀ payload, parseHdr (serializeHdr payload) = some payload)
(serializeEk : v1Incremental.PKvector → Fin 36 → Chunk GF16)
(parseEk : (Fin 36 → Chunk GF16) → Option v1Incremental.PKvector)
(parseEk_serializeEk : ∀ payload, parseEk (serializeEk payload) = some payload)
(serializeCt1 : v1Incremental.C₁ → Fin 30 → Chunk GF16)
(parseCt1 : (Fin 30 → Chunk GF16) → Option v1Incremental.C₁)
(parseCt1_serializeCt1 : ∀ payload, parseCt1 (serializeCt1 payload) = some payload)
(serializeCt2 : v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16)
(parseCt2 : (Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac))
(parseCt2_serializeCt2 : ∀ payload, parseCt2 (serializeCt2 payload) = some payload) :
MLKEMBraid.Parameters ProbComp :=
MLKEMBraid.mlkemBraidParameters .MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768Primitives kdfOK
(v1ErasureCodePayload 3 (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 3 ≤ 2 ^ 16 All goals completed! 🐙) (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 0 < 3 All goals completed! 🐙) serializeHdr parseHdr
parseHdr_serializeHdr)
(v1ErasureCodePayload 36 (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 36 ≤ 2 ^ 16 All goals completed! 🐙) (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 0 < 36 All goals completed! 🐙) serializeEk parseEk
parseEk_serializeEk)
(v1ErasureCodePayload 30 (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 30 ≤ 2 ^ 16 All goals completed! 🐙) (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 0 < 30 All goals completed! 🐙) serializeCt1 parseCt1
parseCt1_serializeCt1)
(v1ErasureCodePayload 5 (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 5 ≤ 2 ^ 16 All goals completed! 🐙) (EpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload⊢ 0 < 5 All goals completed! 🐙) serializeCt2 parseCt2
parseCt2_serializeCt2)SPQR v1 SCKA scheme
noncomputable def v1Scheme {InitKey AuthState EpochKey Mac : Type}
(kdfOK : MLKEM.SharedSecret → ℕ → EpochKey)
(serializeHdr : v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16)
(parseHdr : (Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac))
(parseHdr_serializeHdr : ∀ payload, parseHdr (serializeHdr payload) = some payload)
(serializeEk : v1Incremental.PKvector → Fin 36 → Chunk GF16)
(parseEk : (Fin 36 → Chunk GF16) → Option v1Incremental.PKvector)
(parseEk_serializeEk : ∀ payload, parseEk (serializeEk payload) = some payload)
(serializeCt1 : v1Incremental.C₁ → Fin 30 → Chunk GF16)
(parseCt1 : (Fin 30 → Chunk GF16) → Option v1Incremental.C₁)
(parseCt1_serializeCt1 : ∀ payload, parseCt1 (serializeCt1 payload) = some payload)
(serializeCt2 : v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16)
(parseCt2 : (Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac))
(parseCt2_serializeCt2 : ∀ payload, parseCt2 (serializeCt2 payload) = some payload)
(auth : RatchetedAuthenticator InitKey EpochKey AuthState
v1Incremental.PKheader (v1Incremental.C₁ × v1Incremental.C₂) Mac)
(sampleInitKey : ProbComp InitKey) :
SCKAScheme ProbComp InitKey
(Chunked.PartyState (v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr
serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1
serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState)
(Chunked.PartyState (v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr
serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1
serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState)
EpochKey (Chunked.Message (Chunk GF16))
(SendRand (MLKEM.mlkemIncrementalRandLeak .MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768Primitives).KeygenRand
(MLKEM.mlkemIncrementalRandLeak .MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768Primitives).Encaps1Rand) := InitKey:TypeAuthState:TypeEpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payloadauth:RatchetedAuthenticator InitKey EpochKey AuthState v1Incremental.PKheader (v1Incremental.C₁ × v1Incremental.C₂) MacsampleInitKey:ProbComp InitKey⊢ SCKAScheme ProbComp InitKey
(Chunked.PartyState
(v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1
parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2)
AuthState)
(Chunked.PartyState
(v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1
parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2)
AuthState)
EpochKey (Chunked.Message (Chunk GF16))
(SendRand
(MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768Primitives).KeygenRand
(MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps
MLKEM.Concrete.mlkem768Primitives).Encaps1Rand)
letI : DecidableEq (v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr
serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1
serializeCt2 parseCt2 parseCt2_serializeCt2).Sym := InitKey:TypeAuthState:TypeEpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payloadauth:RatchetedAuthenticator InitKey EpochKey AuthState v1Incremental.PKheader (v1Incremental.C₁ × v1Incremental.C₂) MacsampleInitKey:ProbComp InitKey⊢ DecidableEq
(v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1
parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2).Sym
InitKey:TypeAuthState:TypeEpochKey:TypeMac:TypekdfOK:MLKEM.SharedSecret → ℕ → EpochKeyserializeHdr:v1Incremental.PKheader × Mac → Fin 3 → Chunk GF16parseHdr:(Fin 3 → Chunk GF16) → Option (v1Incremental.PKheader × Mac)parseHdr_serializeHdr:∀ (payload : v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payloadserializeEk:v1Incremental.PKvector → Fin 36 → Chunk GF16parseEk:(Fin 36 → Chunk GF16) → Option v1Incremental.PKvectorparseEk_serializeEk:∀ (payload : v1Incremental.PKvector), parseEk (serializeEk payload) = some payloadserializeCt1:v1Incremental.C₁ → Fin 30 → Chunk GF16parseCt1:(Fin 30 → Chunk GF16) → Option v1Incremental.C₁parseCt1_serializeCt1:∀ (payload : v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payloadserializeCt2:v1Incremental.C₂ × Mac → Fin 5 → Chunk GF16parseCt2:(Fin 5 → Chunk GF16) → Option (v1Incremental.C₂ × Mac)parseCt2_serializeCt2:∀ (payload : v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payloadauth:RatchetedAuthenticator InitKey EpochKey AuthState v1Incremental.PKheader (v1Incremental.C₁ × v1Incremental.C₂) MacsampleInitKey:ProbComp InitKey⊢ DecidableEq (Chunk GF16)
All goals completed! 🐙
All goals completed! 🐙Lean code for Definition9.6.5●4 definitions
Associated Lean declarations
-
SPQR.v1Incremental[complete]
-
SPQR.v1ErasureCodePayload[complete]
-
SPQR.v1Parameters[complete]
-
SPQR.v1Scheme[complete]
-
SPQR.v1Incremental[complete] -
SPQR.v1ErasureCodePayload[complete] -
SPQR.v1Parameters[complete] -
SPQR.v1Scheme[complete]
-
abbrevdefined in SecureMessaging/SCKA/SPQR/Instances.leancomplete
abbrev SPQR.v1Incremental : MLKEM.mlkem768Scheme.IncrementalStructure
abbrev SPQR.v1Incremental : MLKEM.mlkem768Scheme.IncrementalStructure
Incremental ML-KEM-768 over the witnesses of `MLKEM.mlkem768Scheme`.
-
defdefined in SecureMessaging/SCKA/SPQR/Instances.leancomplete
def SPQR.v1ErasureCodePayload {M : Type} (k : ℕ) (hk : k ≤ 2 ^ 16) (hk_pos : 0 < k) (serialize : M → Fin k → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parse : (Fin k → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option M) (parse_serialize : ∀ (payload : M), parse (serialize payload) = some payload) : ErasureCodePayload M (ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16)
def SPQR.v1ErasureCodePayload {M : Type} (k : ℕ) (hk : k ≤ 2 ^ 16) (hk_pos : 0 < k) (serialize : M → Fin k → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parse : (Fin k → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option M) (parse_serialize : ∀ (payload : M), parse (serialize payload) = some payload) : ErasureCodePayload M (ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16)
The SPQR erasure code at threshold `k` with a caller-supplied payload layout.
-
defdefined in SecureMessaging/SCKA/SPQR/Instances.leancomplete
def SPQR.v1Parameters {EpochKey Mac : Type} (kdfOK : MLKEM.SharedSecret → ℕ → EpochKey) (serializeHdr : SPQR.v1Incremental.PKheader × Mac → Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseHdr : (Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.PKheader × Mac)) (parseHdr_serializeHdr : ∀ (payload : SPQR.v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payload) (serializeEk : SPQR.v1Incremental.PKvector → Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseEk : (Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.PKvector) (parseEk_serializeEk : ∀ (payload : SPQR.v1Incremental.PKvector), parseEk (serializeEk payload) = some payload) (serializeCt1 : SPQR.v1Incremental.C₁ → Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt1 : (Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.C₁) (parseCt1_serializeCt1 : ∀ (payload : SPQR.v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payload) (serializeCt2 : SPQR.v1Incremental.C₂ × Mac → Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt2 : (Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.C₂ × Mac)) (parseCt2_serializeCt2 : ∀ (payload : SPQR.v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload) : MLKEMBraid.Parameters ProbComp
def SPQR.v1Parameters {EpochKey Mac : Type} (kdfOK : MLKEM.SharedSecret → ℕ → EpochKey) (serializeHdr : SPQR.v1Incremental.PKheader × Mac → Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseHdr : (Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.PKheader × Mac)) (parseHdr_serializeHdr : ∀ (payload : SPQR.v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payload) (serializeEk : SPQR.v1Incremental.PKvector → Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseEk : (Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.PKvector) (parseEk_serializeEk : ∀ (payload : SPQR.v1Incremental.PKvector), parseEk (serializeEk payload) = some payload) (serializeCt1 : SPQR.v1Incremental.C₁ → Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt1 : (Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.C₁) (parseCt1_serializeCt1 : ∀ (payload : SPQR.v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payload) (serializeCt2 : SPQR.v1Incremental.C₂ × Mac → Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt2 : (Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.C₂ × Mac)) (parseCt2_serializeCt2 : ∀ (payload : SPQR.v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload) : MLKEMBraid.Parameters ProbComp
SPQR v1 parameters at ML-KEM-768 with thresholds 3, 36, 30, and 5.
-
defdefined in SecureMessaging/SCKA/SPQR/Instances.leancomplete
def SPQR.v1Scheme {InitKey AuthState EpochKey Mac : Type} (kdfOK : MLKEM.SharedSecret → ℕ → EpochKey) (serializeHdr : SPQR.v1Incremental.PKheader × Mac → Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseHdr : (Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.PKheader × Mac)) (parseHdr_serializeHdr : ∀ (payload : SPQR.v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payload) (serializeEk : SPQR.v1Incremental.PKvector → Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseEk : (Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.PKvector) (parseEk_serializeEk : ∀ (payload : SPQR.v1Incremental.PKvector), parseEk (serializeEk payload) = some payload) (serializeCt1 : SPQR.v1Incremental.C₁ → Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt1 : (Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.C₁) (parseCt1_serializeCt1 : ∀ (payload : SPQR.v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payload) (serializeCt2 : SPQR.v1Incremental.C₂ × Mac → Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt2 : (Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.C₂ × Mac)) (parseCt2_serializeCt2 : ∀ (payload : SPQR.v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload) (auth : RatchetedAuthenticator InitKey EpochKey AuthState SPQR.v1Incremental.PKheader (SPQR.v1Incremental.C₁ × SPQR.v1Incremental.C₂) Mac) (sampleInitKey : ProbComp InitKey) : SCKAScheme ProbComp InitKey (SPQR.Chunked.PartyState (SPQR.v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState) (SPQR.Chunked.PartyState (SPQR.v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState) EpochKey (SPQR.Chunked.Message (ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16)) (MLKEMBraid.SendRand (MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps MLKEM.Concrete.mlkem768Primitives).KeygenRand (MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps MLKEM.Concrete.mlkem768Primitives).Encaps1Rand)
def SPQR.v1Scheme {InitKey AuthState EpochKey Mac : Type} (kdfOK : MLKEM.SharedSecret → ℕ → EpochKey) (serializeHdr : SPQR.v1Incremental.PKheader × Mac → Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseHdr : (Fin 3 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.PKheader × Mac)) (parseHdr_serializeHdr : ∀ (payload : SPQR.v1Incremental.PKheader × Mac), parseHdr (serializeHdr payload) = some payload) (serializeEk : SPQR.v1Incremental.PKvector → Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseEk : (Fin 36 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.PKvector) (parseEk_serializeEk : ∀ (payload : SPQR.v1Incremental.PKvector), parseEk (serializeEk payload) = some payload) (serializeCt1 : SPQR.v1Incremental.C₁ → Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt1 : (Fin 30 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option SPQR.v1Incremental.C₁) (parseCt1_serializeCt1 : ∀ (payload : SPQR.v1Incremental.C₁), parseCt1 (serializeCt1 payload) = some payload) (serializeCt2 : SPQR.v1Incremental.C₂ × Mac → Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) (parseCt2 : (Fin 5 → ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16) → Option (SPQR.v1Incremental.C₂ × Mac)) (parseCt2_serializeCt2 : ∀ (payload : SPQR.v1Incremental.C₂ × Mac), parseCt2 (serializeCt2 payload) = some payload) (auth : RatchetedAuthenticator InitKey EpochKey AuthState SPQR.v1Incremental.PKheader (SPQR.v1Incremental.C₁ × SPQR.v1Incremental.C₂) Mac) (sampleInitKey : ProbComp InitKey) : SCKAScheme ProbComp InitKey (SPQR.Chunked.PartyState (SPQR.v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState) (SPQR.Chunked.PartyState (SPQR.v1Parameters kdfOK serializeHdr parseHdr parseHdr_serializeHdr serializeEk parseEk parseEk_serializeEk serializeCt1 parseCt1 parseCt1_serializeCt1 serializeCt2 parseCt2 parseCt2_serializeCt2) AuthState) EpochKey (SPQR.Chunked.Message (ErasureCode.SPQRReedSolomon.Chunk ErasureCode.SPQRReedSolomon.GF16)) (MLKEMBraid.SendRand (MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps MLKEM.Concrete.mlkem768Primitives).KeygenRand (MLKEM.mlkemIncrementalRandLeak MLKEM.ParameterSet.MLKEM768 MLKEM.Concrete.concreteNTTRingOps MLKEM.Concrete.mlkem768Primitives).Encaps1Rand)
The SPQR v1 SCKA scheme; the authenticator and initial-key sampler remain parameters.
\todo
\todo
References:
-
Signal (2025)