Skip to content

Commit 33a2845

Browse files
Added exact lemma for parameteriezed global hybrids.
Added global hybrid lemma for hybrids parameterized by oracles that gives an equality, not just an upper bound. Updated the DDH global hybrid example to use it. Idea based on the Nominal-SSProve paper "Mechanizing Nested Hybrid Arguments", https://eprint.iacr.org/2025/1122.
1 parent eb58ec7 commit 33a2845

3 files changed

Lines changed: 625 additions & 398 deletions

File tree

examples/global-hybrid/GlobalHybridExamp1.ec

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
require import AllCore Real Distr StdOrder StdBigop GlobalHybrid.
1414
import RealOrder Bigreal BRA.
1515

16+
clone include GlobalHybrid with
17+
type input <- unit (* no additional input *)
18+
proof *.
19+
1620
op n : {int | 1 <= n} as ge1_n.
1721

1822
type t. (* we want t to have 2 ^ n elements, including def *)
@@ -24,13 +28,13 @@ op [lossless] dt : t distr.
2428
axiom mu1_dt (x : t) : mu1 dt x = 1%r / (2 ^ n)%r.
2529

2630
lemma dt_uni : is_uniform dt.
27-
proof. move => x y _ _; by rewrite !mu1_dt. qed.
31+
proof. by move => x y _ _; by rewrite !mu1_dt. qed.
2832

2933
lemma dt_fu : is_full dt.
3034
proof.
3135
rewrite funi_ll_full.
32-
move => x y; by rewrite !mu1_dt.
33-
rewrite dt_ll.
36+
+ by move => x y; by rewrite !mu1_dt.
37+
by rewrite dt_ll.
3438
qed.
3539

3640
op m : {int | 1 <= m} as ge1_m.
@@ -65,7 +69,7 @@ lemma GReal_GIdeal &m :
6569
*)
6670

6771
module Hybrid : HYBRID = {
68-
proc main(i : int) : bool = {
72+
proc main(y : unit, i : int) : bool = {
6973
var b <- true;
7074
var x : t;
7175
(* start from i: *)
@@ -81,18 +85,18 @@ module Hybrid : HYBRID = {
8185
}.
8286

8387
lemma GReal_Hybrid_1 &m :
84-
Pr[GReal.main() @ &m : res] = Pr[Hybrid.main(1) @ &m : res].
88+
Pr[GReal.main() @ &m : res] = Pr[Hybrid.main((), 1) @ &m : res].
8589
proof.
8690
byequiv => //; proc.
8791
seq 2 1 : (={b, i} /\ i{1} = 1); first auto.
88-
sim.
92+
by sim.
8993
qed.
9094

9195
lemma Hybrid_m &m :
92-
Pr[Hybrid.main(m) @ &m : res] = Pr[GIdeal.main() @ &m : res].
96+
Pr[Hybrid.main((), m) @ &m : res] = Pr[GIdeal.main() @ &m : res].
9397
proof.
9498
byequiv => //; proc; sp 1 0.
95-
rcondf{1} 1; auto.
99+
by rcondf{1} 1; auto.
96100
qed.
97101

98102
(* we use upto bad reasoning *)
@@ -147,53 +151,57 @@ module GBad2 = {
147151

148152
lemma Hybrid_step (i' : int) &m :
149153
1 <= i' < m =>
150-
`|Pr[Hybrid.main(i') @ &m : res] - Pr[Hybrid.main(i' + 1) @ &m : res]| <=
154+
`|Pr[Hybrid.main((), i') @ &m : res] -
155+
Pr[Hybrid.main((), i' + 1) @ &m : res]| <=
151156
1%r / (2 ^ n)%r.
152157
proof.
153-
move => [ge1_i' lt_i'_m].
154-
have -> : Pr[Hybrid.main(i') @ &m : res] = Pr[GBad1.main(i') @ &m : res].
155-
byequiv => //; proc; sp 1 2.
158+
move => [ge1_i' lt_i'_m].
159+
have -> :
160+
Pr[Hybrid.main((), i') @ &m : res] = Pr[GBad1.main(i') @ &m : res].
161+
+ byequiv => //; proc; sp 1 2.
156162
rcondt{1} 1; first auto.
157-
sim.
158-
have -> : Pr[Hybrid.main(i' + 1) @ &m : res] = Pr[GBad2.main(i') @ &m : res].
159-
byequiv => //; proc; sp 1 2.
163+
by sim.
164+
have -> :
165+
Pr[Hybrid.main((), i' + 1) @ &m : res] =
166+
Pr[GBad2.main(i') @ &m : res].
167+
+ byequiv => //; proc; sp 1 2.
160168
seq 0 3 : (={i, b}); first auto.
161-
sim.
169+
by sim.
162170
rewrite (ler_trans Pr[GBad2.main(i') @ &m : GBad2.bad]).
163-
byequiv
164-
(_ :
165-
={i} ==> GBad1.bad{1} = GBad2.bad{2} /\ (! GBad2.bad{2} => ={res})) :
166-
GBad1.bad => //.
167-
proc.
168-
seq 5 5 :
169-
(GBad1.bad{1} = GBad2.bad{2} /\ ={i} /\
170-
(!GBad2.bad{2} => ={b})); first auto.
171-
case (GBad1.bad{1}).
172-
while (={i}); auto.
173-
while (={i, b}); auto; smt().
174-
smt().
171+
+ byequiv
172+
(:
173+
={i} ==> GBad1.bad{1} = GBad2.bad{2} /\ (! GBad2.bad{2} => ={res})) :
174+
GBad1.bad => //.
175+
+ proc.
176+
seq 5 5 :
177+
(GBad1.bad{1} = GBad2.bad{2} /\ ={i} /\
178+
(!GBad2.bad{2} => ={b})); first auto.
179+
case (GBad1.bad{1}).
180+
+ by while (={i}); auto.
181+
by while (={i, b}); auto; smt().
182+
by smt().
175183
byphoare => //; proc; sp.
176184
seq 3 :
177185
GBad2.bad
178186
(1%r / (2 ^ n)%r)
179187
1%r
180188
(1%r - (1%r / (2 ^ n)%r))
181189
0%r.
182-
auto.
183-
wp; rnd (pred1 def); auto; smt(mu1_dt).
184-
conseq (_ : _ ==> _ : = 1%r).
185-
while (true) (m - i) => [z |].
186-
auto; smt(dt_ll).
187-
auto; smt().
188-
hoare; while (true); auto.
189-
trivial.
190+
+ by auto.
191+
+ by wp; rnd (pred1 def); auto; smt(mu1_dt).
192+
+ conseq (: _ ==> _ : = 1%r).
193+
while (true) (m - i) => [z |].
194+
+ by auto; smt(dt_ll).
195+
by auto; smt().
196+
+ by hoare; while (true); auto.
197+
done.
190198
qed.
191199

192200
lemma GReal_GIdeal &m :
193201
`|Pr[GReal.main() @ &m : res] - Pr[GIdeal.main() @ &m : res]| <=
194202
(m - 1)%r * (1%r / (2 ^ n)%r).
195203
proof.
196204
rewrite (GReal_Hybrid_1 &m) -(Hybrid_m &m).
197-
rewrite (hybrid_simp _ _ Hybrid) 1:ge1_m => i ge1_i_lt_m.
205+
rewrite (hybrid_simp _ _ _ Hybrid) 1:ge1_m => i ge1_i_lt_m.
198206
by rewrite Hybrid_step.
199207
qed.

0 commit comments

Comments
 (0)