Make fips_gettime work on Win32 (lets hope the Win32 function we use
authorRichard Levitte <levitte@openssl.org>
Thu, 15 Apr 2004 16:28:05 +0000 (16:28 +0000)
committerRichard Levitte <levitte@openssl.org>
Thu, 15 Apr 2004 16:28:05 +0000 (16:28 +0000)
is OK with NIST.  Otherwise, we have a problem).

Avoid depending on 32-bit longs.

Provided by Dr Stephen Henson <shenson@drh-consultancy.co.uk>

fips/rand/fingerprint.sha1
fips/rand/fips_rand.c

index 2983f14f6c44c2e6457302b4a851168b579325bc..4b9ab6cd5411c522e1334e3fab59fcfb34432d19 100644 (file)
@@ -1,2 +1,2 @@
-HMAC-SHA1(fips_rand.c)= f65f82a78988b284668d51497f06a0fd029b17f8
+HMAC-SHA1(fips_rand.c)= 26921aa3f66397c57791f7c015c053ce84532e54
 HMAC-SHA1(fips_rand.h)= 72cff1a7ca7f33fe9df6b9da30e6420874eeb623
index f0d31f6b905720eb6ddbf8b24915b9b3a9a24909..76c08af92c43b47295cfd03a3fa261e783e9b016 100644 (file)
 #include <openssl/err.h>
 #include <openssl/fips_rand.h>
 #include "e_os.h"
+#ifndef OPENSSL_SYS_WIN32
 #include <sys/time.h>
+#endif
 #include <assert.h>
-#ifdef OPENSSL_UNISTD
-# include OPENSSL_UNISTD
-#else
-# include <unistd.h>
+#ifndef OPENSSL_SYS_WIN32
+# ifdef OPENSSL_UNISTD
+#  include OPENSSL_UNISTD
+# else
+#  include <unistd.h>
+# endif
 #endif
 #include <string.h>
 
@@ -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