Skip to content

Commit 931c6f9

Browse files
oskgostrub
authored andcommitted
Allow substitutions of locals using the same memory as that used by a Pr
ensure `/>` does not fail to substitute depending on direction of equality
1 parent ab3c768 commit 931c6f9

6 files changed

Lines changed: 43 additions & 13 deletions

File tree

src/ecLowGoal.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2424,7 +2424,10 @@ let t_crush ?(delta = true) ?tsolve (tc : tcenv1) =
24242424
| _, `Local _ -> `RtoL
24252425
| _, _ -> `LtoR
24262426
in
2427-
t_subst_x ~clear:SCnone ~kind:sk ~tside ~eqid:eqid ~except:st.cs_sbeq tc
2427+
try t_subst_x ~clear:SCnone ~kind:sk ~tside ~eqid:eqid ~except:st.cs_sbeq tc
2428+
with InvalidGoalShape ->
2429+
let tside = if tside = `LtoR then `RtoL else `LtoR in
2430+
t_subst_x ~clear:SCnone ~kind:sk ~tside ~eqid:eqid ~except:st.cs_sbeq tc
24282431
in
24292432
24302433
(* let _, _, side = gen in

src/ecPV.ml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,16 @@ module PVM = struct
171171

172172
let has_mod b =
173173
List.exists (fun (_,gty) -> match gty with GTmodty _ -> true | _ -> false) b
174+
175+
let has_globs m (s: subst) =
176+
try
177+
let mpv = Mid.find m s in
178+
let has_abstract_globs = not (Mm.is_empty mpv.s_gl) in
179+
let has_concrete_globs =
180+
let check pv _ = is_glob pv in
181+
Mnpv.exists check mpv.s_pv in
182+
has_abstract_globs || has_concrete_globs
183+
with Not_found -> false
174184

175185
let rec subst env (s : subst) =
176186
Hf.memo_rec 107 (fun aux f ->
@@ -187,9 +197,14 @@ module PVM = struct
187197
| FhoareF {hf_m=m}
188198
| FhoareS {hs_m=(m,_)}
189199
| FbdHoareF {bhf_m=m}
190-
| FbdHoareS {bhs_m=(m,_)}
191-
| Fpr {pr_mem=m} ->
200+
| FbdHoareS {bhs_m=(m,_)} ->
201+
check_binding m s;
202+
EcFol.f_map (fun ty -> ty) aux f
203+
| Fpr {pr_mem; pr_event={m}} ->
192204
check_binding m s;
205+
(* Substituting globals using the memory of the pr may erase information *)
206+
if has_globs pr_mem s then
207+
raise MemoryClash;
193208
EcFol.f_map (fun ty -> ty) aux f
194209
| Fquant(q,b,f1) ->
195210
let f1 =

tests/subst-with-pr.ec

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require import Real.
2+
3+
module M = {var x: bool proc p()={}}.
4+
5+
lemma L (&m: {b:bool}): b{m}= true => Pr[M.p()@&m:true] = 1%r.
6+
proof. move => ->>. abort.
7+
8+
lemma L (&m: {b:bool}): M.x{m}= true => Pr[M.p()@&m:true] = 1%r.
9+
proof. fail move => ->>. abort.
10+
11+
lemma L: phoare[M.p{&m}: true ==> Pr[M.p()@&m:true] = 1%r] = 1%r.
12+
proof. proc. abort.

theories/crypto/KeyEncapsulationMechanisms.eca

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3205,7 +3205,7 @@ seq 1 : (k = kt) pr_dec_skc pr_dec_skcp _ 0%r (#pre) => //.
32053205
rewrite Pr[mu_not] (: Pr[S.decaps(sk{m'}, c{m'}) @ &m' : true] = 1%r); 1: by byphoare S_decaps_ll => //.
32063206
by rewrite RField.subr_eq0 eq_sym; byphoare (S_decaps_sl (glob S){m}) => //.
32073207
+ call (: glob S = (glob S){m} /\ arg = (skt, ct) ==> res = kt); 2: by skip.
3208-
rewrite /pr_dec_skc; bypr => /> &m' glS ->.
3208+
rewrite /pr_dec_skc; bypr => /> &m' glS.
32093209
by byequiv => //; proc true.
32103210
+ call (: glob S = (glob S){m} /\ arg = (skt', ct') ==> res = kt'); 2: by skip => />.
32113211
rewrite /pr_dec_skcp; bypr=> &m' [glS ->] /=.
@@ -3237,7 +3237,7 @@ local equiv Eqv_DecapsOrder :
32373237
={glob S} /\ arg{1} = (arg.`2, arg.`1, arg.`4, arg.`3){2} ==> res{1} = (res.`2, res.`1){2}.
32383238
proof.
32393239
bypr (res.`1, res.`2){1} (res.`2, res.`1){2} => [/#|].
3240-
move=> /> &1 &2 [kt kt'] eqglS -> /=.
3240+
move=> /> &1 &2 [kt kt'] eqglS /=.
32413241
rewrite (EqPr_DecapsOrder &1 _ _ _ _ kt kt').
32423242
have->: Pr[Decaps_Order.main(sk{2}, sk'{2}, c{2},
32433243
c'{2}) @ &2 :

theories/distributions/Dexcepted.ec

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,8 @@ proof. by bypr=> &m; exact/(@pr_sampleW &m i{m} P). qed.
582582
equiv sampleE_sampleI : SampleE.sample ~ SampleI.sample :
583583
={i} /\ is_lossless (dt i{1}) ==> ={res}.
584584
proof.
585-
bypr (res{1}) (res{2})=> /> &m1 &m2 a <- dt_ll.
586-
by rewrite (@pr_sampleE &m1 i{m1} (pred1 a)) (@pr_sampleI &m2 i{m1} (pred1 a)).
585+
bypr (res{1}) (res{2}) => /> &m1 &m2 a dt_ll.
586+
by rewrite (@pr_sampleE &m1 i{m2} (pred1 a)) (@pr_sampleI &m2 i{m2} (pred1 a)).
587587
qed.
588588
589589
lemma sampleE_sampleI_pr &m x P:
@@ -594,9 +594,9 @@ proof. by move=> dt_ll; byequiv sampleE_sampleI. qed.
594594
equiv sampleE_sampleWi : SampleE.sample ~ SampleWi.sample :
595595
={i} /\ is_lossless (dt i{1}) /\ test i{2} r{2} ==> ={res}.
596596
proof.
597-
bypr (res{1}) (res{2})=> /> &m1 &m2 a <- dt_ll Htr.
598-
rewrite (@pr_sampleE &m1 i{m1} (pred1 a)).
599-
by rewrite (@pr_sampleWi &m2 i{m1} r{m2} (pred1 a)) // Htr.
597+
bypr (res{1}) (res{2})=> /> &m1 &m2 a dt_ll Htr.
598+
rewrite (@pr_sampleE &m1 i{m2} (pred1 a)).
599+
by rewrite (@pr_sampleWi &m2 i{m2} r{m2} (pred1 a)) // Htr.
600600
qed.
601601
602602
lemma sampleE_sampleWi_pr &m x y P:
@@ -608,8 +608,8 @@ proof. by move=> dt_ll test_i_r; byequiv sampleE_sampleWi. qed.
608608
equiv sampleE_sampleW : SampleE.sample ~ SampleW.sample :
609609
={i} /\ is_lossless (dt i{1}) ==> ={res}.
610610
proof.
611-
bypr (res{1}) (res{2})=> /> &m1 &m2 a <- dt_ll.
612-
by rewrite (@pr_sampleE &m1 i{m1} (pred1 a)) (@pr_sampleW &m2 i{m1} (pred1 a)).
611+
bypr (res{1}) (res{2})=> /> &m1 &m2 a dt_ll.
612+
by rewrite (@pr_sampleE &m1 i{m2} (pred1 a)) (@pr_sampleW &m2 i{m2} (pred1 a)).
613613
qed.
614614
615615
lemma sampleE_sampleW_pr &m x P:

theories/encryption/Means.ec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ seq 1: (v = x) (mu1 d v) pr 1%r 0%r ((glob A) = (glob A){m})=> //.
3535
+ by rnd; auto=> />; rewrite pred1E.
3636
+ call (: (glob A) = (glob A){m} /\ x = v
3737
==> ev v (glob A) res)=> //.
38-
rewrite /pr; bypr=> /> &0 eqGlob <<-.
38+
rewrite /pr; bypr=> /> &0 eqGlob.
3939
by byequiv (: ={glob A, x} ==> ={res, glob A})=> //; proc true.
4040
by hoare => /=; call (: true); auto=> /#.
4141
qed.

0 commit comments

Comments
 (0)