rmd-586.pl revision 7c478bd95313f5f23a4c958a745db2134aa03244
# Normal is the
# ripemd160_block_asm_host_order(RIPEMD160_CTX *c, ULONG *X,int blocks);
$normal=0;
require "x86asm.pl";
$A="ecx";
$B="esi";
$C="edi";
$D="ebx";
$E="ebp";
$tmp1="eax";
$tmp2="edx";
$KL1=0x5A827999;
$KL2=0x6ED9EBA1;
$KL3=0x8F1BBCDC;
$KL4=0xA953FD4E;
$KR0=0x50A28BE6;
$KR1=0x5C4DD124;
$KR2=0x6D703EF3;
$KR3=0x7A6D76E9;
7, 4,13, 1,10, 6,15, 3,12, 0, 9, 5, 2,14,11, 8,
3,10,14, 4, 9,15, 8, 1, 2, 7, 0, 6,13,11, 5,12,
1, 9,11,10, 0, 8,12, 4,13, 3, 7,15,14, 5, 6, 2,
4, 0, 5, 9, 7,12, 2,10,14, 1, 3, 8,11, 6,15,13,
);
6,11, 3, 7, 0,13, 5,10,14,15, 8,12, 4, 9, 1, 2,
15, 5, 1, 3, 7,14, 6, 9,11, 8,12, 2,10, 0, 4,13,
8, 6, 4, 1, 3,11,15, 0, 5,12, 2,13, 9, 7,10,14,
12,15,10, 4, 1, 5, 8, 7, 6, 2,13,14, 0, 3, 9,11,
);
7, 6, 8,13,11, 9, 7,15, 7,12,15, 9,11, 7,13,12,
11,13, 6, 7,14, 9,13,15,14, 8,13, 6, 5,12, 7, 5,
11,12,14,15,14,15, 9, 8, 9,14, 5, 6, 8, 6, 5,12,
9,15, 5,11, 6, 8,13,12, 5,12,13,14,11, 8, 5, 6,
);
9,13,15, 7,12, 8, 9,11, 7, 7,12, 7, 6,15,13,11,
9, 7,15,11, 8, 6, 6,14,12,13, 5,14,13,13, 7, 5,
15, 5, 8,11,14,14, 6,14, 6, 9,12, 9,12, 5,15, 8,
8, 5,12, 9,12, 5,14, 6, 8,13, 6, 5,15,13,11,11,
);
&ripemd160_block("ripemd160_block_asm_host_order");
&asm_finish();
sub Xv
{
local($n)=@_;
return(&swtmp($n));
# tmp on stack
}
sub Np
{
local($p)=@_;
local(%n)=($A,$E,$B,$A,$C,$B,$D,$C,$E,$D);
return($n{$p});
}
sub RIP1
{
&comment($p++);
if ($p & 1)
{
#&mov($tmp1, $c) if $o == -1;
&rotl($c, 10);
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
# XXX if $o == 2;
&rotl($c, 10);
&rotl($a, $s);
&add($a, $e);
}
}
sub RIP2
{
# XXXXXX
&comment($p++);
if ($p & 1)
{
# &mov($tmp2, &Xv($pos)) if $o < -1;
# &mov($tmp1, -1) if $o < -1;
# XXX
&rotl($c, 10);
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
# XXX
if ($o != 2)
{
&rotl($c, 10);
} else {
&rotl($c, 10);
}
&rotl($a, $s);
&add($a, $e);
}
}
sub RIP3
{
&comment($p++);
if ($p & 1)
{
# &mov($tmp2, -1) if $o < -1;
# &sub($tmp2, $c) if $o < -1;
# XXX
&rotl($c, 10);
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
&rotl($c, 10);
&rotl($a, $s);
&add($a, $e);
}
}
sub RIP4
{
local($a,$b,$c,$d,$e,$pos,$s,$K,$o)=@_;
&comment($p++);
if ($p & 1)
{
# &mov($tmp2, -1) if $o == -2;
# &mov($tmp1, $d) if $o == -2;
&rotl($c, 10);
# XXX
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
&rotl($c, 10);
# XXX
# XXX
&rotl($a, $s);
&add($a, $e);
}
}
sub RIP5
{
local($a,$b,$c,$d,$e,$pos,$s,$K,$o)=@_;
&comment($p++);
if ($p & 1)
{
# XXX
&rotl($c, 10);
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
&rotl($c, 10);
&rotl($a, $s);
&add($a, $e);
}
}
sub ripemd160_block
{
local($name)=@_;
# parameter 1 is the RIPEMD160_CTX structure.
# A 0
# B 4
# C 8
# D 12
# E 16
&push("esi");
&push("edi");
&push("ebp");
&push("ebx");
# Special comment about the figure of 6.
# Idea is to pad the current frame so
# that the top of the stack gets fairly
# aligned. Well, as you realize it would
# always depend on how the frame below is
# aligned. The good news are that gcc-2.95
# and later does keep first argument at
# least double-wise aligned.
# <appro@fy.chalmers.se>
&comment("");
# &mov($tmp1, &wparam(1)); # Done at end of loop
# &mov($tmp2, &wparam(0)); # Done at end of loop
for ($z=0; $z<16; $z+=2)
{
}
# &mov($tmp2, &wparam(0)); # moved into last RIP5
# &mov(&swtmp(16), $A);
# &mov($tmp2, &wparam(0)); # Moved into last round
&mov($C, $A);
&mov($A, $D);
&mov($B, $E);
&set_label("get_out");
&pop("ebx");
&pop("ebp");
&pop("edi");
&pop("esi");
&ret();
&function_end_B($name);
}