summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rand/rand_win.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rand/rand_win.c')
-rw-r--r--src/lib/libcrypto/rand/rand_win.c63
1 files changed, 11 insertions, 52 deletions
diff --git a/src/lib/libcrypto/rand/rand_win.c b/src/lib/libcrypto/rand/rand_win.c
index 3d137badd0..c1b955b06f 100644
--- a/src/lib/libcrypto/rand/rand_win.c
+++ b/src/lib/libcrypto/rand/rand_win.c
@@ -113,7 +113,7 @@
113#include <openssl/rand.h> 113#include <openssl/rand.h>
114#include "rand_lcl.h" 114#include "rand_lcl.h"
115 115
116#if defined(WINDOWS) || defined(WIN32) 116#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32)
117#include <windows.h> 117#include <windows.h>
118#ifndef _WIN32_WINNT 118#ifndef _WIN32_WINNT
119# define _WIN32_WINNT 0x0400 119# define _WIN32_WINNT 0x0400
@@ -254,6 +254,10 @@ int RAND_poll(void)
254 * at random times on Windows 2000. Reported by Jeffrey Altman. 254 * at random times on Windows 2000. Reported by Jeffrey Altman.
255 * Only use it on NT. 255 * Only use it on NT.
256 */ 256 */
257 /* Wolfgang Marczy <WMarczy@topcall.co.at> reports that
258 * the RegQueryValueEx call below can hang on NT4.0 (SP6).
259 * So we don't use this at all for now. */
260#if 0
257 if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT && 261 if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
258 osverinfo.dwMajorVersion < 5) 262 osverinfo.dwMajorVersion < 5)
259 { 263 {
@@ -290,6 +294,7 @@ int RAND_poll(void)
290 if (buf) 294 if (buf)
291 free(buf); 295 free(buf);
292 } 296 }
297#endif
293 298
294 if (advapi) 299 if (advapi)
295 { 300 {
@@ -310,8 +315,8 @@ int RAND_poll(void)
310 { 315 {
311 if (gen(hProvider, sizeof(buf), buf) != 0) 316 if (gen(hProvider, sizeof(buf), buf) != 0)
312 { 317 {
313 RAND_add(buf, sizeof(buf), sizeof(buf)); 318 RAND_add(buf, sizeof(buf), 0);
314#ifdef DEBUG 319#if 0
315 printf("randomness from PROV_RSA_FULL\n"); 320 printf("randomness from PROV_RSA_FULL\n");
316#endif 321#endif
317 } 322 }
@@ -324,7 +329,7 @@ int RAND_poll(void)
324 if (gen(hProvider, sizeof(buf), buf) != 0) 329 if (gen(hProvider, sizeof(buf), buf) != 0)
325 { 330 {
326 RAND_add(buf, sizeof(buf), sizeof(buf)); 331 RAND_add(buf, sizeof(buf), sizeof(buf));
327#ifdef DEBUG 332#if 0
328 printf("randomness from PROV_INTEL_SEC\n"); 333 printf("randomness from PROV_INTEL_SEC\n");
329#endif 334#endif
330 } 335 }
@@ -461,7 +466,7 @@ int RAND_poll(void)
461 hlist.th32ProcessID, 466 hlist.th32ProcessID,
462 hlist.th32HeapID)) 467 hlist.th32HeapID))
463 { 468 {
464 int entrycnt = 50; 469 int entrycnt = 80;
465 do 470 do
466 RAND_add(&hentry, 471 RAND_add(&hentry,
467 hentry.dwSize, 5); 472 hentry.dwSize, 5);
@@ -510,7 +515,7 @@ int RAND_poll(void)
510 FreeLibrary(kernel); 515 FreeLibrary(kernel);
511 } 516 }
512 517
513#ifdef DEBUG 518#if 0
514 printf("Exiting RAND_poll\n"); 519 printf("Exiting RAND_poll\n");
515#endif 520#endif
516 521
@@ -685,50 +690,4 @@ static void readscreen(void)
685 DeleteDC(hScrDC); 690 DeleteDC(hScrDC);
686} 691}
687 692
688#else /* Unix version */
689
690#include <time.h>
691
692int RAND_poll(void)
693{
694 unsigned long l;
695 pid_t curr_pid = getpid();
696#ifdef DEVRANDOM
697 FILE *fh;
698#endif
699
700#ifdef DEVRANDOM
701 /* Use a random entropy pool device. Linux, FreeBSD and OpenBSD
702 * have this. Use /dev/urandom if you can as /dev/random may block
703 * if it runs out of random entries. */
704
705 if ((fh = fopen(DEVRANDOM, "r")) != NULL)
706 {
707 unsigned char tmpbuf[ENTROPY_NEEDED];
708 int n;
709
710 setvbuf(fh, NULL, _IONBF, 0);
711 n=fread((unsigned char *)tmpbuf,1,ENTROPY_NEEDED,fh);
712 fclose(fh);
713 RAND_add(tmpbuf,sizeof tmpbuf,n);
714 memset(tmpbuf,0,n);
715 }
716#endif
717
718 /* put in some default random data, we need more than just this */
719 l=curr_pid;
720 RAND_add(&l,sizeof(l),0);
721 l=getuid();
722 RAND_add(&l,sizeof(l),0);
723
724 l=time(NULL);
725 RAND_add(&l,sizeof(l),0);
726
727#ifdef DEVRANDOM
728 return 1;
729#else
730 return 0;
731#endif
732}
733
734#endif 693#endif