Skip to content

Commit eaa8092

Browse files
tob-joecodex
andcommitted
Clear ML-KEM Keccak stack scratch
Wipe the AVX2, AArch64 scalar-hybrid, and Armv8.1-M MVE x4 Keccak scratch frames before returning, and refresh the covered HOL Light proof copies for the changed instruction streams. This keeps state-derived stack scratch from surviving past the permutation return path. Verification: - nix develop .#hol_light-cross-aarch64 -c make -B -C proofs/hol_light/aarch64 mlkem/keccak_f1600_x4_v8a_scalar_hybrid_aarch64_asm.correct - nix develop .#hol_light-cross-aarch64 -c make -B -C proofs/hol_light/aarch64 mlkem/keccak_f1600_x4_v8a_v84a_scalar_hybrid_aarch64_asm.correct - nix develop .#hol_light-cross-x86_64 -c make -B -C proofs/hol_light/x86_64 mlkem/keccak_f1600_x4_avx2_asm.correct Co-authored-by: Codex <codex@openai.com> Signed-off-by: Joe Doyle <joseph.doyle@trailofbits.com>
1 parent 22fda7f commit eaa8092

14 files changed

Lines changed: 205 additions & 25 deletions

dev/fips202/aarch64/src/keccak_f1600_x4_v8a_scalar_hybrid_aarch64_asm.S

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,15 @@
335335
add sp, sp, #(STACK_SIZE)
336336
.endm
337337

