Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
25348918
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
大约 1 年 前同步成功
通知
9
Star
18
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
25348918
编写于
10月 17, 2011
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
bn_mont.c: simplify BN_from_montgomery_word.
上级
79ba545c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
26 addition
and
84 deletion
+26
-84
crypto/bn/bn_mont.c
crypto/bn/bn_mont.c
+26
-84
未找到文件。
crypto/bn/bn_mont.c
浏览文件 @
25348918
...
@@ -179,24 +179,19 @@ err:
...
@@ -179,24 +179,19 @@ err:
static
int
BN_from_montgomery_word
(
BIGNUM
*
ret
,
BIGNUM
*
r
,
BN_MONT_CTX
*
mont
)
static
int
BN_from_montgomery_word
(
BIGNUM
*
ret
,
BIGNUM
*
r
,
BN_MONT_CTX
*
mont
)
{
{
BIGNUM
*
n
;
BIGNUM
*
n
;
BN_ULONG
*
ap
,
*
np
,
*
rp
,
n0
,
v
,
*
nrp
;
BN_ULONG
*
ap
,
*
np
,
*
rp
,
n0
,
v
,
carry
;
int
al
,
nl
,
max
,
i
,
x
,
r
i
;
int
nl
,
max
,
i
;
n
=
&
(
mont
->
N
);
n
=
&
(
mont
->
N
);
/* mont->ri is the size of mont->N in bits (rounded up
to the word size) */
al
=
ri
=
mont
->
ri
/
BN_BITS2
;
nl
=
n
->
top
;
nl
=
n
->
top
;
if
(
(
al
==
0
)
||
(
nl
==
0
)
)
{
ret
->
top
=
0
;
return
(
1
);
}
if
(
nl
==
0
)
{
ret
->
top
=
0
;
return
(
1
);
}
max
=
(
nl
+
al
+
1
);
/* allow for overflow (no?) XXX
*/
max
=
(
2
*
nl
);
/* carry is stored separately
*/
if
(
bn_wexpand
(
r
,
max
)
==
NULL
)
return
(
0
);
if
(
bn_wexpand
(
r
,
max
)
==
NULL
)
return
(
0
);
r
->
neg
^=
n
->
neg
;
r
->
neg
^=
n
->
neg
;
np
=
n
->
d
;
np
=
n
->
d
;
rp
=
r
->
d
;
rp
=
r
->
d
;
nrp
=
&
(
r
->
d
[
nl
]);
/* clear the top words of T */
/* clear the top words of T */
#if 1
#if 1
...
@@ -212,7 +207,7 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
...
@@ -212,7 +207,7 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
#ifdef BN_COUNT
#ifdef BN_COUNT
fprintf
(
stderr
,
"word BN_from_montgomery_word %d * %d
\n
"
,
nl
,
nl
);
fprintf
(
stderr
,
"word BN_from_montgomery_word %d * %d
\n
"
,
nl
,
nl
);
#endif
#endif
for
(
i
=
0
;
i
<
nl
;
i
++
)
for
(
carry
=
0
,
i
=
0
;
i
<
nl
;
i
++
,
rp
++
)
{
{
#ifdef __TANDEM
#ifdef __TANDEM
{
{
...
@@ -230,61 +225,33 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
...
@@ -230,61 +225,33 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
#else
#else
v
=
bn_mul_add_words
(
rp
,
np
,
nl
,(
rp
[
0
]
*
n0
)
&
BN_MASK2
);
v
=
bn_mul_add_words
(
rp
,
np
,
nl
,(
rp
[
0
]
*
n0
)
&
BN_MASK2
);
#endif
#endif
nrp
++
;
if
((
rp
[
nl
]
=
(
rp
[
nl
]
+
v
+
carry
)
&
BN_MASK2
)
<
v
)
rp
++
;
carry
=
1
;
if
(((
nrp
[
-
1
]
+=
v
)
&
BN_MASK2
)
>=
v
)
continue
;
else
else
{
carry
=
0
;
if
(((
++
nrp
[
0
])
&
BN_MASK2
)
!=
0
)
continue
;
if
(((
++
nrp
[
1
])
&
BN_MASK2
)
!=
0
)
continue
;
for
(
x
=
2
;
(((
++
nrp
[
x
])
&
BN_MASK2
)
==
0
);
x
++
)
;
}
}
bn_correct_top
(
r
);
/* mont->ri will be a multiple of the word size and below code
* is kind of BN_rshift(ret,r,mont->ri) equivalent */
if
(
r
->
top
<=
ri
)
{
ret
->
top
=
0
;
return
(
1
);
}
}
al
=
r
->
top
-
ri
;
#define BRANCH_FREE 1
if
(
bn_wexpand
(
ret
,
nl
)
==
NULL
)
return
(
0
);
#if BRANCH_FREE
ret
->
top
=
nl
;
if
(
bn_wexpand
(
ret
,
ri
)
==
NULL
)
return
(
0
);
x
=
0
-
(((
al
-
ri
)
>>
(
sizeof
(
al
)
*
8
-
1
))
&
1
);
ret
->
top
=
x
=
(
ri
&~
x
)
|
(
al
&
x
);
/* min(ri,al) */
ret
->
neg
=
r
->
neg
;
ret
->
neg
=
r
->
neg
;
rp
=
ret
->
d
;
rp
=
ret
->
d
;
ap
=&
(
r
->
d
[
ri
]);
ap
=&
(
r
->
d
[
nl
]);
#define BRANCH_FREE 1
#if BRANCH_FREE
{
{
size_t
m1
,
m2
;
BN_ULONG
*
nrp
;
size_t
m
;
v
=
bn_sub_words
(
rp
,
ap
,
np
,
ri
);
/* this ----------------^^ works even in al<ri case
* thanks to zealous zeroing of top of the vector in the
* beginning. */
/* if (al==ri && !v) || al>ri) nrp=rp; else nrp=ap; */
v
=
bn_sub_words
(
rp
,
ap
,
np
,
nl
)
-
carry
;
/* i
n other words i
f subtraction result is real, then
/* if subtraction result is real, then
* trick unconditional memcpy below to perform in-place
* trick unconditional memcpy below to perform in-place
* "refresh" instead of actual copy. */
* "refresh" instead of actual copy. */
m1
=
0
-
(
size_t
)(((
al
-
ri
)
>>
(
sizeof
(
al
)
*
8
-
1
))
&
1
);
/* al<ri */
m
=
(
0
-
(
size_t
)
v
);
m2
=
0
-
(
size_t
)(((
ri
-
al
)
>>
(
sizeof
(
al
)
*
8
-
1
))
&
1
);
/* al>ri */
nrp
=
(
BN_ULONG
*
)(((
PTR_SIZE_INT
)
rp
&~
m
)
|
((
PTR_SIZE_INT
)
ap
&
m
));
m1
|=
m2
;
/* (al!=ri) */
m1
|=
(
0
-
(
size_t
)
v
);
/* (al!=ri || v) */
m1
&=~
m2
;
/* (al!=ri || v) && !al>ri */
nrp
=
(
BN_ULONG
*
)(((
PTR_SIZE_INT
)
rp
&~
m1
)
|
((
PTR_SIZE_INT
)
ap
&
m1
));
}
/* 'i<ri' is chosen to eliminate dependency on input data, even
for
(
i
=
0
,
nl
-=
4
;
i
<
nl
;
i
+=
4
)
* though it results in redundant copy in al<ri case. */
for
(
i
=
0
,
ri
-=
4
;
i
<
ri
;
i
+=
4
)
{
{
BN_ULONG
t1
,
t2
,
t3
,
t4
;
BN_ULONG
t1
,
t2
,
t3
,
t4
;
...
@@ -297,40 +264,15 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
...
@@ -297,40 +264,15 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
rp
[
i
+
2
]
=
t3
;
rp
[
i
+
2
]
=
t3
;
rp
[
i
+
3
]
=
t4
;
rp
[
i
+
3
]
=
t4
;
}
}
for
(
ri
+=
4
;
i
<
ri
;
i
++
)
for
(
nl
+=
4
;
i
<
nl
;
i
++
)
rp
[
i
]
=
nrp
[
i
],
ap
[
i
]
=
0
;
rp
[
i
]
=
nrp
[
i
],
ap
[
i
]
=
0
;
bn_correct_top
(
r
);
}
bn_correct_top
(
ret
);
#else
#else
if
(
bn_wexpand
(
ret
,
al
)
==
NULL
)
return
(
0
);
if
(
bn_sub_words
(
rp
,
ap
,
np
,
nl
)
-
carry
)
ret
->
top
=
al
;
memcpy
(
rp
,
ap
,
nl
*
sizeof
(
BN_ULONG
));
ret
->
neg
=
r
->
neg
;
rp
=
ret
->
d
;
ap
=&
(
r
->
d
[
ri
]);
al
-=
4
;
for
(
i
=
0
;
i
<
al
;
i
+=
4
)
{
BN_ULONG
t1
,
t2
,
t3
,
t4
;
t1
=
ap
[
i
+
0
];
t2
=
ap
[
i
+
1
];
t3
=
ap
[
i
+
2
];
t4
=
ap
[
i
+
3
];
rp
[
i
+
0
]
=
t1
;
rp
[
i
+
1
]
=
t2
;
rp
[
i
+
2
]
=
t3
;
rp
[
i
+
3
]
=
t4
;
}
al
+=
4
;
for
(;
i
<
al
;
i
++
)
rp
[
i
]
=
ap
[
i
];
if
(
BN_ucmp
(
ret
,
&
(
mont
->
N
))
>=
0
)
{
if
(
!
BN_usub
(
ret
,
ret
,
&
(
mont
->
N
)))
return
(
0
);
}
#endif
#endif
bn_correct_top
(
r
);
bn_correct_top
(
ret
);
bn_check_top
(
ret
);
bn_check_top
(
ret
);
return
(
1
);
return
(
1
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录