提交 622a531c 编写于 作者: A Andy Polyakov

chacha/asm/chacha*: ensure that zero length is handled (without crash).

RT#4305
Reviewed-by: NRich Salz <rsalz@openssl.org>
上级 29880e97
...@@ -200,6 +200,12 @@ ChaCha20_ctr32: ...@@ -200,6 +200,12 @@ ChaCha20_ctr32:
#else #else
adr r14,.LChaCha20_ctr32 adr r14,.LChaCha20_ctr32
#endif #endif
cmp r2,#0 @ len==0?
#ifdef __thumb2__
itt eq
#endif
addeq sp,sp,#4*3
beq .Lno_data
#if __ARM_MAX_ARCH__>=7 #if __ARM_MAX_ARCH__>=7
cmp r2,#192 @ test len cmp r2,#192 @ test len
bls .Lshort bls .Lshort
...@@ -605,6 +611,7 @@ $code.=<<___; ...@@ -605,6 +611,7 @@ $code.=<<___;
.Ldone: .Ldone:
add sp,sp,#4*(32+3) add sp,sp,#4*(32+3)
.Lno_data:
ldmia sp!,{r4-r11,pc} ldmia sp!,{r4-r11,pc}
.size ChaCha20_ctr32,.-ChaCha20_ctr32 .size ChaCha20_ctr32,.-ChaCha20_ctr32
___ ___
......
...@@ -140,6 +140,7 @@ $code.=<<___; ...@@ -140,6 +140,7 @@ $code.=<<___;
.type ChaCha20_ctr32,\@function .type ChaCha20_ctr32,\@function
.align 32 .align 32
ChaCha20_ctr32: ChaCha20_ctr32:
cl${g}ije $len,0,.Lno_data # $len==0?
a${g}hi $len,-64 a${g}hi $len,-64
l${g}hi %r1,-$frame l${g}hi %r1,-$frame
stm${g} %r6,%r15,`6*$SIZE_T`($sp) stm${g} %r6,%r15,`6*$SIZE_T`($sp)
...@@ -271,6 +272,7 @@ $code.=<<___; ...@@ -271,6 +272,7 @@ $code.=<<___;
stmg %r0,%r3,$stdframe+4*12($sp) stmg %r0,%r3,$stdframe+4*12($sp)
lm${g} %r6,%r15,`$frame+6*$SIZE_T`($sp) lm${g} %r6,%r15,`$frame+6*$SIZE_T`($sp)
.Lno_data:
br %r14 br %r14
.align 16 .align 16
......
...@@ -123,6 +123,9 @@ my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous ...@@ -123,6 +123,9 @@ my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous
&static_label("pic_point"); &static_label("pic_point");
&function_begin("ChaCha20_ctr32"); &function_begin("ChaCha20_ctr32");
&xor ("eax","eax");
&cmp ("eax",&wparam(2)); # len==0?
&je (&label("no_data"));
if ($xmm) { if ($xmm) {
&call (&label("pic_point")); &call (&label("pic_point"));
&set_label("pic_point"); &set_label("pic_point");
...@@ -356,6 +359,7 @@ if ($xmm) { ...@@ -356,6 +359,7 @@ if ($xmm) {
&set_label("done"); &set_label("done");
&stack_pop(33); &stack_pop(33);
&set_label("no_data");
&function_end("ChaCha20_ctr32"); &function_end("ChaCha20_ctr32");
if ($xmm) { if ($xmm) {
......
...@@ -219,6 +219,8 @@ $code.=<<___; ...@@ -219,6 +219,8 @@ $code.=<<___;
.type ChaCha20_ctr32,\@function,5 .type ChaCha20_ctr32,\@function,5
.align 64 .align 64
ChaCha20_ctr32: ChaCha20_ctr32:
cmp \$0,$len
je .Lno_data
mov OPENSSL_ia32cap_P+4(%rip),%r10 mov OPENSSL_ia32cap_P+4(%rip),%r10
test \$`1<<(41-32)`,%r10d test \$`1<<(41-32)`,%r10d
jnz .LChaCha20_ssse3 jnz .LChaCha20_ssse3
...@@ -375,6 +377,7 @@ $code.=<<___; ...@@ -375,6 +377,7 @@ $code.=<<___;
pop %r12 pop %r12
pop %rbp pop %rbp
pop %rbx pop %rbx
.Lno_data:
ret ret
.size ChaCha20_ctr32,.-ChaCha20_ctr32 .size ChaCha20_ctr32,.-ChaCha20_ctr32
___ ___
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册