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