From 5d386c0613024993566fb3bef13a1e33fa93e91c Mon Sep 17 00:00:00 2001 From: Alin Serdean Date: Thu, 19 Dec 2013 09:20:17 -0800 Subject: [PATCH] entropy: Add Windows support. Signed-off-by: Alin Serdean Signed-off-by: Ben Pfaff --- lib/entropy.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/entropy.c b/lib/entropy.c index 02f56e0f4..fd7356652 100644 --- a/lib/entropy.c +++ b/lib/entropy.c @@ -20,6 +20,9 @@ #include #include #include +#ifdef _WIN32 +#include +#endif #include "socket-util.h" #include "vlog.h" @@ -33,6 +36,7 @@ static const char urandom[] = "/dev/urandom"; int get_entropy(void *buffer, size_t n) { +#ifndef _WIN32 size_t bytes_read; int error; int fd; @@ -49,6 +53,31 @@ get_entropy(void *buffer, size_t n) if (error) { VLOG_ERR("%s: read error (%s)", urandom, ovs_retval_to_string(error)); } +#else + int error = 0; + HCRYPTPROV crypt_prov = 0; + LPVOID msg_buf; + + CryptAcquireContext(&crypt_prov, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + if (!CryptGenRandom(crypt_prov, n, buffer)) { + error = EINVAL; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + | FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + 0, + (LPTSTR)&msg_buf, + 0, + NULL + ); + VLOG_ERR("CryptGenRandom: read error (%s)", msg_buf); + LocalFree(msg_buf); + } + + CryptReleaseContext(crypt_prov, 0); +#endif return error; } -- 2.20.1