|
| 1 | +/- |
| 2 | +Copyright (c) 2026 Samuel Schlesinger. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Samuel Schlesinger |
| 5 | +-/ |
| 6 | + |
| 7 | +module |
| 8 | + |
| 9 | +public import Cslib.Probability.PMF |
| 10 | +public import Cslib.Crypto.Protocols.SecretSharing.Scheme |
| 11 | + |
| 12 | +/-! |
| 13 | +# Secret Sharing: Definitions |
| 14 | +
|
| 15 | +Privacy for secret sharing is part of the `Scheme` interface. This file exposes |
| 16 | +the corresponding view and posterior distributions, plus theorem-friendly |
| 17 | +consequences of the built-in privacy field. |
| 18 | +
|
| 19 | +## Main definitions |
| 20 | +
|
| 21 | +- `Cslib.Crypto.Protocols.SecretSharing.Scheme.shareDist`: |
| 22 | + the full share distribution for one secret |
| 23 | +- `Cslib.Crypto.Protocols.SecretSharing.Scheme.viewDist`: |
| 24 | + the distribution of the restricted view for one coalition |
| 25 | +- `Cslib.Crypto.Protocols.SecretSharing.Scheme.posteriorSecretDist`: |
| 26 | + the posterior distribution on secrets after observing one view |
| 27 | +- `Cslib.Crypto.Protocols.SecretSharing.Scheme.PerfectlyPrivate`: |
| 28 | + posterior equals prior for unauthorized coalitions |
| 29 | +- `Cslib.Crypto.Protocols.SecretSharing.Scheme.perfectlyPrivate`: |
| 30 | + every scheme has posterior privacy |
| 31 | +
|
| 32 | +## References |
| 33 | +
|
| 34 | +* [Adi Shamir, *How to Share a Secret*][Shamir1979] |
| 35 | +* [J. Katz, Y. Lindell, *Introduction to Modern Cryptography*][KatzLindell2020] |
| 36 | +-/ |
| 37 | + |
| 38 | +@[expose] public section |
| 39 | + |
| 40 | +namespace Cslib.Crypto.Protocols.SecretSharing |
| 41 | + |
| 42 | +namespace Scheme |
| 43 | + |
| 44 | +variable {Secret Randomness Party Share : Type*} |
| 45 | + |
| 46 | +/-- The distribution of the full share assignment for one secret. -/ |
| 47 | +noncomputable def shareDist (scheme : Scheme Secret Randomness Party Share) |
| 48 | + (secret : Secret) : PMF (Party → Share) := |
| 49 | + scheme.gen.map (fun r => scheme.share r secret) |
| 50 | + |
| 51 | +/-- The view distribution induced on the coalition `s`. -/ |
| 52 | +noncomputable def viewDist (scheme : Scheme Secret Randomness Party Share) |
| 53 | + (s : Finset Party) (secret : Secret) : PMF (s → Share) := |
| 54 | + viewDistOf scheme.gen scheme.share s secret |
| 55 | + |
| 56 | +/-- Unauthorized coalitions receive secret-independent view distributions. -/ |
| 57 | +theorem viewDist_eq_of_not_authorized |
| 58 | + (scheme : Scheme Secret Randomness Party Share) |
| 59 | + {s : Finset Party} (hs : ¬ scheme.authorized s) |
| 60 | + (secret₀ secret₁ : Secret) : |
| 61 | + scheme.viewDist s secret₀ = scheme.viewDist s secret₁ := by |
| 62 | + unfold viewDist |
| 63 | + exact scheme.view_indist s hs secret₀ secret₁ |
| 64 | + |
| 65 | +/-- The posterior distribution on secrets after observing the coalition view |
| 66 | +`v`. -/ |
| 67 | +noncomputable def posteriorSecretDist |
| 68 | + (scheme : Scheme Secret Randomness Party Share) |
| 69 | + (s : Finset Party) (secretDist : PMF Secret) (v : s → Share) |
| 70 | + (hv : v ∈ (secretDist.bind (scheme.viewDist s)).support) : PMF Secret := |
| 71 | + Cslib.Probability.PMF.posteriorDist |
| 72 | + (p := secretDist) (f := scheme.viewDist s) v hv |
| 73 | + |
| 74 | +@[simp] |
| 75 | +theorem posteriorSecretDist_apply |
| 76 | + (scheme : Scheme Secret Randomness Party Share) |
| 77 | + (s : Finset Party) (secretDist : PMF Secret) (v : s → Share) |
| 78 | + (hv : v ∈ (secretDist.bind (scheme.viewDist s)).support) (secret : Secret) : |
| 79 | + scheme.posteriorSecretDist s secretDist v hv secret = |
| 80 | + (secretDist.bind fun secret' => |
| 81 | + (scheme.viewDist s secret').bind fun v' => PMF.pure (secret', v')) (secret, v) / |
| 82 | + (secretDist.bind (scheme.viewDist s)) v := |
| 83 | + rfl |
| 84 | + |
| 85 | +/-- Perfect privacy for unauthorized coalitions: conditioning on a view does not |
| 86 | +change the prior on secrets. -/ |
| 87 | +def PerfectlyPrivate (scheme : Scheme Secret Randomness Party Share) : Prop := |
| 88 | + ∀ (s : Finset Party) (_hs : ¬ scheme.authorized s) |
| 89 | + (secretDist : PMF Secret) (v : s → Share) |
| 90 | + (hv : v ∈ (secretDist.bind (scheme.viewDist s)).support), |
| 91 | + scheme.posteriorSecretDist s secretDist v hv = secretDist |
| 92 | + |
| 93 | +/-- Every scheme has posterior privacy by definition of `Scheme`. -/ |
| 94 | +theorem perfectlyPrivate |
| 95 | + (scheme : Scheme Secret Randomness Party Share) : |
| 96 | + scheme.PerfectlyPrivate := by |
| 97 | + intro s hs secretDist v hv |
| 98 | + exact Cslib.Probability.PMF.posteriorDist_eq_prior_of_outputIndist |
| 99 | + (p := secretDist) (f := scheme.viewDist s) |
| 100 | + (fun secret₀ secret₁ => scheme.viewDist_eq_of_not_authorized hs secret₀ secret₁) v hv |
| 101 | + |
| 102 | +end Scheme |
| 103 | + |
| 104 | +end Cslib.Crypto.Protocols.SecretSharing |
0 commit comments