Documentation

Complexity.Crypto.Computational.Homomorphic.KeyChain.Reduction.Game

Exact games of the encrypted-link reduction #

The concrete two-stage reduction simulates the full public key-chain distribution. Its saved state contains only keys that it generated and the public challenge key. Fixed supported secret length justifies replacing the unknown challenge secret by an equally long zero word after its outgoing link has been erased.

Main results #

References #

theorem Cslib.Crypto.Homomorphic.Scheme.eval_linkAdversaryAt (E : Scheme) (beforeCount afterCount bitIndex : ℕ → ℕ) (test : ℕ → List (List Bool) × List (List (List Bool)) → ProbComp Bool) (n width : ℕ) (bit : Bool) (hwidth : ∀ keys ∈ (E.keyGen n).eval.support, keys.2.length = width) :
(Encryption.game E.keyGen E.encrypt (E.linkAdversaryAt beforeCount afterCount bitIndex test) bit n).eval = if bitIndex n < width then (E.publicKeyLinkHybrid n (beforeCount n) (afterCount n) (bitIndex n + if bit = true then 1 else 0) >>= test n).eval else PMF.pure false

The real single-challenge encryption game equals the chosen bit hybrid. The fixed-width hypothesis ranges only over honestly generated keys; no decryption correctness is assumed.

theorem Cslib.Crypto.Homomorphic.Scheme.eval_linkAdversary (E : Scheme) (depth capacity : ℕ → ℕ) (test : ℕ → List (List Bool) × List (List (List Bool)) → ProbComp Bool) (n width : ℕ) (bit : Bool) (hwidth : ∀ keys ∈ (E.keyGen n).eval.support, keys.2.length = width) :
(Encryption.game E.keyGen E.encrypt (E.linkAdversary depth capacity test) bit n).eval = E.keyChainHybridGame n (depth n) width (capacity n) (test n) bit

The actual uniformly sampled two-stage reduction realizes the exact two-coordinate game. Every random choice and every saved-state computation is part of the concrete adversary.

theorem Cslib.Crypto.Homomorphic.Scheme.publicKeyChainHybrid_gap_linkAdversary (E : Scheme) (depth capacity : ℕ → ℕ) (test : ℕ → List (List Bool) × List (List (List Bool)) → ProbComp Bool) (n width : ℕ) (hwidth : ∀ keys ∈ (E.keyGen n).eval.support, keys.2.length = width) (hcapacity : width ≤ capacity n) :
↑(Game.succProbability (E.publicKeyChainHybrid n (depth n) (depth n) >>= test n).eval) - ↑(Game.succProbability (E.publicKeyChainHybrid n (depth n) 0 >>= test n).eval) = ↑(Probability.dyadicSize (depth n)) * ↑(Probability.dyadicSize (capacity n)) * (↑(Game.succProbability (Encryption.game E.keyGen E.encrypt (E.linkAdversary depth capacity test) false n).eval) - ↑(Game.succProbability (Encryption.game E.keyGen E.encrypt (E.linkAdversary depth capacity test) true n).eval))

The public key-chain gap is exactly the concrete base adversary's signed gap, with the explicit dyadic sampling loss. No maximizing coordinate or nonuniform advice is selected.

theorem Cslib.Crypto.Homomorphic.Scheme.publicKeyChainHybrid_advantage_linkAdversary (E : Scheme) (depth capacity : ℕ → ℕ) (test : ℕ → List (List Bool) × List (List (List Bool)) → ProbComp Bool) (n width : ℕ) (hwidth : ∀ keys ∈ (E.keyGen n).eval.support, keys.2.length = width) (hcapacity : width ≤ capacity n) :
Game.advantage (E.publicKeyChainHybrid n (depth n) (depth n) >>= test n).eval (E.publicKeyChainHybrid n (depth n) 0 >>= test n).eval = ↑(Probability.dyadicSize (depth n)) * ↑(Probability.dyadicSize (capacity n)) * Game.advantage (Encryption.game E.keyGen E.encrypt (E.linkAdversary depth capacity test) false n).eval (Encryption.game E.keyGen E.encrypt (E.linkAdversary depth capacity test) true n).eval

The exact unsigned reduction loss for the full public artifact. Padding contributes no gap, including when there are no links or no secret bits.