diff options
author | Ben Laurie <ben@links.org> | 2013-09-20 16:52:07 +0100 |
---|---|---|
committer | Ben Laurie <ben@links.org> | 2013-09-20 16:52:07 +0100 |
commit | 3cd8547a2018ada88a4303067a2aa15eadc17f39 (patch) | |
tree | 6bf31c8586852039343badf78f59dcfed94f82ca | |
parent | 7eef2b0cd712d987b0bd556ad8ec637332ff32fb (diff) | |
download | openssl-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.c | 22 |
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))) |