{-# OPTIONS --without-K #-} open import Type open import Data.Product open import Data.Two module Game.IND-CPA-dagger (PubKey : ★) (SecKey : ★) (Message : ★) (CipherText : ★) -- randomness supply for: encryption, key-generation, adversary, extensions (Rₑ Rₖ Rₐ Rₓ : ★) (KeyGen : Rₖ → PubKey × SecKey) (Enc : PubKey → Message → Rₑ → CipherText) where -- IND-CPA† adversary in two parts record Adversary : ★ where field -- Same as in IND-CPA: -- In the step 'm', the adversary receives some randomness, -- the public key, the message we want (m₀ or m₁). The adversary -- returns the message to encrypt. Remember that the adversary -- is a pure and deterministic function, therefore 𝟚 → Message -- is the same as Message × Message. m : Rₐ → PubKey → 𝟚 → Message -- In the step 'b′' the adversary receives the same randomness -- supply and public key as in step 'm' and receives two ciphertexts -- computed by the challenger. One of the ciphertext should be -- the encryption of m₀ and the other of m₁. -- The adversary has to guess in which order they are, namely -- is the first ciphertext the encryption of m₀. b′ : Rₐ → PubKey → CipherText → CipherText → 𝟚 -- IND-CPA randomness supply R : ★ R = (Rₐ × Rₖ × Rₑ × Rₑ × Rₓ) -- IND-CPA experiments: -- * input: adversary and randomness supply -- * output b: adversary claims we are in experiment EXP b Experiment : ★ Experiment = Adversary → R → 𝟚 -- The game step by step: -- (pk) key-generation, only the public-key is needed -- (mb) send randomness, public-key and bit -- receive which message to encrypt -- (c) encrypt the message -- (b′) send randomness, public-key and ciphertext -- receive the guess from the adversary EXP : (b t : 𝟚) → Experiment EXP b t A (rₐ , rₖ , rₑ , rₑ′ , _rₓ) = b′ where module A = Adversary A pk = proj₁ (KeyGen rₖ) mb = A.m rₐ pk c = Enc pk (mb b) rₑ c′ = Enc pk (mb t) rₑ′ b′ = A.b′ rₐ pk c c′ EXP₀ EXP₁ : Experiment EXP₀ = EXP 0₂ 1₂ EXP₁ = EXP 1₂ 0₂ game : Adversary → (𝟚 × R) → 𝟚 game A (b , r) = b == EXP b (not b) A r open import Relation.Binary.PropositionalEquality module _ (Dist : ★) (|Pr[_≡1]-Pr[_≡1]| : (f g : R → 𝟚) → Dist) (dist-comm : ∀ f g → |Pr[ f ≡1]-Pr[ g ≡1]| ≡ |Pr[ g ≡1]-Pr[ f ≡1]|) where Advantage : Adversary → Dist Advantage A = |Pr[ EXP₀ A ≡1]-Pr[ EXP₁ A ≡1]| Advantage-unordered : ∀ A b → Advantage A ≡ |Pr[ EXP b (not b) A ≡1]-Pr[ EXP (not b) b A ≡1]| Advantage-unordered A 1₂ = dist-comm _ _ Advantage-unordered A 0₂ = refl -- -} -- -} -- -}