Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
e9ad0d2c
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,发现更多精彩内容 >>
提交
e9ad0d2c
编写于
7月 10, 2001
作者:
B
Bodo Möller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix PRNG.
上级
97639f0d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
68 addition
and
33 deletion
+68
-33
CHANGES
CHANGES
+32
-4
FAQ
FAQ
+1
-1
crypto/rand/md_rand.c
crypto/rand/md_rand.c
+29
-21
doc/crypto/rand.pod
doc/crypto/rand.pod
+6
-7
未找到文件。
CHANGES
浏览文件 @
e9ad0d2c
...
@@ -4,13 +4,41 @@
...
@@ -4,13 +4,41 @@
Changes between 0.9.6 and 0.9.7 [xx XXX 2001]
Changes between 0.9.6 and 0.9.7 [xx XXX 2001]
Both OpenSSL 0.9.6a (bugfix release, 5 Apr 2001) and OpenSSL 0.9.7
OpenSSL 0.9.6a/0.9.6b (bugfix releases, 5 Apr 2001 and 9 July 2001)
are based on OpenSSL 0.9.6.
and OpenSSL 0.9.7 were developped in parallel, based on OpenSSL 0.9.6.
Change log entries are tagged as follows:
Change log entries are tagged as follows:
-) applies to 0.9.6a
(/0.9.6b)
only
-) applies to 0.9.6a
/0.9.6b
only
*) applies to 0.9.6a
(/0.9.6b)
and 0.9.7
*) applies to 0.9.6a
/0.9.6b
and 0.9.7
+) applies to 0.9.7 only
+) applies to 0.9.7 only
-) OpenSSL 0.9.6b released [9 July 2001]
*) Change ssleay_rand_bytes (crypto/rand/md_rand.c)
to avoid a SSLeay/OpenSSL PRNG weakness pointed out by
Markku-Juhani O. Saarinen <markku-juhani.saarinen@nokia.com>:
PRNG state recovery was possible based on the output of
one PRNG request appropriately sized to gain knowledge on
'md' followed by enough consecutive 1-byte PRNG requests
to traverse all of 'state'.
1. When updating 'md_local' (the current thread's copy of 'md')
during PRNG output generation, hash all of the previous
'md_local' value, not just the half used for PRNG output.
2. Make the number of bytes from 'state' included into the hash
independent from the number of PRNG bytes requested.
The first measure alone would be sufficient to avoid
Markku-Juhani's attack. (Actually it had never occurred
to me that the half of 'md_local' used for chaining was the
half from which PRNG output bytes were taken -- I had always
assumed that the secret half would be used.) The second
measure makes sure that additional data from 'state' is never
mixed into 'md_local' in small portions; this heuristically
further strengthens the PRNG.
[Bodo Moeller]
+) Speed up EVP routines.
+) Speed up EVP routines.
Before:
Before:
encrypt
encrypt
...
...
FAQ
浏览文件 @
e9ad0d2c
...
@@ -57,7 +57,7 @@ OpenSSL - Frequently Asked Questions
...
@@ -57,7 +57,7 @@ OpenSSL - Frequently Asked Questions
* Which is the current version of OpenSSL?
* Which is the current version of OpenSSL?
The current version is available from <URL: http://www.openssl.org>.
The current version is available from <URL: http://www.openssl.org>.
OpenSSL 0.9.6
a was released on April 5
th, 2001.
OpenSSL 0.9.6
b was released on July 9
th, 2001.
In addition to the current stable release, you can also access daily
In addition to the current stable release, you can also access daily
snapshots of the OpenSSL development version at <URL:
snapshots of the OpenSSL development version at <URL:
...
...
crypto/rand/md_rand.c
浏览文件 @
e9ad0d2c
...
@@ -313,6 +313,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -313,6 +313,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
{
{
static
volatile
int
stirred_pool
=
0
;
static
volatile
int
stirred_pool
=
0
;
int
i
,
j
,
k
,
st_num
,
st_idx
;
int
i
,
j
,
k
,
st_num
,
st_idx
;
int
num_ceil
;
int
ok
;
int
ok
;
long
md_c
[
2
];
long
md_c
[
2
];
unsigned
char
local_md
[
MD_DIGEST_LENGTH
];
unsigned
char
local_md
[
MD_DIGEST_LENGTH
];
...
@@ -333,19 +334,24 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -333,19 +334,24 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
}
}
#endif
#endif
if
(
num
<=
0
)
return
1
;
/* round upwards to multiple of MD_DIGEST_LENGTH/2 */
num_ceil
=
(
1
+
(
num
-
1
)
/
(
MD_DIGEST_LENGTH
/
2
))
*
(
MD_DIGEST_LENGTH
/
2
);
/*
/*
* (Based on the rand(3) manpage:)
* (Based on the rand(3) manpage:)
*
*
* For each group of 10 bytes (or less), we do the following:
* For each group of 10 bytes (or less), we do the following:
*
*
* Input into the hash function the top 10 bytes from the
* Input into the hash function the local 'md' (which is initialized from
* local 'md' (which is initialized from the global 'md'
* the global 'md' before any bytes are generated), the bytes that are to
* before any bytes are generated), the bytes that are
* be overwritten by the random bytes, and bytes from the 'state'
* to be overwritten by the random bytes, and bytes from the
* (incrementing looping index). From this digest output (which is kept
* 'state' (incrementing looping index). From this digest output
* in 'md'), the top (up to) 10 bytes are returned to the caller and the
* (which is kept in 'md'), the top (up to) 10 bytes are
* bottom 10 bytes are xored into the 'state'.
* returned to the caller and the bottom (up to) 10 bytes are xored
*
* into the 'state'.
* Finally, after we have finished 'num' random bytes for the
* Finally, after we have finished 'num' random bytes for the
* caller, 'count' (which is incremented) and the local and global 'md'
* caller, 'count' (which is incremented) and the local and global 'md'
* are fed into the hash function and the results are kept in the
* are fed into the hash function and the results are kept in the
...
@@ -389,11 +395,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -389,11 +395,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
if
(
do_stir_pool
)
if
(
do_stir_pool
)
{
{
/*
Our output function chains only half of 'md', so we better
/*
In the output function only half of 'md' remains secret,
*
make sure that the required entropy gets 'evenly distributed'
*
so we better make sure that the required entropy gets
*
through 'state', our randomness pool. The input function
*
'evenly distributed' through 'state', our randomness pool.
*
(ssleay_rand_add) chains all of 'md', which makes it more
*
The input function (ssleay_rand_add) chains all of 'md',
* suitable for this purpose.
*
which makes it more
suitable for this purpose.
*/
*/
int
n
=
STATE_SIZE
;
/* so that the complete pool gets accessed */
int
n
=
STATE_SIZE
;
/* so that the complete pool gets accessed */
...
@@ -418,11 +424,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -418,11 +424,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
md_c
[
1
]
=
md_count
[
1
];
md_c
[
1
]
=
md_count
[
1
];
memcpy
(
local_md
,
md
,
sizeof
md
);
memcpy
(
local_md
,
md
,
sizeof
md
);
state_index
+=
num
;
state_index
+=
num
_ceil
;
if
(
state_index
>
state_num
)
if
(
state_index
>
state_num
)
state_index
%=
state_num
;
state_index
%=
state_num
;
/* state[st_idx], ..., state[(st_idx + num - 1) % st_num]
/* state[st_idx], ..., state[(st_idx + num
_ceil
- 1) % st_num]
* are now ours (but other threads may use them too) */
* are now ours (but other threads may use them too) */
md_count
[
0
]
+=
1
;
md_count
[
0
]
+=
1
;
...
@@ -434,6 +440,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -434,6 +440,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
while
(
num
>
0
)
while
(
num
>
0
)
{
{
/* num_ceil -= MD_DIGEST_LENGTH/2 */
j
=
(
num
>=
MD_DIGEST_LENGTH
/
2
)
?
MD_DIGEST_LENGTH
/
2
:
num
;
j
=
(
num
>=
MD_DIGEST_LENGTH
/
2
)
?
MD_DIGEST_LENGTH
/
2
:
num
;
num
-=
j
;
num
-=
j
;
MD_Init
(
&
m
);
MD_Init
(
&
m
);
...
@@ -444,27 +451,28 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
...
@@ -444,27 +451,28 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
curr_pid
=
0
;
curr_pid
=
0
;
}
}
#endif
#endif
MD_Update
(
&
m
,
&
(
local_md
[
MD_DIGEST_LENGTH
/
2
]),
MD_DIGEST_LENGTH
/
2
);
MD_Update
(
&
m
,
local_md
,
MD_DIGEST_LENGTH
);
MD_Update
(
&
m
,(
unsigned
char
*
)
&
(
md_c
[
0
]),
sizeof
(
md_c
));
MD_Update
(
&
m
,(
unsigned
char
*
)
&
(
md_c
[
0
]),
sizeof
(
md_c
));
#ifndef PURIFY
#ifndef PURIFY
MD_Update
(
&
m
,
buf
,
j
);
/* purify complains */
MD_Update
(
&
m
,
buf
,
j
);
/* purify complains */
#endif
#endif
k
=
(
st_idx
+
j
)
-
st_num
;
k
=
(
st_idx
+
MD_DIGEST_LENGTH
/
2
)
-
st_num
;
if
(
k
>
0
)
if
(
k
>
0
)
{
{
MD_Update
(
&
m
,
&
(
state
[
st_idx
]),
j
-
k
);
MD_Update
(
&
m
,
&
(
state
[
st_idx
]),
MD_DIGEST_LENGTH
/
2
-
k
);
MD_Update
(
&
m
,
&
(
state
[
0
]),
k
);
MD_Update
(
&
m
,
&
(
state
[
0
]),
k
);
}
}
else
else
MD_Update
(
&
m
,
&
(
state
[
st_idx
]),
j
);
MD_Update
(
&
m
,
&
(
state
[
st_idx
]),
MD_DIGEST_LENGTH
/
2
);
MD_Final
(
&
m
,
local_md
);
MD_Final
(
&
m
,
local_md
);
for
(
i
=
0
;
i
<
j
;
i
++
)
for
(
i
=
0
;
i
<
MD_DIGEST_LENGTH
/
2
;
i
++
)
{
{
state
[
st_idx
++
]
^=
local_md
[
i
];
/* may compete with other threads */
state
[
st_idx
++
]
^=
local_md
[
i
];
/* may compete with other threads */
*
(
buf
++
)
=
local_md
[
i
+
MD_DIGEST_LENGTH
/
2
];
if
(
st_idx
>=
st_num
)
if
(
st_idx
>=
st_num
)
st_idx
=
0
;
st_idx
=
0
;
if
(
i
<
j
)
*
(
buf
++
)
=
local_md
[
i
+
MD_DIGEST_LENGTH
/
2
];
}
}
}
}
...
...
doc/crypto/rand.pod
浏览文件 @
e9ad0d2c
...
@@ -127,13 +127,12 @@ function and xor).
...
@@ -127,13 +127,12 @@ function and xor).
When bytes are extracted from the RNG, the following process is used.
When bytes are extracted from the RNG, the following process is used.
For each group of 10 bytes (or less), we do the following:
For each group of 10 bytes (or less), we do the following:
Input into the hash function the top 10 bytes from the local 'md'
Input into the hash function the local 'md' (which is initialized from
(which is initialized from the global 'md' before any bytes are
the global 'md' before any bytes are generated), the bytes that are to
generated), the bytes that are to be overwritten by the random bytes,
be overwritten by the random bytes, and bytes from the 'state'
and bytes from the 'state' (incrementing looping index). From this
(incrementing looping index). From this digest output (which is kept
digest output (which is kept in 'md'), the top (up to) 10 bytes are
in 'md'), the top (up to) 10 bytes are returned to the caller and the
returned to the caller and the bottom (up to) 10 bytes are xored into
bottom 10 bytes are xored into the 'state'.
the 'state'.
Finally, after we have finished 'num' random bytes for the caller,
Finally, after we have finished 'num' random bytes for the caller,
'count' (which is incremented) and the local and global 'md' are fed
'count' (which is incremented) and the local and global 'md' are fed
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录