Commit 4ec2d4d2 authored by Ulf Möller's avatar Ulf Möller
Browse files

Support EGD.

parent 5921ea3b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4,6 +4,12 @@

 Changes between 0.9.4 and 0.9.5  [xx XXX 2000]

  *) Support EGD <http://www.lothar.com/tech/crypto/>.  New functions
     RAND_egd() and RAND_status().  In the command line application,
     the EGD socket can be specified like a seed file using RANDFILE
     or -rand.
     [Ulf Möller]

  *) Allow the string CERTIFICATE to be tolerated in PKCS#7 structures.
     Some CAs (e.g. Verisign) distribute certificates in this form.
     [Steve Henson]
+12 −3
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@


static int seeded = 0;
static int egdsocket = 0;

int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn)
	{
@@ -130,12 +131,19 @@ int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn)

	if (file == NULL)
		file = RAND_file_name(buffer, sizeof buffer);
	else if (RAND_egd(file) > 0)
		{
		/* we try if the given filename is an EGD socket.
		   if it is, we don't write anything back to the file. */
		egdsocket = 1;
		return 1;
		}
	if (file == NULL || !RAND_load_file(file, -1))
		{
		if (!dont_warn)
		if (RAND_status() == 0 && !dont_warn)
			{
			BIO_printf(bio_e,"unable to load 'random state'\n");
			BIO_printf(bio_e,"What this means is that the random number generator has not been seeded\n");
			BIO_printf(bio_e,"This means that the random number generator has not been seeded\n");
			BIO_printf(bio_e,"with much random data.\n");
			if (consider_randfile) /* explanation does not apply when a file is explicitly named */
				{
@@ -165,6 +173,7 @@ long app_RAND_load_files(char *name)
		name=p+1;
		if (*n == '\0') break;

		tot+=RAND_egd(n);
		tot+=RAND_load_file(n,1024L*1024L);
		if (last) break;
		}
@@ -177,7 +186,7 @@ int app_RAND_write_file(const char *file, BIO *bio_e)
	{
	char buffer[200];
	
	if (!seeded)
	if (egdsocket || !seeded)
		/* If we did not manage to read the seed file,
		 * we should not write a low-entropy seed file back --
		 * it would suppress a crucial warning the next time
+2 −2
Original line number Diff line number Diff line
@@ -22,8 +22,8 @@ TEST= randtest.c
APPS=

LIB=$(TOP)/libcrypto.a
LIBSRC=md_rand.c randfile.c rand_lib.c rand_err.c
LIBOBJ=md_rand.o randfile.o rand_lib.o rand_err.o
LIBSRC=md_rand.c randfile.c rand_lib.c rand_err.c rand_egd.c
LIBOBJ=md_rand.o randfile.o rand_lib.o rand_err.o rand_egd.o

SRC= $(LIBSRC)

+55 −46
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
static unsigned char md[MD_DIGEST_LENGTH];
static long md_count[2]={0,0};
static double entropy=0;
static int initialized=0;

const char *RAND_version="RAND" OPENSSL_VERSION_PTEXT;

@@ -295,6 +296,51 @@ static void ssleay_rand_seed(const void *buf, int num)
	ssleay_rand_add(buf, num, num);
	}

static void ssleay_rand_initialize(void)
	{
	unsigned long l;
#ifndef GETPID_IS_MEANINGLESS
	pid_t curr_pid = getpid();
#endif
#ifdef DEVRANDOM
	FILE *fh;
#endif

	CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
	/* put in some default random data, we need more than just this */
#ifndef GETPID_IS_MEANINGLESS
	l=curr_pid;
	RAND_add(&l,sizeof(l),0);
	l=getuid();
	RAND_add(&l,sizeof(l),0);
#endif
	l=time(NULL);
	RAND_add(&l,sizeof(l),0);

#ifdef DEVRANDOM
	/* Use a random entropy pool device. Linux and FreeBSD have
	 * this. Use /dev/urandom if you can as /dev/random will block
	 * if it runs out of random entries.  */

	if ((fh = fopen(DEVRANDOM, "r")) != NULL)
		{
		unsigned char tmpbuf[ENTROPY_NEEDED];
		int n;
		
		n=fread((unsigned char *)tmpbuf,1,ENTROPY_NEEDED,fh);
		fclose(fh);
		RAND_add(tmpbuf,sizeof tmpbuf,n);
		memset(tmpbuf,0,n);
		}
#endif
#ifdef PURIFY
	memset(state,0,STATE_SIZE);
	memset(md,0,MD_DIGEST_LENGTH);
#endif
	CRYPTO_w_lock(CRYPTO_LOCK_RAND);
	initialized=1;
	}

static int ssleay_rand_bytes(unsigned char *buf, int num)
	{
	int i,j,k,st_num,st_idx;
@@ -302,14 +348,9 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
	long md_c[2];
	unsigned char local_md[MD_DIGEST_LENGTH];
	MD_CTX m;
	static int init=1;
	unsigned long l;
#ifndef GETPID_IS_MEANINGLESS
	pid_t curr_pid = getpid();
#endif
#ifdef DEVRANDOM
	FILE *fh;
#endif

#ifdef PREDICT
	{
@@ -342,47 +383,8 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)

	CRYPTO_w_lock(CRYPTO_LOCK_RAND);

	if (init)
		{
		CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
		/* put in some default random data, we need more than
		 * just this */
		RAND_add(&m,sizeof(m),0);
#ifndef GETPID_IS_MEANINGLESS
		l=curr_pid;
		RAND_add(&l,sizeof(l),0);
		l=getuid();
		RAND_add(&l,sizeof(l),0);
#endif
		l=time(NULL);
		RAND_add(&l,sizeof(l),0);

#ifdef DEVRANDOM
		/* 
		 * Use a random entropy pool device.
		 * Linux 1.3.x and FreeBSD-Current has 
		 * this. Use /dev/urandom if you can
		 * as /dev/random will block if it runs out
		 * of random entries.
		 */
		if ((fh = fopen(DEVRANDOM, "r")) != NULL)
			{
			unsigned char tmpbuf[ENTROPY_NEEDED];
			int n;

			n=fread((unsigned char *)tmpbuf,1,ENTROPY_NEEDED,fh);
			fclose(fh);
			RAND_add(tmpbuf,sizeof tmpbuf,n);
			memset(tmpbuf,0,n);
			}
#endif
#ifdef PURIFY
		memset(state,0,STATE_SIZE);
		memset(md,0,MD_DIGEST_LENGTH);
#endif
		CRYPTO_w_lock(CRYPTO_LOCK_RAND);
		init=0;
		}
	if (!initialized)
		ssleay_rand_initialize();

	ok = (entropy >= ENTROPY_NEEDED);

@@ -473,6 +475,13 @@ static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)
	return (ret);
	}

int RAND_status(void)
	{
	if (!initialized)
		ssleay_rand_initialize();
	return (entropy >= ENTROPY_NEEDED);
	}

#ifdef WINDOWS
#include <windows.h>
#include <openssl/rand.h>
+2 −0
Original line number Diff line number Diff line
@@ -83,6 +83,8 @@ void RAND_add(const void *buf,int num,double entropy);
int  RAND_load_file(const char *file,long max_bytes);
int  RAND_write_file(const char *file);
const char *RAND_file_name(char *file,int num);
int RAND_status(void);
int RAND_egd(const char *path);
#ifdef WINDOWS
void RAND_screen(void);
#endif
Loading