From f8f2188888abba00983c267ead82150b3a9dfa3e Mon Sep 17 00:00:00 2001
From: Marcel Raad <raad@teamviewer.com>
Date: Thu, 31 Jul 2014 12:59:46 +0200
Subject: [PATCH] schannel: use CryptGenRandom for random numbers

This function is available for every Windows version since Windows 95/NT.

reference:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942.aspx
---
 lib/vtls/curl_schannel.c | 17 +++++++++++++++++
 lib/vtls/curl_schannel.h |  3 +++
 2 files changed, 20 insertions(+)

diff --git a/lib/vtls/curl_schannel.c b/lib/vtls/curl_schannel.c
index 64e79e1415..e4e595eaa9 100644
--- a/lib/vtls/curl_schannel.c
+++ b/lib/vtls/curl_schannel.c
@@ -1215,6 +1215,23 @@ size_t Curl_schannel_version(char *buffer, size_t size)
   return size;
 }
 
+int Curl_schannel_random(unsigned char *entropy, size_t length)
+{
+  HCRYPTPROV hCryptProv = 0;
+
+  if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
+                          CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
+    return 1;
+
+  if(!CryptGenRandom(hCryptProv, (DWORD)length, entropy)) {
+    CryptReleaseContext(hCryptProv, 0UL);
+    return 1;
+  }
+
+  CryptReleaseContext(hCryptProv, 0UL);
+  return 0;
+}
+
 #ifdef _WIN32_WCE
 static CURLcode verify_certificate(struct connectdata *conn, int sockindex)
 {
diff --git a/lib/vtls/curl_schannel.h b/lib/vtls/curl_schannel.h
index e9333179ea..aac25db83b 100644
--- a/lib/vtls/curl_schannel.h
+++ b/lib/vtls/curl_schannel.h
@@ -113,6 +113,8 @@ int Curl_schannel_init(void);
 void Curl_schannel_cleanup(void);
 size_t Curl_schannel_version(char *buffer, size_t size);
 
+int Curl_schannel_random(unsigned char *entropy, size_t length);
+
 /* API setup for Schannel */
 #define curlssl_init Curl_schannel_init
 #define curlssl_cleanup Curl_schannel_cleanup
@@ -129,5 +131,6 @@ size_t Curl_schannel_version(char *buffer, size_t size);
 #define curlssl_check_cxn(x) (x=x, -1)
 #define curlssl_data_pending Curl_schannel_data_pending
 #define CURL_SSL_BACKEND CURLSSLBACKEND_SCHANNEL
+#define curlssl_random(x,y,z) Curl_schannel_random(y,z)
 #endif /* USE_SCHANNEL */
 #endif /* HEADER_CURL_SCHANNEL_H */
-- 
GitLab