X-Git-Url: https://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=blobdiff_plain;f=src%2Fmisc%2Frand.c;h=b49087171ab086cd561773ba2a07a5a809daf601;hp=5cdd8c63047d67a2688297950f4192f95abb2a1c;hb=8a0b8bd8d22cf77b80e370fb018b45946002e2fe;hpb=45d3191988ac7622b28ba65ccbe01500fb7800e0 diff --git a/src/misc/rand.c b/src/misc/rand.c index 5cdd8c6304..b49087171a 100644 --- a/src/misc/rand.c +++ b/src/misc/rand.c @@ -116,28 +116,41 @@ 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; + + /* fill buffer with pseudo-random data */ + while (count > 0) { unsigned int val; -#if 0 - rand_s (&val); -#else - abort(); -#endif - - if (len < sizeof (val)) - { - memcpy (buf, &val, len); - break; - } + val = rand(); + if (count < sizeof (val)) + { + memcpy (buf, &val, count); + break; + } + + memcpy (buf, &val, sizeof (val)); + count -= sizeof (val); + } - memcpy (buf, &val, sizeof (val)); - len -= 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