|
@@ -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 */ |
|
|
} |
|
|
} |