@@ -8,25 +8,38 @@ import BitEncoding.BitChunking.
88from Jasmin require import JModel.
99
1010require import XMSS_IMPL Parameters.
11- require import Params Address BaseW Hash LTree.
11+ require import Params Address BaseW Hash LTree Bytes .
1212require import Correctness_Bytes Correctness_Mem Correctness_Address.
1313require 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
1921axiom 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+
2732axiom 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) :
7285proof.
7386rewrite /XMSS_N /XMSS_HASH_PADDING_PRF /XMSS_PADDING_LEN => [#] n_val pval plen.
7487proc => /=.
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 => /> /#.
7989seq 3 0 : #pre; 1 :auto .
80-
8190seq 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.
151119move => ??.
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 /#.
153126qed.
154127
155128lemma 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) :
167140proof.
168141rewrite /XMSS_N /XMSS_HASH_PADDING_PRF_KEYGEN /XMSS_PADDING_LEN => [#] n_val pval plen.
169142proc => // =.
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
174145seq 3 0 : #pre; 1 :auto .
175146
176147seq 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
181153seq 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?.
245166case (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 .
249170case (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 /#.
254175move => ??.
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 /#.
256179qed.
257180
258181op merge_nbytes_to_array (a b : nbytes) : W8.t Array64.t =
@@ -288,11 +211,9 @@ proc => /=.
288211seq 3 0 : #pre; first by auto .
289212
290213seq 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
297218swap {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
578498lemma 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 */ *)
723642seq 2 0 : (
@@ -809,7 +728,8 @@ seq 0 0 : (
809728 smt (@W64 pow2_64).
810729
811730seq 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
815735seq 2 0 : (
0 commit comments