| Index: openssl/crypto/rand/md_rand.c
|
| ===================================================================
|
| --- openssl/crypto/rand/md_rand.c (revision 105093)
|
| +++ openssl/crypto/rand/md_rand.c (working copy)
|
| @@ -126,11 +126,7 @@
|
|
|
| #include <openssl/crypto.h>
|
| #include <openssl/err.h>
|
| -#ifdef OPENSSL_FIPS
|
| -#include <openssl/fips.h>
|
| -#endif
|
|
|
| -
|
| #ifdef BN_DEBUG
|
| # define PREDICT
|
| #endif
|
| @@ -149,7 +145,7 @@
|
| * holds CRYPTO_LOCK_RAND
|
| * (to prevent double locking) */
|
| /* access to lockin_thread is synchronized by CRYPTO_LOCK_RAND2 */
|
| -static unsigned long locking_thread = 0; /* valid iff crypto_lock_rand is set */
|
| +static CRYPTO_THREADID locking_threadid; /* valid iff crypto_lock_rand is set */
|
|
|
|
|
| #ifdef PREDICT
|
| @@ -217,8 +213,10 @@
|
| /* check if we already have the lock */
|
| if (crypto_lock_rand)
|
| {
|
| + CRYPTO_THREADID cur;
|
| + CRYPTO_THREADID_current(&cur);
|
| CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
|
| - do_not_lock = (locking_thread == CRYPTO_thread_id());
|
| + do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
|
| CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
|
| }
|
| else
|
| @@ -274,8 +272,16 @@
|
| }
|
| else
|
| MD_Update(&m,&(state[st_idx]),j);
|
| -
|
| +
|
| + /* DO NOT REMOVE THE FOLLOWING CALL TO MD_Update()! */
|
| MD_Update(&m,buf,j);
|
| + /* We know that line may cause programs such as
|
| + purify and valgrind to complain about use of
|
| + uninitialized data. The problem is not, it's
|
| + with the caller. Removing that line will make
|
| + sure you get really bad randomness and thereby
|
| + other problems such as very insecure keys. */
|
| +
|
| MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
|
| MD_Final(&m,local_md);
|
| md_c[1]++;
|
| @@ -336,14 +342,6 @@
|
| #endif
|
| int do_stir_pool = 0;
|
|
|
| -#ifdef OPENSSL_FIPS
|
| - if(FIPS_mode())
|
| - {
|
| - FIPSerr(FIPS_F_SSLEAY_RAND_BYTES,FIPS_R_NON_FIPS_METHOD);
|
| - return 0;
|
| - }
|
| -#endif
|
| -
|
| #ifdef PREDICT
|
| if (rand_predictable)
|
| {
|
| @@ -384,7 +382,7 @@
|
|
|
| /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
|
| CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
|
| - locking_thread = CRYPTO_thread_id();
|
| + CRYPTO_THREADID_current(&locking_threadid);
|
| CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
|
| crypto_lock_rand = 1;
|
|
|
| @@ -476,9 +474,18 @@
|
| #endif
|
| MD_Update(&m,local_md,MD_DIGEST_LENGTH);
|
| MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
|
| -#ifndef PURIFY
|
| - MD_Update(&m,buf,j); /* purify complains */
|
| +
|
| +#ifndef PURIFY /* purify complains */
|
| + /* The following line uses the supplied buffer as a small
|
| + * source of entropy: since this buffer is often uninitialised
|
| + * it may cause programs such as purify or valgrind to
|
| + * complain. So for those builds it is not used: the removal
|
| + * of such a small source of entropy has negligible impact on
|
| + * security.
|
| + */
|
| + MD_Update(&m,buf,j);
|
| #endif
|
| +
|
| k=(st_idx+MD_DIGEST_LENGTH/2)-st_num;
|
| if (k > 0)
|
| {
|
| @@ -539,15 +546,17 @@
|
|
|
| static int ssleay_rand_status(void)
|
| {
|
| + CRYPTO_THREADID cur;
|
| int ret;
|
| int do_not_lock;
|
|
|
| + CRYPTO_THREADID_current(&cur);
|
| /* check if we already have the lock
|
| * (could happen if a RAND_poll() implementation calls RAND_status()) */
|
| if (crypto_lock_rand)
|
| {
|
| CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
|
| - do_not_lock = (locking_thread == CRYPTO_thread_id());
|
| + do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
|
| CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
|
| }
|
| else
|
| @@ -559,7 +568,7 @@
|
|
|
| /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
|
| CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
|
| - locking_thread = CRYPTO_thread_id();
|
| + CRYPTO_THREADID_cpy(&locking_threadid, &cur);
|
| CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
|
| crypto_lock_rand = 1;
|
| }
|
|
|