Sorry about that. I can put in the ernno for the error but the problem is CryptGenRandom does not set the error number.
So it is either just print the value of GetLastError() or I use FormatMessage function to get the text from that value. Like the following: lib/entropy.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/lib/entropy.c b/lib/entropy.c index 02f56e0..0343d86 100644 --- a/lib/entropy.c +++ b/lib/entropy.c @@ -27,12 +27,16 @@ VLOG_DEFINE_THIS_MODULE(entropy); static const char urandom[] = "/dev/urandom"; +#ifdef _WIN32 +#include <Wincrypt.h> +#endif /* Initializes 'buffer' with 'n' bytes of high-quality random numbers. Returns * 0 if successful, otherwise a positive errno value or EOF on error. */ int get_entropy(void *buffer, size_t n) { +#ifndef _WIN32 size_t bytes_read; int error; int fd; @@ -49,6 +53,30 @@ 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; + CryptAcquireContext(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + + if (!CryptGenRandom(crypt_prov, n, buffer)) { + error = GetLastError(); + LPVOID msg_buf; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + 0, + (LPTSTR)&msg_buf, + 0, + NULL + ); + VLOG_ERR("CryptGenRandom: read error (%s)", msg_buf); + LocalFree(msg_buf); + } + + CryptReleaseContext(crypt_prov, 0); +#endif return error; } Would you like me to set up a helper function like ovs_retval_to_string (i.e. ovs_getlasterror_to_string) or just leave it the way it is for the moment? Kind Regards, Alin. ________________________________________ From: Ben Pfaff [b...@nicira.com] Sent: Saturday, December 14, 2013 7:22 PM To: Alin Serdean Cc: Gurucharan Shetty; dev@openvswitch.org Subject: Re: [ovs-dev] [PATCH] windows pseudorandom number generator On Sat, Dec 14, 2013 at 01:20:31AM +0000, Alin Serdean wrote: > This patch is to add for secure pseudorandom number generator on windows. > > Signed-off-by: Alin Serdean <aserdean at cloudbasesolutions.com> I'm pretty sure that GetLastError() doesn't return an errno value, but this code tries to pass it to ovs_retval_to_string() and return it to a caller expecting an errno. Can you do better than that? Thanks. > + if (!CryptGenRandom(crypt_prov, n, buffer)) { > + error = GetLastError(); > + VLOG_ERR("CryptGenRandom: read error (%s)", > ovs_retval_to_string(error)); > + } _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev