summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Laurie <ben@links.org>2013-09-20 16:52:07 +0100
committerBen Laurie <ben@links.org>2013-09-20 16:52:07 +0100
commit3cd8547a2018ada88a4303067a2aa15eadc17f39 (patch)
tree6bf31c8586852039343badf78f59dcfed94f82ca
parent7eef2b0cd712d987b0bd556ad8ec637332ff32fb (diff)
downloadopenssl-new-3cd8547a2018ada88a4303067a2aa15eadc17f39.tar.gz
Mix time into the pool to avoid repetition of the Android duplicated PID problem.
-rw-r--r--crypto/rand/md_rand.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/crypto/rand/md_rand.c b/crypto/rand/md_rand.c
index f9583324e9..d479aa8a76 100644
--- a/crypto/rand/md_rand.c
+++ b/crypto/rand/md_rand.c
@@ -120,6 +120,7 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
+#include <sys/time.h>
#include "e_os.h"
@@ -359,8 +360,12 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
#ifndef GETPID_IS_MEANINGLESS
pid_t curr_pid = getpid();
#endif
+ time_t curr_time = time(NULL);
+ struct timeval tv;
int do_stir_pool = 0;
+ gettimeofday(&tv, NULL);
+
#ifdef PREDICT
if (rand_predictable)
{
@@ -488,11 +493,26 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
#ifndef GETPID_IS_MEANINGLESS
if (curr_pid) /* just in the first iteration to save time */
{
- if (!MD_Update(&m,(unsigned char*)&curr_pid,sizeof curr_pid))
+ if (!MD_Update(&m,(unsigned char*)&curr_pid,
+ sizeof curr_pid))
goto err;
curr_pid = 0;
}
#endif
+ if (curr_time) /* just in the first iteration to save time */
+ {
+ if (!MD_Update(&m,(unsigned char*)&curr_time,
+ sizeof curr_time))
+ goto err;
+ curr_time = 0;
+ }
+ if (tv.tv_sec) /* just in the first iteration to save time */
+ {
+ if (!MD_Update(&m,(unsigned char*)&tv,
+ sizeof tv))
+ goto err;
+ tv.tv_sec = 0;
+ }
if (!MD_Update(&m,local_md,MD_DIGEST_LENGTH))
goto err;
if (!MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c)))