random_seed: Support using CryptGenRandom on windows
authorMartin Storsjö <martin@martin.st>
Thu, 11 Oct 2012 11:30:23 +0000 (14:30 +0300)
committerMartin Storsjö <martin@martin.st>
Thu, 11 Oct 2012 15:49:34 +0000 (18:49 +0300)
Signed-off-by: Martin Storsjö <martin@martin.st>
configure
libavutil/random_seed.c

index 17f38ec..67f88eb 100755 (executable)
--- a/configure
+++ b/configure
@@ -1139,6 +1139,7 @@ HAVE_LIST="
     closesocket
     cmov
     cpunop
+    CryptGenRandom
     dcbzl
     dev_bktr_ioctl_bt848_h
     dev_bktr_ioctl_meteor_h
@@ -3202,6 +3203,7 @@ check_func  sysctl
 check_func  usleep
 check_func_headers io.h setmode
 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
+check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
 check_func_headers windows.h GetProcessAffinityMask
 check_func_headers windows.h GetProcessTimes
index 8ee4cb7..ec9caa7 100644 (file)
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#if HAVE_CRYPTGENRANDOM
+#include <windows.h>
+#include <wincrypt.h>
+#endif
 #include <fcntl.h>
 #include <math.h>
 #include <time.h>
@@ -82,6 +86,17 @@ uint32_t av_get_random_seed(void)
 {
     uint32_t seed;
 
+#if HAVE_CRYPTGENRANDOM
+    HCRYPTPROV provider;
+    if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL,
+                            CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+        BOOL ret = CryptGenRandom(provider, sizeof(seed), (PBYTE) &seed);
+        CryptReleaseContext(provider, 0);
+        if (ret)
+            return seed;
+    }
+#endif
+
     if (read_random(&seed, "/dev/urandom") == sizeof(seed))
         return seed;
     if (read_random(&seed, "/dev/random")  == sizeof(seed))