Fix error discrepancy.
[openssl.git] / crypto / rand / md_rand.c
index dd291637275d3aeae7ec2b1de81af268aeb0edf3..888b4eb8dd0bd94bb340e0d3aa803cd5327ce70e 100644 (file)
@@ -159,7 +159,6 @@ const char RAND_version[]="RAND" OPENSSL_VERSION_PTEXT;
 static void ssleay_rand_cleanup(void);
 static void ssleay_rand_seed(const void *buf, int num);
 static void ssleay_rand_add(const void *buf, int num, double add_entropy);
-static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo);
 static int ssleay_rand_nopseudo_bytes(unsigned char *buf, int num);
 static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num);
 static int ssleay_rand_status(void);
@@ -198,6 +197,9 @@ static void ssleay_rand_add(const void *buf, int num, double add)
        EVP_MD_CTX m;
        int do_not_lock;
 
+       if (!num)
+               return;
+
        /*
         * (Based on the rand(3) manpage)
         *
@@ -331,7 +333,7 @@ static void ssleay_rand_seed(const void *buf, int num)
        ssleay_rand_add(buf, num, (double)num);
        }
 
-static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
+int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo, int lock)
        {
        static volatile int stirred_pool = 0;
        int i,j,k,st_num,st_idx;
@@ -380,10 +382,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
         * are fed into the hash function and the results are kept in the
         * global 'md'.
         */
-#ifdef OPENSSL_FIPS
-       /* NB: in FIPS mode we are already under a lock */
-       if (!FIPS_mode())
-#endif
+       if (lock)
                CRYPTO_w_lock(CRYPTO_LOCK_RAND);
 
        /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
@@ -463,9 +462,7 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
 
        /* before unlocking, we must clear 'crypto_lock_rand' */
        crypto_lock_rand = 0;
-#ifdef OPENSSL_FIPS
-       if (!FIPS_mode())
-#endif
+       if (lock)
                CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
 
        while (num > 0)
@@ -518,15 +515,11 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
        MD_Init(&m);
        MD_Update(&m,(unsigned char *)&(md_c[0]),sizeof(md_c));
        MD_Update(&m,local_md,MD_DIGEST_LENGTH);
-#ifdef OPENSSL_FIPS
-       if (!FIPS_mode())
-#endif
+       if (lock)
                CRYPTO_w_lock(CRYPTO_LOCK_RAND);
        MD_Update(&m,md,MD_DIGEST_LENGTH);
        MD_Final(&m,md);
-#ifdef OPENSSL_FIPS
-       if (!FIPS_mode())
-#endif
+       if (lock)
                CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
 
        EVP_MD_CTX_cleanup(&m);
@@ -545,14 +538,14 @@ static int ssleay_rand_bytes(unsigned char *buf, int num, int pseudo)
 
 static int ssleay_rand_nopseudo_bytes(unsigned char *buf, int num)
        {
-       return ssleay_rand_bytes(buf, num, 0);
+       return ssleay_rand_bytes(buf, num, 0, 1);
        }
 
 /* pseudo-random bytes that are guaranteed to be unique but not
    unpredictable */
 static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num) 
        {
-       return ssleay_rand_bytes(buf, num, 1);
+       return ssleay_rand_bytes(buf, num, 1, 1);
        }
 
 static int ssleay_rand_status(void)