diff options
author | James Almer <jamrial@gmail.com> | 2023-07-04 19:46:32 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2023-07-05 10:06:05 -0300 |
commit | d694c25b44c319eadfb8039fc917639314cadb08 (patch) | |
tree | 90aee53ca3aa42913026970b043144f5fc38c9a4 /libavutil/random_seed.c | |
parent | 7a1128ca07fa38836775168d002ff6bc55134023 (diff) | |
download | ffmpeg-d694c25b44c319eadfb8039fc917639314cadb08.tar.gz |
avutil/random_seed: add av_random_bytes()
Uses the existing code for av_get_random_seed() to return a buffer with
cryptographically secure random data, or an error if none could be generated.
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavutil/random_seed.c')
-rw-r--r-- | libavutil/random_seed.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/libavutil/random_seed.c b/libavutil/random_seed.c index a51149235b..f5c291263e 100644 --- a/libavutil/random_seed.c +++ b/libavutil/random_seed.c @@ -46,7 +46,7 @@ #define TEST 0 #endif -static int read_random(uint32_t *dst, const char *file) +static int read_random(uint8_t *dst, size_t len, const char *file) { #if HAVE_UNISTD_H FILE *fp = avpriv_fopen_utf8(file, "r"); @@ -54,10 +54,10 @@ static int read_random(uint32_t *dst, const char *file) if (!fp) return AVERROR_UNKNOWN; - err = fread(dst, 1, sizeof(*dst), fp); + err = fread(dst, 1, len, fp); fclose(fp); - if (err != sizeof(*dst)) + if (err != len) return AVERROR_UNKNOWN; return 0; @@ -121,27 +121,38 @@ static uint32_t get_generic_seed(void) return AV_RB32(digest) + AV_RB32(digest + 16); } -uint32_t av_get_random_seed(void) +int av_random_bytes(uint8_t* buf, size_t len) { - uint32_t seed; + int err; #if HAVE_BCRYPT BCRYPT_ALG_HANDLE algo_handle; NTSTATUS ret = BCryptOpenAlgorithmProvider(&algo_handle, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); if (BCRYPT_SUCCESS(ret)) { - NTSTATUS ret = BCryptGenRandom(algo_handle, (UCHAR*)&seed, sizeof(seed), 0); + NTSTATUS ret = BCryptGenRandom(algo_handle, (PUCHAR)buf, len, 0); BCryptCloseAlgorithmProvider(algo_handle, 0); if (BCRYPT_SUCCESS(ret)) - return seed; + return 0; } #endif #if HAVE_ARC4RANDOM - return arc4random(); + arc4random_buf(buf, len); + return 0; #endif - if (!read_random(&seed, "/dev/urandom")) - return seed; - return get_generic_seed(); + err = read_random(buf, len, "/dev/urandom"); + + return err; +} + +uint32_t av_get_random_seed(void) +{ + uint32_t seed; + + if (av_random_bytes((uint8_t *)&seed, sizeof(seed)) < 0) + return get_generic_seed(); + + return seed; } |