Don't cheat: when only getting several bytes from each source, n is incremented
[openssl.git] / crypto / rand / rand_lib.c
index 2eb5e1218278dd0a5c46ad4c86e64355daddf67f..57eff0f132948bee10bd1110836cca76c8862beb 100644 (file)
  */
 
 #include <stdio.h>
-#include <sys/types.h>
 #include <time.h>
-#include "rand.h"
+#include <openssl/rand.h>
+#include <openssl/engine.h>
 
-#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
+static ENGINE *rand_engine=NULL;
 
+#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_init(engine))
+               return 0;
+       rand_engine = engine;
+       /* SHOULD ERROR CHECK THIS!!! */
+       ENGINE_finish(mtmp);
+       return 1;
+       }
+#endif
 
 RAND_METHOD *RAND_get_rand_method(void)
        {
-       return(rand_meth);
+       if (rand_engine == NULL
+               && (rand_engine = ENGINE_get_default_RAND()) == NULL)
+               return NULL;
+       return ENGINE_get_RAND(rand_engine);
        }
 
 void RAND_cleanup(void)
        {
-       if (rand_meth != NULL)
-               rand_meth->cleanup();
+       RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->cleanup)
+               meth->cleanup();
        }
 
 void RAND_seed(const void *buf, int num)
        {
-       if (rand_meth != NULL)
-               rand_meth->seed(buf,num);
+       RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->seed)
+               meth->seed(buf,num);
+       }
+
+void RAND_add(const void *buf, int num, double entropy)
+       {
+       RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->add)
+               meth->add(buf,num,entropy);
        }
 
-void RAND_bytes(unsigned char *buf, int num)
+int RAND_bytes(unsigned char *buf, int num)
        {
-       if (rand_meth != NULL)
-               rand_meth->bytes(buf,num);
+       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)
+       {
+       RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->pseudorand)
+               return meth->pseudorand(buf,num);
+       return(-1);
+       }
+
+int RAND_status(void)
+       {
+       RAND_METHOD *meth = RAND_get_rand_method();
+       if (meth && meth->status)
+               return meth->status();
+       return 0;
+       }