@@ -65,6 +65,63 @@ noncomputable def scheme : CommitmentScheme (ZMod params.q) G (ZMod params.q) G
6565 verify := verify
6666 }
6767
68+
69+ theorem pedersen_correctness : Commitment.correctness (@scheme G params) := by
70+ unfold Commitment.correctness
71+ intro h m
72+ unfold scheme commit verify
73+ simp only [pure]
74+ ext b
75+ simp only [PMF.bind_apply, PMF.pure_apply, PMF.uniformOfFintype_apply, tsum_fintype, Finset.sum_mul]
76+ -- Exchange the order of summation
77+ rw [Finset.sum_comm]
78+ simp only [mul_ite, mul_one, mul_zero]
79+ -- For each r, the inner sum over x: only x = (g^m*h^r, r) contributes
80+ have h_inner : ∀ r : ZMod params.q,
81+ (∑ x : G × ZMod params.q,
82+ if b = (if x.1 = params.g ^ m.val * h ^ x.2 .val then 1 else 0 )
83+ then if x = (params.g ^ m.val * h ^ r.val, r)
84+ then ((↑(Fintype.card (ZMod params.q)))⁻¹ : ENNReal)
85+ else 0
86+ else 0 ) =
87+ if b = 1 then ((↑(Fintype.card (ZMod params.q)))⁻¹ : ENNReal) else 0 := by
88+ intro r
89+ -- The sum collapses to checking x = (g^m*h^r, r)
90+ have : (∑ x : G × ZMod params.q,
91+ if b = (if x.1 = params.g ^ m.val * h ^ x.2 .val then 1 else 0 )
92+ then if x = (params.g ^ m.val * h ^ r.val, r)
93+ then ((↑(Fintype.card (ZMod params.q)))⁻¹ : ENNReal)
94+ else 0
95+ else 0 ) =
96+ (if b = (if (params.g ^ m.val * h ^ r.val) = params.g ^ m.val * h ^ r.val then 1 else 0 )
97+ then ((↑(Fintype.card (ZMod params.q)))⁻¹ : ENNReal)
98+ else 0 ) := by
99+ -- The sum has at most one non-zero term, when x = (g^m*h^r, r)
100+ trans (∑ x : G × ZMod params.q,
101+ if x = (params.g ^ m.val * h ^ r.val, r)
102+ then (if b = (if x.1 = params.g ^ m.val * h ^ x.2 .val then 1 else 0 )
103+ then ((↑(Fintype.card (ZMod params.q)))⁻¹ : ENNReal)
104+ else 0 )
105+ else 0 )
106+ · congr 1
107+ ext x
108+ by_cases hx : x = (params.g ^ m.val * h ^ r.val, r)
109+ · simp [hx]
110+ · simp [hx]
111+ · rw [Finset.sum_ite_eq']
112+ simp
113+ rw [this]
114+ simp
115+ simp_rw [h_inner]
116+ by_cases hb : b = 1
117+ · subst hb
118+ simp only [ite_true, Finset.sum_const, Finset.card_univ, nsmul_eq_mul]
119+ rw [ENNReal.mul_inv_cancel]
120+ · simp [params.prime_q.ne_zero]
121+ · simp [ENNReal.natCast_ne_top]
122+ · simp [hb]
123+
124+
68125noncomputable def generate_a : PMF (ZModMult params.q) := PMF.uniformOfFintype (ZModMult params.q)
69126
70127/- ========================================
0 commit comments