Skip to content

Commit b552abc

Browse files
committed
aes: Use encrypt_iv_xor_block in encrypt_block sometimes.
1 parent 0dc90a5 commit b552abc

File tree

8 files changed

+8
-196
lines changed

8 files changed

+8
-196
lines changed

build.rs

-1
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,6 @@ fn prefix_all_symbols(pp: char, prefix_prefix: &str, prefix: &str) -> String {
868868
"OPENSSL_cpuid_setup",
869869
"OPENSSL_ia32cap_P",
870870
"aes_hw_ctr32_encrypt_blocks",
871-
"aes_hw_encrypt",
872871
"aes_hw_set_encrypt_key",
873872
"aes_nohw_ctr32_encrypt_blocks",
874873
"aes_nohw_encrypt",

crypto/fipsmodule/aes/asm/aesni-x86.pl

-20
Original file line numberDiff line numberDiff line change
@@ -192,26 +192,6 @@ sub aesni_generate1 # fully unrolled loop
192192
&function_end_B("_aesni_${p}rypt1");
193193
}
194194

195-
# void $PREFIX_encrypt (const void *inp,void *out,const AES_KEY *key);
196-
&aesni_generate1("enc") if (!$inline);
197-
&function_begin_B("${PREFIX}_encrypt");
198-
&record_function_hit(1);
199-
200-
&mov ("eax",&wparam(0));
201-
&mov ($key,&wparam(2));
202-
&movups ($inout0,&QWP(0,"eax"));
203-
&mov ($rounds,&DWP(240,$key));
204-
&mov ("eax",&wparam(1));
205-
if ($inline)
206-
{ &aesni_inline_generate1("enc"); }
207-
else
208-
{ &call ("_aesni_encrypt1"); }
209-
&pxor ($rndkey0,$rndkey0); # clear register bank
210-
&pxor ($rndkey1,$rndkey1);
211-
&movups (&QWP(0,"eax"),$inout0);
212-
&pxor ($inout0,$inout0);
213-
&ret ();
214-
&function_end_B("${PREFIX}_encrypt");
215195

216196
# _aesni_[en|de]cryptN are private interfaces, N denotes interleave
217197
# factor. Why 3x subroutine were originally used in loops? Even though

crypto/fipsmodule/aes/asm/aesni-x86_64.pl

-29
Original file line numberDiff line numberDiff line change
@@ -260,35 +260,6 @@ sub aesni_generate1 {
260260
aes${p}last $rndkey1,$inout
261261
___
262262
}}
263-
# void $PREFIX_[en|de]crypt (const void *inp,void *out,const AES_KEY *key);
264-
#
265-
{ my ($inp,$out,$key) = @_4args;
266-
267-
$code.=<<___;
268-
.globl ${PREFIX}_encrypt
269-
.type ${PREFIX}_encrypt,\@abi-omnipotent
270-
.align 16
271-
${PREFIX}_encrypt:
272-
.cfi_startproc
273-
_CET_ENDBR
274-
#ifdef BORINGSSL_DISPATCH_TEST
275-
.extern BORINGSSL_function_hit
276-
movb \$1,BORINGSSL_function_hit+1(%rip)
277-
#endif
278-
movups ($inp),$inout0 # load input
279-
mov 240($key),$rounds # key->rounds
280-
___
281-
&aesni_generate1("enc",$key,$rounds);
282-
$code.=<<___;
283-
pxor $rndkey0,$rndkey0 # clear register bank
284-
pxor $rndkey1,$rndkey1
285-
movups $inout0,($out) # output
286-
pxor $inout0,$inout0
287-
ret
288-
.cfi_endproc
289-
.size ${PREFIX}_encrypt,.-${PREFIX}_encrypt
290-
___
291-
}
292263

293264
# _aesni_[en|de]cryptN are private interfaces, N denotes interleave
294265
# factor. Why 3x subroutine were originally used in loops? Even though

crypto/fipsmodule/aes/asm/aesv8-armx.pl

