Secure Messaging

9.6. SPQR🔗

Definition9.6.1
groupuses 1
Used by 2
Reverse dependency previews
Preview
Definition 9.6.3
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

\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 none
Lean code for Definition9.6.1●8 definitions
  • structure(2 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    structure SPQR.EkSender.KeysUnsampled (AuthState : Type) : Type
    structure SPQR.EkSender.KeysUnsampled
      (AuthState : Type) : Type
    State before sampling an encapsulation key. 
    ep : ℕ
    The epoch in progress. 
    authSt : AuthState
    Authenticator state entering the epoch. 
  • structure(4 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    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. 
  • structure(3 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    ep : ℕ
    The epoch in progress. 
    authSt : AuthState
    Authenticator state entering the epoch. 
    sk : SK
    The decapsulation key held for this epoch. 
  • structure(4 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    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. 
  • 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. 
  • 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. 
  • 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. 
  • 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. 
Definition9.6.2
groupuses 1
Used by 2
Reverse dependency previews
Preview
Definition 9.6.3
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

\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 none

send 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 none

send 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 none
Lean code for Definition9.6.2●10 definitions
  • structure(2 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    structure SPQR.CtSender.NoHeaderReceived (AuthState : Type) : Type
    structure SPQR.CtSender.NoHeaderReceived
      (AuthState : Type) : Type
    State before receiving an encapsulation-key header. 
    ep : ℕ
    The epoch in progress. 
    authSt : AuthState
    Authenticator state entering the epoch. 
  • structure(3 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    ep : ℕ
    The epoch in progress. 
    authSt : AuthState
    Authenticator state entering the epoch. 
    hdr : inc.PKheader
    Stored encapsulation-key header. 
  • structure(5 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    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. 
  • structure(6 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    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. 
    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. 
  • structure(2 fields)defined in SecureMessaging/SCKA/SPQR/Unchunked.lean
    complete
    structure SPQR.CtSender.Ct2Sent (AuthState : Type) : Type
    structure SPQR.CtSender.Ct2Sent (AuthState : Type) :
      Type
    State after sending the second ciphertext component and its tag. 
    ep : ℕ
    The epoch in progress. 
    authSt : AuthState
    Authenticator state after the update with this epoch's key. 
  • 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. 
  • 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. 
  • 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. 
  • 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. 
  • 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. 
Definition9.6.3
group
Statement uses 5
Statement dependency previews
Preview
Definition 4.1.2
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
Used by 2
Reverse dependency previews
Preview
Definition 9.6.4
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

\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 Sym

party 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. -/ | erroneousDataReceived

send 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 AuthState

receive 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 AuthState

complete 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
  • inductive(7 constructors, 1 parameter)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    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. 
    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. 
  • structure(2 fields)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    structure SPQR.Chunked.Message (Sym : Type) : Type
    structure SPQR.Chunked.Message (Sym : Type) : Type
    Rust `Message` (`states.rs:41`). 
    epoch : ℕ
    The epoch being negotiated. 
    payload : SPQR.Chunked.Payload Sym
    The typed payload. 
  • inductive(11 constructors, 4 parameters)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    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. 
    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`). 
  • inductive(3 constructors)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    inductive SPQR.Chunked.Error : Type
    inductive SPQR.Chunked.Error : Type
    The three Rust public errors reachable from `States::recv` (`lib.rs:96-122`). 
    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. 
  • structure(4 fields)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    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. 
    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. 
  • structure(3 fields)defined in SecureMessaging/SCKA/SPQR/Chunked.lean
    complete
    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. 
    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. 
  • 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`). 
Definition9.6.4
group
Statement uses 3
Statement dependency previews
Preview
Definition 6.4.4
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
used by 1✓L∃∀N

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 st

receive 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 ignore

receive 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
  • 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`). 
  • 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. 
  • 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)`. 
  • 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. 
  • 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. 
  • 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. 
  • 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. 
Definition9.6.5
Group: Sparse Post-Quantum Ratchet (SPQR) ( ). (2)
Group member previews
Preview
Theorem 9.6.6
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 8
Statement dependency previews
Preview
Definition 4.1.1
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
Used by 2
Reverse dependency previews
Preview
Theorem 9.6.6
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

\todo

incremental ML-KEM-768

abbrev v1Incremental : MLKEM.mlkem768Scheme.IncrementalStructure := MLKEM.mlkemIncremental .MLKEM768 MLKEM.Concrete.concreteNTTRingOps MLKEM.Concrete.mlkem768Primitives

SPQR 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
  • complete
    abbrev SPQR.v1Incremental : MLKEM.mlkem768Scheme.IncrementalStructure
    abbrev SPQR.v1Incremental :
      MLKEM.mlkem768Scheme.IncrementalStructure
    Incremental ML-KEM-768 over the witnesses of `MLKEM.mlkem768Scheme`. 
  • 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. 
  • 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. 
  • 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. 
Theorem9.6.6
Group: Sparse Post-Quantum Ratchet (SPQR) ( ). (2)
Group member previews
Preview
Definition 9.6.5
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 3
Statement dependency previews
Preview
Definition 4.1.4
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
used by 0XL∃∀N

\todo

LeanLean anchor pending
Theorem9.6.7
Group: Sparse Post-Quantum Ratchet (SPQR) ( ). (2)
Group member previews
Preview
Definition 9.6.5
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 3
Statement dependency previews
Preview
Definition 4.1.1
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
used by 0XL∃∀N

\todo

LeanLean anchor pending

References: