chacha/asm/chacha*: ensure that zero length is handled (without crash).
RT#4305 Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
@@ -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.=<<___;
|
|||||||
|
|
||||||
.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.=<<___;
|
|||||||
.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.=<<___;
|
|||||||
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
|
|||||||
&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) {
|
|||||||
|
|
||||||
&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.=<<___;
|
|||||||
.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.=<<___;
|
|||||||
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
|
||||||
___
|
___
|
||||||
|
|||||||
Reference in New Issue
Block a user