/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