X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Frandom_seed.c;h=ec9caa74b709ce37ce14b7af8f8984cda3e2ec03;hb=932117171f32fc3160f3d92943290238945fcb28;hp=6dc8d22ca4fc608f5ce6ec8b1af59ab560e03115;hpb=2912e87a6c9264d556734e2bf94a99c64cf9b102;p=ffmpeg diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c index 6dc8d22ca4f..ec9caa74b70 100644 --- a/libavutil/random_seed.c +++ b/libavutil/random_seed.c @@ -18,15 +18,24 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + +#if HAVE_UNISTD_H #include +#endif +#if HAVE_CRYPTGENRANDOM +#include +#include +#endif #include +#include +#include #include "timer.h" -#include "time.h" #include "random_seed.h" -#include "avutil.h" static int read_random(uint32_t *dst, const char *file) { +#if HAVE_UNISTD_H int fd = open(file, O_RDONLY); int err = -1; @@ -36,28 +45,31 @@ static int read_random(uint32_t *dst, const char *file) close(fd); return err; +#else + return -1; +#endif } static uint32_t get_generic_seed(void) { - clock_t last_t=0; - int bits=0; - uint64_t random=0; + clock_t last_t = 0; + int bits = 0; + uint64_t random = 0; unsigned i; - float s=0.000000000001; + float s = 0.000000000001; - for(i=0;bits<64;i++){ - clock_t t= clock(); - if(last_t && fabs(t-last_t)>s || t==(clock_t)-1){ - if(i<10000 && s<(1<<24)){ - s+=s; - i=t=0; - }else{ - random= 2*random + (i&1); + for (i = 0; bits < 64; i++) { + clock_t t = clock(); + if (last_t && fabs(t - last_t) > s || t == (clock_t) -1) { + if (i < 10000 && s < (1 << 24)) { + s += s; + i = t = 0; + } else { + random = 2 * random + (i & 1); bits++; } } - last_t= t; + last_t = t; } #ifdef AV_READ_TIME random ^= AV_READ_TIME(); @@ -65,7 +77,7 @@ static uint32_t get_generic_seed(void) random ^= clock(); #endif - random += random>>32; + random += random >> 32; return random; } @@ -74,17 +86,20 @@ uint32_t av_get_random_seed(void) { uint32_t seed; +#if HAVE_CRYPTGENRANDOM + HCRYPTPROV provider; + if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { + BOOL ret = CryptGenRandom(provider, sizeof(seed), (PBYTE) &seed); + CryptReleaseContext(provider, 0); + if (ret) + return seed; + } +#endif + if (read_random(&seed, "/dev/urandom") == sizeof(seed)) return seed; if (read_random(&seed, "/dev/random") == sizeof(seed)) return seed; return get_generic_seed(); } - -#if LIBAVUTIL_VERSION_MAJOR < 51 -attribute_deprecated uint32_t ff_random_get_seed(void); -uint32_t ff_random_get_seed(void) -{ - return av_get_random_seed(); -} -#endif