Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
992bba11
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
1 年多 前同步成功
通知
10
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看板
提交
992bba11
编写于
6月 01, 2014
作者:
B
Ben Laurie
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'erbridge-probable_primes'
上级
3009244d
5fc3a5fe
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
347 addition
and
43 deletion
+347
-43
CHANGES
CHANGES
+4
-0
Configure
Configure
+18
-17
apps/speed.c
apps/speed.c
+139
-18
crypto/bn/bn_lcl.h
crypto/bn/bn_lcl.h
+5
-0
crypto/bn/bn_prime.c
crypto/bn/bn_prime.c
+122
-8
crypto/bn/bntest.c
crypto/bn/bntest.c
+38
-0
tools/primes.py
tools/primes.py
+21
-0
未找到文件。
CHANGES
浏览文件 @
992bba11
...
@@ -4,6 +4,10 @@
...
@@ -4,6 +4,10 @@
Changes between 1.0.2 and 1.1.0 [xx XXX xxxx]
Changes between 1.0.2 and 1.1.0 [xx XXX xxxx]
*) Experimental support for a new, fast, unbiased prime candidate generator,
bn_probable_prime_dh_coprime(). Not currently used by any prime generator.
[Felix Laurie von Massenbach <felix@erbridge.co.uk>]
*) New output format NSS in the sess_id command line tool. This allows
*) New output format NSS in the sess_id command line tool. This allows
exporting the session id and the master key in NSS keylog format.
exporting the session id and the master key in NSS keylog format.
[Martin Kaiser <martin@kaiser.cx>]
[Martin Kaiser <martin@kaiser.cx>]
...
...
Configure
浏览文件 @
992bba11
...
@@ -180,6 +180,7 @@ my %table=(
...
@@ -180,6 +180,7 @@ my %table=(
"debug-ben-darwin64","cc:$gcc_devteam_warn -Wno-language-extension-token -Wno-extended-offsetof -arch x86_64 -O3 -DL_ENDIAN -DMD32_REG_T=int -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:$x86_64_asm:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
"debug-ben-darwin64","cc:$gcc_devteam_warn -Wno-language-extension-token -Wno-extended-offsetof -arch x86_64 -O3 -DL_ENDIAN -DMD32_REG_T=int -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:$x86_64_asm:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}",
"debug-bodo", "gcc:$gcc_devteam_warn -Wno-error=overlength-strings -DBN_DEBUG -DBN_DEBUG_RAND -DCONF_DEBUG -DBIO_PAIR_DEBUG -m64 -DL_ENDIAN -DTERMIO -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
"debug-bodo", "gcc:$gcc_devteam_warn -Wno-error=overlength-strings -DBN_DEBUG -DBN_DEBUG_RAND -DCONF_DEBUG -DBIO_PAIR_DEBUG -m64 -DL_ENDIAN -DTERMIO -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
"debug-erbridge", "gcc:$gcc_devteam_warn -DBN_DEBUG -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -DTERMIO -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",
"debug-ulf", "gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DBN_DEBUG_RAND -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations:::CYGWIN32:::${no_asm}:win32:cygwin-shared:::.dll",
"debug-ulf", "gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DBN_DEBUG_RAND -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations:::CYGWIN32:::${no_asm}:win32:cygwin-shared:::.dll",
"debug-steve64", "gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"debug-steve64", "gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"debug-steve32", "gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
"debug-steve32", "gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -Wno-overlength-strings -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
...
...
apps/speed.c
浏览文件 @
992bba11
...
@@ -75,6 +75,7 @@
...
@@ -75,6 +75,7 @@
#undef SECONDS
#undef SECONDS
#define SECONDS 3
#define SECONDS 3
#define PRIME_SECONDS 10
#define RSA_SECONDS 10
#define RSA_SECONDS 10
#define DSA_SECONDS 10
#define DSA_SECONDS 10
#define ECDSA_SECONDS 10
#define ECDSA_SECONDS 10
...
@@ -191,6 +192,8 @@
...
@@ -191,6 +192,8 @@
#endif
#endif
#include <openssl/modes.h>
#include <openssl/modes.h>
#include "../crypto/bn/bn_lcl.h"
#ifndef HAVE_FORK
#ifndef HAVE_FORK
# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_NETWARE)
# define HAVE_FORK 0
# define HAVE_FORK 0
...
@@ -214,15 +217,18 @@ static int usertime=1;
...
@@ -214,15 +217,18 @@ static int usertime=1;
static
double
Time_F
(
int
s
);
static
double
Time_F
(
int
s
);
static
void
print_message
(
const
char
*
s
,
long
num
,
int
length
);
static
void
print_message
(
const
char
*
s
,
long
num
,
int
length
);
static
void
prime_print_message
(
const
char
*
s
,
long
num
);
static
void
pkey_print_message
(
const
char
*
str
,
const
char
*
str2
,
static
void
pkey_print_message
(
const
char
*
str
,
const
char
*
str2
,
long
num
,
int
bits
,
int
sec
);
long
num
,
int
bits
,
int
sec
);
static
void
print_result
(
int
alg
,
int
run_no
,
int
count
,
double
time_used
);
static
void
print_result
(
int
alg
,
int
run_no
,
int
count
,
double
time_used
);
static
void
prime_print_result
(
int
alg
,
int
count
,
double
time_used
);
#ifndef NO_FORK
#ifndef NO_FORK
static
int
do_multi
(
int
multi
);
static
int
do_multi
(
int
multi
);
#endif
#endif
#define ALGOR_NUM 30
#define ALGOR_NUM 30
#define SIZE_NUM 5
#define SIZE_NUM 5
#define PRIME_NUM 3
#define RSA_NUM 4
#define RSA_NUM 4
#define DSA_NUM 3
#define DSA_NUM 3
...
@@ -239,6 +245,8 @@ static const char *names[ALGOR_NUM]={
...
@@ -239,6 +245,8 @@ static const char *names[ALGOR_NUM]={
"aes-128 ige"
,
"aes-192 ige"
,
"aes-256 ige"
,
"ghash"
};
"aes-128 ige"
,
"aes-192 ige"
,
"aes-256 ige"
,
"ghash"
};
static
double
results
[
ALGOR_NUM
][
SIZE_NUM
];
static
double
results
[
ALGOR_NUM
][
SIZE_NUM
];
static
int
lengths
[
SIZE_NUM
]
=
{
16
,
64
,
256
,
1024
,
8
*
1024
};
static
int
lengths
[
SIZE_NUM
]
=
{
16
,
64
,
256
,
1024
,
8
*
1024
};
static
const
char
*
prime_names
[
PRIME_NUM
]
=
{
"prime trial division"
,
"prime trial division retry"
,
"prime coprime"
};
#ifndef OPENSSL_NO_RSA
#ifndef OPENSSL_NO_RSA
static
double
rsa_results
[
RSA_NUM
][
2
];
static
double
rsa_results
[
RSA_NUM
][
2
];
#endif
#endif
...
@@ -492,6 +500,12 @@ int MAIN(int argc, char **argv)
...
@@ -492,6 +500,12 @@ int MAIN(int argc, char **argv)
#define D_GHASH 29
#define D_GHASH 29
double
d
=
0
.
0
;
double
d
=
0
.
0
;
long
c
[
ALGOR_NUM
][
SIZE_NUM
];
long
c
[
ALGOR_NUM
][
SIZE_NUM
];
#define D_PRIME_TRIAL_DIVISION 0
#define D_PRIME_TRIAL_DIVISION_RETRY 1
#define D_PRIME_COPRIME 2
long
prime_c
[
PRIME_NUM
];
#define R_DSA_512 0
#define R_DSA_512 0
#define R_DSA_1024 1
#define R_DSA_1024 1
#define R_DSA_2048 2
#define R_DSA_2048 2
...
@@ -605,6 +619,7 @@ int MAIN(int argc, char **argv)
...
@@ -605,6 +619,7 @@ int MAIN(int argc, char **argv)
long
ecdh_c
[
EC_NUM
][
2
];
long
ecdh_c
[
EC_NUM
][
2
];
#endif
#endif
int
prime_doit
[
PRIME_NUM
];
int
rsa_doit
[
RSA_NUM
];
int
rsa_doit
[
RSA_NUM
];
int
dsa_doit
[
DSA_NUM
];
int
dsa_doit
[
DSA_NUM
];
#ifndef OPENSSL_NO_ECDSA
#ifndef OPENSSL_NO_ECDSA
...
@@ -685,6 +700,8 @@ int MAIN(int argc, char **argv)
...
@@ -685,6 +700,8 @@ int MAIN(int argc, char **argv)
for
(
i
=
0
;
i
<
EC_NUM
;
i
++
)
for
(
i
=
0
;
i
<
EC_NUM
;
i
++
)
ecdh_doit
[
i
]
=
0
;
ecdh_doit
[
i
]
=
0
;
#endif
#endif
for
(
i
=
0
;
i
<
PRIME_NUM
;
i
++
)
prime_doit
[
i
]
=
0
;
j
=
0
;
j
=
0
;
...
@@ -997,6 +1014,18 @@ int MAIN(int argc, char **argv)
...
@@ -997,6 +1014,18 @@ int MAIN(int argc, char **argv)
}
}
else
else
#endif
#endif
if
(
strcmp
(
*
argv
,
"prime-trial-division"
)
==
0
)
prime_doit
[
D_PRIME_TRIAL_DIVISION
]
=
1
;
else
if
(
strcmp
(
*
argv
,
"prime-trial-division-retry"
)
==
0
)
prime_doit
[
D_PRIME_TRIAL_DIVISION_RETRY
]
=
1
;
else
if
(
strcmp
(
*
argv
,
"prime-coprime"
)
==
0
)
prime_doit
[
D_PRIME_COPRIME
]
=
1
;
else
if
(
strcmp
(
*
argv
,
"prime"
)
==
0
)
{
for
(
i
=
0
;
i
<
PRIME_NUM
;
i
++
)
prime_doit
[
i
]
=
1
;
}
else
{
{
BIO_printf
(
bio_err
,
"Error: bad option or value
\n
"
);
BIO_printf
(
bio_err
,
"Error: bad option or value
\n
"
);
BIO_printf
(
bio_err
,
"
\n
"
);
BIO_printf
(
bio_err
,
"
\n
"
);
...
@@ -1123,6 +1152,7 @@ int MAIN(int argc, char **argv)
...
@@ -1123,6 +1152,7 @@ int MAIN(int argc, char **argv)
!defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
!defined(OPENSSL_NO_AES) || !defined(OPENSSL_NO_CAMELLIA)
BIO_printf
(
bio_err
,
"
\n
"
);
BIO_printf
(
bio_err
,
"
\n
"
);
#endif
#endif
BIO_printf
(
bio_err
,
"prime-trial-division prime-coprime
\n
"
);
BIO_printf
(
bio_err
,
"
\n
"
);
BIO_printf
(
bio_err
,
"
\n
"
);
BIO_printf
(
bio_err
,
"Available options:
\n
"
);
BIO_printf
(
bio_err
,
"Available options:
\n
"
);
...
@@ -1291,25 +1321,26 @@ int MAIN(int argc, char **argv)
...
@@ -1291,25 +1321,26 @@ int MAIN(int argc, char **argv)
c
[
D_IGE_256_AES
][
0
]
=
count
;
c
[
D_IGE_256_AES
][
0
]
=
count
;
c
[
D_GHASH
][
0
]
=
count
;
c
[
D_GHASH
][
0
]
=
count
;
for
(
i
=
1
;
i
<
SIZE_NUM
;
i
++
)
{
c
[
D_MD2
][
i
]
=
c
[
D_MD2
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_MDC2
][
i
]
=
c
[
D_MDC2
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_MD4
][
i
]
=
c
[
D_MD4
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_MD5
][
i
]
=
c
[
D_MD5
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_HMAC
][
i
]
=
c
[
D_HMAC
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_SHA1
][
i
]
=
c
[
D_SHA1
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_RMD160
][
i
]
=
c
[
D_RMD160
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_SHA256
][
i
]
=
c
[
D_SHA256
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_SHA512
][
i
]
=
c
[
D_SHA512
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
c
[
D_WHIRLPOOL
][
i
]
=
c
[
D_WHIRLPOOL
][
0
]
*
4
*
lengths
[
0
]
/
lengths
[
i
];
}
for
(
i
=
1
;
i
<
SIZE_NUM
;
i
++
)
for
(
i
=
1
;
i
<
SIZE_NUM
;
i
++
)
{
{
long
l0
,
l1
;
long
l0
,
l1
;
l0
=
(
long
)
lengths
[
i
-
1
];
l0
=
(
long
)
lengths
[
0
];
l1
=
(
long
)
lengths
[
i
];
l1
=
(
long
)
lengths
[
i
];
c
[
D_MD2
][
i
]
=
c
[
D_MD2
][
0
]
*
4
*
l0
/
l1
;
c
[
D_MDC2
][
i
]
=
c
[
D_MDC2
][
0
]
*
4
*
l0
/
l1
;
c
[
D_MD4
][
i
]
=
c
[
D_MD4
][
0
]
*
4
*
l0
/
l1
;
c
[
D_MD5
][
i
]
=
c
[
D_MD5
][
0
]
*
4
*
l0
/
l1
;
c
[
D_HMAC
][
i
]
=
c
[
D_HMAC
][
0
]
*
4
*
l0
/
l1
;
c
[
D_SHA1
][
i
]
=
c
[
D_SHA1
][
0
]
*
4
*
l0
/
l1
;
c
[
D_RMD160
][
i
]
=
c
[
D_RMD160
][
0
]
*
4
*
l0
/
l1
;
c
[
D_SHA256
][
i
]
=
c
[
D_SHA256
][
0
]
*
4
*
l0
/
l1
;
c
[
D_SHA512
][
i
]
=
c
[
D_SHA512
][
0
]
*
4
*
l0
/
l1
;
c
[
D_WHIRLPOOL
][
i
]
=
c
[
D_WHIRLPOOL
][
0
]
*
4
*
l0
/
l1
;
l0
=
(
long
)
lengths
[
i
-
1
];
c
[
D_RC4
][
i
]
=
c
[
D_RC4
][
i
-
1
]
*
l0
/
l1
;
c
[
D_RC4
][
i
]
=
c
[
D_RC4
][
i
-
1
]
*
l0
/
l1
;
c
[
D_CBC_DES
][
i
]
=
c
[
D_CBC_DES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_CBC_DES
][
i
]
=
c
[
D_CBC_DES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_EDE3_DES
][
i
]
=
c
[
D_EDE3_DES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_EDE3_DES
][
i
]
=
c
[
D_EDE3_DES
][
i
-
1
]
*
l0
/
l1
;
...
@@ -1329,6 +1360,11 @@ int MAIN(int argc, char **argv)
...
@@ -1329,6 +1360,11 @@ int MAIN(int argc, char **argv)
c
[
D_IGE_192_AES
][
i
]
=
c
[
D_IGE_192_AES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_IGE_192_AES
][
i
]
=
c
[
D_IGE_192_AES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_IGE_256_AES
][
i
]
=
c
[
D_IGE_256_AES
][
i
-
1
]
*
l0
/
l1
;
c
[
D_IGE_256_AES
][
i
]
=
c
[
D_IGE_256_AES
][
i
-
1
]
*
l0
/
l1
;
}
}
prime_c
[
D_PRIME_TRIAL_DIVISION
]
=
count
;
prime_c
[
D_PRIME_TRIAL_DIVISION_RETRY
]
=
count
;
prime_c
[
D_PRIME_COPRIME
]
=
count
;
#ifndef OPENSSL_NO_RSA
#ifndef OPENSSL_NO_RSA
rsa_c
[
R_RSA_512
][
0
]
=
count
/
2000
;
rsa_c
[
R_RSA_512
][
0
]
=
count
/
2000
;
rsa_c
[
R_RSA_512
][
1
]
=
count
/
400
;
rsa_c
[
R_RSA_512
][
1
]
=
count
/
400
;
...
@@ -1996,6 +2032,66 @@ int MAIN(int argc, char **argv)
...
@@ -1996,6 +2032,66 @@ int MAIN(int argc, char **argv)
}
}
}
}
if
(
prime_doit
[
D_PRIME_TRIAL_DIVISION
])
{
BIGNUM
*
rnd
=
BN_new
();
BIGNUM
*
add
=
BN_new
();
BN_CTX
*
ctx
=
BN_CTX_new
();
BN_set_word
(
add
,
2
);
prime_print_message
(
prime_names
[
D_PRIME_TRIAL_DIVISION
],
prime_c
[
D_PRIME_TRIAL_DIVISION
]);
Time_F
(
START
);
for
(
count
=
0
,
run
=
1
;
COND
(
prime_c
[
D_PRIME_TRIAL_DIVISION
]);
count
++
)
if
(
!
bn_probable_prime_dh
(
rnd
,
1024
,
add
,
NULL
,
ctx
))
count
--
;
d
=
Time_F
(
STOP
);
prime_print_result
(
D_PRIME_TRIAL_DIVISION
,
count
,
d
);
BN_CTX_free
(
ctx
);
BN_free
(
add
);
BN_free
(
rnd
);
}
if
(
prime_doit
[
D_PRIME_TRIAL_DIVISION_RETRY
])
{
BIGNUM
*
rnd
=
BN_new
();
BN_CTX
*
ctx
=
BN_CTX_new
();
prime_print_message
(
prime_names
[
D_PRIME_TRIAL_DIVISION_RETRY
],
prime_c
[
D_PRIME_TRIAL_DIVISION_RETRY
]);
Time_F
(
START
);
for
(
count
=
0
,
run
=
1
;
COND
(
prime_c
[
D_PRIME_TRIAL_DIVISION_RETRY
]);
count
++
)
if
(
!
bn_probable_prime_dh_retry
(
rnd
,
1024
,
ctx
))
count
--
;
d
=
Time_F
(
STOP
);
prime_print_result
(
D_PRIME_TRIAL_DIVISION_RETRY
,
count
,
d
);
BN_CTX_free
(
ctx
);
BN_free
(
rnd
);
}
if
(
prime_doit
[
D_PRIME_COPRIME
])
{
BIGNUM
*
rnd
=
BN_new
();
BN_CTX
*
ctx
=
BN_CTX_new
();
prime_print_message
(
prime_names
[
D_PRIME_COPRIME
],
prime_c
[
D_PRIME_COPRIME
]);
Time_F
(
START
);
for
(
count
=
0
,
run
=
1
;
COND
(
prime_c
[
D_PRIME_COPRIME
]);
count
++
)
if
(
!
bn_probable_prime_dh_coprime
(
rnd
,
1024
,
ctx
))
count
--
;
d
=
Time_F
(
STOP
);
prime_print_result
(
D_PRIME_COPRIME
,
count
,
d
);
BN_CTX_free
(
ctx
);
BN_free
(
rnd
);
}
RAND_pseudo_bytes
(
buf
,
36
);
RAND_pseudo_bytes
(
buf
,
36
);
#ifndef OPENSSL_NO_RSA
#ifndef OPENSSL_NO_RSA
for
(
j
=
0
;
j
<
RSA_NUM
;
j
++
)
for
(
j
=
0
;
j
<
RSA_NUM
;
j
++
)
...
@@ -2586,6 +2682,23 @@ static void print_message(const char *s, long num, int length)
...
@@ -2586,6 +2682,23 @@ static void print_message(const char *s, long num, int length)
#endif
#endif
}
}
static
void
prime_print_message
(
const
char
*
s
,
long
num
)
{
#ifdef SIGALRM
BIO_printf
(
bio_err
,
mr
?
"+DT:%s:%d
\n
"
:
"Doing %s for %ds: "
,
s
,
PRIME_SECONDS
);
(
void
)
BIO_flush
(
bio_err
);
alarm
(
PRIME_SECONDS
);
#else
BIO_printf
(
bio_err
,
mr
?
"+DN:%s:%ld
\n
"
:
"Doing %s %ld times: "
,
s
,
num
);
(
void
)
BIO_flush
(
bio_err
);
#endif
#ifdef LINT
num
=
num
;
#endif
}
static
void
pkey_print_message
(
const
char
*
str
,
const
char
*
str2
,
long
num
,
static
void
pkey_print_message
(
const
char
*
str
,
const
char
*
str2
,
long
num
,
int
bits
,
int
tm
)
int
bits
,
int
tm
)
{
{
...
@@ -2611,6 +2724,14 @@ static void print_result(int alg,int run_no,int count,double time_used)
...
@@ -2611,6 +2724,14 @@ static void print_result(int alg,int run_no,int count,double time_used)
results
[
alg
][
run_no
]
=
((
double
)
count
)
/
time_used
*
lengths
[
run_no
];
results
[
alg
][
run_no
]
=
((
double
)
count
)
/
time_used
*
lengths
[
run_no
];
}
}
static
void
prime_print_result
(
int
alg
,
int
count
,
double
time_used
)
{
BIO_printf
(
bio_err
,
mr
?
"+R:%d:%s:%f:%f
\n
"
:
"%d %s's in %.2fs (%.2f microseconds / run)
\n
"
,
count
,
prime_names
[
alg
],
time_used
,
time_used
/
((
double
)
count
)
*
1000000
);
}
#ifndef NO_FORK
#ifndef NO_FORK
static
char
*
sstrsep
(
char
**
string
,
const
char
*
delim
)
static
char
*
sstrsep
(
char
**
string
,
const
char
*
delim
)
{
{
...
...
crypto/bn/bn_lcl.h
浏览文件 @
992bba11
...
@@ -534,6 +534,11 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_U
...
@@ -534,6 +534,11 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_U
BIGNUM
*
int_bn_mod_inverse
(
BIGNUM
*
in
,
BIGNUM
*
int_bn_mod_inverse
(
BIGNUM
*
in
,
const
BIGNUM
*
a
,
const
BIGNUM
*
n
,
BN_CTX
*
ctx
,
int
*
noinv
);
const
BIGNUM
*
a
,
const
BIGNUM
*
n
,
BN_CTX
*
ctx
,
int
*
noinv
);
int
bn_probable_prime_dh
(
BIGNUM
*
rnd
,
int
bits
,
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
);
int
bn_probable_prime_dh_retry
(
BIGNUM
*
rnd
,
int
bits
,
BN_CTX
*
ctx
);
int
bn_probable_prime_dh_coprime
(
BIGNUM
*
rnd
,
int
bits
,
BN_CTX
*
ctx
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
...
...
crypto/bn/bn_prime.c
浏览文件 @
992bba11
...
@@ -129,11 +129,54 @@
...
@@ -129,11 +129,54 @@
static
int
witness
(
BIGNUM
*
w
,
const
BIGNUM
*
a
,
const
BIGNUM
*
a1
,
static
int
witness
(
BIGNUM
*
w
,
const
BIGNUM
*
a
,
const
BIGNUM
*
a1
,
const
BIGNUM
*
a1_odd
,
int
k
,
BN_CTX
*
ctx
,
BN_MONT_CTX
*
mont
);
const
BIGNUM
*
a1_odd
,
int
k
,
BN_CTX
*
ctx
,
BN_MONT_CTX
*
mont
);
static
int
probable_prime
(
BIGNUM
*
rnd
,
int
bits
);
static
int
probable_prime
(
BIGNUM
*
rnd
,
int
bits
);
static
int
probable_prime_dh
(
BIGNUM
*
rnd
,
int
bits
,
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
);
static
int
probable_prime_dh_safe
(
BIGNUM
*
rnd
,
int
bits
,
static
int
probable_prime_dh_safe
(
BIGNUM
*
rnd
,
int
bits
,
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
);
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
);
static
const
int
prime_offsets
[
480
]
=
{
13
,
17
,
19
,
23
,
29
,
31
,
37
,
41
,
43
,
47
,
53
,
59
,
61
,
67
,
71
,
73
,
79
,
83
,
89
,
97
,
101
,
103
,
107
,
109
,
113
,
127
,
131
,
137
,
139
,
149
,
151
,
157
,
163
,
167
,
169
,
173
,
179
,
181
,
191
,
193
,
197
,
199
,
211
,
221
,
223
,
227
,
229
,
233
,
239
,
241
,
247
,
251
,
257
,
263
,
269
,
271
,
277
,
281
,
283
,
289
,
293
,
299
,
307
,
311
,
313
,
317
,
323
,
331
,
337
,
347
,
349
,
353
,
359
,
361
,
367
,
373
,
377
,
379
,
383
,
389
,
391
,
397
,
401
,
403
,
409
,
419
,
421
,
431
,
433
,
437
,
439
,
443
,
449
,
457
,
461
,
463
,
467
,
479
,
481
,
487
,
491
,
493
,
499
,
503
,
509
,
521
,
523
,
527
,
529
,
533
,
541
,
547
,
551
,
557
,
559
,
563
,
569
,
571
,
577
,
587
,
589
,
593
,
599
,
601
,
607
,
611
,
613
,
617
,
619
,
629
,
631
,
641
,
643
,
647
,
653
,
659
,
661
,
667
,
673
,
677
,
683
,
689
,
691
,
697
,
701
,
703
,
709
,
713
,
719
,
727
,
731
,
733
,
739
,
743
,
751
,
757
,
761
,
767
,
769
,
773
,
779
,
787
,
793
,
797
,
799
,
809
,
811
,
817
,
821
,
823
,
827
,
829
,
839
,
841
,
851
,
853
,
857
,
859
,
863
,
871
,
877
,
881
,
883
,
887
,
893
,
899
,
901
,
907
,
911
,
919
,
923
,
929
,
937
,
941
,
943
,
947
,
949
,
953
,
961
,
967
,
971
,
977
,
983
,
989
,
991
,
997
,
1003
,
1007
,
1009
,
1013
,
1019
,
1021
,
1027
,
1031
,
1033
,
1037
,
1039
,
1049
,
1051
,
1061
,
1063
,
1069
,
1073
,
1079
,
1081
,
1087
,
1091
,
1093
,
1097
,
1103
,
1109
,
1117
,
1121
,
1123
,
1129
,
1139
,
1147
,
1151
,
1153
,
1157
,
1159
,
1163
,
1171
,
1181
,
1187
,
1189
,
1193
,
1201
,
1207
,
1213
,
1217
,
1219
,
1223
,
1229
,
1231
,
1237
,
1241
,
1247
,
1249
,
1259
,
1261
,
1271
,
1273
,
1277
,
1279
,
1283
,
1289
,
1291
,
1297
,
1301
,
1303
,
1307
,
1313
,
1319
,
1321
,
1327
,
1333
,
1339
,
1343
,
1349
,
1357
,
1361
,
1363
,
1367
,
1369
,
1373
,
1381
,
1387
,
1391
,
1399
,
1403
,
1409
,
1411
,
1417
,
1423
,
1427
,
1429
,
1433
,
1439
,
1447
,
1451
,
1453
,
1457
,
1459
,
1469
,
1471
,
1481
,
1483
,
1487
,
1489
,
1493
,
1499
,
1501
,
1511
,
1513
,
1517
,
1523
,
1531
,
1537
,
1541
,
1543
,
1549
,
1553
,
1559
,
1567
,
1571
,
1577
,
1579
,
1583
,
1591
,
1597
,
1601
,
1607
,
1609
,
1613
,
1619
,
1621
,
1627
,
1633
,
1637
,
1643
,
1649
,
1651
,
1657
,
1663
,
1667
,
1669
,
1679
,
1681
,
1691
,
1693
,
1697
,
1699
,
1703
,
1709
,
1711
,
1717
,
1721
,
1723
,
1733
,
1739
,
1741
,
1747
,
1751
,
1753
,
1759
,
1763
,
1769
,
1777
,
1781
,
1783
,
1787
,
1789
,
1801
,
1807
,
1811
,
1817
,
1819
,
1823
,
1829
,
1831
,
1843
,
1847
,
1849
,
1853
,
1861
,
1867
,
1871
,
1873
,
1877
,
1879
,
1889
,
1891
,
1901
,
1907
,
1909
,
1913
,
1919
,
1921
,
1927
,
1931
,
1933
,
1937
,
1943
,
1949
,
1951
,
1957
,
1961
,
1963
,
1973
,
1979
,
1987
,
1993
,
1997
,
1999
,
2003
,
2011
,
2017
,
2021
,
2027
,
2029
,
2033
,
2039
,
2041
,
2047
,
2053
,
2059
,
2063
,
2069
,
2071
,
2077
,
2081
,
2083
,
2087
,
2089
,
2099
,
2111
,
2113
,
2117
,
2119
,
2129
,
2131
,
2137
,
2141
,
2143
,
2147
,
2153
,
2159
,
2161
,
2171
,
2173
,
2179
,
2183
,
2197
,
2201
,
2203
,
2207
,
2209
,
2213
,
2221
,
2227
,
2231
,
2237
,
2239
,
2243
,
2249
,
2251
,
2257
,
2263
,
2267
,
2269
,
2273
,
2279
,
2281
,
2287
,
2291
,
2293
,
2297
,
2309
,
2311
};
static
const
int
prime_offset_count
=
480
;
static
const
int
prime_multiplier
=
2310
;
static
const
int
prime_multiplier_bits
=
11
;
/* 2^|prime_multiplier_bits|
<= |prime_multiplier| */
static
const
int
first_prime_index
=
5
;
int
BN_GENCB_call
(
BN_GENCB
*
cb
,
int
a
,
int
b
)
int
BN_GENCB_call
(
BN_GENCB
*
cb
,
int
a
,
int
b
)
{
{
/* No callback means continue */
/* No callback means continue */
...
@@ -198,7 +241,7 @@ loop:
...
@@ -198,7 +241,7 @@ loop:
}
}
else
else
{
{
if
(
!
probable_prime_dh
(
ret
,
bits
,
add
,
rem
,
ctx
))
if
(
!
bn_
probable_prime_dh
(
ret
,
bits
,
add
,
rem
,
ctx
))
goto
err
;
goto
err
;
}
}
}
}
...
@@ -362,6 +405,73 @@ err:
...
@@ -362,6 +405,73 @@ err:
return
(
ret
);
return
(
ret
);
}
}
int
bn_probable_prime_dh_retry
(
BIGNUM
*
rnd
,
int
bits
,
BN_CTX
*
ctx
)
{
int
i
;
int
ret
=
0
;
loop:
if
(
!
BN_rand
(
rnd
,
bits
,
0
,
1
))
goto
err
;
/* we now have a random number 'rand' to test. */
for
(
i
=
1
;
i
<
NUMPRIMES
;
i
++
)
{
/* check that rnd is a prime */
if
(
BN_mod_word
(
rnd
,
(
BN_ULONG
)
primes
[
i
])
<=
1
)
{
goto
loop
;
}
}
ret
=
1
;
err:
bn_check_top
(
rnd
);
return
(
ret
);
}
int
bn_probable_prime_dh_coprime
(
BIGNUM
*
rnd
,
int
bits
,
BN_CTX
*
ctx
)
{
int
i
;
BIGNUM
*
offset_index
;
BIGNUM
*
offset_count
;
int
ret
=
0
;
OPENSSL_assert
(
bits
>
prime_multiplier_bits
);
BN_CTX_start
(
ctx
);
if
((
offset_index
=
BN_CTX_get
(
ctx
))
==
NULL
)
goto
err
;
if
((
offset_count
=
BN_CTX_get
(
ctx
))
==
NULL
)
goto
err
;
BN_add_word
(
offset_count
,
prime_offset_count
);
loop:
if
(
!
BN_rand
(
rnd
,
bits
-
prime_multiplier_bits
,
0
,
1
))
goto
err
;
if
(
BN_is_bit_set
(
rnd
,
bits
))
goto
loop
;
if
(
!
BN_rand_range
(
offset_index
,
offset_count
))
goto
err
;
BN_mul_word
(
rnd
,
prime_multiplier
);
BN_add_word
(
rnd
,
prime_offsets
[
BN_get_word
(
offset_index
)]);
/* we now have a random number 'rand' to test. */
/* skip coprimes */
for
(
i
=
first_prime_index
;
i
<
NUMPRIMES
;
i
++
)
{
/* check that rnd is a prime */
if
(
BN_mod_word
(
rnd
,
(
BN_ULONG
)
primes
[
i
])
<=
1
)
{
goto
loop
;
}
}
ret
=
1
;
err:
BN_CTX_end
(
ctx
);
bn_check_top
(
rnd
);
return
ret
;
}
static
int
witness
(
BIGNUM
*
w
,
const
BIGNUM
*
a
,
const
BIGNUM
*
a1
,
static
int
witness
(
BIGNUM
*
w
,
const
BIGNUM
*
a
,
const
BIGNUM
*
a1
,
const
BIGNUM
*
a1_odd
,
int
k
,
BN_CTX
*
ctx
,
BN_MONT_CTX
*
mont
)
const
BIGNUM
*
a1_odd
,
int
k
,
BN_CTX
*
ctx
,
BN_MONT_CTX
*
mont
)
{
{
...
@@ -409,7 +519,7 @@ again:
...
@@ -409,7 +519,7 @@ again:
maxdelta
=
size_limit
;
maxdelta
=
size_limit
;
}
}
delta
=
0
;
delta
=
0
;
loop:
loop:
if
(
is_single_word
)
if
(
is_single_word
)
{
{
BN_ULONG
rnd_word
=
BN_get_word
(
rnd
);
BN_ULONG
rnd_word
=
BN_get_word
(
rnd
);
...
@@ -454,7 +564,7 @@ again:
...
@@ -454,7 +564,7 @@ again:
return
(
1
);
return
(
1
);
}
}
static
int
probable_prime_dh
(
BIGNUM
*
rnd
,
int
bits
,
int
bn_
probable_prime_dh
(
BIGNUM
*
rnd
,
int
bits
,
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
)
const
BIGNUM
*
add
,
const
BIGNUM
*
rem
,
BN_CTX
*
ctx
)
{
{
int
i
,
ret
=
0
;
int
i
,
ret
=
0
;
...
@@ -476,7 +586,8 @@ static int probable_prime_dh(BIGNUM *rnd, int bits,
...
@@ -476,7 +586,8 @@ static int probable_prime_dh(BIGNUM *rnd, int bits,
/* we now have a random number 'rand' to test. */
/* we now have a random number 'rand' to test. */
loop:
for
(
i
=
1
;
i
<
NUMPRIMES
;
i
++
)
loop:
for
(
i
=
1
;
i
<
NUMPRIMES
;
i
++
)
{
{
/* check that rnd is a prime */
/* check that rnd is a prime */
if
(
BN_mod_word
(
rnd
,(
BN_ULONG
)
primes
[
i
])
<=
1
)
if
(
BN_mod_word
(
rnd
,(
BN_ULONG
)
primes
[
i
])
<=
1
)
...
@@ -486,6 +597,7 @@ static int probable_prime_dh(BIGNUM *rnd, int bits,
...
@@ -486,6 +597,7 @@ static int probable_prime_dh(BIGNUM *rnd, int bits,
}
}
}
}
ret
=
1
;
ret
=
1
;
err:
err:
BN_CTX_end
(
ctx
);
BN_CTX_end
(
ctx
);
bn_check_top
(
rnd
);
bn_check_top
(
rnd
);
...
@@ -524,12 +636,13 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd,
...
@@ -524,12 +636,13 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd,
if
(
!
BN_lshift1
(
p
,
q
))
goto
err
;
if
(
!
BN_lshift1
(
p
,
q
))
goto
err
;
if
(
!
BN_add_word
(
p
,
1
))
goto
err
;
if
(
!
BN_add_word
(
p
,
1
))
goto
err
;
loop:
for
(
i
=
1
;
i
<
NUMPRIMES
;
i
++
)
loop:
for
(
i
=
1
;
i
<
NUMPRIMES
;
i
++
)
{
{
/* check that p and q are prime */
/* check that p and q are prime */
/* check that for p and q
/* check that for p and q
* gcd(p-1,primes) == 1 (except for 2) */
* gcd(p-1,primes) == 1 (except for 2) */
if
(
(
BN_mod_word
(
p
,(
BN_ULONG
)
primes
[
i
])
==
0
)
||
if
((
BN_mod_word
(
p
,(
BN_ULONG
)
primes
[
i
])
==
0
)
||
(
BN_mod_word
(
q
,(
BN_ULONG
)
primes
[
i
])
==
0
))
(
BN_mod_word
(
q
,(
BN_ULONG
)
primes
[
i
])
==
0
))
{
{
if
(
!
BN_add
(
p
,
p
,
padd
))
goto
err
;
if
(
!
BN_add
(
p
,
p
,
padd
))
goto
err
;
...
@@ -538,6 +651,7 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd,
...
@@ -538,6 +651,7 @@ static int probable_prime_dh_safe(BIGNUM *p, int bits, const BIGNUM *padd,
}
}
}
}
ret
=
1
;
ret
=
1
;
err:
err:
BN_CTX_end
(
ctx
);
BN_CTX_end
(
ctx
);
bn_check_top
(
p
);
bn_check_top
(
p
);
...
...
crypto/bn/bntest.c
浏览文件 @
992bba11
...
@@ -87,6 +87,8 @@
...
@@ -87,6 +87,8 @@
#include <openssl/x509.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/err.h>
#include "../crypto/bn/bn_lcl.h"
const
int
num0
=
100
;
/* number of tests */
const
int
num0
=
100
;
/* number of tests */
const
int
num1
=
50
;
/* additional tests for some functions */
const
int
num1
=
50
;
/* additional tests for some functions */
const
int
num2
=
5
;
/* number of tests for slow functions */
const
int
num2
=
5
;
/* number of tests for slow functions */
...
@@ -121,6 +123,7 @@ int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx);
...
@@ -121,6 +123,7 @@ int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx);
int
test_kron
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_kron
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_sqrt
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_sqrt
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_small_prime
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_small_prime
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
test_probable_prime_coprime
(
BIO
*
bp
,
BN_CTX
*
ctx
);
int
rand_neg
(
void
);
int
rand_neg
(
void
);
static
int
results
=
0
;
static
int
results
=
0
;
...
@@ -270,6 +273,10 @@ int main(int argc, char *argv[])
...
@@ -270,6 +273,10 @@ int main(int argc, char *argv[])
if
(
!
test_small_prime
(
out
,
ctx
))
goto
err
;
if
(
!
test_small_prime
(
out
,
ctx
))
goto
err
;
(
void
)
BIO_flush
(
out
);
(
void
)
BIO_flush
(
out
);
message
(
out
,
"Probable prime generation with coprimes"
);
if
(
!
test_probable_prime_coprime
(
out
,
ctx
))
goto
err
;
(
void
)
BIO_flush
(
out
);
#ifndef OPENSSL_NO_EC2M
#ifndef OPENSSL_NO_EC2M
message
(
out
,
"BN_GF2m_add"
);
message
(
out
,
"BN_GF2m_add"
);
if
(
!
test_gf2m_add
(
out
))
goto
err
;
if
(
!
test_gf2m_add
(
out
))
goto
err
;
...
@@ -1923,6 +1930,37 @@ err:
...
@@ -1923,6 +1930,37 @@ err:
return
ret
;
return
ret
;
}
}
int
test_probable_prime_coprime
(
BIO
*
bp
,
BN_CTX
*
ctx
)
{
int
i
,
j
,
ret
=
0
;
BIGNUM
r
;
BN_ULONG
primes
[
5
]
=
{
2
,
3
,
5
,
7
,
11
};
BN_init
(
&
r
);
for
(
i
=
0
;
i
<
1000
;
i
++
)
{
if
(
!
bn_probable_prime_dh_coprime
(
&
r
,
1024
,
ctx
))
goto
err
;
for
(
j
=
0
;
j
<
5
;
j
++
)
{
if
(
BN_mod_word
(
&
r
,
primes
[
j
])
==
0
)
{
BIO_printf
(
bp
,
"Number generated is not coprime to %ld:
\n
"
,
primes
[
j
]);
BN_print_fp
(
stdout
,
&
r
);
BIO_printf
(
bp
,
"
\n
"
);
goto
err
;
}
}
}
ret
=
1
;
err:
BN_clear
(
&
r
);
return
ret
;
}
int
test_lshift
(
BIO
*
bp
,
BN_CTX
*
ctx
,
BIGNUM
*
a_
)
int
test_lshift
(
BIO
*
bp
,
BN_CTX
*
ctx
,
BIGNUM
*
a_
)
{
{
BIGNUM
*
a
,
*
b
,
*
c
,
*
d
;
BIGNUM
*
a
,
*
b
,
*
c
,
*
d
;
...
...
tools/primes.py
0 → 100644
浏览文件 @
992bba11
primes
=
[
2
,
3
,
5
,
7
,
11
]
safe
=
False
# Not sure if the period's right on safe primes.
muliplier
=
1
if
not
safe
else
2
for
p
in
primes
:
muliplier
*=
p
offsets
=
[]
for
x
in
range
(
3
,
muliplier
+
3
,
2
):
prime
=
True
for
p
in
primes
:
if
not
x
%
p
or
(
safe
and
not
((
x
-
1
)
/
2
)
%
p
):
prime
=
False
break
if
prime
:
offsets
.
append
(
x
)
print
(
offsets
)
print
(
len
(
offsets
))
print
(
muliplier
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录