Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
btwise
openssl
提交
500b5a18
O
openssl
项目概览
btwise
/
openssl
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
500b5a18
编写于
8月 31, 2006
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rewrite sha1-586.pl.
上级
2b8a5406
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
141 addition
and
314 deletion
+141
-314
crypto/sha/asm/sha1-586.pl
crypto/sha/asm/sha1-586.pl
+141
-314
未找到文件。
crypto/sha/asm/sha1-586.pl
浏览文件 @
500b5a18
#!/usr/local/bin/perl
#!/usr/bin/env perl
# ====================================================================
# [Re]written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
# project. Rights for redistribution and usage in source and binary
# forms are granted according to the OpenSSL license.
# ====================================================================
# "[Re]written" was achieved in two major overhauls. In 2004 BODY_*
# functions were re-implemented to address P4 performance issue [see
# commentary below], and in 2006 the rest was rewritten in order to
# gain freedom to liberate licensing terms.
# It was noted that Intel IA-32 C compiler generates code which
# performs ~30% *faster* on P4 CPU than original *hand-coded*
...
...
@@ -25,82 +36,24 @@
# ----------------------------------------------------------------
# <appro@fy.chalmers.se>
$normal
=
0
;
push
(
@INC
,"
perlasm
","
../../perlasm
");
require
"
x86asm.pl
";
&asm_init
(
$ARGV
[
0
],"
sha1-586.pl
",
$ARGV
[
$#ARGV
]
eq
"
386
");
$A
=
"
eax
";
$B
=
"
e
c
x
";
$C
=
"
e
b
x
";
$B
=
"
e
b
x
";
$C
=
"
e
c
x
";
$D
=
"
edx
";
$E
=
"
edi
";
$T
=
"
esi
";
$tmp1
=
"
ebp
";
$off
=
9
*
4
;
@K
=
(
0x5a827999
,
0x6ed9eba1
,
0x8f1bbcdc
,
0xca62c1d6
);
&sha1_block_data
("
sha1_block_asm_data_order
");
&asm_finish
();
sub
Nn
{
local
(
$p
)
=
@_
;
local
(
%n
)
=
(
$A
,
$T
,
$B
,
$A
,
$C
,
$B
,
$D
,
$C
,
$E
,
$D
,
$T
,
$E
);
return
(
$n
{
$p
});
}
sub
Np
{
local
(
$p
)
=
@_
;
local
(
%n
)
=
(
$A
,
$T
,
$B
,
$A
,
$C
,
$B
,
$D
,
$C
,
$E
,
$D
,
$T
,
$E
);
local
(
%n
)
=
(
$A
,
$B
,
$B
,
$C
,
$C
,
$D
,
$D
,
$E
,
$E
,
$T
,
$T
,
$A
);
return
(
$n
{
$p
});
}
sub
Na
{
local
(
$n
)
=
@_
;
return
(
((
$n
)
&
0x0f
),
((
$n
+
2
)
&
0x0f
),
((
$n
+
8
)
&
0x0f
),
((
$n
+
13
)
&
0x0f
),
((
$n
+
1
)
&
0x0f
));
}
sub
X_expand
{
local
(
$in
)
=
@_
;
&comment
("
First, load the words onto the stack in network byte order
");
for
(
$i
=
0
;
$i
<
16
;
$i
+=
2
)
{
&mov
(
$A
,
&DWP
((
$i
+
0
)
*
4
,
$in
,"",
0
));
# unless $i == 0;
&mov
(
$B
,
&DWP
((
$i
+
1
)
*
4
,
$in
,"",
0
));
&bswap
(
$A
);
&bswap
(
$B
);
&mov
(
&swtmp
(
$i
+
0
),
$A
);
&mov
(
&swtmp
(
$i
+
1
),
$B
);
}
&comment
("
We now have the X array on the stack
");
&comment
("
starting at sp-4
");
}
# Rules of engagement
# F is always trashable at the start, the running total.
# E becomes the next F so it can be trashed after it has been 'accumulated'
# F becomes A in the next round. We don't need to access it much.
# During the X update part, the result ends up in $X[$n0].
@V
=
(
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
sub
BODY_00_15
{
local
(
$
pos
,
$K
,
$X
,
$
n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
local
(
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
&comment
("
00_15
$n
");
...
...
@@ -109,37 +62,37 @@ sub BODY_00_15
else
{
&mov
(
$a
,
$tmp1
);
}
&rotl
(
$tmp1
,
5
);
# tmp1=ROTATE(a,5)
&xor
(
$f
,
$d
);
&and
(
$f
,
$b
);
&add
(
$tmp1
,
$e
);
# tmp1+=e;
&mov
(
$e
,
&swtmp
(
$n
));
# e becomes volatile and
# is loaded with xi
&add
(
$tmp1
,
$e
);
# tmp1+=e;
&and
(
$f
,
$b
);
&mov
(
$e
,
&swtmp
(
$n
%
16
));
# e becomes volatile and is loaded
# with xi, also note that e becomes
# f in next round...
&xor
(
$f
,
$d
);
# f holds F_00_19(b,c,d)
&rotr
(
$b
,
2
);
# b=ROTATE(b,30)
&lea
(
$tmp1
,
&DWP
(
$K
,
$tmp1
,
$e
,
1
));
# tmp1+=K_00_19+xi
&lea
(
$tmp1
,
&DWP
(
0x5a827999
,
$tmp1
,
$e
));
# tmp1+=K_00_19+xi
if
(
$n
==
15
)
{
&add
(
$f
,
$tmp1
);
}
# f+=tmp1
else
{
&add
(
$tmp1
,
$f
);
}
else
{
&add
(
$tmp1
,
$f
);
}
# f becomes a in next round
}
sub
BODY_16_19
{
local
(
$pos
,
$K
,
$X
,
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
local
(
$n0
,
$n1
,
$n2
,
$n3
,
$np
)
=
&Na
(
$n
);
local
(
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
&comment
("
16_19
$n
");
&mov
(
$f
,
&swtmp
(
$n
1
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&mov
(
$f
,
&swtmp
(
$n
%
16
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&mov
(
$tmp1
,
$c
);
# tmp1 to hold F_00_19(b,c,d)
&xor
(
$f
,
&swtmp
(
$n0
));
&xor
(
$f
,
&swtmp
(
(
$n
+
2
)
%
16
));
&xor
(
$tmp1
,
$d
);
&xor
(
$f
,
&swtmp
(
$n2
));
&xor
(
$f
,
&swtmp
(
(
$n
+
8
)
%
16
));
&and
(
$tmp1
,
$b
);
# tmp1 holds F_00_19(b,c,d)
&rotr
(
$b
,
2
);
# b=ROTATE(b,30)
&xor
(
$f
,
&swtmp
(
$n3
));
# f holds xa^xb^xc^xd
&rotl
(
$f
,
1
);
# f=ROATE(f,1)
&xor
(
$f
,
&swtmp
(
(
$n
+
13
)
%
16
));
# f holds xa^xb^xc^xd
&rotl
(
$f
,
1
);
# f=RO
T
ATE(f,1)
&xor
(
$tmp1
,
$d
);
# tmp1=F_00_19(b,c,d)
&mov
(
&swtmp
(
$n
0
),
$f
);
# xi=f
&lea
(
$f
,
&DWP
(
$K
,
$f
,
$e
,
1
));
# f+=K_00_19+e
&mov
(
&swtmp
(
$n
%
16
),
$f
);
# xi=f
&lea
(
$f
,
&DWP
(
0x5a827999
,
$f
,
$e
));
# f+=K_00_19+e
&mov
(
$e
,
$a
);
# e becomes volatile
&rotl
(
$e
,
5
);
# e=ROTATE(a,5)
&add
(
$f
,
$tmp1
);
# f+=F_00_19(b,c,d)
...
...
@@ -148,48 +101,47 @@ sub BODY_16_19
sub
BODY_20_39
{
local
(
$pos
,
$K
,
$X
,
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
local
(
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
local
$K
=
(
$n
<
40
)?
0x6ed9eba1
:
0xca62c1d6
;
&comment
("
20_39
$n
");
local
(
$n0
,
$n1
,
$n2
,
$n3
,
$np
)
=
&Na
(
$n
);
&mov
(
$tmp1
,
$b
);
# tmp1 to hold F_20_39(b,c,d)
&mov
(
$f
,
&swtmp
(
$n
0
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&mov
(
$f
,
&swtmp
(
$n
%
16
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&rotr
(
$b
,
2
);
# b=ROTATE(b,30)
&xor
(
$f
,
&swtmp
(
$n1
));
&xor
(
$f
,
&swtmp
(
(
$n
+
2
)
%
16
));
&xor
(
$tmp1
,
$c
);
&xor
(
$f
,
&swtmp
(
$n2
));
&xor
(
$f
,
&swtmp
(
(
$n
+
8
)
%
16
));
&xor
(
$tmp1
,
$d
);
# tmp1 holds F_20_39(b,c,d)
&xor
(
$f
,
&swtmp
(
$n3
));
# f holds xa^xb^xc^xd
&xor
(
$f
,
&swtmp
(
(
$n
+
13
)
%
16
));
# f holds xa^xb^xc^xd
&rotl
(
$f
,
1
);
# f=ROTATE(f,1)
&add
(
$tmp1
,
$e
);
&mov
(
&swtmp
(
$n
0
),
$f
);
# xi=f
&mov
(
&swtmp
(
$n
%
16
),
$f
);
# xi=f
&mov
(
$e
,
$a
);
# e becomes volatile
&rotl
(
$e
,
5
);
# e=ROTATE(a,5)
&lea
(
$f
,
&DWP
(
$K
,
$f
,
$tmp1
,
1
));
# f+=K_20_39+e
&lea
(
$f
,
&DWP
(
$K
,
$f
,
$tmp1
));
# f+=K_20_39+e
&add
(
$f
,
$e
);
# f+=ROTATE(a,5)
}
sub
BODY_40_59
{
local
(
$
pos
,
$K
,
$X
,
$
n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
local
(
$n
,
$a
,
$b
,
$c
,
$d
,
$e
,
$f
)
=
@_
;
&comment
("
40_59
$n
");
local
(
$n0
,
$n1
,
$n2
,
$n3
,
$np
)
=
&Na
(
$n
);
&mov
(
$f
,
&swtmp
(
$n
0
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&mov
(
$tmp1
,
&swtmp
(
$n1
));
&mov
(
$f
,
&swtmp
(
$n
%
16
));
# f to hold Xupdate(xi,xa,xb,xc,xd)
&mov
(
$tmp1
,
&swtmp
(
(
$n
+
2
)
%
16
));
&xor
(
$f
,
$tmp1
);
&mov
(
$tmp1
,
&swtmp
(
$n2
));
&mov
(
$tmp1
,
&swtmp
(
(
$n
+
8
)
%
16
));
&xor
(
$f
,
$tmp1
);
&mov
(
$tmp1
,
&swtmp
(
$n3
));
&mov
(
$tmp1
,
&swtmp
(
(
$n
+
13
)
%
16
));
&xor
(
$f
,
$tmp1
);
# f holds xa^xb^xc^xd
&mov
(
$tmp1
,
$b
);
# tmp1 to hold F_40_59(b,c,d)
&rotl
(
$f
,
1
);
# f=ROTATE(f,1)
&or
(
$tmp1
,
$c
);
&mov
(
&swtmp
(
$n
0
),
$f
);
# xi=f
&mov
(
&swtmp
(
$n
%
16
),
$f
);
# xi=f
&and
(
$tmp1
,
$d
);
&lea
(
$f
,
&DWP
(
$K
,
$f
,
$e
,
1
));
# f+=K_40_59+e
&lea
(
$f
,
&DWP
(
0x8f1bbcdc
,
$f
,
$e
));
# f+=K_40_59+e
&mov
(
$e
,
$b
);
# e becomes volatile and is used
# to calculate F_40_59(b,c,d)
&rotr
(
$b
,
2
);
# b=ROTATE(b,30)
...
...
@@ -201,230 +153,105 @@ sub BODY_40_59
&add
(
$f
,
$e
);
# f+=ROTATE(a,5)
}
sub
BODY_60_79
{
&BODY_20_39
(
@
_
);
}
&function_begin
("
sha1_block_asm_data_order
",
16
);
&mov
(
$tmp1
,
&wparam
(
0
));
# SHA_CTX *c
&mov
(
$T
,
&wparam
(
1
));
# const void *input
&mov
(
$A
,
&wparam
(
2
));
# size_t num
&stack_push
(
16
);
# allocate X[16]
&shl
(
$A
,
6
);
&add
(
$A
,
$T
);
&mov
(
&wparam
(
2
),
$A
);
# pointer beyond the end of input
&mov
(
$E
,
&DWP
(
16
,
$tmp1
));
# pre-load E
sub
sha1_block_host
{
local
(
$name
,
$sclabel
)
=
@_
;
&function_begin_B
(
$name
,"");
# parameter 1 is the MD5_CTX structure.
# A 0
# B 4
# C 8
# D 12
# E 16
&mov
("
ecx
",
&wparam
(
2
));
&push
("
esi
");
&shl
("
ecx
",
6
);
&mov
("
esi
",
&wparam
(
1
));
&push
("
ebp
");
&add
("
ecx
","
esi
");
# offset to leave on
&push
("
ebx
");
&mov
("
ebp
",
&wparam
(
0
));
&push
("
edi
");
&mov
(
$D
,
&DWP
(
12
,"
ebp
","",
0
));
&stack_push
(
18
+
9
);
&mov
(
$E
,
&DWP
(
16
,"
ebp
","",
0
));
&mov
(
$C
,
&DWP
(
8
,"
ebp
","",
0
));
&mov
(
&swtmp
(
17
),"
ecx
");
&comment
("
First we need to setup the X array
");
for
(
$i
=
0
;
$i
<
16
;
$i
+=
2
)
&set_label
("
loop
",
16
);
# copy input chunk to X, but reversing byte order!
for
(
$i
=
0
;
$i
<
16
;
$i
+=
4
)
{
&mov
(
$A
,
&DWP
((
$i
+
0
)
*
4
,"
esi
","",
0
));
# unless $i == 0;
&mov
(
$B
,
&DWP
((
$i
+
1
)
*
4
,"
esi
","",
0
));
&mov
(
$A
,
&DWP
(
4
*
(
$i
+
0
),
$T
));
&mov
(
$B
,
&DWP
(
4
*
(
$i
+
1
),
$T
));
&mov
(
$C
,
&DWP
(
4
*
(
$i
+
2
),
$T
));
&mov
(
$D
,
&DWP
(
4
*
(
$i
+
3
),
$T
));
&bswap
(
$A
);
&bswap
(
$B
);
&bswap
(
$C
);
&bswap
(
$D
);
&mov
(
&swtmp
(
$i
+
0
),
$A
);
&mov
(
&swtmp
(
$i
+
1
),
$B
);
&mov
(
&swtmp
(
$i
+
1
),
$B
);
&mov
(
&swtmp
(
$i
+
2
),
$C
);
&mov
(
&swtmp
(
$i
+
3
),
$D
);
}
&mov
(
&wparam
(
1
),
$T
);
# redundant in 1st spin
&mov
(
$A
,
&DWP
(
0
,
$tmp1
));
# load SHA_CTX
&mov
(
$B
,
&DWP
(
4
,
$tmp1
));
&mov
(
$C
,
&DWP
(
8
,
$tmp1
));
&mov
(
$D
,
&DWP
(
12
,
$tmp1
));
# E is pre-loaded
&set_label
("
shortcut
");
# keep a note of shortcut label so it can be used outside the block.
$shortcut
=
&label
("
shortcut
");
for
(
$i
=
0
;
$i
<
16
;
$i
++
)
{
&BODY_00_15
(
$i
,
@V
);
unshift
(
@V
,
pop
(
@V
));
}
for
(;
$i
<
20
;
$i
++
)
{
&BODY_16_19
(
$i
,
@V
);
unshift
(
@V
,
pop
(
@V
));
}
for
(;
$i
<
40
;
$i
++
)
{
&BODY_20_39
(
$i
,
@V
);
unshift
(
@V
,
pop
(
@V
));
}
for
(;
$i
<
60
;
$i
++
)
{
&BODY_40_59
(
$i
,
@V
);
unshift
(
@V
,
pop
(
@V
));
}
for
(;
$i
<
80
;
$i
++
)
{
&BODY_20_39
(
$i
,
@V
);
unshift
(
@V
,
pop
(
@V
));
}
((
$V
[
5
]
eq
$D
)
and
(
$V
[
0
]
eq
$E
))
or
die
;
# double-check
&mov
(
$tmp1
,
&wparam
(
0
));
# re-load SHA_CTX*
&mov
(
$D
,
&wparam
(
1
));
# D is last "T" and is discarded
&add
(
$E
,
&DWP
(
0
,
$tmp1
));
# E is last "A"...
&add
(
$T
,
&DWP
(
4
,
$tmp1
));
&add
(
$A
,
&DWP
(
8
,
$tmp1
));
&add
(
$B
,
&DWP
(
12
,
$tmp1
));
&add
(
$C
,
&DWP
(
16
,
$tmp1
));
&mov
(
&DWP
(
0
,
$tmp1
),
$E
);
# update SHA_CTX
&add
(
$D
,
64
);
# advance input pointer
&mov
(
&DWP
(
4
,
$tmp1
),
$T
);
&cmp
(
$D
,
&wparam
(
2
));
# have we reached the end yet?
&mov
(
&DWP
(
8
,
$tmp1
),
$A
);
&mov
(
$E
,
$C
);
# C is last "E" which needs to be "pre-loaded"
&mov
(
&DWP
(
12
,
$tmp1
),
$B
);
&mov
(
$T
,
$D
);
# input pointer
&mov
(
&DWP
(
16
,
$tmp1
),
$C
);
&jb
(
&label
("
loop
"));
&stack_pop
(
16
);
&function_end
("
sha1_block_asm_data_order
");
&function_begin
("
sha1_block_asm_host_order
",
16
);
&mov
(
$tmp1
,
&wparam
(
0
));
# SHA_CTX *c
&mov
(
$T
,
&wparam
(
1
));
# const void *input
#&mov($A,&wparam(2)); # size_t num, always 1
&stack_push
(
16
);
# allocate X[16]
&lea
(
$A
,
&DWP
(
64
,
$T
));
# this works, because num is always 1 here
&mov
(
&wparam
(
2
),
$A
);
# pointer beyond the end of input
# just copy input to X
for
(
$i
=
0
;
$i
<
16
;
$i
+=
4
)
{
&mov
(
$A
,
&DWP
(
4
*
(
$i
+
0
),
$T
));
&mov
(
$B
,
&DWP
(
4
*
(
$i
+
1
),
$T
));
&mov
(
$C
,
&DWP
(
4
*
(
$i
+
2
),
$T
));
&mov
(
$D
,
&DWP
(
4
*
(
$i
+
3
),
$T
));
&mov
(
&swtmp
(
$i
+
0
),
$A
);
&mov
(
&swtmp
(
$i
+
1
),
$B
);
&mov
(
&swtmp
(
$i
+
2
),
$C
);
&mov
(
&swtmp
(
$i
+
3
),
$D
);
}
&jmp
(
$sclabel
);
&function_end_B
(
$name
);
}
&mov
(
$A
,
&DWP
(
0
,
$tmp1
));
# load SHA_CTX
&mov
(
$B
,
&DWP
(
4
,
$tmp1
));
&mov
(
$C
,
&DWP
(
8
,
$tmp1
));
&mov
(
$D
,
&DWP
(
12
,
$tmp1
));
&mov
(
$E
,
&DWP
(
16
,
$tmp1
));
sub
sha1_block_data
{
local
(
$name
)
=
@_
;
&function_begin_B
(
$name
,"");
# parameter 1 is the MD5_CTX structure.
# A 0
# B 4
# C 8
# D 12
# E 16
&mov
("
ecx
",
&wparam
(
2
));
&push
("
esi
");
&shl
("
ecx
",
6
);
&mov
("
esi
",
&wparam
(
1
));
&push
("
ebp
");
&add
("
ecx
","
esi
");
# offset to leave on
&push
("
ebx
");
&mov
("
ebp
",
&wparam
(
0
));
&push
("
edi
");
&mov
(
$D
,
&DWP
(
12
,"
ebp
","",
0
));
&stack_push
(
18
+
9
);
&mov
(
$E
,
&DWP
(
16
,"
ebp
","",
0
));
&mov
(
$C
,
&DWP
(
8
,"
ebp
","",
0
));
&mov
(
&swtmp
(
17
),"
ecx
");
&comment
("
First we need to setup the X array
");
&set_label
("
start
")
unless
$normal
;
&X_expand
("
esi
");
&mov
(
&wparam
(
1
),"
esi
");
&set_label
("
shortcut
",
0
,
1
);
&comment
("");
&comment
("
Start processing
");
# odd start
&mov
(
$A
,
&DWP
(
0
,"
ebp
","",
0
));
&mov
(
$B
,
&DWP
(
4
,"
ebp
","",
0
));
$X
=
"
esp
";
&BODY_00_15
(
-
2
,
$K
[
0
],
$X
,
0
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
1
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
2
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
3
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
4
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
5
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
6
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
7
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
8
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
9
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
10
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
11
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
12
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
13
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_00_15
(
0
,
$K
[
0
],
$X
,
14
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_00_15
(
1
,
$K
[
0
],
$X
,
15
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_16_19
(
-
1
,
$K
[
0
],
$X
,
16
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_16_19
(
0
,
$K
[
0
],
$X
,
17
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_16_19
(
0
,
$K
[
0
],
$X
,
18
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_16_19
(
1
,
$K
[
0
],
$X
,
19
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_20_39
(
-
1
,
$K
[
1
],
$X
,
20
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
21
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
22
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
23
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
24
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
25
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
26
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
27
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
28
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
29
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
30
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
31
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
32
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
33
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
34
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
35
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
36
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
37
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_20_39
(
0
,
$K
[
1
],
$X
,
38
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_20_39
(
1
,
$K
[
1
],
$X
,
39
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_40_59
(
-
1
,
$K
[
2
],
$X
,
40
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
41
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
42
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
43
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
44
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
45
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
46
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
47
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
48
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
49
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
50
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
51
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
52
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
53
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
54
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
55
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
56
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
57
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_40_59
(
0
,
$K
[
2
],
$X
,
58
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_40_59
(
1
,
$K
[
2
],
$X
,
59
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_60_79
(
-
1
,
$K
[
3
],
$X
,
60
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
61
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
62
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
63
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
64
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
65
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
66
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
67
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
68
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
69
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
70
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
71
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
72
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
73
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
74
,
$E
,
$T
,
$A
,
$B
,
$C
,
$D
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
75
,
$D
,
$E
,
$T
,
$A
,
$B
,
$C
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
76
,
$C
,
$D
,
$E
,
$T
,
$A
,
$B
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
77
,
$B
,
$C
,
$D
,
$E
,
$T
,
$A
);
&BODY_60_79
(
0
,
$K
[
3
],
$X
,
78
,
$A
,
$B
,
$C
,
$D
,
$E
,
$T
);
&BODY_60_79
(
2
,
$K
[
3
],
$X
,
79
,
$T
,
$A
,
$B
,
$C
,
$D
,
$E
);
&comment
("
End processing
");
&comment
("");
# D is the tmp value
# E -> A
# T -> B
# A -> C
# B -> D
# C -> E
# D -> T
&mov
(
$tmp1
,
&wparam
(
0
));
&mov
(
$D
,
&DWP
(
12
,
$tmp1
,"",
0
));
&add
(
$D
,
$B
);
&mov
(
$B
,
&DWP
(
4
,
$tmp1
,"",
0
));
&add
(
$B
,
$T
);
&mov
(
$T
,
$A
);
&mov
(
$A
,
&DWP
(
0
,
$tmp1
,"",
0
));
&mov
(
&DWP
(
12
,
$tmp1
,"",
0
),
$D
);
&add
(
$A
,
$E
);
&mov
(
$E
,
&DWP
(
16
,
$tmp1
,"",
0
));
&add
(
$E
,
$C
);
&mov
(
$C
,
&DWP
(
8
,
$tmp1
,"",
0
));
&add
(
$C
,
$T
);
&mov
(
&DWP
(
0
,
$tmp1
,"",
0
),
$A
);
&mov
("
esi
",
&wparam
(
1
));
&mov
(
&DWP
(
8
,
$tmp1
,"",
0
),
$C
);
&add
("
esi
",
64
);
&mov
("
eax
",
&swtmp
(
17
));
&mov
(
&DWP
(
16
,
$tmp1
,"",
0
),
$E
);
&cmp
("
esi
","
eax
");
&mov
(
&DWP
(
4
,
$tmp1
,"",
0
),
$B
);
&jb
(
&label
("
start
"));
&stack_pop
(
18
+
9
);
&pop
("
edi
");
&pop
("
ebx
");
&pop
("
ebp
");
&pop
("
esi
");
&ret
();
# keep a note of shortcut label so it can be used outside
# block.
my
$sclabel
=
&label
("
shortcut
");
&function_end_B
(
$name
);
# Putting this here avoids problems with MASM in debugging mode
&sha1_block_host
("
sha1_block_asm_host_order
",
$sclabel
);
}
&jmp
(
$shortcut
);
# this works, because num is always 1
&function_end_B
("
sha1_block_asm_host_order
");
&asm_finish
();
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录