Skip to content

Commit ddcf84b

Browse files
committed
Refactor proofs
This commit introduces a refactor in the correctness proofs. - The easycrypt extraction of the jasmin program no longer relies on jpp and the jasmin preprocessor. Instead, we use namespaces. The proofs were updated to match this - The security proof is now checked in the CI
1 parent 79a5c46 commit ddcf84b

File tree

18 files changed

+220
-235
lines changed

18 files changed

+220
-235
lines changed

proof/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ check_extraction: extraction/XMSS_IMPL.ec
5454

5555
################################### correctness proof ##############################################
5656

57-
check_correctness_proof: extraction/XMSS_IMPL.ec
57+
check_correctness_proof: extraction/XMSS_IMPL.ec common/Array8.ec
5858
$(ECRUNTEST) config/tests.config correctness
5959

6060
####################################################################################################
6161

6262
# FIXME: Only one of these is needed
6363
check_security_proof:
64-
$(ECRUNTEST) config/tests.config xmss-acai
65-
$(ECRUNTEST) config/tests.config xmss-fsai
64+
$(ECRUNTEST) config/tests.config acai
65+
$(ECRUNTEST) config/tests.config fsai
6666

6767
####################################################################################################
6868

proof/correctness/Correctness_Bytes.ec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import W8u8.Pack.
2727

