OLD | NEW |
(Empty) | |
| 1 diff --git a/lib/freebl/win_rand.c b/lib/freebl/win_rand.c |
| 2 --- a/lib/freebl/win_rand.c |
| 3 +++ b/lib/freebl/win_rand.c |
| 4 @@ -362,102 +362,37 @@ void RNG_FileForRNG(const char *filename |
| 5 } |
| 6 |
| 7 nBytes = RNG_GetNoise(buffer, 20); // get up to 20 bytes |
| 8 RNG_RandomUpdate(buffer, nBytes); |
| 9 } |
| 10 |
| 11 |
| 12 /* |
| 13 - * CryptoAPI requires Windows NT 4.0 or Windows 95 OSR2 and later. |
| 14 - * Until we drop support for Windows 95, we need to emulate some |
| 15 - * definitions and declarations in <wincrypt.h> and look up the |
| 16 - * functions in advapi32.dll at run time. |
| 17 - */ |
| 18 - |
| 19 -#ifndef WIN64 |
| 20 -typedef unsigned long HCRYPTPROV; |
| 21 -#endif |
| 22 - |
| 23 -#define CRYPT_VERIFYCONTEXT 0xF0000000 |
| 24 - |
| 25 -#define PROV_RSA_FULL 1 |
| 26 - |
| 27 -typedef BOOL |
| 28 -(WINAPI *CryptAcquireContextAFn)( |
| 29 - HCRYPTPROV *phProv, |
| 30 - LPCSTR pszContainer, |
| 31 - LPCSTR pszProvider, |
| 32 - DWORD dwProvType, |
| 33 - DWORD dwFlags); |
| 34 - |
| 35 -typedef BOOL |
| 36 -(WINAPI *CryptReleaseContextFn)( |
| 37 - HCRYPTPROV hProv, |
| 38 - DWORD dwFlags); |
| 39 - |
| 40 -typedef BOOL |
| 41 -(WINAPI *CryptGenRandomFn)( |
| 42 - HCRYPTPROV hProv, |
| 43 - DWORD dwLen, |
| 44 - BYTE *pbBuffer); |
| 45 - |
| 46 -/* |
| 47 * Windows XP and Windows Server 2003 and later have RtlGenRandom, |
| 48 * which must be looked up by the name SystemFunction036. |
| 49 */ |
| 50 typedef BOOLEAN |
| 51 (APIENTRY *RtlGenRandomFn)( |
| 52 PVOID RandomBuffer, |
| 53 ULONG RandomBufferLength); |
| 54 |
| 55 size_t RNG_SystemRNG(void *dest, size_t maxLen) |
| 56 { |
| 57 HMODULE hModule; |
| 58 RtlGenRandomFn pRtlGenRandom; |
| 59 - CryptAcquireContextAFn pCryptAcquireContextA; |
| 60 - CryptReleaseContextFn pCryptReleaseContext; |
| 61 - CryptGenRandomFn pCryptGenRandom; |
| 62 - HCRYPTPROV hCryptProv; |
| 63 size_t bytes = 0; |
| 64 |
| 65 usedWindowsPRNG = PR_FALSE; |
| 66 hModule = LoadLibrary("advapi32.dll"); |
| 67 if (hModule == NULL) { |
| 68 - return rng_systemFromNoise(dest,maxLen); |
| 69 + return bytes; |
| 70 } |
| 71 pRtlGenRandom = (RtlGenRandomFn) |
| 72 GetProcAddress(hModule, "SystemFunction036"); |
| 73 - if (pRtlGenRandom) { |
| 74 - if (pRtlGenRandom(dest, maxLen)) { |
| 75 - bytes = maxLen; |
| 76 - usedWindowsPRNG = PR_TRUE; |
| 77 - } else { |
| 78 - bytes = rng_systemFromNoise(dest,maxLen); |
| 79 - } |
| 80 - goto done; |
| 81 + if (pRtlGenRandom && pRtlGenRandom(dest, maxLen)) { |
| 82 + bytes = maxLen; |
| 83 + usedWindowsPRNG = PR_TRUE; |
| 84 } |
| 85 - pCryptAcquireContextA = (CryptAcquireContextAFn) |
| 86 - GetProcAddress(hModule, "CryptAcquireContextA"); |
| 87 - pCryptReleaseContext = (CryptReleaseContextFn) |
| 88 - GetProcAddress(hModule, "CryptReleaseContext"); |
| 89 - pCryptGenRandom = (CryptGenRandomFn) |
| 90 - GetProcAddress(hModule, "CryptGenRandom"); |
| 91 - if (!pCryptAcquireContextA || !pCryptReleaseContext || !pCryptGenRandom) { |
| 92 - bytes = rng_systemFromNoise(dest,maxLen); |
| 93 - goto done; |
| 94 - } |
| 95 - if (pCryptAcquireContextA(&hCryptProv, NULL, NULL, |
| 96 - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { |
| 97 - if (pCryptGenRandom(hCryptProv, maxLen, dest)) { |
| 98 - bytes = maxLen; |
| 99 - usedWindowsPRNG = PR_TRUE; |
| 100 - } |
| 101 - pCryptReleaseContext(hCryptProv, 0); |
| 102 - } |
| 103 - if (bytes == 0) { |
| 104 - bytes = rng_systemFromNoise(dest,maxLen); |
| 105 - } |
| 106 -done: |
| 107 FreeLibrary(hModule); |
| 108 return bytes; |
| 109 } |
| 110 #endif /* is XP_WIN */ |
OLD | NEW |