Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
bac68541
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,发现更多精彩内容 >>
提交
bac68541
编写于
12月 06, 2000
作者:
B
Bodo Möller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Faster BN_mod_sqrt algorithm for p == 5 (8).
上级
1a4d6400
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
80 addition
and
6 deletion
+80
-6
CHANGES
CHANGES
+1
-1
crypto/bn/bn_sqrt.c
crypto/bn/bn_sqrt.c
+79
-5
未找到文件。
CHANGES
浏览文件 @
bac68541
...
...
@@ -32,7 +32,7 @@
[Richard Levitte]
*) New function BN_mod_sqrt for computing square roots modulo a prime
(Tonelli-Shanks algorithm).
(Tonelli-Shanks algorithm
unless p == 3 (mod 4) or p == 5 (mod 8)
).
[Lenka Fibikova <fibikova@exp-math.uni-essen.de>, Bodo Moeller]
*) Store verify_result within SSL_SESSION also for client side to
...
...
crypto/bn/bn_sqrt.c
浏览文件 @
bac68541
...
...
@@ -93,6 +93,20 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
return
(
NULL
);
}
if
(
BN_is_zero
(
a
)
||
BN_is_one
(
a
))
{
if
(
ret
==
NULL
)
ret
=
BN_new
();
if
(
ret
==
NULL
)
goto
end
;
if
(
!
BN_set_word
(
ret
,
BN_is_one
(
a
)))
{
BN_free
(
ret
);
return
NULL
;
}
return
ret
;
}
#if 0 /* if BN_mod_sqrt is used with correct input, this just wastes time */
r = BN_kronecker(a, p, ctx);
if (r < -1) return NULL;
...
...
@@ -119,7 +133,9 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
e
=
1
;
while
(
!
BN_is_bit_set
(
p
,
e
))
e
++
;
if
(
!
BN_rshift
(
q
,
p
,
e
))
goto
end
;
if
(
e
>
2
)
/* we don't need this q if e = 1 or 2 */
if
(
!
BN_rshift
(
q
,
p
,
e
))
goto
end
;
q
->
neg
=
0
;
if
(
e
==
1
)
...
...
@@ -129,16 +145,74 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
* directly by modular exponentiation.
* We have
* 2 * (p+1)/4 == 1 (mod (p-1)/2),
* so we can use exponent (p+1)/4, i.e. (
q+1)/2
.
* so we can use exponent (p+1)/4, i.e. (
p-3)/4 + 1
.
*/
if
(
!
BN_
add_word
(
q
,
1
))
goto
end
;
if
(
!
BN_
rshift1
(
q
,
q
))
goto
end
;
if
(
!
BN_
rshift
(
q
,
p
,
2
))
goto
end
;
if
(
!
BN_
add_word
(
q
,
1
))
goto
end
;
if
(
!
BN_mod_exp
(
ret
,
a
,
q
,
p
,
ctx
))
goto
end
;
err
=
0
;
goto
end
;
}
/* e > 1, so we really have to use the Tonelli/Shanks algorithm.
if
(
e
==
2
)
{
/* p == 5 (mod 8)
*
* In this case 2 is always a non-square since
* Legendre(2,p) = (-1)^((p^2-1)/8) for any odd prime.
* So if a really is a square, then 2*a is a non-square.
* Thus for
* b := (2*a)^((p-5)/8),
* i := (2*a)*b^2
* we have
* i^2 = (2*a)^((1 + (p-5)/4)*2)
* = (2*a)^((p-1)/2)
* = -1;
* so if we set
* x := a*b*(i-1),
* then
* x^2 = a^2 * b^2 * (i^2 - 2*i + 1)
* = a^2 * b^2 * (-2*i)
* = a*(-i)*(2*a*b^2)
* = a*(-i)*i
* = a.
*
* (This is due to A.O.L. Atkin,
* <URL: http://listserv.nodak.edu/scripts/wa.exe?A2=ind9211&L=nmbrthry&O=T&P=562>,
* November 1992.)
*/
/* make sure that a is reduced modulo p */
if
(
a
->
neg
||
BN_ucmp
(
a
,
p
)
>=
0
)
{
if
(
!
BN_nnmod
(
x
,
a
,
p
,
ctx
))
goto
end
;
a
=
x
;
/* use x as temporary variable */
}
/* t := 2*a */
if
(
!
BN_mod_lshift1_quick
(
t
,
a
,
p
))
goto
end
;
/* b := (2*a)^((p-5)/8) */
if
(
!
BN_rshift
(
q
,
p
,
3
))
goto
end
;
if
(
!
BN_mod_exp
(
b
,
t
,
q
,
p
,
ctx
))
goto
end
;
/* y := b^2 */
if
(
!
BN_mod_sqr
(
y
,
b
,
p
,
ctx
))
goto
end
;
/* t := (2*a)*b^2 - 1*/
if
(
!
BN_mod_mul
(
t
,
t
,
y
,
p
,
ctx
))
goto
end
;
if
(
!
BN_sub_word
(
t
,
1
))
goto
end
;
/* cannot become negative */
/* x = a*b*t */
if
(
!
BN_mod_mul
(
x
,
a
,
b
,
p
,
ctx
))
goto
end
;
if
(
!
BN_mod_mul
(
x
,
x
,
t
,
p
,
ctx
))
goto
end
;
if
(
!
BN_copy
(
ret
,
x
))
goto
end
;
err
=
0
;
goto
end
;
}
/* e > 2, so we really have to use the Tonelli/Shanks algorithm.
* First, find some y that is not a square. */
i
=
2
;
do
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录