Use of DEVRANDOM must be #ifdef'ed (the #ifdef was commented out
[openssl.git] / crypto / rand / md_rand.c
index 6c8e65a05cc81c94e57c4eb40d5b76aab60b0150..0ce390b5c015a61ec50ee52ba3dab20171db0904 100644 (file)
@@ -1,5 +1,5 @@
 /* crypto/rand/md_rand.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
  */
 
 #include <stdio.h>
-#include "cryptlib.h"
-#include <sys/types.h>
 #include <time.h>
+#include <string.h>
 
+#include "openssl/e_os.h"
+
+#include <openssl/crypto.h>
 
 #if !defined(USE_MD5_RAND) && !defined(USE_SHA1_RAND) && !defined(USE_MDC2_RAND) && !defined(USE_MD2_RAND)
-#ifndef NO_MD5
-#define USE_MD5_RAND
-#elif !defined(NO_SHA1)
+#if !defined(NO_SHA) && !defined(NO_SHA1)
 #define USE_SHA1_RAND
-#elif !defined(NO_MDC2)
+#elif !defined(NO_MD5)
+#define USE_MD5_RAND
+#elif !defined(NO_MDC2) && !defined(NO_DES)
 #define USE_MDC2_RAND
 #elif !defined(NO_MD2)
 #define USE_MD2_RAND
 #else
-We need a message digest of some type 
+#error No message digest algorithm available
 #endif
 #endif
 
@@ -83,60 +85,78 @@ We need a message digest of some type
  */
 
 #if defined(USE_MD5_RAND)
-#include "md5.h"
+#include <openssl/md5.h>
 #define MD_DIGEST_LENGTH       MD5_DIGEST_LENGTH
 #define MD_CTX                 MD5_CTX
 #define MD_Init(a)             MD5_Init(a)
 #define MD_Update(a,b,c)       MD5_Update(a,b,c)
 #define        MD_Final(a,b)           MD5_Final(a,b)
+#define        MD(a,b,c)               MD5(a,b,c)
 #elif defined(USE_SHA1_RAND)
-#include "sha.h"
+#include <openssl/sha.h>
 #define MD_DIGEST_LENGTH       SHA_DIGEST_LENGTH
 #define MD_CTX                 SHA_CTX
 #define MD_Init(a)             SHA1_Init(a)
 #define MD_Update(a,b,c)       SHA1_Update(a,b,c)
 #define        MD_Final(a,b)           SHA1_Final(a,b)
+#define        MD(a,b,c)               SHA1(a,b,c)
 #elif defined(USE_MDC2_RAND)
-#include "mdc2.h"
+#include <openssl/mdc2.h>
 #define MD_DIGEST_LENGTH       MDC2_DIGEST_LENGTH
 #define MD_CTX                 MDC2_CTX
 #define MD_Init(a)             MDC2_Init(a)
 #define MD_Update(a,b,c)       MDC2_Update(a,b,c)
 #define        MD_Final(a,b)           MDC2_Final(a,b)
+#define        MD(a,b,c)               MDC2(a,b,c)
 #elif defined(USE_MD2_RAND)
-#include "md2.h"
+#include <openssl/md2.h>
 #define MD_DIGEST_LENGTH       MD2_DIGEST_LENGTH
 #define MD_CTX                 MD2_CTX
 #define MD_Init(a)             MD2_Init(a)
 #define MD_Update(a,b,c)       MD2_Update(a,b,c)
 #define        MD_Final(a,b)           MD2_Final(a,b)
+#define        MD(a,b,c)               MD2(a,b,c)
 #endif
 
-#include "rand.h"
+#include <openssl/rand.h>
 
-/*#define NORAND       1 */
-/*#define PREDICT      1 */
+/* #define NORAND      1 */
+/* #define PREDICT     1 */
 
 #define STATE_SIZE     1023
 static int state_num=0,state_index=0;
-static unsigned char state[STATE_SIZE];
+static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
 static unsigned char md[MD_DIGEST_LENGTH];
-static int count=0;
+static long md_count[2]={0,0};
 
-char *RAND_version="RAND part of SSLeay 0.8.1b 29-Jun-1998";
+const char *RAND_version="RAND" OPENSSL_VERSION_PTEXT;
 
-void RAND_cleanup()
+static void ssleay_rand_cleanup(void);
+static void ssleay_rand_seed(const void *buf, int num);
+static void ssleay_rand_bytes(unsigned char *buf, int num);
+
+RAND_METHOD rand_ssleay_meth={
+       ssleay_rand_seed,
+       ssleay_rand_bytes,
+       ssleay_rand_cleanup,
+       }; 
+
+RAND_METHOD *RAND_SSLeay(void)
        {
-       memset(state,0,STATE_SIZE);
+       return(&rand_ssleay_meth);
+       }
+
+static void ssleay_rand_cleanup(void)
+       {
+       memset(state,0,sizeof(state));
        state_num=0;
        state_index=0;
        memset(md,0,MD_DIGEST_LENGTH);
-       count=0;
+       md_count[0]=0;
+       md_count[1]=0;
        }
 
