OPENSSL_cleanse to accept zero length parameter [matching C implementation].
authorAndy Polyakov <appro@openssl.org>
Sun, 24 Jan 2010 14:54:24 +0000 (14:54 +0000)
committerAndy Polyakov <appro@openssl.org>
Sun, 24 Jan 2010 14:54:24 +0000 (14:54 +0000)
crypto/alphacpuid.s
crypto/perlasm/ppc-xlate.pl
crypto/ppccpuid.pl
crypto/s390xcpuid.S
crypto/sparccpuid.S
crypto/x86_64cpuid.pl
crypto/x86cpuid.pl

index b13b3cd..3fa77a0 100644 (file)
@@ -90,6 +90,7 @@ OPENSSL_rdtsc:
 OPENSSL_cleanse:
        .frame  $30,0,$26
        .prologue 0
+       beq     $17,.Ldone
        and     $16,7,$0
        bic     $17,7,$at
        beq     $at,.Little
index 755524c..4579671 100755 (executable)
@@ -101,6 +101,13 @@ my $bnelr = sub {
        "       .long   ".sprintf "0x%x",19<<26|$bo<<21|2<<16|16<<1 :
        "       bclr    $bo,2";
 };
+my $beqlr = sub {
+    my $f = shift;
+    my $bo = $f=~/-/ ? 12+2 : 12;      # optional "not to be taken" hint
+    ($flavour =~ /linux/) ?            # GNU as doesn't allow most recent hints
+       "       .long   ".sprintf "0x%X",19<<26|$bo<<21|2<<16|16<<1 :
+       "       bclr    $bo,2";
+};
 # GNU assembler can't handle extrdi rA,rS,16,48, or when sum of last two
 # arguments is 64, with "operand out of range" error.
 my $extrdi = sub {
index a52a8b3..7e8d233 100755 (executable)
@@ -83,6 +83,8 @@ Loop: lwarx   r5,0,r3
        $CMPLI  r4,7
        li      r0,0
        bge     Lot
+       $CMPLI  r4,0
+       beqlr-
 Little:        mtctr   r4
        stb     r0,0(r3)
        addi    r3,r3,1
index aa704c0..b053c6a 100644 (file)
@@ -62,6 +62,8 @@ OPENSSL_cleanse:
        lghi    %r0,0
        clgr    %r3,%r4
        jh      .Lot
+       clgr    %r3,%r0
+       bcr     8,%r14
 .Little:
        stc     %r0,0(%r2)
        la      %r2,1(%r2)
index 4691bd7..bcf46f2 100644 (file)
@@ -242,6 +242,10 @@ OPENSSL_cleanse:
 #else
        bgu     .Lot
 #endif
+       cmp     %o1,0
+       bne     .Little
+       nop
+       retl
        nop
 
 .Little:
index 862118f..a7f98b3 100644 (file)
@@ -145,12 +145,14 @@ OPENSSL_cleanse:
        xor     %rax,%rax
        cmp     \$15,$arg2
        jae     .Lot
+       cmp     \$0,$arg2
+       je      .Lret
 .Little:
        mov     %al,($arg1)
        sub     \$1,$arg2
        lea     1($arg1),$arg1
        jnz     .Little
-       ret
+.Lret: ret
 .align 16
 .Lot:
        test    \$7,$arg1
index e5dcc58..a7464af 100644 (file)
@@ -279,11 +279,14 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
        &xor    ("eax","eax");
        &cmp    ("ecx",7);
        &jae    (&label("lot"));
+       &cmp    ("ecx",0);
+       &je     (&label("ret"));
 &set_label("little");
        &mov    (&BP(0,"edx"),"al");
        &sub    ("ecx",1);
        &lea    ("edx",&DWP(1,"edx"));
        &jnz    (&label("little"));
+&set_label("ret");
        &ret    ();
 
 &set_label("lot",16);