X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fentropy.c;h=f9808553dc26f9ad150dfd2d150555b1f30e46f9;hb=HEAD;hp=8a6479bef2f50217bea1fa2bd1612cd730c814dd;hpb=d98e60075528c3065ad453f7add4b30f22edcde3;p=sliver-openvswitch.git diff --git a/lib/entropy.c b/lib/entropy.c index 8a6479bef..f9808553d 100644 --- a/lib/entropy.c +++ b/lib/entropy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2009, 2010 Nicira Networks +/* Copyright (c) 2008, 2009, 2010, 2011, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,9 @@ #include #include #include +#ifdef _WIN32 +#include +#endif #include "socket-util.h" #include "vlog.h" @@ -33,13 +36,14 @@ static const char urandom[] = "/dev/urandom"; int get_entropy(void *buffer, size_t n) { +#ifndef _WIN32 size_t bytes_read; int error; int fd; fd = open(urandom, O_RDONLY); if (fd < 0) { - VLOG_ERR("%s: open failed (%s)", urandom, strerror(errno)); + VLOG_ERR("%s: open failed (%s)", urandom, ovs_strerror(errno)); return errno ? errno : EINVAL; } @@ -47,9 +51,21 @@ get_entropy(void *buffer, size_t n) close(fd); if (error) { - VLOG_ERR("%s: read error (%s)", urandom, - error == EOF ? "unexpected end of file" : strerror(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)) { + VLOG_ERR("CryptGenRandom: read error (%s)", ovs_lasterror_to_string()); + error = EINVAL; + } + + CryptReleaseContext(crypt_prov, 0); +#endif return error; } @@ -60,6 +76,7 @@ get_entropy_or_die(void *buffer, size_t n) { int error = get_entropy(buffer, n); if (error) { - ovs_fatal(error, "%s: read error", urandom); + VLOG_FATAL("%s: read error (%s)", + urandom, ovs_retval_to_string(error)); } }