Fix memory leak when RAND is used: need to cleanup
[openssl.git] / crypto / rand / rand_lib.c
index c4b44e5186ca66cfe58e77170a7af9e725ad73fe..adbae32ce358633be5cfcd3bb93777ade4e7fa55 100644 (file)
  */
 
 #include <stdio.h>
-#include "cryptlib.h"
-#include <sys/types.h>
 #include <time.h>
-#include "rand.h"
+#include "cryptlib.h"
+#include <openssl/rand.h>
+#include <openssl/engine.h>
 
-#ifdef NO_RAND
-static RAND_METHOD *rand_meth=NULL;
+static ENGINE *rand_engine=NULL;
+
+#if 0
+void RAND_set_rand_method(RAND_METHOD *meth)
+       {
+       rand_meth=meth;
+       }
 #else
-extern RAND_METHOD rand_ssleay;
-static RAND_METHOD *rand_meth= &rand_ssleay;
+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
 
-void RAND_set_rand_method(meth)
-RAND_METHOD *meth;
+const RAND_METHOD *RAND_get_rand_method(void)
        {
-       rand_meth=meth;
+       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);
        }
 
-RAND_METHOD *RAND_get_rand_method()
+void RAND_cleanup(void)
        {
-       return(rand_meth);
+       const RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->cleanup)
+               meth->cleanup();
        }
 
-void RAND_cleanup()
+void RAND_seed(const void *buf, int num)
        {
-       if (rand_meth != NULL)
-               rand_meth->cleanup();
+       const RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->seed)
+               meth->seed(buf,num);
        }
 
-void RAND_seed(buf,num)
-unsigned char *buf;
-int num;
+void RAND_add(const void *buf, int num, double entropy)
        {
-       if (rand_meth != NULL)
-               rand_meth->seed(buf,num);
+       const RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->add)
+               meth->add(buf,num,entropy);
        }
 
-void RAND_bytes(buf,num)
-unsigned char *buf;
-int num;
+int RAND_bytes(unsigned char *buf, int num)
        {
-       if (rand_meth != NULL)
-               rand_meth->bytes(buf,num);
+       const RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->bytes)
+               return 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);
+       return(-1);
+       }
+
+int RAND_status(void)
+       {
+       const RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->status)
+               return meth->status();
+       return 0;
+       }