From 0ae9a77679e3b339c9ec1cd4e032c22056ca743d Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Apr 2004 16:28:05 +0000 Subject: [PATCH] Make fips_gettime work on Win32 (lets hope the Win32 function we use is OK with NIST. Otherwise, we have a problem). Avoid depending on 32-bit longs. Provided by Dr Stephen Henson --- fips/rand/fingerprint.sha1 | 2 +- fips/rand/fips_rand.c | 39 +++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/fips/rand/fingerprint.sha1 b/fips/rand/fingerprint.sha1 index 2983f14f6c..4b9ab6cd54 100644 --- a/fips/rand/fingerprint.sha1 +++ b/fips/rand/fingerprint.sha1 @@ -1,2 +1,2 @@ -HMAC-SHA1(fips_rand.c)= f65f82a78988b284668d51497f06a0fd029b17f8 +HMAC-SHA1(fips_rand.c)= 26921aa3f66397c57791f7c015c053ce84532e54 HMAC-SHA1(fips_rand.h)= 72cff1a7ca7f33fe9df6b9da30e6420874eeb623 diff --git a/fips/rand/fips_rand.c b/fips/rand/fips_rand.c index f0d31f6b90..76c08af92c 100644 --- a/fips/rand/fips_rand.c +++ b/fips/rand/fips_rand.c @@ -57,12 +57,16 @@ #include #include #include "e_os.h" +#ifndef OPENSSL_SYS_WIN32 #include +#endif #include -#ifdef OPENSSL_UNISTD -# include OPENSSL_UNISTD -#else -# include +#ifndef OPENSSL_SYS_WIN32 +# ifdef OPENSSL_UNISTD +# include OPENSSL_UNISTD +# else +# include +# endif #endif #include @@ -117,7 +121,11 @@ int FIPS_rand_seeded() static void fips_gettime(unsigned char buf[8]) { +#ifdef OPENSSL_SYS_WIN32 + FILETIME ft; +#else struct timeval tv; +#endif if(test_mode) { @@ -125,10 +133,27 @@ static void fips_gettime(unsigned char buf[8]) memcpy(buf,test_faketime,sizeof test_faketime); return; } +#ifdef OPENSSL_SYS_WIN32 + GetSystemTimeAsFileTime(&ft); + buf[0] = (unsigned char) (ft.dwHighDateTime & 0xff); + buf[1] = (unsigned char) ((ft.dwHighDateTime >> 8) & 0xff); + buf[2] = (unsigned char) ((ft.dwHighDateTime >> 16) & 0xff); + buf[3] = (unsigned char) ((ft.dwHighDateTime >> 24) & 0xff); + buf[4] = (unsigned char) (ft.dwLowDateTime & 0xff); + buf[5] = (unsigned char) ((ft.dwLowDateTime >> 8) & 0xff); + buf[6] = (unsigned char) ((ft.dwLowDateTime >> 16) & 0xff); + buf[7] = (unsigned char) ((ft.dwLowDateTime >> 24) & 0xff); +#else gettimeofday(&tv,NULL); - assert(sizeof(long) == 4); - memcpy (&buf[0],&tv.tv_sec,4); - memcpy (&buf[4],&tv.tv_usec,4); + buf[0] = (unsigned char) (tv.tv_sec & 0xff); + buf[1] = (unsigned char) ((tv.tv_sec >> 8) & 0xff); + buf[2] = (unsigned char) ((tv.tv_sec >> 16) & 0xff); + buf[3] = (unsigned char) ((tv.tv_sec >> 24) & 0xff); + buf[4] = (unsigned char) (tv.tv_usec & 0xff); + buf[5] = (unsigned char) ((tv.tv_usec >> 8) & 0xff); + buf[6] = (unsigned char) ((tv.tv_usec >> 16) & 0xff); + buf[7] = (unsigned char) ((tv.tv_usec >> 24) & 0xff); +#endif #if 0 /* This eminently sensible strategy is not acceptable to NIST. Sigh. */ #ifndef GETPID_IS_MEANINGLESS -- 2.25.1