X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Frand.c;h=81bc1850b3300b7466009659dc1301aa538b7bc1;hb=f71d55dd356d9f1fb225f221adeb1ee8e5dc3aee;hp=97663ef7ff84336957955ce240eed2c1e76db30c;hpb=63ea63eb19692b20fe489f25c237c121d36fe932;p=vlc diff --git a/src/misc/rand.c b/src/misc/rand.c index 97663ef7ff..81bc1850b3 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 @@ -80,12 +84,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 +97,66 @@ 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; + 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