*** uuid_prng.c.orig Tue Jun 3 14:59:53 2008 --- uuid_prng.c Sat Aug 23 23:56:32 2008 *************** *** 33,46 **** /* system headers */ #include #include #include #include #include #include - #if defined(WIN32) - #define WINVER 0x0500 - #include - #include #endif /* own headers (part 2/2) */ --- 33,47 ---- /* system headers */ #include #include + #ifdef HAVE_UNISTD_H #include + #endif #include + #ifdef HAVE_SYS_TIME_H #include + #endif + #ifdef HAVE_FCNTL_H #include #endif /* own headers (part 2/2) */ *************** *** 48,53 **** --- 49,59 ---- #include "uuid_prng.h" #include "uuid_md5.h" + #if defined(WIN32) + #include + #include + #endif + struct prng_st { int dev; /* system PRNG device */ md5_t *md5; /* local MD5 PRNG engine */ *************** *** 60,66 **** --- 66,76 ---- int fd = -1; #endif struct timeval tv; + #if defined(WIN32) + unsigned int pid; + #else pid_t pid; + #endif unsigned int i; /* sanity check argument(s) */ *************** *** 93,99 **** --- 103,113 ---- /* seed the C library PRNG once */ (void)time_gettimeofday(&tv); + #if defined(WIN32) + pid = (unsigned int)GetCurrentThreadId(); + #else pid = getpid(); + #endif srand((unsigned int)( ((unsigned int)pid << 16) ^ (unsigned int)pid *************** *** 117,123 **** unsigned char md5_buf[MD5_LEN_BIN]; unsigned char *md5_ptr; size_t md5_len; - int retries; int i; #if defined(WIN32) HCRYPTPROV hProv; --- 131,136 ---- *************** *** 132,139 **** n = data_len; /* approach 1: try to gather data via stronger system PRNG device */ if (prng->dev != -1) { ! retries = 0; while (n > 0) { i = (int)read(prng->dev, (void *)p, n); if (i <= 0) { --- 145,153 ---- n = data_len; /* approach 1: try to gather data via stronger system PRNG device */ + #if !defined(WIN32) if (prng->dev != -1) { ! int retries = 0; while (n > 0) { i = (int)read(prng->dev, (void *)p, n); if (i <= 0) { *************** *** 146,155 **** p += (unsigned int)i; } } ! #if defined(WIN32) ! else { ! if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) ! CryptGenRandom(hProv, n, p); } #endif --- 160,176 ---- p += (unsigned int)i; } } ! #else ! if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) { ! if (CryptGenRandom(hProv, (DWORD)n, (BYTE *)p)) ! n = 0; ! CryptReleaseContext(hProv, 0); ! } ! else ! if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { ! if (CryptGenRandom(hProv, (DWORD)n, (BYTE *)p)) ! n = 0; ! CryptReleaseContext(hProv, 0); } #endif *************** *** 184,191 **** --- 205,214 ---- return PRNG_RC_ARG; /* close PRNG device */ + #if !defined(WIN32) if (prng->dev != -1) (void)close(prng->dev); + #endif /* destroy MD5 engine */ (void)md5_destroy(prng->md5);