From: Guus Sliepen Date: Sun, 25 May 2014 14:26:37 +0000 (+0200) Subject: Use CryptGenRandom() instead of /dev/[u]random on Windows. X-Git-Url: http://git.meshlink.io/?a=commitdiff_plain;h=7db92fb1932065e40cd4709989e429fca2d49778;hp=ede1a2bcd371937eda4d6b2ed1f28b2935a0054c;p=meshlink Use CryptGenRandom() instead of /dev/[u]random on Windows. --- diff --git a/src/crypto.c b/src/crypto.c index cf000c8a..2e2fa538 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -23,6 +23,8 @@ //TODO: use a strict random source once to seed a PRNG? +#ifndef HAVE_MINGW + static int random_fd = -1; void crypto_init(void) { @@ -36,11 +38,30 @@ void crypto_init(void) { } void crypto_exit(void) { + close(random_fd); +} + +#else + +#include +HCRYPTPROV prov; + +void crypto_init(void) { + if(!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + fprintf(stderr, "CryptAcquireContext() failed!\n"); + abort(); + } +} + +void crypto_exit(void) { + CryptReleaseContext(prov, 0); } void randomize(void *out, size_t outlen) { - if(read(random_fd, out, outlen) != outlen) { - fprintf(stderr, "Error reading random numbers: %s\n", strerror(errno)); + if(!CryptGenRandom(prov, outlen, out)) { + fprintf(stderr, "CryptGenRandom() failed\n"); abort(); } } + +#endif