Index: patches/nss-rtlgenrandom.patch |
=================================================================== |
--- patches/nss-rtlgenrandom.patch (revision 0) |
+++ patches/nss-rtlgenrandom.patch (revision 0) |
@@ -0,0 +1,110 @@ |
+diff --git a/lib/freebl/win_rand.c b/lib/freebl/win_rand.c |
+--- a/lib/freebl/win_rand.c |
++++ b/lib/freebl/win_rand.c |
+@@ -362,102 +362,37 @@ void RNG_FileForRNG(const char *filename |
+ } |
+ |
+ nBytes = RNG_GetNoise(buffer, 20); // get up to 20 bytes |
+ RNG_RandomUpdate(buffer, nBytes); |
+ } |
+ |
+ |
+ /* |
+- * CryptoAPI requires Windows NT 4.0 or Windows 95 OSR2 and later. |
+- * Until we drop support for Windows 95, we need to emulate some |
+- * definitions and declarations in <wincrypt.h> and look up the |
+- * functions in advapi32.dll at run time. |
+- */ |
+- |
+-#ifndef WIN64 |
+-typedef unsigned long HCRYPTPROV; |
+-#endif |
+- |
+-#define CRYPT_VERIFYCONTEXT 0xF0000000 |
+- |
+-#define PROV_RSA_FULL 1 |
+- |
+-typedef BOOL |
+-(WINAPI *CryptAcquireContextAFn)( |
+- HCRYPTPROV *phProv, |
+- LPCSTR pszContainer, |
+- LPCSTR pszProvider, |
+- DWORD dwProvType, |
+- DWORD dwFlags); |
+- |
+-typedef BOOL |
+-(WINAPI *CryptReleaseContextFn)( |
+- HCRYPTPROV hProv, |
+- DWORD dwFlags); |
+- |
+-typedef BOOL |
+-(WINAPI *CryptGenRandomFn)( |
+- HCRYPTPROV hProv, |
+- DWORD dwLen, |
+- BYTE *pbBuffer); |
+- |
+-/* |
+ * Windows XP and Windows Server 2003 and later have RtlGenRandom, |
+ * which must be looked up by the name SystemFunction036. |
+ */ |
+ typedef BOOLEAN |
+ (APIENTRY *RtlGenRandomFn)( |
+ PVOID RandomBuffer, |
+ ULONG RandomBufferLength); |
+ |
+ size_t RNG_SystemRNG(void *dest, size_t maxLen) |
+ { |
+ HMODULE hModule; |
+ RtlGenRandomFn pRtlGenRandom; |
+- CryptAcquireContextAFn pCryptAcquireContextA; |
+- CryptReleaseContextFn pCryptReleaseContext; |
+- CryptGenRandomFn pCryptGenRandom; |
+- HCRYPTPROV hCryptProv; |
+ size_t bytes = 0; |
+ |
+ usedWindowsPRNG = PR_FALSE; |
+ hModule = LoadLibrary("advapi32.dll"); |
+ if (hModule == NULL) { |
+- return rng_systemFromNoise(dest,maxLen); |
++ return bytes; |
+ } |
+ pRtlGenRandom = (RtlGenRandomFn) |
+ GetProcAddress(hModule, "SystemFunction036"); |
+- if (pRtlGenRandom) { |
+- if (pRtlGenRandom(dest, maxLen)) { |
+- bytes = maxLen; |
+- usedWindowsPRNG = PR_TRUE; |
+- } else { |
+- bytes = rng_systemFromNoise(dest,maxLen); |
+- } |
+- goto done; |
++ if (pRtlGenRandom && pRtlGenRandom(dest, maxLen)) { |
++ bytes = maxLen; |
++ usedWindowsPRNG = PR_TRUE; |
+ } |
+- pCryptAcquireContextA = (CryptAcquireContextAFn) |
+- GetProcAddress(hModule, "CryptAcquireContextA"); |
+- pCryptReleaseContext = (CryptReleaseContextFn) |
+- GetProcAddress(hModule, "CryptReleaseContext"); |
+- pCryptGenRandom = (CryptGenRandomFn) |
+- GetProcAddress(hModule, "CryptGenRandom"); |
+- if (!pCryptAcquireContextA || !pCryptReleaseContext || !pCryptGenRandom) { |
+- bytes = rng_systemFromNoise(dest,maxLen); |
+- goto done; |
+- } |
+- if (pCryptAcquireContextA(&hCryptProv, NULL, NULL, |
+- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { |
+- if (pCryptGenRandom(hCryptProv, maxLen, dest)) { |
+- bytes = maxLen; |
+- usedWindowsPRNG = PR_TRUE; |
+- } |
+- pCryptReleaseContext(hCryptProv, 0); |
+- } |
+- if (bytes == 0) { |
+- bytes = rng_systemFromNoise(dest,maxLen); |
+- } |
+-done: |
+ FreeLibrary(hModule); |
+ return bytes; |
+ } |
+ #endif /* is XP_WIN */ |