diff options
author | Andy Polyakov <appro@openssl.org> | 2016-02-13 17:13:53 +0100 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2016-02-14 21:22:42 +0100 |
commit | 622a531c18187e3c59a7ab2d32ab990b397aafc2 (patch) | |
tree | 92911d60769621318bfbafd113b7a018a49fd933 /crypto/chacha | |
parent | 29880e97104e5c88887e502a1d0ff570b646ec1b (diff) |
chacha/asm/chacha*: ensure that zero length is handled (without crash).
RT#4305
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/chacha')
-rwxr-xr-x | crypto/chacha/asm/chacha-armv4.pl | 7 | ||||
-rwxr-xr-x | crypto/chacha/asm/chacha-s390x.pl | 2 | ||||
-rwxr-xr-x | crypto/chacha/asm/chacha-x86.pl | 4 | ||||
-rwxr-xr-x | crypto/chacha/asm/chacha-x86_64.pl | 3 |
4 files changed, 16 insertions, 0 deletions
diff --git a/crypto/chacha/asm/chacha-armv4.pl b/crypto/chacha/asm/chacha-armv4.pl index 4d234b7275..55ebc9e586 100755 --- a/crypto/chacha/asm/chacha-armv4.pl +++ b/crypto/chacha/asm/chacha-armv4.pl @@ -200,6 +200,12 @@ ChaCha20_ctr32: #else adr r14,.LChaCha20_ctr32 #endif + cmp r2,#0 @ len==0? +#ifdef __thumb2__ + itt eq +#endif + addeq sp,sp,#4*3 + beq .Lno_data #if __ARM_MAX_ARCH__>=7 cmp r2,#192 @ test len bls .Lshort @@ -605,6 +611,7 @@ $code.=<<___; .Ldone: add sp,sp,#4*(32+3) +.Lno_data: ldmia sp!,{r4-r11,pc} .size ChaCha20_ctr32,.-ChaCha20_ctr32 ___ diff --git a/crypto/chacha/asm/chacha-s390x.pl b/crypto/chacha/asm/chacha-s390x.pl index 8a09706543..e637dc2f4f 100755 --- a/crypto/chacha/asm/chacha-s390x.pl +++ b/crypto/chacha/asm/chacha-s390x.pl @@ -140,6 +140,7 @@ $code.=<<___; .type ChaCha20_ctr32,\@function .align 32 ChaCha20_ctr32: + cl${g}ije $len,0,.Lno_data # $len==0? a${g}hi $len,-64 l${g}hi %r1,-$frame stm${g} %r6,%r15,`6*$SIZE_T`($sp) @@ -271,6 +272,7 @@ $code.=<<___; stmg %r0,%r3,$stdframe+4*12($sp) lm${g} %r6,%r15,`$frame+6*$SIZE_T`($sp) +.Lno_data: br %r14 .align 16 diff --git a/crypto/chacha/asm/chacha-x86.pl b/crypto/chacha/asm/chacha-x86.pl index e2019aa3b5..850c917264 100755 --- a/crypto/chacha/asm/chacha-x86.pl +++ b/crypto/chacha/asm/chacha-x86.pl @@ -123,6 +123,9 @@ my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous &static_label("pic_point"); &function_begin("ChaCha20_ctr32"); + &xor ("eax","eax"); + &cmp ("eax",&wparam(2)); # len==0? + &je (&label("no_data")); if ($xmm) { &call (&label("pic_point")); &set_label("pic_point"); @@ -356,6 +359,7 @@ if ($xmm) { &set_label("done"); &stack_pop(33); +&set_label("no_data"); &function_end("ChaCha20_ctr32"); if ($xmm) { diff --git a/crypto/chacha/asm/chacha-x86_64.pl b/crypto/chacha/asm/chacha-x86_64.pl index 1a87cf8495..107fc70819 100755 --- a/crypto/chacha/asm/chacha-x86_64.pl +++ b/crypto/chacha/asm/chacha-x86_64.pl @@ -219,6 +219,8 @@ $code.=<<___; .type ChaCha20_ctr32,\@function,5 .align 64 ChaCha20_ctr32: + cmp \$0,$len + je .Lno_data mov OPENSSL_ia32cap_P+4(%rip),%r10 test \$`1<<(41-32)`,%r10d jnz .LChaCha20_ssse3 @@ -375,6 +377,7 @@ $code.=<<___; pop %r12 pop %rbp pop %rbx +.Lno_data: ret .size ChaCha20_ctr32,.-ChaCha20_ctr32 ___ |