From 59e2c77824840f8cd5706c4ae660bc7f50bab0f1 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 11 Mar 2004 05:14:06 +0000 Subject: [PATCH] Get entropy in windows. svn:r1257 --- src/common/crypto.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/or/or.h | 2 ++ 2 files changed, 43 insertions(+) diff --git a/src/common/crypto.c b/src/common/crypto.c index e1115cb85f..7452f60566 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -41,6 +41,13 @@ #define RETURN_SSL_OUTCOME(exp) return !(exp) #endif +#ifdef MS_WINDOWS +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 +#include +#include +#endif + struct crypto_pk_env_t { int type; @@ -1032,6 +1039,39 @@ void crypto_dh_free(crypto_dh_env_t *dh) } /* random numbers */ +#ifdef MS_WINDOWS +int crypto_seed_rng() +{ + static int provider_set = 0; + static HCRYPTPROV p; + char buf[21]; + + if (!provider_set) { + if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, 0)) { + if (GetLastError() != NTE_BAD_KEYSET) { + log_fn(LOG_ERR,"Can't get CryptoAPI provider [1]"); + return -1; + } + /* Yes, we need to try it twice. */ + if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, + CRYPT_NEWKEYSET)) { + log_fn(LOG_ERR,"Can't get CryptoAPI provider [2]"); + return -1; + } + } + provider_set = 1; + } + if (!CryptGenRandom(provider, 20, buf)) { + log_fn(LOG_ERR,"Can't get entropy from CryptoAPI."); + return -1; + } + RAND_seed(buf, 20); + /* And add the current screen state to the entopy pool for + * good measure. */ + RAND_screen(); + return 0; +} +#else int crypto_seed_rng() { static char *filenames[] = { @@ -1058,6 +1098,7 @@ int crypto_seed_rng() log_fn(LOG_WARN, "Cannot seed RNG -- no entropy source found."); return -1; } +#endif int crypto_rand(unsigned int n, unsigned char *to) { diff --git a/src/or/or.h b/src/or/or.h index 383fc97994..854e1528c3 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -86,6 +86,8 @@ #include #include #include +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 #define WIN32_LEAN_AND_MEAN #include #define snprintf _snprintf -- 2.11.4.GIT