Browse Source

get_cryptgenrandom_seed: compat with old windows + fallback

pull/627/head
Gianluigi Tiesi 5 years ago
parent
commit
5bb58421c8
1 changed files with 18 additions and 10 deletions
  1. +18
    -10
      random_seed.c

+ 18
- 10
random_seed.c View File

@@ -194,28 +194,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%08x", 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%08x", GetLastError());
r = get_time_seed();
}
}

CryptReleaseContext(hProvider, 0);

return r;
}



Loading…
Cancel
Save