Use SEH directives for aes_hw_set_encrypt_key and aes_hw_set_decrypt_key
These functions don't use the calling convention conversion, so we can
use the automatic things. This will make it a little easier, in the
commit, to split these into a few functions.
Note this only works because aes_hw_set_encrypt_key and
aes_hw_set_decrypt_key are the last two functions in this file. We
cannot interleave automatic and handwritten SEH tables.
This also lets us remove some hand-encoded instructions. When OpenSSL
handwrites SEH tables, they had to hand-encode instructions just in case
the assembler picked a different length encoding. The synthesized tables
fill in computed offsets.
Bug: 259
Change-Id: Ic94cdceeab1378ef7afb217de7643a6bb75ae1a2
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/68687
Auto-Submit: David Benjamin <davidben@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/crypto/fipsmodule/aes/aes_test.cc b/crypto/fipsmodule/aes/aes_test.cc
index 75a5aed..d4a458b 100644
--- a/crypto/fipsmodule/aes/aes_test.cc
+++ b/crypto/fipsmodule/aes/aes_test.cc
@@ -333,7 +333,7 @@
}
if (hwaes_capable()) {
- ASSERT_EQ(CHECK_ABI(aes_hw_set_encrypt_key, kKey, bits, &key), 0);
+ ASSERT_EQ(CHECK_ABI_SEH(aes_hw_set_encrypt_key, kKey, bits, &key), 0);
CHECK_ABI(aes_hw_encrypt, block, block, &key);
for (size_t blocks : block_counts) {
SCOPED_TRACE(blocks);
@@ -346,7 +346,7 @@
#endif
}
- ASSERT_EQ(CHECK_ABI(aes_hw_set_decrypt_key, kKey, bits, &key), 0);
+ ASSERT_EQ(CHECK_ABI_SEH(aes_hw_set_decrypt_key, kKey, bits, &key), 0);
CHECK_ABI(aes_hw_decrypt, block, block, &key);
for (size_t blocks : block_counts) {
SCOPED_TRACE(blocks);
diff --git a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
index a8abb4d..6a85862 100644
--- a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
+++ b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
@@ -3190,9 +3190,12 @@
.align 16
${PREFIX}_set_decrypt_key:
.cfi_startproc
+.seh_startproc
_CET_ENDBR
- .byte 0x48,0x83,0xEC,0x08 # sub rsp,8
+ sub \$8,%rsp
.cfi_adjust_cfa_offset 8
+.seh_stackalloc 8
+.seh_endprologue
call __aesni_set_encrypt_key
shl \$4,$bits # rounds-1 after _aesni_set_encrypt_key
test %eax,%eax
@@ -3228,7 +3231,7 @@
.cfi_adjust_cfa_offset -8
ret
.cfi_endproc
-.LSEH_end_set_decrypt_key:
+.seh_endproc
.size ${PREFIX}_set_decrypt_key,.-${PREFIX}_set_decrypt_key
___
@@ -3263,12 +3266,15 @@
${PREFIX}_set_encrypt_key:
__aesni_set_encrypt_key:
.cfi_startproc
+.seh_startproc
_CET_ENDBR
#ifdef BORINGSSL_DISPATCH_TEST
movb \$1,BORINGSSL_function_hit+3(%rip)
#endif
- .byte 0x48,0x83,0xEC,0x08 # sub rsp,8
+ sub \$8,%rsp
.cfi_adjust_cfa_offset 8
+.seh_stackalloc 8
+.seh_endprologue
mov \$-1,%rax
test $inp,$inp
jz .Lenc_key_ret
@@ -3565,7 +3571,7 @@
.cfi_adjust_cfa_offset -8
ret
.cfi_endproc
-.LSEH_end_set_encrypt_key:
+.seh_endproc
.align 16
.Lkey_expansion_128:
@@ -3926,14 +3932,6 @@
.rva .LSEH_begin_${PREFIX}_cbc_encrypt
.rva .LSEH_end_${PREFIX}_cbc_encrypt
.rva .LSEH_info_cbc
-
- .rva ${PREFIX}_set_decrypt_key
- .rva .LSEH_end_set_decrypt_key
- .rva .LSEH_info_key
-
- .rva ${PREFIX}_set_encrypt_key
- .rva .LSEH_end_set_encrypt_key
- .rva .LSEH_info_key
.section .xdata
.align 8
___
@@ -3951,9 +3949,6 @@
.LSEH_info_cbc:
.byte 9,0,0,0
.rva cbc_se_handler
-.LSEH_info_key:
- .byte 0x01,0x04,0x01,0x00
- .byte 0x04,0x02,0x00,0x00 # sub rsp,8
___
}
diff --git a/gen/bcm/aesni-x86_64-apple.S b/gen/bcm/aesni-x86_64-apple.S
index f3505b9..c5c862d 100644
--- a/gen/bcm/aesni-x86_64-apple.S
+++ b/gen/bcm/aesni-x86_64-apple.S
@@ -1911,8 +1911,11 @@
.p2align 4
_aes_hw_set_decrypt_key:
+
_CET_ENDBR
-.byte 0x48,0x83,0xEC,0x08
+ subq $8,%rsp
+
+
call __aesni_set_encrypt_key
shll $4,%esi
@@ -1949,7 +1952,7 @@
ret
-L$SEH_end_set_decrypt_key:
+
.globl _aes_hw_set_encrypt_key
.private_extern _aes_hw_set_encrypt_key
@@ -1958,11 +1961,14 @@
_aes_hw_set_encrypt_key:
__aesni_set_encrypt_key:
+
_CET_ENDBR
#ifdef BORINGSSL_DISPATCH_TEST
movb $1,_BORINGSSL_function_hit+3(%rip)
#endif
-.byte 0x48,0x83,0xEC,0x08
+ subq $8,%rsp
+
+
movq $-1,%rax
testq %rdi,%rdi
@@ -2260,7 +2266,7 @@
ret
-L$SEH_end_set_encrypt_key:
+
.p2align 4
L$key_expansion_128:
diff --git a/gen/bcm/aesni-x86_64-linux.S b/gen/bcm/aesni-x86_64-linux.S
index 68742fb..87c1a13 100644
--- a/gen/bcm/aesni-x86_64-linux.S
+++ b/gen/bcm/aesni-x86_64-linux.S
@@ -1913,9 +1913,12 @@
.align 16
aes_hw_set_decrypt_key:
.cfi_startproc
+
_CET_ENDBR
-.byte 0x48,0x83,0xEC,0x08
+ subq $8,%rsp
.cfi_adjust_cfa_offset 8
+
+
call __aesni_set_encrypt_key
shll $4,%esi
testl %eax,%eax
@@ -1951,7 +1954,7 @@
.cfi_adjust_cfa_offset -8
ret
.cfi_endproc
-.LSEH_end_set_decrypt_key:
+
.size aes_hw_set_decrypt_key,.-aes_hw_set_decrypt_key
.globl aes_hw_set_encrypt_key
.hidden aes_hw_set_encrypt_key
@@ -1960,12 +1963,15 @@
aes_hw_set_encrypt_key:
__aesni_set_encrypt_key:
.cfi_startproc
+
_CET_ENDBR
#ifdef BORINGSSL_DISPATCH_TEST
movb $1,BORINGSSL_function_hit+3(%rip)
#endif
-.byte 0x48,0x83,0xEC,0x08
+ subq $8,%rsp
.cfi_adjust_cfa_offset 8
+
+
movq $-1,%rax
testq %rdi,%rdi
jz .Lenc_key_ret
@@ -2262,7 +2268,7 @@
.cfi_adjust_cfa_offset -8
ret
.cfi_endproc
-.LSEH_end_set_encrypt_key:
+
.align 16
.Lkey_expansion_128:
diff --git a/gen/bcm/aesni-x86_64-win.asm b/gen/bcm/aesni-x86_64-win.asm
index 6c5d9ad..9e12312 100644
--- a/gen/bcm/aesni-x86_64-win.asm
+++ b/gen/bcm/aesni-x86_64-win.asm
@@ -2017,9 +2017,12 @@
ALIGN 16
aes_hw_set_decrypt_key:
+$L$SEH_begin_aes_hw_set_decrypt_key_1:
_CET_ENDBR
- DB 0x48,0x83,0xEC,0x08
+ sub rsp,8
+$L$SEH_prologue_aes_hw_set_decrypt_key_2:
+$L$SEH_endprologue_aes_hw_set_decrypt_key_3:
call __aesni_set_encrypt_key
shl edx,4
test eax,eax
@@ -2055,7 +2058,7 @@
ret
-$L$SEH_end_set_decrypt_key:
+$L$SEH_end_aes_hw_set_decrypt_key_4:
global aes_hw_set_encrypt_key
@@ -2063,12 +2066,15 @@
aes_hw_set_encrypt_key:
__aesni_set_encrypt_key:
+$L$SEH_begin_aes_hw_set_encrypt_key_1:
_CET_ENDBR
%ifdef BORINGSSL_DISPATCH_TEST
mov BYTE[((BORINGSSL_function_hit+3))],1
%endif
- DB 0x48,0x83,0xEC,0x08
+ sub rsp,8
+$L$SEH_prologue_aes_hw_set_encrypt_key_2:
+$L$SEH_endprologue_aes_hw_set_encrypt_key_3:
mov rax,-1
test rcx,rcx
jz NEAR $L$enc_key_ret
@@ -2365,7 +2371,7 @@
ret
-$L$SEH_end_set_encrypt_key:
+$L$SEH_end_aes_hw_set_encrypt_key_4:
ALIGN 16
$L$key_expansion_128:
@@ -2646,14 +2652,6 @@
DD $L$SEH_begin_aes_hw_cbc_encrypt wrt ..imagebase
DD $L$SEH_end_aes_hw_cbc_encrypt wrt ..imagebase
DD $L$SEH_info_cbc wrt ..imagebase
-
- DD aes_hw_set_decrypt_key wrt ..imagebase
- DD $L$SEH_end_set_decrypt_key wrt ..imagebase
- DD $L$SEH_info_key wrt ..imagebase
-
- DD aes_hw_set_encrypt_key wrt ..imagebase
- DD $L$SEH_end_set_encrypt_key wrt ..imagebase
- DD $L$SEH_info_key wrt ..imagebase
section .xdata rdata align=8
ALIGN 8
$L$SEH_info_ecb:
@@ -2667,9 +2665,37 @@
$L$SEH_info_cbc:
DB 9,0,0,0
DD cbc_se_handler wrt ..imagebase
-$L$SEH_info_key:
- DB 0x01,0x04,0x01,0x00
- DB 0x04,0x02,0x00,0x00
+section .pdata
+ALIGN 4
+ DD $L$SEH_begin_aes_hw_set_decrypt_key_1 wrt ..imagebase
+ DD $L$SEH_end_aes_hw_set_decrypt_key_4 wrt ..imagebase
+ DD $L$SEH_info_aes_hw_set_decrypt_key_0 wrt ..imagebase
+
+ DD $L$SEH_begin_aes_hw_set_encrypt_key_1 wrt ..imagebase
+ DD $L$SEH_end_aes_hw_set_encrypt_key_4 wrt ..imagebase
+ DD $L$SEH_info_aes_hw_set_encrypt_key_0 wrt ..imagebase
+
+
+section .xdata
+ALIGN 4
+$L$SEH_info_aes_hw_set_decrypt_key_0:
+ DB 1
+ DB $L$SEH_endprologue_aes_hw_set_decrypt_key_3-$L$SEH_begin_aes_hw_set_decrypt_key_1
+ DB 1
+ DB 0
+ DB $L$SEH_prologue_aes_hw_set_decrypt_key_2-$L$SEH_begin_aes_hw_set_decrypt_key_1
+ DB 2
+
+ DW 0
+$L$SEH_info_aes_hw_set_encrypt_key_0:
+ DB 1
+ DB $L$SEH_endprologue_aes_hw_set_encrypt_key_3-$L$SEH_begin_aes_hw_set_encrypt_key_1
+ DB 1
+ DB 0
+ DB $L$SEH_prologue_aes_hw_set_encrypt_key_2-$L$SEH_begin_aes_hw_set_encrypt_key_1
+ DB 2
+
+ DW 0
%else
; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738
ret