Browse Source

get_cryptgenrandom_seed: compat with old windows + fallback

tags/json-c-0.15-20200726
Gianluigi Tiesi 5 years ago
parent
commit
481d0a8ede
1 changed files with 18 additions and 10 deletions
  1. +18
    -10
      random_seed.c

+ 18
- 10
random_seed.c View File

@@ -226,28 +226,36 @@ 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,
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; return r;
} }




Loading…
Cancel
Save