get_cryptgenrandom_seed: compat with old windows + fallback

This commit is contained in:
Gianluigi Tiesi
2020-06-01 20:49:08 +02:00
parent 1c6086a86a
commit 481d0a8ede

View File

@@ -226,27 +226,35 @@ 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))
{
fprintf(stderr, "error CryptAcquireContextW");
exit(1);
}
/* WinNT 4 and Win98 do no support CRYPT_SILENT */
if (LOBYTE(LOWORD(GetVersion())) > 4)
dwFlags |= CRYPT_SILENT;
if (!CryptGenRandom(hProvider, sizeof(r), (BYTE *)&r))
if (!CryptAcquireContextA(&hProvider, 0, 0, PROV_RSA_FULL, dwFlags))
{
fprintf(stderr, "error CryptGenRandom");
exit(1);
fprintf(stderr, "error CryptAcquireContextA 0x%08lx", GetLastError());
r = get_time_seed();
}
else
{
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;
}