-void RAND_seed(buf,num)
-unsigned char *buf;
-int num;
+static void ssleay_rand_seed(const void *buf, int num)
        {
        int i,j,k,st_idx,st_num;
        MD_CTX m;
@@ -150,7 +170,7 @@ int num;
        st_num=state_num;
 
        state_index=(state_index+num);
-       if (state_index > STATE_SIZE)
+       if (state_index >= STATE_SIZE)
                {
                state_index%=STATE_SIZE;
                state_num=STATE_SIZE;
@@ -179,9 +199,11 @@ int num;
                        MD_Update(&m,&(state[st_idx]),j);
                        
                MD_Update(&m,buf,j);
+               MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
                MD_Final(md,&m);
+               md_count[1]++;
 
-               buf+=j;
+               buf=(const char *)buf + j;
 
                for (k=0; k<j; k++)
                        {
@@ -196,9 +218,7 @@ int num;
        memset((char *)&m,0,sizeof(m));
        }
 
-void RAND_bytes(buf,num)
-unsigned char *buf;
-int num;
+static void ssleay_rand_bytes(unsigned char *buf, int num)
        {
        int i,j,k,st_num,st_idx;
        MD_CTX m;
@@ -222,19 +242,18 @@ int num;
 
        if (init)
                {
-               init=0;
                CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
                /* put in some default random data, we need more than
                 * just this */
-               RAND_seed((unsigned char *)&m,sizeof(m));
+               RAND_seed(&m,sizeof(m));
 #ifndef MSDOS
                l=getpid();
-               RAND_seed((unsigned char *)&l,sizeof(l));
+               RAND_seed(&l,sizeof(l));
                l=getuid();
-               RAND_seed((unsigned char *)&l,sizeof(l));
+               RAND_seed(&l,sizeof(l));
 #endif
                l=time(NULL);
-               RAND_seed((unsigned char *)&l,sizeof(l));
+               RAND_seed(&l,sizeof(l));
 
 #ifdef DEVRANDOM
                /* 
@@ -246,15 +265,15 @@ int num;
                 */
                if ((fh = fopen(DEVRANDOM, "r")) != NULL)
                        {
-                       unsigned char buf[32];
+                       unsigned char tmpbuf[32];
 
-                       fread((unsigned char *)buf,1,32,fh);
+                       fread((unsigned char *)tmpbuf,1,32,fh);
                        /* we don't care how many bytes we read,
                         * we will just copy the 'stack' if there is
                         * nothing else :-) */
                        fclose(fh);
-                       RAND_seed(buf,32);
-                       memset(buf,0,32);
+                       RAND_seed(tmpbuf,32);
+                       memset(tmpbuf,0,32);
                        }
 #endif
 #ifdef PURIFY
@@ -262,6 +281,7 @@ int num;
                memset(md,0,MD_DIGEST_LENGTH);
 #endif
                CRYPTO_w_lock(CRYPTO_LOCK_RAND);
+               init=0;
                }
 
        st_idx=state_index;
@@ -278,6 +298,7 @@ int num;
                num-=j;
                MD_Init(&m);
                MD_Update(&m,&(md[MD_DIGEST_LENGTH/2]),MD_DIGEST_LENGTH/2);
+               MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
 #ifndef PURIFY
                MD_Update(&m,buf,j); /* purify complains */
 #endif
@@ -301,7 +322,8 @@ int num;
                }
 
        MD_Init(&m);
-       MD_Update(&m,(unsigned char *)&count,sizeof(count)); count++;
+       MD_Update(&m,(unsigned char *)&(md_count[0]),sizeof(md_count));
+       md_count[0]++;
        MD_Update(&m,md,MD_DIGEST_LENGTH);
        MD_Final(md,&m);
        memset(&m,0,sizeof(m));
@@ -309,7 +331,7 @@ int num;
 
 #ifdef WINDOWS
 #include <windows.h>
-#include <rand.h>
+#include <openssl/rand.h>
 
 /*****************************************************************************
  * Initialisation function for the SSL random generator.  Takes the contents
@@ -321,13 +343,13 @@ int num;
  * <URL:http://www.microsoft.com/kb/developr/win_dk/q97193.htm>;
  * the original copyright message is:
  *
-//   (C) Copyright Microsoft Corp. 1993.  All rights reserved.
-//
-//   You have a royalty-free right to use, modify, reproduce and
-//   distribute the Sample Files (and/or any modified version) in
-//   any way you find useful, provided that you agree that
-//   Microsoft has no warranty obligations or liability for any
-//   Sample Application Files which are modified.
+ *   (C) Copyright Microsoft Corp. 1993.  All rights reserved.
+ *
+ *   You have a royalty-free right to use, modify, reproduce and
+ *   distribute the Sample Files (and/or any modified version) in
+ *   any way you find useful, provided that you agree that
+ *   Microsoft has no warranty obligations or liability for any
+ *   Sample Application Files which are modified.
  */
 /*
  * I have modified the loading of bytes via RAND_seed() mechanism since
@@ -386,7 +408,7 @@ void RAND_screen(void)
        GetBitmapBits(hBitmap, size, bmbits);
 
        /* Get the MD5 of the bitmap */
-       MD5(bmbits,size,md);
+       MD(bmbits,size,md);
 
        /* Seed the random generator with the MD5 digest */
        RAND_seed(md, MD_DIGEST_LENGTH);