Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
5b054c69
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,发现更多精彩内容 >>
提交
5b054c69
编写于
3月 11, 2001
作者:
B
Bodo Möller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
EC_METHOD based on bn_mont2 (not used in the library)
上级
10654d3a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
313 addition
and
9 deletion
+313
-9
crypto/bn/bn_mont2.c
crypto/bn/bn_mont2.c
+29
-8
crypto/bn/bn_mont2.h
crypto/bn/bn_mont2.h
+1
-1
crypto/ec/ecp_mont2.c
crypto/ec/ecp_mont2.c
+283
-0
未找到文件。
crypto/bn/bn_mont2.c
浏览文件 @
5b054c69
...
@@ -82,7 +82,8 @@ static BN_ULONG BN_mont_inv(BIGNUM *a, int e, BN_CTX *ctx)
...
@@ -82,7 +82,8 @@ static BN_ULONG BN_mont_inv(BIGNUM *a, int e, BN_CTX *ctx)
exp
=
2
;
exp
=
2
;
mask
=
3
;
mask
=
3
;
if
((
x
=
BN_dup
(
a
))
==
NULL
)
return
0
;
if
((
x
=
BN_dup
(
a
))
==
NULL
)
return
0
;
if
(
!
BN_mask_bits
(
x
,
e
))
return
0
;
if
(
x
->
top
>
e
/
BN_BITS2
)
if
(
!
BN_mask_bits
(
x
,
e
))
return
0
;
BN_CTX_start
(
ctx
);
BN_CTX_start
(
ctx
);
xy
=
BN_CTX_get
(
ctx
);
xy
=
BN_CTX_get
(
ctx
);
...
@@ -138,6 +139,7 @@ int BN_mont_set(BIGNUM *p, BN_MONTGOMERY *mont, BN_CTX *ctx)
...
@@ -138,6 +139,7 @@ int BN_mont_set(BIGNUM *p, BN_MONTGOMERY *mont, BN_CTX *ctx)
if
(
BN_copy
(
mont
->
p
,
p
)
==
NULL
);
if
(
BN_copy
(
mont
->
p
,
p
)
==
NULL
);
mont
->
p_inv_b_neg
=
BN_mont_inv
(
p
,
BN_BITS2
,
ctx
);
mont
->
p_inv_b_neg
=
BN_mont_inv
(
p
,
BN_BITS2
,
ctx
);
if
(
!
mont
->
p_inv_b_neg
)
return
0
;
mont
->
p_inv_b_neg
=
0
-
mont
->
p_inv_b_neg
;
mont
->
p_inv_b_neg
=
0
-
mont
->
p_inv_b_neg
;
return
1
;
return
1
;
...
@@ -267,16 +269,16 @@ int BN_mont_red(BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -267,16 +269,16 @@ int BN_mont_red(BIGNUM *y, BN_MONTGOMERY *mont)
}
}
int
BN_mont_mod_mul
(
BIGNUM
*
r
,
BIGNUM
*
x
,
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
)
int
BN_mont_mod_mul
(
BIGNUM
*
r
_
,
BIGNUM
*
x
,
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
,
BN_CTX
*
ctx
)
/* r = x * y mod p */
/* r = x * y mod p */
/* r != x && r! = y !!! */
/* r != x && r! = y !!! */
{
{
BN_ULONG
c
;
BN_ULONG
c
;
BIGNUM
*
p
;
BIGNUM
*
p
;
int
i
,
j
,
max
;
int
i
,
j
,
max
;
BIGNUM
*
r
;
assert
(
r
!=
x
&&
r
!=
y
);
assert
(
r_
!=
NULL
&&
x
!=
NULL
&&
y
!=
NULL
&&
mont
!=
NULL
);
assert
(
r
!=
NULL
&&
x
!=
NULL
&&
y
!=
NULL
&&
mont
!=
NULL
);
assert
(
mont
->
p
!=
NULL
);
assert
(
mont
->
p
!=
NULL
);
assert
(
BN_cmp
(
x
,
mont
->
p
)
<
0
);
assert
(
BN_cmp
(
x
,
mont
->
p
)
<
0
);
assert
(
BN_cmp
(
y
,
mont
->
p
)
<
0
);
assert
(
BN_cmp
(
y
,
mont
->
p
)
<
0
);
...
@@ -289,6 +291,14 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -289,6 +291,14 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
return
1
;
return
1
;
}
}
if
(
r_
==
x
||
r_
==
y
)
{
BN_CTX_start
(
ctx
);
r
=
BN_CTX_get
(
ctx
);
}
else
r
=
r_
;
p
=
mont
->
p
;
p
=
mont
->
p
;
max
=
mont
->
p_num_bytes
;
max
=
mont
->
p_num_bytes
;
...
@@ -296,7 +306,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -296,7 +306,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
the last one --- max + 3 --- is only as a backstop
the last one --- max + 3 --- is only as a backstop
for incorrect input
for incorrect input
*/
*/
if
(
bn_wexpand
(
r
,
max
+
3
)
==
NULL
)
return
0
;
if
(
bn_wexpand
(
r
,
max
+
3
)
==
NULL
)
goto
err
;
for
(
i
=
0
;
i
<
max
+
3
;
i
++
)
r
->
d
[
i
]
=
0
;
for
(
i
=
0
;
i
<
max
+
3
;
i
++
)
r
->
d
[
i
]
=
0
;
r
->
top
=
max
+
2
;
r
->
top
=
max
+
2
;
...
@@ -308,7 +318,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -308,7 +318,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
if
(
c
)
if
(
c
)
{
{
if
(((
r
->
d
[
max
]
+=
c
)
&
BN_MASK2
)
<
c
)
if
(((
r
->
d
[
max
]
+=
c
)
&
BN_MASK2
)
<
c
)
if
(((
r
->
d
[
max
+
1
]
++
)
&
BN_MASK2
)
==
0
)
return
0
;
if
(((
r
->
d
[
max
+
1
]
++
)
&
BN_MASK2
)
==
0
)
goto
err
;
}
}
/* r = (r + x_i * y) / b */
/* r = (r + x_i * y) / b */
...
@@ -321,7 +331,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -321,7 +331,7 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
j
=
y
->
top
;
j
=
y
->
top
;
while
(((
++
(
r
->
d
[
j
])
)
&
BN_MASK2
)
==
0
)
while
(((
++
(
r
->
d
[
j
])
)
&
BN_MASK2
)
==
0
)
j
++
;
j
++
;
if
(
j
>
max
)
return
0
;
if
(
j
>
max
)
goto
err
;
}
}
}
}
r
->
d
[
max
+
1
]
=
0
;
r
->
d
[
max
+
1
]
=
0
;
...
@@ -342,8 +352,19 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
...
@@ -342,8 +352,19 @@ int BN_mont_mod_mul(BIGNUM *r, BIGNUM *x, BIGNUM *y, BN_MONTGOMERY *mont)
if
(
BN_cmp
(
r
,
mont
->
p
)
>=
0
)
if
(
BN_cmp
(
r
,
mont
->
p
)
>=
0
)
{
{
if
(
!
BN_sub
(
r
,
r
,
mont
->
p
))
return
0
;
if
(
!
BN_sub
(
r
,
r
,
mont
->
p
))
goto
err
;
}
if
(
r
!=
r_
)
{
if
(
!
BN_copy
(
r_
,
r
))
goto
err
;
BN_CTX_end
(
ctx
);
}
}
return
1
;
return
1
;
err:
if
(
r
!=
r_
)
BN_CTX_end
(
ctx
);
return
0
;
}
}
crypto/bn/bn_mont2.h
浏览文件 @
5b054c69
...
@@ -31,6 +31,6 @@ int BN_to_mont(BIGNUM *x, BN_MONTGOMERY *mont, BN_CTX *ctx);
...
@@ -31,6 +31,6 @@ int BN_to_mont(BIGNUM *x, BN_MONTGOMERY *mont, BN_CTX *ctx);
void
BN_mont_clear_free
(
BN_MONTGOMERY
*
mont
);
void
BN_mont_clear_free
(
BN_MONTGOMERY
*
mont
);
int
BN_mont_set
(
BIGNUM
*
p
,
BN_MONTGOMERY
*
mont
,
BN_CTX
*
ctx
);
int
BN_mont_set
(
BIGNUM
*
p
,
BN_MONTGOMERY
*
mont
,
BN_CTX
*
ctx
);
int
BN_mont_red
(
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
);
int
BN_mont_red
(
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
);
int
BN_mont_mod_mul
(
BIGNUM
*
r
,
BIGNUM
*
x
,
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
);
int
BN_mont_mod_mul
(
BIGNUM
*
r
,
BIGNUM
*
x
,
BIGNUM
*
y
,
BN_MONTGOMERY
*
mont
,
BN_CTX
*
);
#endif
#endif
crypto/ec/ecp_mont2.c
0 → 100644
浏览文件 @
5b054c69
/* unused */
/* crypto/ec/ecp_mont2.c */
/* ====================================================================
* Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
#define NDEBUG
#include <openssl/err.h>
#include "ec_lcl.h"
#include "../bn/bn_mont2.c"
int
ec_GFp_mont2_group_init
(
EC_GROUP
*
);
int
ec_GFp_mont2_group_set_curve_GFp
(
EC_GROUP
*
,
const
BIGNUM
*
p
,
const
BIGNUM
*
a
,
const
BIGNUM
*
b
,
BN_CTX
*
);
void
ec_GFp_mont2_group_finish
(
EC_GROUP
*
);
void
ec_GFp_mont2_group_clear_finish
(
EC_GROUP
*
);
/* int ec_GFp_mont2_group_copy(EC_GROUP *, const EC_GROUP *); */
int
ec_GFp_mont2_field_mul
(
const
EC_GROUP
*
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
const
BIGNUM
*
b
,
BN_CTX
*
);
int
ec_GFp_mont2_field_sqr
(
const
EC_GROUP
*
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
);
int
ec_GFp_mont2_field_encode
(
const
EC_GROUP
*
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
);
int
ec_GFp_mont2_field_decode
(
const
EC_GROUP
*
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
);
int
ec_GFp_mont2_field_set_to_one
(
const
EC_GROUP
*
,
BIGNUM
*
r
,
BN_CTX
*
);
const
EC_METHOD
*
EC_GFp_mont2_method
(
void
)
{
static
const
EC_METHOD
ret
=
{
ec_GFp_mont2_group_init
,
ec_GFp_mont2_group_finish
,
ec_GFp_mont2_group_clear_finish
,
0
/* ec_GFp_mont2_group_copy */
,
ec_GFp_mont2_group_set_curve_GFp
,
ec_GFp_simple_group_get_curve_GFp
,
ec_GFp_simple_group_set_generator
,
ec_GFp_simple_group_get0_generator
,
ec_GFp_simple_group_get_order
,
ec_GFp_simple_group_get_cofactor
,
ec_GFp_simple_point_init
,
ec_GFp_simple_point_finish
,
ec_GFp_simple_point_clear_finish
,
ec_GFp_simple_point_copy
,
ec_GFp_simple_point_set_to_infinity
,
ec_GFp_simple_set_Jprojective_coordinates_GFp
,
ec_GFp_simple_get_Jprojective_coordinates_GFp
,
ec_GFp_simple_point_set_affine_coordinates_GFp
,
ec_GFp_simple_point_get_affine_coordinates_GFp
,
ec_GFp_simple_set_compressed_coordinates_GFp
,
ec_GFp_simple_point2oct
,
ec_GFp_simple_oct2point
,
ec_GFp_simple_add
,
ec_GFp_simple_dbl
,
ec_GFp_simple_invert
,
ec_GFp_simple_is_at_infinity
,
ec_GFp_simple_is_on_curve
,
ec_GFp_simple_cmp
,
ec_GFp_simple_make_affine
,
ec_GFp_simple_points_make_affine
,
ec_GFp_mont2_field_mul
,
ec_GFp_mont2_field_sqr
,
ec_GFp_mont2_field_encode
,
ec_GFp_mont2_field_decode
,
ec_GFp_mont2_field_set_to_one
};
return
&
ret
;
}
int
ec_GFp_mont2_group_init
(
EC_GROUP
*
group
)
{
int
ok
;
ok
=
ec_GFp_simple_group_init
(
group
);
group
->
field_data1
=
NULL
;
group
->
field_data2
=
NULL
;
return
ok
;
}
int
ec_GFp_mont2_group_set_curve_GFp
(
EC_GROUP
*
group
,
const
BIGNUM
*
p
,
const
BIGNUM
*
a
,
const
BIGNUM
*
b
,
BN_CTX
*
ctx
)
{
BN_CTX
*
new_ctx
=
NULL
;
BN_MONTGOMERY
*
mont
=
NULL
;
BIGNUM
*
one
=
NULL
;
int
ret
=
0
;
if
(
group
->
field_data1
!=
NULL
)
{
BN_mont_clear_free
(
group
->
field_data1
);
group
->
field_data1
=
NULL
;
}
if
(
group
->
field_data2
!=
NULL
)
{
BN_free
(
group
->
field_data2
);
group
->
field_data2
=
NULL
;
}
if
(
ctx
==
NULL
)
{
ctx
=
new_ctx
=
BN_CTX_new
();
if
(
ctx
==
NULL
)
return
0
;
}
mont
=
BN_mont_new
();
if
(
mont
==
NULL
)
goto
err
;
if
(
!
BN_mont_set
(
p
,
mont
,
ctx
))
{
ECerr
(
EC_F_GFP_MONT2_GROUP_SET_CURVE_GFP
,
ERR_R_BN_LIB
);
goto
err
;
}
one
=
BN_new
();
if
(
one
==
NULL
)
goto
err
;
if
(
!
BN_one
(
one
))
goto
err
;
if
(
!
BN_to_mont
(
one
,
mont
,
ctx
))
goto
err
;
group
->
field_data1
=
mont
;
mont
=
NULL
;
group
->
field_data2
=
one
;
one
=
NULL
;
ret
=
ec_GFp_simple_group_set_curve_GFp
(
group
,
p
,
a
,
b
,
ctx
);
if
(
!
ret
)
{
BN_mont_clear_free
(
group
->
field_data1
);
group
->
field_data1
=
NULL
;
BN_free
(
group
->
field_data2
);
group
->
field_data2
=
NULL
;
}
err:
if
(
new_ctx
!=
NULL
)
BN_CTX_free
(
new_ctx
);
if
(
mont
!=
NULL
)
BN_mont_clear_free
(
mont
);
return
ret
;
}
void
ec_GFp_mont2_group_finish
(
EC_GROUP
*
group
)
{
if
(
group
->
field_data1
!=
NULL
)
{
BN_mont_clear_free
(
group
->
field_data1
);
group
->
field_data1
=
NULL
;
}
if
(
group
->
field_data2
!=
NULL
)
{
BN_free
(
group
->
field_data2
);
group
->
field_data2
=
NULL
;
}
ec_GFp_simple_group_finish
(
group
);
}
void
ec_GFp_mont2_group_clear_finish
(
EC_GROUP
*
group
)
{
if
(
group
->
field_data1
!=
NULL
)
{
BN_mont_clear_free
(
group
->
field_data1
);
group
->
field_data1
=
NULL
;
}
if
(
group
->
field_data2
!=
NULL
)
{
BN_clear_free
(
group
->
field_data2
);
group
->
field_data2
=
NULL
;
}
ec_GFp_simple_group_clear_finish
(
group
);
}
int
ec_GFp_mont2_field_mul
(
const
EC_GROUP
*
group
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
const
BIGNUM
*
b
,
BN_CTX
*
ctx
)
{
if
(
group
->
field_data1
==
NULL
)
{
ECerr
(
EC_F_EC_GFP_MONT2_FIELD_MUL
,
EC_R_NOT_INITIALIZED
);
return
0
;
}
return
BN_mont_mod_mul
(
r
,
a
,
b
,
group
->
field_data1
,
ctx
);
}
int
ec_GFp_mont2_field_sqr
(
const
EC_GROUP
*
group
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
ctx
)
{
if
(
group
->
field_data1
==
NULL
)
{
ECerr
(
EC_F_EC_GFP_MONT2_FIELD_SQR
,
EC_R_NOT_INITIALIZED
);
return
0
;
}
return
BN_mont_mod_mul
(
r
,
a
,
a
,
group
->
field_data1
,
ctx
);
}
int
ec_GFp_mont2_field_encode
(
const
EC_GROUP
*
group
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
ctx
)
{
if
(
group
->
field_data1
==
NULL
)
{
ECerr
(
EC_F_EC_GFP_MONT2_FIELD_ENCODE
,
EC_R_NOT_INITIALIZED
);
return
0
;
}
if
(
!
BN_copy
(
r
,
a
))
return
0
;
return
BN_to_mont
(
r
,
(
BN_MONTGOMERY
*
)
group
->
field_data1
,
ctx
);
}
int
ec_GFp_mont2_field_decode
(
const
EC_GROUP
*
group
,
BIGNUM
*
r
,
const
BIGNUM
*
a
,
BN_CTX
*
ctx
)
{
if
(
group
->
field_data1
==
NULL
)
{
ECerr
(
EC_F_EC_GFP_MONT2_FIELD_DECODE
,
EC_R_NOT_INITIALIZED
);
return
0
;
}
if
(
!
BN_copy
(
r
,
a
))
return
0
;
return
BN_mont_red
(
r
,
(
BN_MONTGOMERY
*
)
group
->
field_data1
);
}
int
ec_GFp_mont2_field_set_to_one
(
const
EC_GROUP
*
group
,
BIGNUM
*
r
,
BN_CTX
*
ctx
)
{
if
(
group
->
field_data2
==
NULL
)
{
ECerr
(
EC_F_EC_GFP_MONT2_FIELD_DECODE
,
EC_R_NOT_INITIALIZED
);
return
0
;
}
if
(
!
BN_copy
(
r
,
group
->
field_data2
))
return
0
;
return
1
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录