From: hniksic Date: Fri, 23 Nov 2001 16:18:41 +0000 (-0800) Subject: [svn] Seed OpenSSL's RNG. X-Git-Tag: v1.13~2048 X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=49b93249b137f75293aec6f5d6ae171b22f7d201 [svn] Seed OpenSSL's RNG. Submitted by Lemble Gregory. --- diff --git a/src/ChangeLog b/src/ChangeLog index 42699cac..cf9ba8d4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2001-11-23 Lemble Gregory + + * gen_sslfunc.c (ssl_init_prng): New function; seed the SSL RNG. + 2001-11-23 Hrvoje Niksic * progress.c: Renamed dp_* functions to dot_* for greater clarity diff --git a/src/gen_sslfunc.c b/src/gen_sslfunc.c index be5e31e2..247cbf46 100644 --- a/src/gen_sslfunc.c +++ b/src/gen_sslfunc.c @@ -31,6 +31,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include +#include #include "wget.h" #include "connect.h" @@ -41,6 +42,50 @@ extern int errno; static int verify_callback PARAMS ((int, X509_STORE_CTX *)); +static void +ssl_init_prng (void) +{ +#if SSLEAY_VERSION_NUMBER >= 0x00905100 + if (RAND_status () == 0) + { + char rand_file[256]; + time_t t; + pid_t pid; + long l,seed; + + t = time(NULL); + pid = getpid(); + RAND_file_name(rand_file, 256); + if (rand_file != NULL) + { + /* Seed as much as 1024 bytes from RAND_file_name */ + RAND_load_file(rand_file, 1024); + } + /* Seed in time (mod_ssl does this) */ + RAND_seed((unsigned char *)&t, sizeof(time_t)); + /* Seed in pid (mod_ssl does this) */ + RAND_seed((unsigned char *)&pid, sizeof(pid_t)); + /* Initialize system's random number generator */ + RAND_bytes((unsigned char *)&seed, sizeof(long)); + srand48(seed); + while (RAND_status () == 0) + { + /* Repeatedly seed the PRNG using the system's random number + generator until it has been seeded with enough data. */ + l = lrand48(); + RAND_seed((unsigned char *)&l, sizeof(long)); + } + if (rand_file != NULL) + { + /* Write a rand_file */ + RAND_write_file(rand_file); + } + } +#endif /* SSLEAY_VERSION_NUMBER >= 0x00905100 */ + return; +} + + /* Creates a SSL Context and sets some defaults for it */ uerr_t init_ssl (SSL_CTX **ctx) @@ -66,6 +111,7 @@ init_ssl (SSL_CTX **ctx) SSL_FILETYPE_PEM) <= 0) return SSLERRCERTKEY; } + ssl_init_prng(); return 0; /* Succeded */ } @@ -82,6 +128,9 @@ connect_ssl (SSL **con, SSL_CTX *ctx, int fd) SSL_connect (*con); if ((*con)->state != SSL_ST_OK) return 1; + /*while((SSLerror=ERR_get_error())!=0) + printf("%s\n", ERR_error_string(SSLerror,NULL));*/ + return 0; }