New function RAND_pseudo_bytes() generated pseudorandom numbers that
authorUlf Möller <ulf@openssl.org>
Sun, 16 Jan 2000 15:58:17 +0000 (15:58 +0000)
committerUlf Möller <ulf@openssl.org>
Sun, 16 Jan 2000 15:58:17 +0000 (15:58 +0000)
are not guaranteed to be unpredictable.

CHANGES
apps/speed.c
crypto/pkcs7/pk7_mime.c
crypto/rand/md_rand.c
crypto/rand/rand.h
crypto/rand/rand_lib.c
crypto/rand/randtest.c
e_os.h

diff --git a/CHANGES b/CHANGES
index 326b5cf7a1dfbb3f90df067b5980d6a3ab385942..70dd5101b1a2de6545ec44903bd39a080b9666e7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,11 +7,12 @@
   *) Precautions against using the PRNG uninitialized: RAND_bytes() now
      has a return value which indicates the quality of the random data
      (1 = ok, 0 = not seeded).  Also an error is recorded on the thread's
-     error queue.
+     error queue. New function RAND_pseudo_bytes() generates output that is
+     guaranteed to be unique but not unpredictable.
      (TO DO: always check the result of RAND_bytes when it is used in the
-     library, because leaving the error in the error queue but reporting
-     success in a function that uses RAND_bytes could confuse things
-     considerably.)
+     library, or use RAND_pseudo_bytes instead, because leaving the
+     error in the error queue but reporting success in a function that
+     uses RAND_bytes could confuse things considerably.)
      [Ulf Möller]
 
   *) Do more iterations of Rabin-Miller probable prime test (specifically,
index b96733346bc080f4b840f179a547e23c1e1f91e7..59caa0db3489318b52dd6ec551110d517a8f9b19 100644 (file)
@@ -965,7 +965,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-       RAND_bytes(buf,36);
+       RAND_pseudo_bytes(buf,36);
 #ifndef NO_RSA
        for (j=0; j<RSA_NUM; j++)
                {
@@ -1026,7 +1026,7 @@ int MAIN(int argc, char **argv)
                }
 #endif
 
-       RAND_bytes(buf,20);
+       RAND_pseudo_bytes(buf,20);
 #ifndef NO_DSA
        for (j=0; j<DSA_NUM; j++)
                {
index 4282f69d0d7c085a42e0b06166f1ed64c5ebe7df..54d5f422ad7d1482ae46c219246b25dbc5e22fc3 100644 (file)
@@ -149,7 +149,7 @@ int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags)
        if((flags & PKCS7_DETACHED) && data) {
        /* We want multipart/signed */
                /* Generate a random boundary */
-               RAND_bytes((unsigned char *)bound, 32);
+               RAND_pseudo_bytes((unsigned char *)bound, 32);
                for(i = 0; i < 32; i++) {
                        c = bound[i] & 0xf;
                        if(c < 10) c += '0';
index dbed1dcde26c10f0c6275b08b64cafe774d4505c..7b8cde94012241467524596eadde681ca444aff4 100644 (file)
@@ -146,12 +146,14 @@ 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, int add_entropy);
 static int ssleay_rand_bytes(unsigned char *buf, int num);
+static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num);
 
 RAND_METHOD rand_ssleay_meth={
        ssleay_rand_seed,
        ssleay_rand_bytes,
        ssleay_rand_cleanup,
        ssleay_rand_add,
+       ssleay_rand_pseudo_bytes,
        }; 
 
 RAND_METHOD *RAND_SSLeay(void)
@@ -449,6 +451,23 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
                }
        }
 
+/* pseudo-random bytes that are guaranteed to be unique but not
+   unpredictable */
+static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num) 
+       {
+       int ret, err;
+
+       ret = RAND_bytes(buf, num);
+       if (ret == 0)
+               {
+               err = ERR_peek_error();
+               if (ERR_GET_LIB(err) == ERR_LIB_RAND &&
+                   ERR_GET_REASON(err) == RAND_R_PRNG_NOT_SEEDED)
+                       (void)ERR_get_error();
+               }
+       return (ret);
+       }
+
 #ifdef WINDOWS
 #include <windows.h>
 #include <openssl/rand.h>
index 35a3bb6e10101d40f6b5dfaeaa1861686507dcc5..5ab94a779b5ba722e93c84a851175724ad35f232 100644 (file)
@@ -69,6 +69,7 @@ typedef struct rand_meth_st
        int (*bytes)(unsigned char *buf, int num);
        void (*cleanup)(void);
        void (*add)(const void *buf, int num, int entropy);
+       int (*pseudorand)(unsigned char *buf, int num);
        } RAND_METHOD;
 
 void RAND_set_rand_method(RAND_METHOD *meth);
@@ -76,6 +77,7 @@ RAND_METHOD *RAND_get_rand_method(void );
 RAND_METHOD *RAND_SSLeay(void);
 void RAND_cleanup(void );
 int  RAND_bytes(unsigned char *buf,int num);
+int  RAND_pseudo_bytes(unsigned char *buf,int num);
 void RAND_seed(const void *buf,int num);
 void RAND_add(const void *buf,int num,int entropy);
 int  RAND_load_file(const char *file,long max_bytes);
index 3cdba48ba8470cba6cb1635ec08c54d4d0a8e48e..9a0b804292bc4c907627f8187316caabc3923999 100644 (file)
@@ -102,3 +102,9 @@ int RAND_bytes(unsigned char *buf, int num)
        return(-1);
        }
 
+int RAND_pseudo_bytes(unsigned char *buf, int num)
+       {
+       if (rand_meth != NULL)
+               return rand_meth->pseudorand(buf,num);
+       return(-1);
+       }
index f0706d779a25907a669ad8ea3c0fa3e17dc7e1ed..da96e3f6959a0ddd9072584d72c72687f24d3eec 100644 (file)
@@ -73,7 +73,7 @@ int main()
        /*double d; */
        long d;
 
-       RAND_bytes(buf,2500);
+       RAND_pseudo_bytes(buf,2500);
 
        n1=0;
        for (i=0; i<16; i++) n2[i]=0;
diff --git a/e_os.h b/e_os.h
index fa2a117762b7ef1519cdfeddbb752cd0513861e9..f0b381a5464f134af9977cbfbaea536200d434cd 100644 (file)
--- a/e_os.h
+++ b/e_os.h
@@ -79,7 +79,7 @@ extern "C" {
 #ifndef DEVRANDOM
 /* set this to your 'random' device if you have one.
  * My default, we will try to read this file */
-#define DEVRANDOM "/dev/urandom"
+#define DEVRANDOM "/gibtsnich/dev/urandom"
 #endif
 
 #if defined(__MWERKS__) && defined(macintosh)