chacha/asm/chacha*: ensure that zero length is handled (without crash).
authorAndy Polyakov <appro@openssl.org>
Sat, 13 Feb 2016 16:13:53 +0000 (17:13 +0100)
committerAndy Polyakov <appro@openssl.org>
Sun, 14 Feb 2016 20:22:42 +0000 (21:22 +0100)
RT#4305

Reviewed-by: Rich Salz <rsalz@openssl.org>
crypto/chacha/asm/chacha-armv4.pl
crypto/chacha/asm/chacha-s390x.pl
crypto/chacha/asm/chacha-x86.pl
crypto/chacha/asm/chacha-x86_64.pl

index 4d234b727562ffc1eb20ad2bafc53af178dc7c38..55ebc9e586475a35e313b74483eb4b8d5b6f2b03 100755 (executable)
@@ -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
 ___
index 8a097065431356178afc8b563c506c2948bbdf89..e637dc2f4fbd2ddde844ac91a9550703a0b9ea92 100755 (executable)
@@ -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
index e2019aa3b5ed65e452f7260d8c67e6a6b5f1f81b..850c9172641d5220850a832e8d56e65bd7829d77 100755 (executable)
@@ -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) {
index 1a87cf8495abc7f3dba2016897c640b8b2ff2dc4..107fc70819d559b2d9f764fec7b8f14bdd2ff7e4 100755 (executable)
@@ -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
 ___