From: Andy Polyakov Date: Sun, 24 Jan 2010 14:54:24 +0000 (+0000) Subject: OPENSSL_cleanse to accept zero length parameter [matching C implementation]. X-Git-Tag: OpenSSL-fips-2_0-rc1~1324 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=7676eebf4297c8ccb27a6517eb8529cbd187f17a;p=oweals%2Fopenssl.git OPENSSL_cleanse to accept zero length parameter [matching C implementation]. --- diff --git a/crypto/alphacpuid.s b/crypto/alphacpuid.s index b13b3cdb3c..3fa77a0ade 100644 --- a/crypto/alphacpuid.s +++ b/crypto/alphacpuid.s @@ -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 diff --git a/crypto/perlasm/ppc-xlate.pl b/crypto/perlasm/ppc-xlate.pl index 755524c9cf..4579671c97 100755 --- a/crypto/perlasm/ppc-xlate.pl +++ b/crypto/perlasm/ppc-xlate.pl @@ -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 { diff --git a/crypto/ppccpuid.pl b/crypto/ppccpuid.pl index a52a8b38d0..7e8d233b72 100755 --- a/crypto/ppccpuid.pl +++ b/crypto/ppccpuid.pl @@ -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 diff --git a/crypto/s390xcpuid.S b/crypto/s390xcpuid.S index aa704c033a..b053c6a281 100644 --- a/crypto/s390xcpuid.S +++ b/crypto/s390xcpuid.S @@ -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) diff --git a/crypto/sparccpuid.S b/crypto/sparccpuid.S index 4691bd72bb..bcf46f209d 100644 --- a/crypto/sparccpuid.S +++ b/crypto/sparccpuid.S @@ -242,6 +242,10 @@ OPENSSL_cleanse: #else bgu .Lot #endif + cmp %o1,0 + bne .Little + nop + retl nop .Little: diff --git a/crypto/x86_64cpuid.pl b/crypto/x86_64cpuid.pl index 862118f285..a7f98b3fd3 100644 --- a/crypto/x86_64cpuid.pl +++ b/crypto/x86_64cpuid.pl @@ -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 diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl index e5dcc58124..a7464af19b 100644 --- a/crypto/x86cpuid.pl +++ b/crypto/x86cpuid.pl @@ -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);