summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rand/md_rand.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rand/md_rand.c')
-rw-r--r--src/lib/libcrypto/rand/md_rand.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/src/lib/libcrypto/rand/md_rand.c b/src/lib/libcrypto/rand/md_rand.c
index 0f8dd3e00f..88088ce73c 100644
--- a/src/lib/libcrypto/rand/md_rand.c
+++ b/src/lib/libcrypto/rand/md_rand.c
@@ -126,10 +126,6 @@
126 126
127#include <openssl/crypto.h> 127#include <openssl/crypto.h>
128#include <openssl/err.h> 128#include <openssl/err.h>
129#ifdef OPENSSL_FIPS
130#include <openssl/fips.h>
131#endif
132
133 129
134#ifdef BN_DEBUG 130#ifdef BN_DEBUG
135# define PREDICT 131# define PREDICT
@@ -149,7 +145,7 @@ static unsigned int crypto_lock_rand = 0; /* may be set only when a thread
149 * holds CRYPTO_LOCK_RAND 145 * holds CRYPTO_LOCK_RAND
150 * (to prevent double locking) */ 146 * (to prevent double locking) */
151/* access to lockin_thread is synchronized by CRYPTO_LOCK_RAND2 */ 147/* access to lockin_thread is synchronized by CRYPTO_LOCK_RAND2 */
152static unsigned long locking_thread = 0; /* valid iff crypto_lock_rand is set */ 148static CRYPTO_THREADID locking_threadid; /* valid iff crypto_lock_rand is set */
153 149
154 150
155#ifdef PREDICT 151#ifdef PREDICT
@@ -217,8 +213,10 @@ static void ssleay_rand_add(const void *buf, int num, double add)
217 /* check if we already have the lock */ 213 /* check if we already have the lock */
218 if (crypto_lock_rand) 214 if (crypto_lock_rand)
219 { 215 {
216 CRYPTO_THREADID cur;
217 CRYPTO_THREADID_current(&cur);
220 CRYPTO_r_lock(CRYPTO_LOCK_RAND2); 218 CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
221 do_not_lock = (locking_thread == CRYPTO_thread_id()); 219 do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
222 CRYPTO_r_unlock(CRYPTO_LOCK_RAND2); 220 CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
223 } 221 }
224 else 222 else
@@ -274,8 +272,16 @@ static void ssleay_rand_add(const void *buf, int num, double add)
274 } 272 }
275 else 273 else
276 MD_Update(&m,&(state[st_idx]),j); 274 MD_Update(&m,&(state[st_idx]),j);
277 275
276 /* DO NOT REMOVE THE FOLLOWING CALL TO MD_Update()! */
278 MD_Update(&m,buf,j); 277 MD_Update(&m,buf,j);
278 /* We know that line may cause programs such as
279 purify and valgrind to complain about use of
280 uninitialized data. The problem is not, it's
281 with the caller. Removing that line will make
282 sure you get really bad randomness and thereby
283 other problems such as very insecure keys. */
284
279 MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c)); 285 MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
280 MD_Final(&m,local_md); 286 MD_Final(&m,local_md);
281 md_c[1]++; 287 md_c[1]++;
@@ -336,14 +342,6 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
336#endif 342#endif
337 int do_stir_pool = 0; 343 int do_stir_pool = 0;
338 344
339#ifdef OPENSSL_FIPS
340 if(FIPS_mode())
341 {
342 FIPSerr(FIPS_F_SSLEAY_RAND_BYTES,FIPS_R_NON_FIPS_METHOD);
343 return 0;
344 }
345#endif
346
347#ifdef PREDICT 345#ifdef PREDICT
348 if (rand_predictable) 346 if (rand_predictable)
349 { 347 {
@@ -384,7 +382,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
384 382
385 /* prevent ssleay_rand_bytes() from trying to obtain the lock again */ 383 /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
386 CRYPTO_w_lock(CRYPTO_LOCK_RAND2); 384 CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
387 locking_thread = CRYPTO_thread_id(); 385 CRYPTO_THREADID_current(&locking_threadid);
388 CRYPTO_w_unlock(CRYPTO_LOCK_RAND2); 386 CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
389 crypto_lock_rand = 1; 387 crypto_lock_rand = 1;
390 388
@@ -476,9 +474,15 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
476#endif 474#endif
477 MD_Update(&m,local_md,MD_DIGEST_LENGTH); 475 MD_Update(&m,local_md,MD_DIGEST_LENGTH);
478 MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c)); 476 MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
479#ifndef PURIFY 477
480 MD_Update(&m,buf,j); /* purify complains */ 478#ifndef PURIFY /* purify complains */
479 /* DO NOT REMOVE THE FOLLOWING CALL TO MD_Update()! */
480 MD_Update(&m,buf,j);
481 /* We know that line may cause programs such as
482 purify and valgrind to complain about use of
483 uninitialized data. */
481#endif 484#endif
485
482 k=(st_idx+MD_DIGEST_LENGTH/2)-st_num; 486 k=(st_idx+MD_DIGEST_LENGTH/2)-st_num;
483 if (k > 0) 487 if (k > 0)
484 { 488 {
@@ -539,15 +543,17 @@ static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
539 543
540static int ssleay_rand_status(void) 544static int ssleay_rand_status(void)
541 { 545 {
546 CRYPTO_THREADID cur;
542 int ret; 547 int ret;
543 int do_not_lock; 548 int do_not_lock;
544 549
550 CRYPTO_THREADID_current(&cur);
545 /* check if we already have the lock 551 /* check if we already have the lock
546 * (could happen if a RAND_poll() implementation calls RAND_status()) */ 552 * (could happen if a RAND_poll() implementation calls RAND_status()) */
547 if (crypto_lock_rand) 553 if (crypto_lock_rand)
548 { 554 {
549 CRYPTO_r_lock(CRYPTO_LOCK_RAND2); 555 CRYPTO_r_lock(CRYPTO_LOCK_RAND2);
550 do_not_lock = (locking_thread == CRYPTO_thread_id()); 556 do_not_lock = !CRYPTO_THREADID_cmp(&locking_threadid, &cur);
551 CRYPTO_r_unlock(CRYPTO_LOCK_RAND2); 557 CRYPTO_r_unlock(CRYPTO_LOCK_RAND2);
552 } 558 }
553 else 559 else
@@ -559,7 +565,7 @@ static int ssleay_rand_status(void)
559 565
560 /* prevent ssleay_rand_bytes() from trying to obtain the lock again */ 566 /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
561 CRYPTO_w_lock(CRYPTO_LOCK_RAND2); 567 CRYPTO_w_lock(CRYPTO_LOCK_RAND2);
562 locking_thread = CRYPTO_thread_id(); 568 CRYPTO_THREADID_cpy(&locking_threadid, &cur);
563 CRYPTO_w_unlock(CRYPTO_LOCK_RAND2); 569 CRYPTO_w_unlock(CRYPTO_LOCK_RAND2);
564 crypto_lock_rand = 1; 570 crypto_lock_rand = 1;
565 } 571 }