]> granicus.if.org Git - json-c/commitdiff
get_cryptgenrandom_seed: compat with old windows + fallback
authorGianluigi Tiesi <sherpya@netfarm.it>
Mon, 1 Jun 2020 18:49:08 +0000 (20:49 +0200)
committerGianluigi Tiesi <sherpya@netfarm.it>
Wed, 3 Jun 2020 05:51:42 +0000 (07:51 +0200)
random_seed.c

index b5f8a0795e96b2b0d7018501175562260db09921..833b1a53860e0b2410802cf4adf6644f152454a7 100644 (file)
@@ -226,28 +226,36 @@ static int get_dev_random_seed(void)
 #pragma comment(lib, "advapi32.lib")
 #endif
 
+static int get_time_seed(void);
+
 static int get_cryptgenrandom_seed(void)
 {
        HCRYPTPROV hProvider = 0;
+       DWORD dwFlags = CRYPT_VERIFYCONTEXT;
        int r;
 
        DEBUG_SEED("get_cryptgenrandom_seed");
 
-       if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL,
-                                 CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
+       /* WinNT 4 and Win98 do no support CRYPT_SILENT */
+       if (LOBYTE(LOWORD(GetVersion())) > 4)
+               dwFlags |= CRYPT_SILENT;
+
+       if (!CryptAcquireContextA(&hProvider, 0, 0, PROV_RSA_FULL, dwFlags))
        {
-               fprintf(stderr, "error CryptAcquireContextW");
-               exit(1);
+               fprintf(stderr, "error CryptAcquireContextA 0x%08lx", GetLastError());
+               r = get_time_seed();
        }
-
-       if (!CryptGenRandom(hProvider, sizeof(r), (BYTE *)&r))
+       else
        {
-               fprintf(stderr, "error CryptGenRandom");
-               exit(1);
+               BOOL ret = CryptGenRandom(hProvider, sizeof(r), (BYTE*)&r);
+               CryptReleaseContext(hProvider, 0);
+               if (!ret)
+               {
+                       fprintf(stderr, "error CryptGenRandom 0x%08lx", GetLastError());
+                       r = get_time_seed();
+               }
        }
 
-       CryptReleaseContext(hProvider, 0);
-
        return r;
 }