mirror of
https://github.com/json-c/json-c.git
synced 2026-03-13 18:19:06 +08:00
get_cryptgenrandom_seed: compat with old windows + fallback
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user