338+
.macro clear_stack
339+
eor v0.16b, v0.16b, v0.16b
340+
.set .Lclear_stack_offset, 0
341+
.rept STACK_SIZE / 16
342+
str q0, [sp, #.Lclear_stack_offset]
343+
.set .Lclear_stack_offset, .Lclear_stack_offset + 16
344+
.endr
345+
.endm
346+
338347
.macro eor5 dst, src0, src1, src2, src3, src4
339348
eor \dst, \src0, \src1
340349
eor \dst, \dst, \src2
@@ -2453,6 +2462,7 @@ keccak_f1600_x4_v8a_scalar_hybrid_done:
24532462

24542463
restore_vregs
24552464
restore_gprs
2465+
clear_stack
24562466
free_stack
24572467
ret
24582468

dev/fips202/aarch64/src/keccak_f1600_x4_v8a_v84a_scalar_hybrid_aarch64_asm.S

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,15 @@
354354
add sp, sp, #(STACK_SIZE)
355355
.endm
356356

357+
.macro clear_stack
358+
eor v0.16b, v0.16b, v0.16b
359+
.set .Lclear_stack_offset, 0
360+
.rept STACK_SIZE / 16
361+
str q0, [sp, #.Lclear_stack_offset]
362+
.set .Lclear_stack_offset, .Lclear_stack_offset + 16
363+
.endr
364+
.endm
365+
357366
.macro eor5 dst, src0, src1, src2, src3, src4
358367
eor \dst, \src0, \src1
359368
eor \dst, \dst, \src2
@@ -2284,6 +2293,7 @@ keccak_f1600_x4_v8a_v84a_scalar_hybrid_done:
22842293

22852294
restore_vregs
22862295
restore_gprs
2296+
clear_stack
22872297
free_stack
22882298
ret
22892299

dev/fips202/armv81m/src/keccak_f1600_x4_mve.S

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,14 @@ MLK_ASM_FN_SYMBOL(keccak_f1600_x4_mve_asm)
16261626

16271627
le lr, keccak_f1600_x4_mve_asm_roundstart
16281628
keccak_f1600_x4_mve_asm_roundend:
1629+
// Clear the 0x80-byte scratch frame before releasing it.
1630+
movs r0, #0
1631+
vdup.32 q0, r0
1632+
.set .Lclear_stack_offset, 0
1633+
.rept 8
1634+
vstrw.32 q0, [r13, #.Lclear_stack_offset]
1635+
.set .Lclear_stack_offset, .Lclear_stack_offset + 16
1636+
.endr
16291637
add sp, #8*16
16301638

16311639
vpop {d8-d15}

dev/fips202/x86_64/src/keccak_f1600_x4_avx2_asm.S

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,14 @@ MLK_ASM_FN_SYMBOL(keccak_f1600_x4_avx2_asm)
651651
vmovhpd %xmm3, 0x188(%rdi)
652652
vmovq %xmm15, 0x250(%rdi)
653653
vmovhpd %xmm15, 0x318(%rdi)
654+
655+
// Clear the scratch frame before releasing it.
656+
vpxor %ymm0, %ymm0, %ymm0
657+
.set .Lclear_stack_offset, 0
658+
.rept 24
659+
vmovdqu %ymm0, .Lclear_stack_offset(%rsp)
660+
.set .Lclear_stack_offset, .Lclear_stack_offset + 32
661+
.endr
654662
movq %r11, %rsp
655663
ret
656664

mlkem/src/fips202/native/aarch64/src/keccak_f1600_x4_v8a_scalar_hybrid_aarch64_asm.S

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,21 @@ Lkeccak_f1600_x4_v8a_scalar_hybrid_done:
10631063
ldp x29, x30, [sp, #0x80]
10641064
.cfi_restore x29
10651065
.cfi_restore x30
1066+
eor v0.16b, v0.16b, v0.16b
1067+
str q0, [sp]
1068+
str q0, [sp, #0x10]
1069+
str q0, [sp, #0x20]
1070+
str q0, [sp, #0x30]
1071+
str q0, [sp, #0x40]
1072+
str q0, [sp, #0x50]
1073+
str q0, [sp, #0x60]
1074+
str q0, [sp, #0x70]
1075+
str q0, [sp, #0x80]
1076+
str q0, [sp, #0x90]
1077+
str q0, [sp, #0xa0]
1078+
str q0, [sp, #0xb0]
1079+
str q0, [sp, #0xc0]
1080+
str q0, [sp, #0xd0]
10661081
add sp, sp, #0xe0
10671082
.cfi_adjust_cfa_offset -0xe0
10681083
ret

mlkem/src/fips202/native/aarch64/src/keccak_f1600_x4_v8a_v84a_scalar_hybrid_aarch64_asm.S

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,21 @@ Lkeccak_f1600_x4_v8a_v84a_scalar_hybrid_done:
972972
ldp x29, x30, [sp, #0x80]
973973
.cfi_restore x29
974974
.cfi_restore x30
975+
eor v0.16b, v0.16b, v0.16b
976+
str q0, [sp]
977+
str q0, [sp, #0x10]
978+
str q0, [sp, #0x20]
979+
str q0, [sp, #0x30]
980+
str q0, [sp, #0x40]
981+
str q0, [sp, #0x50]
982+
str q0, [sp, #0x60]
983+
str q0, [sp, #0x70]
984+
str q0, [sp, #0x80]
985+
str q0, [sp, #0x90]
986+
str q0, [sp, #0xa0]
987+
str q0, [sp, #0xb0]
988+
str q0, [sp, #0xc0]
989+
str q0, [sp, #0xd0]
975990
add sp, sp, #0xe0
976991
.cfi_adjust_cfa_offset -0xe0
977992
ret

mlkem/src/fips202/native/armv81m/src/keccak_f1600_x4_mve.S

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,13 @@ Lkeccak_f1600_x4_mve_asm_roundend_pre:
681681
le lr, Lkeccak_f1600_x4_mve_asm_roundstart @ imm = #-0x8c0
682682

683683
Lkeccak_f1600_x4_mve_asm_roundend:
684+
movs r0, #0x0
685+
vdup.32 q0, r0
686+
.set .Lkeccak_f1600_x4_mve_clear_stack_offset, 0
687+
.rept 8
688+
vstrw.32 q0, [sp, #.Lkeccak_f1600_x4_mve_clear_stack_offset]
689+
.set .Lkeccak_f1600_x4_mve_clear_stack_offset, .Lkeccak_f1600_x4_mve_clear_stack_offset + 16
690+
.endr
684691
add sp, #0x80
685692
.cfi_adjust_cfa_offset -0x80
686693
vpop {d8, d9, d10, d11, d12, d13, d14, d15}
@@ -705,7 +712,6 @@ Lkeccak_f1600_x4_mve_asm_roundend:
705712
.cfi_restore lr
706713
.cfi_adjust_cfa_offset -0x24
707714
.cfi_endproc
708-
nop
709715

710716
MLK_ASM_FN_SIZE(keccak_f1600_x4_mve_asm)
711717

mlkem/src/fips202/native/x86_64/src/keccak_f1600_x4_avx2_asm.S

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,12 @@ LLkeccak_f1600_x4_avx2:
473473
vmovhpd %xmm3, 0x188(%rdi)
474474
vmovq %xmm15, 0x250(%rdi)
475475
vmovhpd %xmm15, 0x318(%rdi)
476+
vpxor %ymm0, %ymm0, %ymm0
477+
.set .Lkeccak_f1600_x4_avx2_clear_stack_offset, 0
478+
.rept 24
479+
vmovdqu %ymm0, .Lkeccak_f1600_x4_avx2_clear_stack_offset(%rsp)
480+
.set .Lkeccak_f1600_x4_avx2_clear_stack_offset, .Lkeccak_f1600_x4_avx2_clear_stack_offset + 32
481+
.endr
476482
movq %r11, %rsp
477483
.cfi_def_cfa_register %rsp
478484
retq

proofs/hol_light/aarch64/mlkem/keccak_f1600_x4_v8a_scalar_hybrid_aarch64_asm.S

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,21 @@ Lkeccak_f1600_x4_v8a_scalar_hybrid_done:
10651065
ldp x29, x30, [sp, #0x80]
10661066
.cfi_restore x29
10671067
.cfi_restore x30
1068+
eor v0.16b, v0.16b, v0.16b
1069+
str q0, [sp]
1070+
str q0, [sp, #0x10]
1071+
str q0, [sp, #0x20]
1072+
str q0, [sp, #0x30]
1073+
str q0, [sp, #0x40]
1074+
str q0, [sp, #0x50]
1075+
str q0, [sp, #0x60]
1076+
str q0, [sp, #0x70]
1077+
str q0, [sp, #0x80]
1078+
str q0, [sp, #0x90]
1079+
str q0, [sp, #0xa0]
1080+
str q0, [sp, #0xb0]
1081+
str q0, [sp, #0xc0]
1082+
str q0, [sp, #0xd0]
10681083
add sp, sp, #0xe0
10691084
.cfi_adjust_cfa_offset -0xe0
10701085
ret

proofs/hol_light/aarch64/mlkem/keccak_f1600_x4_v8a_v84a_scalar_hybrid_aarch64_asm.S

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,21 @@ Lkeccak_f1600_x4_v8a_v84a_scalar_hybrid_done:
973973
ldp x29, x30, [sp, #0x80]
974974
.cfi_restore x29
975975
.cfi_restore x30
976+
eor v0.16b, v0.16b, v0.16b
977+
str q0, [sp]
978+
str q0, [sp, #0x10]
979+
str q0, [sp, #0x20]
980+
str q0, [sp, #0x30]
981+
str q0, [sp, #0x40]
982+
str q0, [sp, #0x50]
983+
str q0, [sp, #0x60]
984+
str q0, [sp, #0x70]
985+
str q0, [sp, #0x80]
986+
str q0, [sp, #0x90]
987+
str q0, [sp, #0xa0]
988+
str q0, [sp, #0xb0]
989+
str q0, [sp, #0xc0]
990+
str q0, [sp, #0xd0]
976991
add sp, sp, #0xe0
977992
.cfi_adjust_cfa_offset -0xe0
978993
ret

0 commit comments

Comments
 (0)