OPENSSL_cleanse to accept zero length parameter [matching C implementation].
This commit is contained in:
parent
21a5c040e5
commit
7676eebf42
7 changed files with 22 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -242,6 +242,10 @@ OPENSSL_cleanse:
|
|||
#else
|
||||
bgu .Lot
|
||||
#endif
|
||||
cmp %o1,0
|
||||
bne .Little
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
|
||||
.Little:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue