diff --git a/random_seed.c b/random_seed.c index fc19e26..a768c06 100644 --- a/random_seed.c +++ b/random_seed.c @@ -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; }