-45
Original file line numberDiff line numberDiff line change
@@ -239,51 +239,6 @@
239239
___
240240
}}}
241241
{{{
242-
sub gen_block () {
243-
my $dir = shift;
244-
my ($e,$mc) = $dir eq "en" ? ("e","mc") : ("d","imc");
245-
my ($inp,$out,$key)=map("x$_",(0..2));
246-
my $rounds="w3";
247-
my ($rndkey0,$rndkey1,$inout)=map("q$_",(0..3));
248-
249-
$code.=<<___;
250-
.globl ${prefix}_${dir}crypt
251-
.type ${prefix}_${dir}crypt,%function
252-
.align 5
253-
${prefix}_${dir}crypt:
254-
AARCH64_VALID_CALL_TARGET
255-
ldr $rounds,[$key,#240]
256-
vld1.32 {$rndkey0},[$key],#16
257-
vld1.8 {$inout},[$inp]
258-
sub $rounds,$rounds,#2
259-
vld1.32 {$rndkey1},[$key],#16
260-
261-
.Loop_${dir}c:
262-
aes$e $inout,$rndkey0
263-
aes$mc $inout,$inout
264-
vld1.32 {$rndkey0},[$key],#16
265-
subs $rounds,$rounds,#2
266-
aes$e $inout,$rndkey1
267-
aes$mc $inout,$inout
268-
vld1.32 {$rndkey1},[$key],#16
269-
b.gt .Loop_${dir}c
270-
271-
aes$e $inout,$rndkey0
272-
aes$mc $inout,$inout
273-
vld1.32 {$rndkey0},[$key]
274-
aes$e $inout,$rndkey1
275-
veor $inout,$inout,$rndkey0
276-
277-
vst1.8 {$inout},[$out]
278-
ret
279-
.size ${prefix}_${dir}crypt,.-${prefix}_${dir}crypt
280-
___
281-
}
282-
&gen_block("en");
283-
# Decryption removed in *ring*.
284-
# &gen_block("de");
285-
}}}
286-
{{{
287242
my ($inp,$out,$len,$key,$ivp)=map("x$_",(0..4));
288243
my ($rounds,$cnt,$key_)=("w5","w6","x7");
289244
my ($ctr,$tctr0,$tctr1,$tctr2)=map("w$_",(8..10,12));

crypto/fipsmodule/aes/asm/vpaes-armv7.pl

-19
Original file line numberDiff line numberDiff line change
@@ -310,25 +310,6 @@
310310
vtbl.8 q0#hi, {q2}, q1#hi
311311
bx lr
312312
.size _vpaes_encrypt_core,.-_vpaes_encrypt_core
313-
314-
.globl vpaes_encrypt
315-
.type vpaes_encrypt,%function
316-
.align 4
317-
vpaes_encrypt:
318-
@ _vpaes_encrypt_core uses r8-r11. Round up to r7-r11 to maintain stack
319-
@ alignment.
320-
stmdb sp!, {r7-r11,lr}
321-
@ _vpaes_encrypt_core uses q4-q5 (d8-d11), which are callee-saved.
322-
vstmdb sp!, {d8-d11}
323-
324-
vld1.64 {q0}, [$inp]
325-
bl _vpaes_preheat
326-
bl _vpaes_encrypt_core
327-
vst1.64 {q0}, [$out]
328-
329-
vldmia sp!, {d8-d11}
330-
ldmia sp!, {r7-r11, pc} @ return
331-
.size vpaes_encrypt,.-vpaes_encrypt
332313
___
333314
}
334315
{

crypto/fipsmodule/aes/asm/vpaes-armv8.pl

-18
Original file line numberDiff line numberDiff line change
@@ -235,24 +235,6 @@
235235
ret
236236
.size _vpaes_encrypt_core,.-_vpaes_encrypt_core
237237

238-
.globl vpaes_encrypt
239-
.type vpaes_encrypt,%function
240-
.align 4
241-
vpaes_encrypt:
242-
AARCH64_SIGN_LINK_REGISTER
243-
stp x29,x30,[sp,#-16]!
244-
add x29,sp,#0
245-
246-
ld1 {v7.16b}, [$inp]
247-
bl _vpaes_encrypt_preheat
248-
bl _vpaes_encrypt_core
249-
st1 {v0.16b}, [$out]
250-
251-
ldp x29,x30,[sp],#16
252-
AARCH64_VALIDATE_LINK_REGISTER
253-
ret
254-
.size vpaes_encrypt,.-vpaes_encrypt
255-
256238
.type _vpaes_encrypt_2x,%function
257239
.align 4
258240
_vpaes_encrypt_2x:

crypto/fipsmodule/aes/asm/vpaes-x86_64.pl

-57
Original file line numberDiff line numberDiff line change
@@ -691,56 +691,6 @@
691691
ret
692692
.cfi_endproc
693693
.size ${PREFIX}_set_encrypt_key,.-${PREFIX}_set_encrypt_key
694-
695-
.globl ${PREFIX}_encrypt
696-
.type ${PREFIX}_encrypt,\@function,3
697-
.align 16
698-
${PREFIX}_encrypt:
699-
.cfi_startproc
700-
_CET_ENDBR
701-
#ifdef BORINGSSL_DISPATCH_TEST
702-
.extern BORINGSSL_function_hit
703-
movb \$1, BORINGSSL_function_hit+4(%rip)
704-
#endif
705-
___
706-
$code.=<<___ if ($win64);
707-
lea -0xb8(%rsp),%rsp
708-
movaps %xmm6,0x10(%rsp)
709-
movaps %xmm7,0x20(%rsp)
710-
movaps %xmm8,0x30(%rsp)
711-
movaps %xmm9,0x40(%rsp)
712-
movaps %xmm10,0x50(%rsp)
713-
movaps %xmm11,0x60(%rsp)
714-
movaps %xmm12,0x70(%rsp)
715-
movaps %xmm13,0x80(%rsp)
716-
movaps %xmm14,0x90(%rsp)
717-
movaps %xmm15,0xa0(%rsp)
718-
.Lenc_body:
719-
___
720-
$code.=<<___;
721-
movdqu (%rdi),%xmm0
722-
call _vpaes_preheat
723-
call _vpaes_encrypt_core
724-
movdqu %xmm0,(%rsi)
725-
___
726-
$code.=<<___ if ($win64);
727-
movaps 0x10(%rsp),%xmm6
728-
movaps 0x20(%rsp),%xmm7
729-
movaps 0x30(%rsp),%xmm8
730-
movaps 0x40(%rsp),%xmm9
731-
movaps 0x50(%rsp),%xmm10
732-
movaps 0x60(%rsp),%xmm11
733-
movaps 0x70(%rsp),%xmm12
734-
movaps 0x80(%rsp),%xmm13
735-
movaps 0x90(%rsp),%xmm14
736-
movaps 0xa0(%rsp),%xmm15
737-
lea 0xb8(%rsp),%rsp
738-
.Lenc_epilogue:
739-
___
740-
$code.=<<___;
741-
ret
742-
.cfi_endproc
743-
.size ${PREFIX}_encrypt,.-${PREFIX}_encrypt
744694
___
745695
{
746696
my ($inp,$out,$blocks,$key,$ivp)=("%rdi","%rsi","%rdx","%rcx","%r8");
@@ -1042,9 +992,6 @@
1042992
.rva .LSEH_end_${PREFIX}_set_encrypt_key
1043993
.rva .LSEH_info_${PREFIX}_set_encrypt_key
1044994

1045-
.rva .LSEH_begin_${PREFIX}_encrypt
1046-
.rva .LSEH_end_${PREFIX}_encrypt
1047-
.rva .LSEH_info_${PREFIX}_encrypt
1048995
.rva .LSEH_begin_${PREFIX}_ctr32_encrypt_blocks
1049996
.rva .LSEH_end_${PREFIX}_ctr32_encrypt_blocks
1050997
.rva .LSEH_info_${PREFIX}_ctr32_encrypt_blocks
@@ -1055,10 +1002,6 @@
10551002
.byte 9,0,0,0
10561003
.rva se_handler
10571004
.rva .Lenc_key_body,.Lenc_key_epilogue # HandlerData[]
1058-
.LSEH_info_${PREFIX}_encrypt:
1059-
.byte 9,0,0,0
1060-
.rva se_handler
1061-
.rva .Lenc_body,.Lenc_epilogue # HandlerData[]
10621005
.LSEH_info_${PREFIX}_ctr32_encrypt_blocks:
10631006
.byte 9,0,0,0
10641007
.rva se_handler

src/aead/aes.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -209,14 +209,15 @@ impl Key {
209209
pub fn encrypt_block(&self, a: Block, cpu_features: cpu::Features) -> Block {
210210
match detect_implementation(cpu_features) {
211211
#[cfg(any(target_arch = "aarch64", target_arch = "x86_64", target_arch = "x86"))]
212-
Implementation::HWAES => encrypt_block!(aes_hw_encrypt, a, self),
212+
Implementation::HWAES => self.encrypt_iv_xor_block(Iv(a), ZERO_BLOCK, cpu_features),
213213

214-
#[cfg(any(
215-
target_arch = "aarch64",
216-
target_arch = "arm",
217-
target_arch = "x86_64",
218-
target_arch = "x86"
219-
))]
214+
#[cfg(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"))]
215+
Implementation::VPAES_BSAES => {
216+
self.encrypt_iv_xor_block(Iv(a), ZERO_BLOCK, cpu_features)
217+
}
218+
219+
// `encrypt_iv_xor_block` calls `encrypt_block` on `target_arch = "x86"`.
220+
#[cfg(target_arch = "x86")]
220221
Implementation::VPAES_BSAES => encrypt_block!(vpaes_encrypt, a, self),
221222

222223
Implementation::NOHW => encrypt_block!(aes_nohw_encrypt, a, self),

0 commit comments

Comments
 (0)