diff options
Diffstat (limited to 'third_party/srtp/crypto/rng/rand_source.c')
-rw-r--r-- | third_party/srtp/crypto/rng/rand_source.c | 75 |
1 files changed, 29 insertions, 46 deletions
diff --git a/third_party/srtp/crypto/rng/rand_source.c b/third_party/srtp/crypto/rng/rand_source.c index 3d01d25a..1eb6fbb0 100644 --- a/third_party/srtp/crypto/rng/rand_source.c +++ b/third_party/srtp/crypto/rng/rand_source.c @@ -42,15 +42,14 @@ * */ -#include "srtp_config.h" +#include "config.h" -#if defined(DEV_URANDOM) || defined(PJ_DEV_URANDOM) +#ifdef DEV_URANDOM # include <fcntl.h> /* for open() */ # include <unistd.h> /* for close() */ -#elif (_MSC_VER >= 1400) -#define _CRT_RAND_S +#elif defined(HAVE_RAND_S) +# define _CRT_RAND_S # include <stdlib.h> -# include <stdio.h> #else # include <stdio.h> #endif @@ -87,18 +86,11 @@ rand_source_init(void) { dev_random_fdes = open(DEV_URANDOM, O_RDONLY); if (dev_random_fdes < 0) return err_status_init_fail; -#elif defined(PJ_DEV_URANDOM) - /* open random source for reading */ - dev_random_fdes = open(PJ_DEV_URANDOM, O_RDONLY); - if (dev_random_fdes < 0) { - err_report(3,"Ugh: /dev/urandom not present, using rand() instead"); - return err_status_ok; /* it's ok, it'll fallback to using rand() */ - } -#elif (_MSC_VER >= 1400) +#elif defined(HAVE_RAND_S) dev_random_fdes = RAND_SOURCE_READY; #else - /* no random source available; let the user know */
- err_report(err_level_info, "WARNING: no real random source present!\n"); + /* no random source available; let the user know */ + fprintf(stderr, "WARNING: no real random source present!\n"); dev_random_fdes = RAND_SOURCE_READY; #endif return err_status_ok; @@ -113,35 +105,32 @@ rand_source_get_octet_string(void *dest, uint32_t len) { * written */ #ifdef DEV_URANDOM - if (read(dev_random_fdes, dest, len) != len) - return err_status_fail; -#elif 0 && (_MSC_VER >= 1400) /* disabled rand_s, causing assertion 'rand_s not supported' in vs8 */ - unsigned int *dst = dest; + uint8_t *dst = (uint8_t *)dest; while (len) { - unsigned int val = 0; - errno_t err = rand_s(&val); - if (err != 0) - { - return err_status_fail; - } - - *dst++ = val; - len--; + ssize_t num_read = read(dev_random_fdes, dst, len); + if (num_read <= 0 || num_read > len) + return err_status_fail; + len -= num_read; + dst += num_read; } -#else +#elif defined(HAVE_RAND_S) uint8_t *dst = (uint8_t *)dest; -
-#ifdef PJ_DEV_URANDOM - /* First try with /dev/urandom, if it's opened */ - if (dev_random_fdes >= 0) { - if (read(dev_random_fdes, dest, len) == len) - return err_status_ok; /* success */ - }
-#endif + while (len) + { + unsigned int val; + errno_t err = rand_s(&val); + if (err != 0) + return err_status_fail; + + *dst++ = val & 0xff; + len--; + } +#else /* Generic C-library (rand()) version */ /* This is a random source of last resort */ + uint8_t *dst = (uint8_t *)dest; while (len) { int val = rand(); @@ -157,19 +146,13 @@ rand_source_get_octet_string(void *dest, uint32_t len) { err_status_t rand_source_deinit(void) { -#ifndef PJ_DEV_URANDOM if (dev_random_fdes < 0) return err_status_dealloc_fail; /* well, we haven't really failed, * * but there is something wrong */ +#ifdef DEV_URANDOM + close(dev_random_fdes); #endif -
-#if defined(DEV_URANDOM) || defined(PJ_DEV_URANDOM) - if (dev_random_fdes >= 0) - close(dev_random_fdes); - - dev_random_fdes = RAND_SOURCE_NOT_READY;
-#endif + dev_random_fdes = RAND_SOURCE_NOT_READY; return err_status_ok; } - |