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; |
} |