Merge pull request #628 from clamwin/compat-fixes-master

get_cryptgenrandom_seed: compat with old windows + fallback
This commit is contained in:
Eric Hawicz
2020-06-03 23:53:46 -04:00
committed by GitHub

View File

@@ -226,27 +226,35 @@ static int get_dev_random_seed(void)
#pragma comment(lib, "advapi32.lib") #pragma comment(lib, "advapi32.lib")
#endif #endif
static int get_time_seed(void);
static int get_cryptgenrandom_seed(void) static int get_cryptgenrandom_seed(void)
{ {
HCRYPTPROV hProvider = 0; HCRYPTPROV hProvider = 0;
DWORD dwFlags = CRYPT_VERIFYCONTEXT;
int r; int r;
DEBUG_SEED("get_cryptgenrandom_seed"); DEBUG_SEED("get_cryptgenrandom_seed");
if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, /* WinNT 4 and Win98 do no support CRYPT_SILENT */
CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) if (LOBYTE(LOWORD(GetVersion())) > 4)
{ dwFlags |= CRYPT_SILENT;
fprintf(stderr, "error CryptAcquireContextW");
exit(1);
}
if (!CryptGenRandom(hProvider, sizeof(r), (BYTE *)&r)) if (!CryptAcquireContextA(&hProvider, 0, 0, PROV_RSA_FULL, dwFlags))
{ {
fprintf(stderr, "error CryptGenRandom"); fprintf(stderr, "error CryptAcquireContextA 0x%08lx", GetLastError());
exit(1); 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; return r;
} }