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=97663ef7ff84336957955ce240eed2c1e76db30c;hb=8a0b8bd8d22cf77b80e370fb018b45946002e2fe;hpb=63ea63eb19692b20fe489f25c237c121d36fe932;ds=sidebyside diff --git a/src/misc/rand.c b/src/misc/rand.c index 97663ef7ff..b49087171a 100644 --- a/src/misc/rand.c +++ b/src/misc/rand.c @@ -80,12 +80,12 @@ void vlc_rand_bytes (void *buf, size_t len) static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; static uint64_t counter = 0; - struct md5_s md; uint64_t stamp = NTPtime64 (); while (len > 0) { uint64_t val; + struct md5_s mdi, mdo; pthread_mutex_lock (&lock); if (counter == 0) @@ -93,42 +93,64 @@ void vlc_rand_bytes (void *buf, size_t len) val = counter++; pthread_mutex_unlock (&lock); - InitMD5 (&md); - AddMD5 (&md, ikey, sizeof (ikey)); - AddMD5 (&md, &stamp, sizeof (stamp)); - AddMD5 (&md, &val, sizeof (val)); - EndMD5 (&md); - - if (len < sizeof (md.p_digest)) + InitMD5 (&mdi); + AddMD5 (&mdi, ikey, sizeof (ikey)); + AddMD5 (&mdi, &stamp, sizeof (stamp)); + AddMD5 (&mdi, &val, sizeof (val)); + EndMD5 (&mdi); + InitMD5 (&mdo); + AddMD5 (&mdo, okey, sizeof (okey)); + AddMD5 (&mdo, mdi.p_digest, sizeof (mdi.p_digest)); + EndMD5 (&mdo); + + if (len < sizeof (mdo.p_digest)) { - memcpy (buf, md.p_digest, len); + memcpy (buf, mdo.p_digest, len); break; } - memcpy (buf, md.p_digest, sizeof (md.p_digest)); - len -= sizeof (md.p_digest); - buf = ((uint8_t *)buf) + sizeof (md.p_digest); + memcpy (buf, mdo.p_digest, sizeof (mdo.p_digest)); + len -= sizeof (mdo.p_digest); + buf = ((uint8_t *)buf) + sizeof (mdo.p_digest); } } #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; - rand_s (&val); - - 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)); + /* 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