diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-03-11 05:14:06 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-03-11 05:14:06 +0000 |
commit | 59e2c77824840f8cd5706c4ae660bc7f50bab0f1 (patch) | |
tree | ea161a30b477f52f1f8e70257092284746c328e0 /src/common/crypto.c | |
parent | 14963e4af51c71f397ef2754da1b3438ba9b9888 (diff) | |
download | tor-59e2c77824840f8cd5706c4ae660bc7f50bab0f1.tar tor-59e2c77824840f8cd5706c4ae660bc7f50bab0f1.tar.gz |
Get entropy in windows.
svn:r1257
Diffstat (limited to 'src/common/crypto.c')
-rw-r--r-- | src/common/crypto.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index e1115cb85..7452f6056 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 <windows.h> +#include <wincrypt.h> +#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) { |