aboutsummaryrefslogtreecommitdiff
path: root/src/common/crypto.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-03-11 05:14:06 +0000
committerNick Mathewson <nickm@torproject.org>2004-03-11 05:14:06 +0000
commit59e2c77824840f8cd5706c4ae660bc7f50bab0f1 (patch)
treeea161a30b477f52f1f8e70257092284746c328e0 /src/common/crypto.c
parent14963e4af51c71f397ef2754da1b3438ba9b9888 (diff)
downloadtor-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.c41
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)
{