@@ -11,6 +11,7 @@ needs "arm/proofs/base.ml";;
11
11
12
12
needs " proofs/mlkem_specs.ml" ;;
13
13
needs " proofs/mlkem_utils.ml" ;;
14
+ needs " proofs/mlkem_zetas.ml" ;;
14
15
15
16
(* *** print_literal_from_elf "mlkem/mlkem_ntt.o";;
16
17
****)
@@ -343,95 +344,28 @@ let mlkem_ntt_mc = define_assert_from_elf
343
344
344
345
let MLKEM_NTT_EXEC = ARM_MK_EXEC_RULE mlkem_ntt_mc;;
345
346
346
- (* ------------------------------------------------------------------------- *)
347
- (* Data tables that are assumed in the precondition. *)
348
- (* ------------------------------------------------------------------------- *)
349
-
350
- let ntt_zetas_layer01234 = define
351
- `ntt_zetas_layer01234:int list =
352
- [-- &1600 ; -- &15749 ; -- &749 ; -- &7373 ; -- &40 ; -- &394 ; -- &687 ; -- &6762 ;
353
- &630 ; &6201 ; -- &1432 ; -- &14095 ; &848 ; &8347 ; &0 ; &0 ; &1062 ; &10453 ; &296 ;
354
- &2914 ; -- &882 ; -- &8682 ; &0 ; &0 ; -- &1410 ; -- &13879 ; &1339 ; &13180 ; &1476 ;
355
- &14529 ; &0 ; &0 ; &193 ; &1900 ; -- &283 ; -- &2786 ; &56 ; &551 ; &0 ; &0 ; &797 ;
356
- &7845 ; -- &1089 ; -- &10719 ; &1333 ; &13121 ; &0 ; &0 ; -- &543 ; -- &5345 ;
357
- &1426 ; &14036 ; -- &1235 ; -- &12156 ; &0 ; &0 ; -- &69 ; -- &679 ; &535 ; &5266 ;
358
- -- &447 ; -- &4400 ; &0 ; &0 ; &569 ; &5601 ; -- &936 ; -- &9213 ; -- &450 ;
359
- -- &4429 ; &0 ; &0 ; -- &1583 ; -- &15582 ; -- &1355 ; -- &13338 ; &821 ;
360
- &8081 ; &0 ; &0 ]`;;
361
-
362
- let ntt_zetas_layer56 = define
363
- `ntt_zetas_layer56:int list =
364
- [&289 ; &289 ; &331 ; &331 ; -- &76 ; -- &76 ; -- &1573 ; -- &1573 ; &2845 ;
365
- &2845 ; &3258 ; &3258 ; -- &748 ; -- &748 ; -- &15483 ; -- &15483 ; &17 ; &17 ;
366
- &583 ; &583 ; &1637 ; &1637 ; -- &1041 ; -- &1041 ; &167 ; &167 ; &5739 ;
367
- &5739 ; &16113 ; &16113 ; -- &10247 ; -- &10247 ; -- &568 ; -- &568 ;
368
- -- &680 ; -- &680 ; &723 ; &723 ; &1100 ; &1100 ; -- &5591 ; -- &5591 ; -- &6693 ;
369
- -- &6693 ; &7117 ; &7117 ; &10828 ; &10828 ; &1197 ; &1197 ; -- &1025 ;
370
- -- &1025 ; -- &1052 ; -- &1052 ; -- &1274 ; -- &1274 ; &11782 ; &11782 ;
371
- -- &10089 ; -- &10089 ; -- &10355 ; -- &10355 ; -- &12540 ; -- &12540 ; &1409 ;
372
- &1409 ; -- &48 ; -- &48 ; &756 ; &756 ; -- &314 ; -- &314 ; &13869 ; &13869 ;
373
- -- &472 ; -- &472 ; &7441 ; &7441 ; -- &3091 ; -- &3091 ; -- &667 ; -- &667 ;
374
- &233 ; &233 ; -- &1173 ; -- &1173 ; -- &279 ; -- &279 ; -- &6565 ; -- &6565 ;
375
- &2293 ; &2293 ; -- &11546 ; -- &11546 ; -- &2746 ; -- &2746 ; &650 ; &650 ;
376
- -- &1352 ; -- &1352 ; -- &816 ; -- &816 ; &632 ; &632 ; &6398 ; &6398 ;
377
- -- &13308 ; -- &13308 ; -- &8032 ; -- &8032 ; &6221 ; &6221 ; -- &1626 ;
378
- -- &1626 ; -- &540 ; -- &540 ; -- &1482 ; -- &1482 ; &1461 ; &1461 ; -- &16005 ;
379
- -- &16005 ; -- &5315 ; -- &5315 ; -- &14588 ; -- &14588 ; &14381 ; &14381 ;
380
- &1651 ; &1651 ; -- &1540 ; -- &1540 ; &952 ; &952 ; -- &642 ; -- &642 ;
381
- &16251 ; &16251 ; -- &15159 ; -- &15159 ; &9371 ; &9371 ; -- &6319 ;
382
- -- &6319 ; -- &464 ; -- &464 ; &33 ; &33 ; &1320 ; &1320 ; -- &1414 ; -- &1414 ;
383
- -- &4567 ; -- &4567 ; &325 ; &325 ; &12993 ; &12993 ; -- &13918 ; -- &13918 ;
384
- &939 ; &939 ; -- &892 ; -- &892 ; &733 ; &733 ; &268 ; &268 ; &9243 ; &9243 ;
385
- -- &8780 ; -- &8780 ; &7215 ; &7215 ; &2638 ; &2638 ; -- &1021 ; -- &1021 ;
386
- -- &941 ; -- &941 ; -- &992 ; -- &992 ; &641 ; &641 ; -- &10050 ; -- &10050 ;
387
- -- &9262 ; -- &9262 ; -- &9764 ; -- &9764 ; &6309 ; &6309 ; -- &1010 ; -- &1010 ;
388
- &1435 ; &1435 ; &807 ; &807 ; &452 ; &452 ; -- &9942 ; -- &9942 ; &14125 ;
389
- &14125 ; &7943 ; &7943 ; &4449 ; &4449 ; &1584 ; &1584 ; -- &1292 ; -- &1292 ;
390
- &375 ; &375 ; -- &1239 ; -- &1239 ; &15592 ; &15592 ; -- &12717 ; -- &12717 ;
391
- &3691 ; &3691 ; -- &12196 ; -- &12196 ; -- &1031 ; -- &1031 ; -- &109 ;
392
- -- &109 ; -- &780 ; -- &780 ; &1645 ; &1645 ; -- &10148 ; -- &10148 ; -- &1073 ;
393
- -- &1073 ; -- &7678 ; -- &7678 ; &16192 ; &16192 ; &1438 ; &1438 ; -- &461 ;
394
- -- &461 ; &1534 ; &1534 ; -- &927 ; -- &927 ; &14155 ; &14155 ; -- &4538 ;
395
- -- &4538 ; &15099 ; &15099 ; -- &9125 ; -- &9125 ; &1063 ; &1063 ; -- &556 ;
396
- -- &556 ; -- &1230 ; -- &1230 ; -- &863 ; -- &863 ; &10463 ; &10463 ; -- &5473 ;
397
- -- &5473 ; -- &12107 ; -- &12107 ; -- &8495 ; -- &8495 ; &319 ; &319 ; &757 ;
398
- &757 ; &561 ; &561 ; -- &735 ; -- &735 ; &3140 ; &3140 ; &7451 ; &7451 ; &5522 ;
399
- &5522 ; -- &7235 ; -- &7235 ; -- &682 ; -- &682 ; -- &712 ; -- &712 ; &1481 ;
400
- &1481 ; &648 ; &648 ; -- &6713 ; -- &6713 ; -- &7008 ; -- &7008 ; &14578 ;
401
- &14578 ; &6378 ; &6378 ; -- &525 ; -- &525 ; &403 ; &403 ; &1143 ; &1143 ;
402
- -- &554 ; -- &554 ; -- &5168 ; -- &5168 ; &3967 ; &3967 ; &11251 ; &11251 ;
403
- -- &5453 ; -- &5453 ; &1092 ; &1092 ; &1026 ; &1026 ; -- &1179 ; -- &1179 ; &886 ;
404
- &886 ; &10749 ; &10749 ; &10099 ; &10099 ; -- &11605 ; -- &11605 ; &8721 ;
405
- &8721 ; -- &855 ; -- &855 ; -- &219 ; -- &219 ; &1227 ; &1227 ; &910 ; &910 ;
406
- -- &8416 ; -- &8416 ; -- &2156 ; -- &2156 ; &12078 ; &12078 ; &8957 ; &8957 ;
407
- -- &1607 ; -- &1607 ; -- &1455 ; -- &1455 ; -- &1219 ; -- &1219 ; &885 ;
408
- &885 ; -- &15818 ; -- &15818 ; -- &14322 ; -- &14322 ; -- &11999 ;
409
- -- &11999 ; &8711 ; &8711 ; &1212 ; &1212 ; &1029 ; &1029 ; -- &394 ; -- &394 ;
410
- -- &1175 ; -- &1175 ; &11930 ; &11930 ; &10129 ; &10129 ; -- &3878 ; -- &3878 ;
411
- -- &11566 ; -- &11566 ]`;;
412
-
413
347
let ntt_constants = define
414
- `ntt_constants z_01234 z_56 s <=>
348
+ `ntt_constants z_12345 z_67 s <=>
415
349
(!i. i < 80
416
- ==> read(memory :> bytes16(word_add z_01234 (word(2 * i)))) s =
417
- iword(EL i ntt_zetas_layer01234 )) /\
350
+ ==> read(memory :> bytes16(word_add z_12345 (word(2 * i)))) s =
351
+ iword(EL i ntt_zetas_layer12345 )) /\
418
352
(!i. i < 384
419
- ==> read(memory :> bytes16(word_add z_56 (word(2 * i)))) s =
420
- iword(EL i ntt_zetas_layer56 ))`;;
353
+ ==> read(memory :> bytes16(word_add z_67 (word(2 * i)))) s =
354
+ iword(EL i ntt_zetas_layer67 ))`;;
421
355
422
356
(* ------------------------------------------------------------------------- *)
423
357
(* Correctness proof. *)
424
358
(* ------------------------------------------------------------------------- *)
425
359
426
360
let MLKEM_NTT_CORRECT = prove
427
- (`!a z_01234 z_56 x pc.
361
+ (`!a z_12345 z_67 x pc.
428
362
ALL (nonoverlapping (a,512 ))
429
- [(word pc,0x504); (z_01234 ,160 ); (z_56 ,768 )]
363
+ [(word pc,0x504); (z_12345 ,160 ); (z_67 ,768 )]
430
364
==> ensures arm
431
365
(\s. aligned_bytes_loaded s (word pc) mlkem_ntt_mc /\
432
366
read PC s = word (pc + 0x14) /\
433
- C_ARGUMENTS [a; z_01234; z_56 ] s /\
434
- ntt_constants z_01234 z_56 s /\
367
+ C_ARGUMENTS [a; z_12345; z_67 ] s /\
368
+ ntt_constants z_12345 z_67 s /\
435
369
!i. i < 256
436
370
==> read(memory :> bytes16(word_add a (word(2 * i)))) s =
437
371
x i)
@@ -446,7 +380,7 @@ let MLKEM_NTT_CORRECT = prove
446
380
MAYCHANGE [Q8; Q9; Q10; Q11; Q12; Q13; Q14; Q15] ,,
447
381
MAYCHANGE [memory :> bytes(a,512 )])`,
448
382
MAP_EVERY X_GEN_TAC
449
- [`a:int64`; `z_01234 :int64`; `z_56 :int64`; `x:num->int16`; `pc:num`] THEN
383
+ [`a:int64`; `z_12345 :int64`; `z_67 :int64`; `x:num->int16`; `pc:num`] THEN
450
384
REWRITE_TAC[MAYCHANGE_REGS_AND_FLAGS_PERMITTED_BY_ABI; C_ARGUMENTS;
451
385
NONOVERLAPPING_CLAUSES; ALL] THEN
452
386
DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN
@@ -456,7 +390,7 @@ let MLKEM_NTT_CORRECT = prove
456
390
REWRITE_TAC[ntt_constants] THEN
457
391
CONV_TAC(RATOR_CONV(LAND_CONV(ONCE_DEPTH_CONV
458
392
(EXPAND_CASES_CONV THENC ONCE_DEPTH_CONV NUM_MULT_CONV)))) THEN
459
- REWRITE_TAC[ntt_zetas_layer01234; ntt_zetas_layer56 ] THEN
393
+ REWRITE_TAC[ntt_zetas_layer12345; ntt_zetas_layer67 ] THEN
460
394
CONV_TAC(ONCE_DEPTH_CONV EL_CONV) THEN
461
395
CONV_TAC(ONCE_DEPTH_CONV WORD_IWORD_CONV) THEN REWRITE_TAC[WORD_ADD_0] THEN
462
396
ENSURES_INIT_TAC " s0" THEN
@@ -466,8 +400,8 @@ let MLKEM_NTT_CORRECT = prove
466
400
***)
467
401
468
402
MEMORY_128_FROM_16_TAC " a" 32 THEN
469
- MEMORY_128_FROM_16_TAC " z_01234 " 10 THEN
470
- MEMORY_128_FROM_16_TAC " z_56 " 48 THEN
403
+ MEMORY_128_FROM_16_TAC " z_12345 " 10 THEN
404
+ MEMORY_128_FROM_16_TAC " z_67 " 48 THEN
471
405
ASM_REWRITE_TAC[WORD_ADD_0] THEN CONV_TAC WORD_REDUCE_CONV THEN
472
406
DISCARD_MATCHING_ASSUMPTIONS [`read (memory :> bytes16 a) s = x`] THEN
473
407
REPEAT STRIP_TAC THEN
@@ -523,19 +457,19 @@ let MLKEM_NTT_CORRECT = prove
523
457
(* ** Subroutine form, somewhat messy elaboration of the usual wrapper ***)
524
458
525
459
let MLKEM_NTT_SUBROUTINE_CORRECT = prove
526
- (`!a z_01234 z_56 x pc stackpointer returnaddress.
460
+ (`!a z_12345 z_67 x pc stackpointer returnaddress.
527
461
aligned 16 stackpointer /\
528
462
ALLPAIRS nonoverlapping
529
463
[(a,512 ); (word_sub stackpointer (word 64 ),64 )]
530
- [(word pc,0x504); (z_01234 ,160 ); (z_56 ,768 )] /\
464
+ [(word pc,0x504); (z_12345 ,160 ); (z_67 ,768 )] /\
531
465
nonoverlapping (a,512 ) (word_sub stackpointer (word 64 ),64 )
532
466
==> ensures arm
533
467
(\s. aligned_bytes_loaded s (word pc) mlkem_ntt_mc /\
534
468
read PC s = word pc /\
535
469
read SP s = stackpointer /\
536
470
read X30 s = returnaddress /\
537
- C_ARGUMENTS [a; z_01234; z_56 ] s /\
538
- ntt_constants z_01234 z_56 s /\
471
+ C_ARGUMENTS [a; z_12345; z_67 ] s /\
472
+ ntt_constants z_12345 z_67 s /\
539
473
!i. i < 256
540
474
==> read(memory :> bytes16(word_add a (word(2 * i)))) s =
541
475
x i)
0 commit comments