From: Ben Laurie Date: Fri, 20 Sep 2013 15:52:07 +0000 (+0100) Subject: Mix time into the pool to avoid repetition of the Android duplicated PID problem. X-Git-Tag: master-post-reformat~1165 X-Git-Url: https://git.openssl.org/?p=openssl.git;a=commitdiff_plain;h=3cd8547a2018ada88a4303067a2aa15eadc17f39 Mix time into the pool to avoid repetition of the Android duplicated PID problem. --- 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 #include #include +#include #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)))