2828
lemma ull_to_bytes2_post (x : W64.t, y : W32.t) :
2929
phoare[
30-
M(Syscall).__ull_to_bytes_2 :
30+
M(Syscall).bytes_wots_checksum__ull_to_bytes :
3131
arg.`2 = x
3232
==>
3333
to_list res = W64toBytes_ext x 2
@@ -52,7 +52,7 @@ qed.
5252

5353
lemma ull_to_bytes_32_correct (x : W64.t) :
5454
phoare [
55-
M(Syscall).__ull_to_bytes_32 :
55+
M(Syscall).bytes_32__ull_to_bytes :
5656
arg.`2 = x /\
5757
0 <= to_uint x < W64.max_uint
5858
==>
@@ -299,7 +299,7 @@ qed.
299299

300300
lemma ull_to_bytes_3_correct (x : W64.t) :
301301
phoare [
302-
M(Syscall).__ull_to_bytes_3 :
302+
M(Syscall).bytes_idx__ull_to_bytes :
303303
0 <= to_uint x <= 2^XMSS_FULL_HEIGHT /\
304304
arg.`2 = x
305305
==>

proof/correctness/Correctness_Hash.ec

Lines changed: 58 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,38 @@ import BitEncoding.BitChunking.
88
from Jasmin require import JModel.
99

1010
require import XMSS_IMPL Parameters.
11-
require import Params Address BaseW Hash LTree.
11+
require import Params Address BaseW Hash LTree Bytes.
1212
require import Correctness_Bytes Correctness_Mem Correctness_Address.
1313
require import Utils Repr.
1414

15-
require import Array8 Array32 Array64 Array96 Array128.
15+
require import Array4 Array8 Array32 Array64 Array96 Array128.
16+
17+
require import WArray32 WArray64.
1618

1719
(*---*) import StdBigop.Bigint.
1820

1921
axiom hash_96 (x : W8.t Array96.t) :
2022
phoare[
21-
M(Syscall).__core_hash_96 :
23+
M(Syscall).hash_plen_2n____sha256 :
2224
arg.`2 = x
2325
==>
2426
to_list res = NBytes.val (Hash (to_list x))
2527
] = 1%r.
2628

29+
axiom hash_96_ (x : W8.t Array96.t) :
30+
phoare[M(Syscall).hash_plen_n_32____sha256 : arg.`2 = x ==> to_list res = NBytes.val (Hash (to_list x))] = 1%r.
31+
2732
axiom hash_128 (x : W8.t Array128.t) :
2833
phoare[
29-
M(Syscall).__core_hash_128 :
34+
M(Syscall).hash_plen_2n_32____sha256 :
35+
arg.`2 = x
36+
==>
37+
to_list res = NBytes.val (Hash (to_list x))
38+
] = 1%r.
39+
40+
axiom hash_128_ (x : W8.t Array128.t) :
41+
phoare[
42+
M(Syscall).hash_plen_3n____sha256 :
3043
arg.`2 = x
3144
==>
3245
to_list res = NBytes.val (Hash (to_list x))
@@ -72,14 +85,11 @@ lemma prf_correctness (a b : W8.t Array32.t) :
7285
proof.
7386
rewrite /XMSS_N /XMSS_HASH_PADDING_PRF /XMSS_PADDING_LEN => [#] n_val pval plen.
7487
proc => /=.
75-
seq 9 2 : (buf{2} = to_list buf{1}); last first.
76-
+ inline M(Syscall).__core_hash__96 M(Syscall)._core_hash_96; wp; sp.
77-
ecall {1} (hash_96 buf{1}); auto => /> /#.
78-
88+
seq 7 2 : (buf{2} = to_list buf{1}); last by ecall {1} (hash_96_ buf{1}); auto => /> /#.
7989
seq 3 0 : #pre; 1:auto.
80-
8190
seq 1 1 : (#pre /\ padding{2} = to_list padding_buf{1}).
82-
+ call {1} (ull_to_bytes_32_correct (of_int 3)%W64).
91+
+ outline {1} [1] { padding_buf <@ M(Syscall).bytes_32__ull_to_bytes (padding_buf, W64.of_int 3); }.
92+
call {1} (ull_to_bytes_32_correct (of_int 3)%W64).
8393
auto => /> ? ->.
8494
by rewrite /toByte_64 /W64toBytes_ext pval plen.
8595

@@ -94,62 +104,25 @@ seq 1 0 : (
94104
rewrite initiE 1:/# => />.
95105
by rewrite ifT.
96106

97-
seq 1 0 : (#pre /\ aux{1} = key{1}); first by ecall {1} (_x_memcpy_u8u8_post key{1}); auto => />.
98-
99-
seq 1 0 : (#pre /\ forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)).
100-
+ auto => /> &1 &2 H0 H1 H2; split => k??.
101-
- rewrite initiE 1:/# => />.
102-
rewrite ifF 1:/#.
103-
apply H2 => //.
104-
- rewrite initiE 1:/# => />.
105-
rewrite ifT //= H0 get_to_list //=.
107+
auto => /> &1 &2 H0 H1 H2 *; apply (eq_from_nth witness); rewrite !size_cat !size_to_list !NBytes.valP n_val //= => j?.
106108

107-
seq 1 0 : (
108-
NBytes.val key{2} = to_list key{1} /\
109-
NBytes.val in_0{2} = to_list in_0{1} /\
110-
padding{2} = to_list padding_buf{1} /\
111-
(forall (k : int), 0 <= k < 32 => buf{1}.[k] = nth witness padding{2} k) /\
112-
(forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)) /\
113-
aux{1} = in_0{1}
114-
); first by ecall {1} (_x_memcpy_u8u8_post in_0{1}); auto => /> /#.
115-
116-
seq 1 0 : (
117-
NBytes.val key{2} = to_list key{1} /\
118-
NBytes.val in_0{2} = to_list in_0{1} /\
119-
padding{2} = to_list padding_buf{1} /\
120-
size padding{2} = 32 /\
121-
(forall (k : int), 0 <= k < 32 => buf{1}.[k] = nth witness padding{2} k) /\
122-
(forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)) /\
123-
(forall (k : int), 64 <= k < 96 => buf{1}.[k] = nth witness (NBytes.val in_0{2}) (k - 64))
124-
).
125-
+ auto => /> &1 &2 H0 H1 H2 H3 *.
126-
do split; first by rewrite size_to_list.
127-
- move => k??.
128-
rewrite initiE 1:/# => />.
129-
rewrite ifF 1:/#.
130-
apply H2 => //.
131-
- move => k??.
132-
rewrite initiE 1:/# => />.
133-
rewrite ifF 1:/#.
134-
apply H3 => //.
135-
- move => k??.
136-
rewrite initiE 1:/# => />.
137-
rewrite ifT // -get_to_list -H1 //.
138-
139-
auto => /> &1 &2 H0 H1 H2 H3 H4 H5.
140-
141-
apply (eq_from_nth witness).
142-
+ rewrite !size_cat !size_to_list !NBytes.valP n_val //.
143-
144-
rewrite !size_cat H0 !size_to_list //= NBytes.valP n_val //= => i?.
145-
case (0 <= i < 32).
109+
case (0 <= j < 32).
146110
+ move => ?.
147-
rewrite nth_cat size_cat !size_to_list ifT 1:/# nth_cat !size_to_list ifT 1:/# get_to_list /#.
148-
case (32 <= i < 64).
111+
rewrite nth_cat size_cat !size_to_list NBytes.valP ifT 1:/# nth_cat !size_to_list ifT 1:/# get_to_list.
112+
by rewrite -H2 // initiE //= ifF 1:/# initiE //= ifF 1:/#.
113+
114+
case (32 <= j < 64).
149115
+ move => ?_.
150-
rewrite nth_cat size_cat !size_to_list ifT 1:/# nth_cat size_to_list ifF 1:/# -H0 /#.
116+
rewrite nth_cat size_cat !size_to_list NBytes.valP n_val //= ifT 1:/#.
117+
rewrite nth_cat size_to_list ifF 1:/#.
118+
by rewrite H0 get_to_list initiE //= ifF 1:/# initiE //= ifT 1:/# /copy_8.
151119
move => ??.
152-
rewrite nth_cat size_cat !size_to_list ifF 1:/# H5 // /#.
120+
rewrite nth_cat size_cat !size_to_list NBytes.valP ifF 1:/# H1 get_to_list initiE //= ifT 1:/# //=.
121+
rewrite initiE 1:/# /get8 /init64 /= /copy_64 initiE 1:/# /=.
122+
rewrite initiE 1:/# /=.
123+
rewrite bits8E wordP => i?.
124+
rewrite initiE //=.
125+
rewrite/init8 get64E pack8E //= initiE 1:/# /= initiE 1:/# /= initiE /#.
153126
qed.
154127

155128
lemma prf_keygen_correctness (a : W8.t Array64.t, b : W8.t Array32.t) :
@@ -167,16 +140,15 @@ lemma prf_keygen_correctness (a : W8.t Array64.t, b : W8.t Array32.t) :
167140
proof.
168141
rewrite /XMSS_N /XMSS_HASH_PADDING_PRF_KEYGEN /XMSS_PADDING_LEN => [#] n_val pval plen.
169142
proc => //=.
170-
seq 9 2 : (buf{2} = to_list buf{1}); last first.
171-
+ inline M(Syscall).__core_hash__128 M(Syscall)._core_hash_128; wp; sp.
172-
ecall {1} (hash_128 buf{1}); auto => /> /#.
143+
seq 7 2 : (buf{2} = to_list buf{1}); last by ecall {1} (hash_128 buf{1}); auto => /> /#.
173144

174145
seq 3 0 : #pre; 1:auto.
175146

176147
seq 1 1 : (#pre /\ padding{2} = to_list padding_buf{1}).
177-
+ call {1} (ull_to_bytes_32_correct (of_int 4)%W64).
148+
+ outline {1} [1] { padding_buf <@ M(Syscall).bytes_32__ull_to_bytes (padding_buf, W64.of_int 4); }.
149+
call {1} (ull_to_bytes_32_correct (of_int 4)%W64).
178150
auto => /> ? ->.
179-
by rewrite pval plen.
151+
by rewrite /toByte_64 /W64toBytes_ext pval plen.
180152

181153
seq 1 0 : (
182154
NBytes.val key{2} = to_list key{1} /\
@@ -190,69 +162,20 @@ seq 1 0 : (
190162
rewrite initiE 1:/# => />.
191163
by rewrite ifT.
192164

193-
seq 1 0 : (#pre /\ aux{1} = key{1}); first by ecall {1} (_x_memcpy_u8u8_post key{1}); auto => />.
194-
195-
seq 1 0 : (
196-
#pre /\
197-
forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)
198-
).
199-
+ auto => /> &1 &2 H0 H1; split => k??.
200-
* rewrite initiE 1:/# => />.
201-
rewrite ifF 1:/#.
202-
apply H1 => //.
203-
* rewrite initiE 1:/# => />.
204-
by rewrite ifT 1:/# H0 get_to_list.
205-
206-
seq 1 0 : (
207-
NBytes.val key{2} = to_list key{1} /\
208-
in_0{2} = to_list in_0{1} /\
209-
padding{2} = to_list padding_buf{1} /\
210-
(forall (k : int), 0 <= k < 32 => buf{1}.[k] = nth witness padding{2} k) /\
211-
(forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)) /\
212-
aux_0{1} = in_0{1}
213-
).
214-
215-
+ ecall {1} (_x_memcpy_u8u8_64_post in_0{1}); auto => /> /#.
216-
seq 1 0 : (
217-
NBytes.val key{2} = to_list key{1} /\
218-
in_0{2} = to_list in_0{1} /\
219-
size in_0{2} = 64 /\
220-
padding{2} = to_list padding_buf{1} /\
221-
(forall (k : int), 0 <= k < 32 => buf{1}.[k] = nth witness padding{2} k) /\
222-
(forall (k : int), 32 <= k < 64 => buf{1}.[k] = nth witness (NBytes.val key{2}) (k - 32)) /\
223-
(forall (k : int), 64 <= k < 128 => buf{1}.[k] = nth witness in_0{2} (k - 64))
224-
).
225-
+ auto => /> &1 &2 H0 H1 H2; do split.
226-
* by rewrite size_to_list.
227-
* move => k??.
228-
rewrite initiE 1:/# => />.
229-
rewrite ifF 1:/#.
230-
apply H1 => //.
231-
* move => k??.
232-
rewrite initiE 1:/# => />.
233-
rewrite ifF 1:/#.
234-
apply H2 => //.
235-
* move => k??.
236-
rewrite initiE 1:/# => />.
237-
by rewrite ifT 1:/#.
238-
239-
auto => /> &1 &2 H0 H1 H2 H3 H4.
240-
241-
apply (eq_from_nth witness).
242-
+ rewrite !size_cat H0 !size_to_list //=.
243-
244-
rewrite !size_cat H0 !size_to_list //= => i?.
165+
auto => /> &1 &2 H0 H1; apply (eq_from_nth witness); rewrite !size_cat H0 !size_to_list //= => i?.
245166
case (0 <= i < 32).
246167
+ move => ?.
247-
rewrite nth_cat !size_cat !size_to_list //= ifT 1:/#.
248-
rewrite nth_cat !size_to_list //= ifT /#.
168+
rewrite nth_cat !size_cat !size_to_list ifT 1:/#.
169+
by rewrite nth_cat !size_to_list //= ifT 1:/# initiE //= ifF 1:/# initiE //= ifF 1:/# H1.
249170
case (32 <= i < 64).
250171
+ move => ?_.
251172
rewrite nth_cat !size_cat !size_to_list //= ifT 1:/#.
252173
rewrite nth_cat !size_to_list //= ifF 1:/#.
253-
rewrite -!get_to_list -H0 /#.
174+
rewrite initiE //= ifF 1:/# initiE /#.
254175
move => ??.
255-
rewrite nth_cat !size_cat !size_to_list //= ifF /#.
176+
rewrite nth_cat !size_cat !size_to_list //= ifF 1:/# initiE //= ifT 1:/#.
177+
rewrite initiE 1:/# /get8 initiE 1:/# /= /copy_64 initiE 1:/# /= bits8E /= wordP => j?.
178+
rewrite initiE //= get64E pack8E initiE 1:/# /= initiE 1:/# /= initiE /#.
256179
qed.
257180

258181
op merge_nbytes_to_array (a b : nbytes) : W8.t Array64.t =
@@ -288,11 +211,9 @@ proc => /=.
288211
seq 3 0 : #pre; first by auto.
289212

290213
seq 1 1 : (#pre /\ padding{2} = to_list aux{1} /\ size padding{2} = 32).
291-
+ call {1} (ull_to_bytes_32_correct W64.one).
292-
auto => /> H result ->.
293-
split.
294-
- by rewrite /rand_hash_padding plen.
295-
- rewrite size_toByte_64 /#.
214+
+ outline {1} [1] { aux <@ M(Syscall).bytes_32__ull_to_bytes (Array32.init (fun (i_0 : int) => buf.[0 + i_0]), W64.one); }.
215+
call {1} (ull_to_bytes_32_correct (of_int 1)%W64).
216+
auto => /> ??->; smt(W64toBytes_ext_toByte_64 size_toByte_64).
296217

297218
swap {1} [2..3] -1.
298219

@@ -364,9 +285,8 @@ seq 11 6 : (
364285
sub addr{1} 0 7 = sub a1 0 7 /\
365286
to_list buf{1} = padding{2} ++ (NBytes.val key{2}) ++ bytexor ((NBytes.val _left{2}) ++ (NBytes.val _right{2})) ((NBytes.val bitmask_0{2}) ++ (NBytes.val bitmask_1{2}))
366287
); last first.
367-
+ inline {1} M(Syscall)._core_hash_128.
368-
wp.
369-
ecall {1} (hash_128 in_00{1}).
288+
+ wp.
289+
ecall {1} (hash_128_ buf{1}).
370290
auto => /> &1 &2 ??? ->.
371291
split; last by smt(sub_k).
372292
apply nbytes_eq.
@@ -577,7 +497,7 @@ require import Bytes.
577497

578498
lemma p_write_buf_ptr mem (ptr o : W64.t) (buf : W8.t Array32.t) :
579499
phoare [
580-
M(Syscall).__memcpy_u8pu8_32 :
500+
M(Syscall).memcpy_u8pu8_n____memcpy_u8pu8 :
581501
0 <= to_uint ptr + to_uint o + 32 < W64.max_uint /\
582502
Glob.mem = mem /\
583503
arg = (ptr, o, buf)
@@ -696,7 +616,8 @@ seq 1 1 : (
696616
to_list buf{1} = padding{2} /\
697617
padding{2} = toByte_64 H_msg_padding_val n
698618
).
699-
+ call {1} (ull_to_bytes_32_correct ((of_int 2)%W64)); auto => /> ?????->.
619+
+ outline {1} [1] { buf <@ M(Syscall).bytes_32__ull_to_bytes (buf, W64.of_int 2); }.
620+
call {1} (ull_to_bytes_32_correct ((of_int 2)%W64)); auto => /> ?????->.
700621
apply (eq_from_nth witness); first by rewrite !size_toByte_64 //#.
701622
rewrite size_W64toBytes_ext // => j?.
702623
rewrite /toByte_64 /W64toBytes_ext; do congr => /#.
@@ -713,11 +634,9 @@ seq 2 0 : (
713634
).
714635
+ inline {1} 2; inline {1} 8.
715636
sp; wp.
637+
outline {1} [1] { (out0, offset1) <@ M(Syscall).memcpy_u8pu8_n____memcpy_u8pu8 (out0, offset1, in_00); }.
716638
ecall {1} (p_write_buf_ptr Glob.mem{1} out0{1} offset1{1} in_00{1}).
717-
skip => /> &hr H0 H1 H2 H3 H4*; do split.
718-
- smt().
719-
- smt(@W64 pow2_64).
720-
- smt().
639+
skip => /> &hr H0 H1 H2 H3 H4*; smt(@W64 pow2_64).
721640

722641
(* toByte(X, 32) || R || root || index || M */ *)
723642
seq 2 0 : (
@@ -809,7 +728,8 @@ seq 0 0 : (
809728
smt(@W64 pow2_64).
810729

811730
seq 1 0 : (#pre /\ to_list buf_n{1} = toByte_64 idx{1} 32).
812-
+ ecall {1} (ull_to_bytes_32_correct idx{1}); auto => /> ????H*.
731+
+ outline {1} [1] { buf_n <@ M(Syscall).bytes_32__ull_to_bytes(buf_n, idx); }.
732+
ecall {1} (ull_to_bytes_32_correct idx{1}); auto => /> ????H*.
813733
rewrite /XMSS_FULL_HEIGHT /= in H; smt().
814734

815735
seq 2 0 : (

0 commit comments

Comments
 (0)