util: add function to generate random bytes
Add a function to fill a buffer with random bytes which uses a better PRNG than random(). Use arc4random() if it's available on the system. Fall back to reading from /dev/urandom, which should be available on all currently supported systems.
This commit is contained in:
parent
cbd77c9752
commit
6199a89170
3 changed files with 27 additions and 0 deletions
4
configure
vendored
4
configure
vendored
|
@ -567,6 +567,10 @@ then
|
|||
MYCFLAGS="$MYCFLAGS -pthread"
|
||||
fi
|
||||
|
||||
if test_code 'arc4random_buf()' 'stdlib.h' '' '' 'arc4random_buf(NULL, 0);'; then
|
||||
add_def HAVE_ARC4RANDOM
|
||||
fi
|
||||
|
||||
timepps_h=""
|
||||
if [ $feat_refclock = "1" ] && [ $feat_pps = "1" ]; then
|
||||
if test_code '<sys/timepps.h>' 'sys/timepps.h' '' '' ''; then
|
||||
|
|
20
util.c
20
util.c
|
@ -1070,3 +1070,23 @@ UTI_CheckDirPermissions(const char *path, mode_t perm, uid_t uid, gid_t gid)
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
#define DEV_URANDOM "/dev/urandom"
|
||||
|
||||
void
|
||||
UTI_GetRandomBytes(void *buf, unsigned int len)
|
||||
{
|
||||
#ifdef HAVE_ARC4RANDOM
|
||||
arc4random_buf(buf, len);
|
||||
#else
|
||||
static FILE *f = NULL;
|
||||
if (!f)
|
||||
f = fopen(DEV_URANDOM, "r");
|
||||
if (!f)
|
||||
LOG_FATAL(LOGF_Util, "Can't open %s : %s", DEV_URANDOM, strerror(errno));
|
||||
if (fread(buf, 1, len, f) != len)
|
||||
LOG_FATAL(LOGF_Util, "Can't read from %s", DEV_URANDOM);
|
||||
#endif
|
||||
}
|
||||
|
|
3
util.h
3
util.h
|
@ -144,4 +144,7 @@ extern int UTI_CreateDirAndParents(const char *path, mode_t mode, uid_t uid, gid
|
|||
permissions and its uid/gid must match the specified values. */
|
||||
extern int UTI_CheckDirPermissions(const char *path, mode_t perm, uid_t uid, gid_t gid);
|
||||
|
||||
/* Fill buffer with random bytes */
|
||||
extern void UTI_GetRandomBytes(void *buf, unsigned int len);
|
||||
|
||||
#endif /* GOT_UTIL_H */
|
||||
|
|
Loading…
Reference in a new issue