| @@ -20,6 +20,16 @@ | |||||
| #define DEBUG_SEED(s) | #define DEBUG_SEED(s) | ||||
| #if defined(__APPLE__) || defined(__unix__) || defined(__linux__) | |||||
| #define HAVE_DEV_RANDOM 1 | |||||
| #endif | |||||
| #ifdef HAVE_ARC4RANDOM | |||||
| #undef HAVE_GETRANDOM | |||||
| #undef HAVE_DEV_RANDOM | |||||
| #undef HAVE_CRYPTGENRANDOM | |||||
| #endif | |||||
| #if defined ENABLE_RDRAND | #if defined ENABLE_RDRAND | ||||
| /* cpuid */ | /* cpuid */ | ||||
| @@ -197,7 +207,7 @@ static int get_getrandom_seed(int *seed) | |||||
| /* get_dev_random_seed */ | /* get_dev_random_seed */ | ||||
| #if defined(__APPLE__) || defined(__unix__) || defined(__linux__) | |||||
| #ifdef HAVE_DEV_RANDOM | |||||
| #include <fcntl.h> | #include <fcntl.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| @@ -207,8 +217,6 @@ static int get_getrandom_seed(int *seed) | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||
| #define HAVE_DEV_RANDOM 1 | |||||
| static const char *dev_random_file = "/dev/urandom"; | static const char *dev_random_file = "/dev/urandom"; | ||||
| static int get_dev_random_seed(int *seed) | static int get_dev_random_seed(int *seed) | ||||
| @@ -294,6 +302,7 @@ static int get_cryptgenrandom_seed(int *seed) | |||||
| /* get_time_seed */ | /* get_time_seed */ | ||||
| #ifndef HAVE_ARC4RANDOM | |||||
| #include <time.h> | #include <time.h> | ||||
| static int get_time_seed(void) | static int get_time_seed(void) | ||||
| @@ -302,12 +311,12 @@ static int get_time_seed(void) | |||||
| return (unsigned)time(NULL) * 433494437; | return (unsigned)time(NULL) * 433494437; | ||||
| } | } | ||||
| #endif | |||||
| /* json_c_get_random_seed */ | /* json_c_get_random_seed */ | ||||
| int json_c_get_random_seed(void) | int json_c_get_random_seed(void) | ||||
| { | { | ||||
| int seed; | |||||
| #ifdef OVERRIDE_GET_RANDOM_SEED | #ifdef OVERRIDE_GET_RANDOM_SEED | ||||
| OVERRIDE_GET_RANDOM_SEED; | OVERRIDE_GET_RANDOM_SEED; | ||||
| #endif | #endif | ||||
| @@ -318,18 +327,28 @@ int json_c_get_random_seed(void) | |||||
| #ifdef HAVE_ARC4RANDOM | #ifdef HAVE_ARC4RANDOM | ||||
| /* arc4random never fails, so use it if it's available */ | /* arc4random never fails, so use it if it's available */ | ||||
| return arc4random(); | return arc4random(); | ||||
| #endif | |||||
| #else | |||||
| #ifdef HAVE_GETRANDOM | #ifdef HAVE_GETRANDOM | ||||
| if (get_getrandom_seed(&seed) == 0) | |||||
| return seed; | |||||
| { | |||||
| int seed; | |||||
| if (get_getrandom_seed(&seed) == 0) | |||||
| return seed; | |||||
| } | |||||
| #endif | #endif | ||||
| #if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM | #if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM | ||||
| if (get_dev_random_seed(&seed) == 0) | |||||
| return seed; | |||||
| { | |||||
| int seed; | |||||
| if (get_dev_random_seed(&seed) == 0) | |||||
| return seed; | |||||
| } | |||||
| #endif | #endif | ||||
| #if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM | #if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM | ||||
| if (get_cryptgenrandom_seed(&seed) == 0) | |||||
| return seed; | |||||
| { | |||||
| int seed; | |||||
| if (get_cryptgenrandom_seed(&seed) == 0) | |||||
| return seed; | |||||
| } | |||||
| #endif | #endif | ||||
| return get_time_seed(); | return get_time_seed(); | ||||
| #endif /* !HAVE_ARC4RANDOM */ | |||||
| } | } | ||||