Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
6b6443de
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
大约 1 年 前同步成功
通知
8
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,发现更多精彩内容 >>
提交
6b6443de
编写于
6月 10, 2007
作者:
A
Andy Polyakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Eliminate conditional final subtraction in Montgomery multiplication.
上级
54b5fd53
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
54 addition
and
7 deletion
+54
-7
crypto/bn/bn_mont.c
crypto/bn/bn_mont.c
+54
-7
未找到文件。
crypto/bn/bn_mont.c
浏览文件 @
6b6443de
...
...
@@ -240,20 +240,67 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
}
}
bn_correct_top
(
r
);
/* mont->ri will be a multiple of the word size */
#if 0
BN_rshift(ret,r,mont->ri);
#else
/* 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
;
if
(
bn_wexpand
(
ret
,
al
)
==
NULL
)
return
(
0
);
#define BRANCH_FREE 1
#if BRANCH_FREE
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
;
rp
=
ret
->
d
;
ap
=&
(
r
->
d
[
ri
]);
nrp
=
ap
;
/* This 'if' denotes violation of 2*M<r^(n-1) boundary condition
* formulated by C.D.Walter in "Montgomery exponentiation needs
* no final subtractions." Incurred branch can disclose only
* information about modulus length, which is not really secret. */
if
((
mont
->
N
.
d
[
ri
-
1
]
>>
(
BN_BITS2
-
2
))
!=
0
)
{
size_t
m1
,
m2
;
v
=
bn_sub_words
(
rp
,
ap
,
mont
->
N
.
d
,
ri
);
/* if (al==ri && !v) || al>ri) nrp=rp; */
/* in other words if subtraction result is real, then
* trick unconditional memcpy below to make "refresh"
* instead of real copy. */
m1
=
0
-
(
size_t
)(((
al
-
ri
)
>>
(
sizeof
(
al
)
*
8
-
1
))
&
1
);
/* al<ri */
m2
=
0
-
(
size_t
)(((
ri
-
al
)
>>
(
sizeof
(
al
)
*
8
-
1
))
&
1
);
/* al>ri */
m1
=~
(
m1
|
m2
);
/* (al==ri) */
m1
&=~
(
0
-
(
size_t
)
v
);
/* (al==ri && !v) */
m1
|=
m2
;
/* (al==ri && !v) || al>ri */
nrp
=
(
BN_ULONG
*
)(((
size_t
)
rp
&
m1
)
|
((
size_t
)
ap
&~
m1
));
}
for
(
i
=
0
,
ri
-=
4
;
i
<
ri
;
i
+=
4
)
{
BN_ULONG
t1
,
t2
,
t3
,
t4
;
t1
=
nrp
[
i
+
0
];
t2
=
nrp
[
i
+
1
];
t3
=
nrp
[
i
+
2
];
ap
[
i
+
0
]
=
0
;
t4
=
nrp
[
i
+
3
];
ap
[
i
+
1
]
=
0
;
rp
[
i
+
0
]
=
t1
;
ap
[
i
+
2
]
=
0
;
rp
[
i
+
1
]
=
t2
;
ap
[
i
+
3
]
=
0
;
rp
[
i
+
2
]
=
t3
;
rp
[
i
+
3
]
=
t4
;
}
for
(
ri
+=
4
;
i
<
ri
;
i
++
)
rp
[
i
]
=
nrp
[
i
],
ap
[
i
]
=
0
;
#else
if
(
bn_wexpand
(
ret
,
al
)
==
NULL
)
return
(
0
);
ret
->
top
=
al
;
ret
->
neg
=
r
->
neg
;
rp
=
ret
->
d
;
ap
=&
(
r
->
d
[
ri
]);
...
...
@@ -274,12 +321,12 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
al
+=
4
;
for
(;
i
<
al
;
i
++
)
rp
[
i
]
=
ap
[
i
];
#endif
if
(
BN_ucmp
(
ret
,
&
(
mont
->
N
))
>=
0
)
{
if
(
!
BN_usub
(
ret
,
ret
,
&
(
mont
->
N
)))
return
(
0
);
}
#endif
bn_check_top
(
ret
);
return
(
1
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录