X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Frand.c;h=081ece3ff8234463d25c6efac66b3525beaaeddc;hb=7e6c2325f169cfe06a8562b55a0832c26580c503;hp=9e27ced3b0bb975df5d4be73b5b53c1c5ae19c64;hpb=bdf786c983885b18e9162fd01d245442a6c9ec06;p=vlc diff --git a/src/misc/rand.c b/src/misc/rand.c index 9e27ced3b0..081ece3ff8 100644 --- a/src/misc/rand.c +++ b/src/misc/rand.c @@ -19,7 +19,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include #ifndef WIN32 @@ -31,6 +35,7 @@ #include #include #include +#include #include @@ -53,7 +58,7 @@ static void vlc_rand_init (void) uint8_t key[BLOCK_SIZE]; /* Get non-predictible value as key for HMAC */ - int fd = open (randfile, O_RDONLY); + int fd = vlc_open (randfile, O_RDONLY); if (fd == -1) return; /* Uho! */ @@ -116,23 +121,43 @@ void vlc_rand_bytes (void *buf, size_t len) } #else /* WIN32 */ -#define _CRT_RAND_S -#include + +#include void vlc_rand_bytes (void *buf, size_t len) { - while (len > 0) + HCRYPTPROV hProv; + size_t count = len; + uint8_t *p_buf = (uint8_t *)buf; + + /* fill buffer with pseudo-random data */ + while (count > 0) { unsigned int val; - rand_s (&val); - - if (len < sizeof (val)) + val = rand(); + if (count < sizeof (val)) { - memcpy (buf, &val, len); + memcpy (p_buf, &val, count); break; } + + memcpy (p_buf, &val, sizeof (val)); + count -= sizeof (val); + p_buf += sizeof (val); + } - memcpy (buf, &val, sizeof (val)); + /* acquire default encryption context */ + if( CryptAcquireContext( + &hProv, // Variable to hold returned handle. + NULL, // Use default key container. + MS_DEF_PROV, // Use default CSP. + PROV_RSA_FULL, // Type of provider to acquire. + 0) ) + { + /* fill buffer with pseudo-random data, intial buffer content + is used as auxillary random seed */ + CryptGenRandom(hProv, len, buf); + CryptReleaseContext(hProv, 0); } } #endif