/soc/2015/mmcc/rand: dcf27ec371f2: Add a randomness source for W...

Eion Robb <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: dcf27ec371f20b091578b7447cd1066dc51300f2
Author:	 Eion Robb <[email protected]>
Date:	 2015-08-21 23:19 -0400
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/mmcc/rand/rev/dcf27ec371f2

Description:

Add a randomness source for Windows to fall back on when the SSL API isn't
available.

diffstat:

 libpurple/util.c           |   6 +++++-
 libpurple/win32/win32dep.c |  20 ++++++++++++++++++++
 libpurple/win32/win32dep.h |   1 +
 3 files changed, 26 insertions(+), 1 deletions(-)

diffs (86 lines):

diff --git a/libpurple/util.c b/libpurple/util.c
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -5001,8 +5001,11 @@ purple_util_random(void *buf, size_t len
 	/* use SSL API if available... */
 	if (purple_ssl_is_supported() && ops && ops->rand_bytes) {
 		return (ops->rand_bytes)(buf, len);
-	/* ...otherwise, fall back to /dev/urandom */
+	/* ...otherwise, fall back to /dev/urandom or Windows alternative */
 	} else {
+#ifdef _WIN32
+		return wpurple_rand_bytes(buf, len);
+#else	/* _WIN32 */
 		fd = open("/dev/urandom", O_RDONLY);
 		if (fd < 0) {
 			purple_debug_error("purple_random",
@@ -5026,6 +5029,7 @@ purple_util_random(void *buf, size_t len
 		close(fd);
 		return 0;
 	}
+#endif	/* _WIN32 */
 }
 
 #if 0
diff --git a/libpurple/win32/win32dep.c b/libpurple/win32/win32dep.c
--- a/libpurple/win32/win32dep.c
+++ b/libpurple/win32/win32dep.c
@@ -23,6 +23,7 @@
  *
  */
 #include "internal.h"
+#include <wincrypt.h>
 #include <winuser.h>
 
 #include "debug.h"
@@ -40,6 +41,8 @@ static char *app_data_dir = NULL, *bin_d
 
 static HINSTANCE libpurpledll_hInstance = NULL;
 
+static HCRYPTPROV hCryptoServiceProvider = 0;
+
 /*
  *  PUBLIC CODE
  */
@@ -618,6 +621,20 @@ int wpurple_input_pipe(int pipefd[2])
 	}
 }
 
+int wpurple_rand_bytes(void *buf, size_t len) {
+	if (hCryptoServiceProvider == 0) {
+		purple_debug_error("wpurple", "No crypto service provider could be created\n");
+		return -1;
+	}
+	
+	if (!CryptGenRandom(hCryptoServiceProvider, len, buf)) {
+		purple_debug_error("wpurple", "Generating random number failed\n");
+		return -1;
+	}
+	
+	return 0;
+}	
+
 void wpurple_init(void) {
 	WORD wVersionRequested;
 	WSADATA wsaData;
@@ -650,6 +667,9 @@ void wpurple_init(void) {
 		purple_debug_error("wpurple", "Could not find a usable WinSock DLL.  Oh well.\n");
 		WSACleanup();
 	}
+	
+	/* Crypto init */
+	CryptAcquireContextA(&hCryptoServiceProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
 
 	if (purple_debug_is_verbose())
 		purple_debug_misc("wpurple", "wpurple_init end\n");
diff --git a/libpurple/win32/win32dep.h b/libpurple/win32/win32dep.h
--- a/libpurple/win32/win32dep.h
+++ b/libpurple/win32/win32dep.h
@@ -63,6 +63,7 @@ char *wpurple_read_reg_string(HKEY rootk
 gboolean wpurple_write_reg_string(HKEY rootkey, const char *subkey, const char *valname, const char *value);
 char *wpurple_escape_dirsep(const char *filename); /* needs to be g_free'd */
 GIOChannel *wpurple_g_io_channel_win32_new_socket(int socket); /* Until we get the post-2.8 glib win32 giochannel implementation working, use the thread-based one */
+int wpurple_rand_bytes(void *buf, size_t len);
 
 /* Simulate unix pipes by creating a pair of connected sockets */
 int wpurple_input_pipe(int pipefd[2]);

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.