Modules

categorical-crypto

  • Prelude

CategoricalCrypto

  • CategoricalCrypto
  • Abstract
  • Abstract2
  • Abstract2.Equivalence
  • Abstract2.Morphism
  • Abstract2.OAPEmulation
  • Abstract2.WideSubcategory
  • Channel.Category
  • Channel.Core
  • Channel.Selection
  • Examples.Basic
  • Examples.Commitment
  • Examples.RelSetup
  • Examples.Signatures
  • FamilyCategory
  • Machine.Constraints
  • Machine.Core
  • MachineAxioms
  • RandomOracle
  • RandomOracle2
  • SFunM
  • Standard
  • Standard2
  • Standard2.Morphism
  • StandardTV
  • UCSetup
  • UCSetup.Morphism
  • VanishingTV

Categories

  • Actegory
  • Actegory.Underlying
  • Category.EquivClosureHelper
  • Coherence.Monoidal
  • Coherence.Monoidal.Compare
  • Coherence.Monoidal.Diagram
  • Coherence.Monoidal.Frontend
  • Coherence.Monoidal.Frontend.Core
  • Coherence.Monoidal.Frontend.Sigma
  • Coherence.Monoidal.MacLane
  • Coherence.Monoidal.Normalize
  • Coherence.Monoidal.Reflect
  • Coherence.Monoidal.Sigma
  • Coherence.Monoidal.Test.Frontend
  • Coherence.Monoidal.Test.InterchangeStress
  • Coherence.Monoidal.Test.Limitations
  • Coherence.Monoidal.Test.SigmaFrontend
  • Coherence.Monoidal.WireCoherence
  • CoherenceIsos
  • Diagram.Coend.Ext.Setoids
  • Discrete
  • FreeMonoidal
  • FreeStrictMonoidal
  • Functor.Monoidal.CurriedTensor
  • Functor.Monoidal.CurriedTensor.Properties
  • Functor.Monoidal.Properties.Ext
  • Functor.Presheaf.Morphism
  • GradedKleisli
  • GradedKleisli.Functorial
  • GradedKleisli.Functorial.Category
  • GradedKleisli.Regrade
  • KernelCongruence
  • KernelCongruence.Reindex
  • LocallyGraded
  • LocallyGraded.FreeActegory
  • LocallyGraded.FreeActegory.Kleisli
  • LocallyGraded.Kleisli
  • Monad.Graded.Ext
  • Monad.Graded.Morphism
  • Monad.Graded.Pullback
  • Monad.Graded.Uncurried
  • Morphism.Reasoning.Ext
  • NaturalTransformationHelper
  • Properties

Class

  • Monad.Ext

Data

  • List.Properties.Ext
  • Maybe.Ext
  • Nat.Poly

LibExt

  • LibExt
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
{-# OPTIONS --safe #-}
module CategoricalCrypto.Examples.Signatures where
 
open import categorical-crypto.Prelude
import categorical-crypto.Prelude as P
 
open import Data.Fin using (Fin; fromℕ<) renaming (zero to fzero; suc to fsuc)
 
open import CategoricalCrypto.Channel.Core
open import CategoricalCrypto.Channel.Selection
open import CategoricalCrypto.Machine.Core
 
open import Data.Nat
open import Data.List
open import Data.List.Membership.Propositional
 
open import Function
 
module Signatures (VK M S : Set) where
data SigT : Mode → Type where
Gen : SigT Out
GetPk : VK → SigT In
Sign : M → SigT Out
GetSig : S → SigT In
 
Sig : Channel
Sig = simpleChannel SigT
 
data VerT : Mode → Type where
Verify : VK → M → S → VerT Out
 
Ver : Channel
Ver = simpleChannel VerT
 
data AdvT : Mode → Type where
GenA : AdvT In
GenPk : VK → AdvT Out
SignA : M → ℕ → AdvT In
SignSig : S → ℕ → AdvT Out
 
Adv : Channel
Adv = simpleChannel AdvT
 
record State : Set where
field key : Maybe VK
verList : List (VK × M × S)
msgs : List M
seenIds : List ℕ
 
data WithState_receive_return_newState_ : MachineType I ((Sig ⊗₀ Ver) ⊗₀ Adv) State where
 
Gen₁NI : ∀ {s}
→ State.key s ≡ nothing
→ WithState s
receive L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ₒ Gen
return just $ L⊗ (L⊗ ϵ) ᵗ¹ ↑ᵢ GenA
newState s
 
Gen₂NI : ∀ {s vk}
→ State.key s ≡ nothing
→ WithState s
receive L⊗ (L⊗ ϵ) ᵗ¹ ↑ₒ GenPk vk
return just $ L⊗ ((ϵ ⊗R) ⊗R) ᵗ¹ ↑ᵢ GetPk vk
newState record s { key = just vk }
 
GenI : ∀ {s vk}
→ State.key s ≡ just vk
→ WithState s
receive L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ₒ Gen
return just $ L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ᵢ GetPk vk
newState s
 
Sign₁ : ∀ {s vk m}
→ let open State s in
State.key s ≡ just vk
→ WithState s
receive L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ₒ Sign m
return just $ L⊗ (L⊗ ϵ) ᵗ¹ ↑ᵢ SignA m (length msgs)
newState record s { msgs = m ∷ State.msgs s }
 
Sign₂ : ∀ {s vk σ k m}
→ let open State s in
State.key s ≡ just vk
→ k ∉ seenIds
→ (k<len : k < length msgs)
→ P.lookup msgs (fromℕ< k<len) ≡ m
→ WithState s
receive L⊗ (L⊗ ϵ) ᵗ¹ ↑ₒ SignSig σ k
return just $ L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ᵢ GetSig σ
newState record s { verList = (vk , m , σ) ∷ State.verList s ; seenIds = k ∷ seenIds }
 
-- TODO
-- Ver : ∀ {s vk σ k m}
-- → let open State s in
-- WithState s
-- receive adversarialInput (-, SignSig σ k)
-- return just $ honestOutputO (rcvˡ (-, GetSig σ))
-- newState record s { verList = (vk , m , σ) ∷ State.verList s ; seenIds = k ∷ seenIds }
 
_-⟦_/_⟧⇀_ = WithState_receive_return_newState_
 
Functionality : Machine I ((Sig ⊗₀ Ver) ⊗₀ Adv)
Functionality .Machine.State = State
Functionality .Machine.stepRel = WithState_receive_return_newState_
 
opaque
unfolding
_⊗₀_
 
signTwice : ∀ {s s' m o}
→ s -⟦ L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ₒ Sign m / o ⟧⇀ s' → ∃[ o' ] ∃[ s'' ]
s' -⟦ L⊗ ((ϵ ⊗R) ⊗R) ᵗ² ↑ₒ Sign m / o' ⟧⇀ s''
signTwice (Sign₁ s-key≡just-vk) = -, -, Sign₁ s-key≡just-vk