Avoid race condition.
[oweals/openssl.git] / crypto / rand / rand_lib.c
index adbae32ce358633be5cfcd3bb93777ade4e7fa55..7da74aab0ef3364b58c31a4593818225ccdc1e41 100644 (file)
 
 #include <stdio.h>
 #include <time.h>
-#include "cryptlib.h"
 #include <openssl/rand.h>
-#include <openssl/engine.h>
 
-static ENGINE *rand_engine=NULL;
+#ifdef NO_RAND
+static RAND_METHOD *rand_meth=NULL;
+#else
+extern RAND_METHOD rand_ssleay_meth;
+static RAND_METHOD *rand_meth= &rand_ssleay_meth;
+#endif
 
-#if 0
 void RAND_set_rand_method(RAND_METHOD *meth)
        {
        rand_meth=meth;
        }
-#else
-int RAND_set_rand_method(ENGINE *engine)
-       {
-       ENGINE *mtmp;
-       mtmp = rand_engine;
-       if (engine && !ENGINE_init(engine))
-               return 0;
-       rand_engine = engine;
-       /* SHOULD ERROR CHECK THIS!!! */
-       if(mtmp)
-               ENGINE_finish(mtmp);
-       return 1;
-       }
-#endif
 
-const RAND_METHOD *RAND_get_rand_method(void)
+RAND_METHOD *RAND_get_rand_method(void)
        {
-       if (rand_engine == NULL
-               && (rand_engine = ENGINE_get_default_RAND()) == NULL)
-               {
-               RANDerr(RAND_F_RAND_GET_RAND_METHOD,ERR_LIB_ENGINE);
-               return NULL;
-               }
-       return ENGINE_get_RAND(rand_engine);
+       return(rand_meth);
        }
 
 void RAND_cleanup(void)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->cleanup)
-               meth->cleanup();
+       if (rand_meth != NULL)
+               rand_meth->cleanup();
        }
 
 void RAND_seed(const void *buf, int num)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->seed)
-               meth->seed(buf,num);
+       if (rand_meth != NULL)
+               rand_meth->seed(buf,num);
        }
 
 void RAND_add(const void *buf, int num, double entropy)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->add)
-               meth->add(buf,num,entropy);
+       if (rand_meth != NULL)
+               rand_meth->add(buf,num,entropy);
        }
 
 int RAND_bytes(unsigned char *buf, int num)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->bytes)
-               return meth->bytes(buf,num);
+       if (rand_meth != NULL)
+               return rand_meth->bytes(buf,num);
        return(-1);
        }
 
 int RAND_pseudo_bytes(unsigned char *buf, int num)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->pseudorand)
-               return meth->pseudorand(buf,num);
+       if (rand_meth != NULL)
+               return rand_meth->pseudorand(buf,num);
        return(-1);
        }
 
 int RAND_status(void)
        {
-       const RAND_METHOD *meth = RAND_get_rand_method();
-       if (meth && meth->status)
-               return meth->status();
+       if (rand_meth != NULL)
+               return rand_meth->status();
        return 0;
        }