util: add UTI_GetRandomBytesUrandom()
This function always uses /dev/urandom, even if arc4random() is available, and is intended for generating long-term keys.
This commit is contained in:
parent
0d12410eaa
commit
32ac6ffa26
2 changed files with 19 additions and 5 deletions
17
util.c
17
util.c
|
@ -1141,17 +1141,26 @@ UTI_DropRoot(uid_t uid, gid_t gid)
|
||||||
#define DEV_URANDOM "/dev/urandom"
|
#define DEV_URANDOM "/dev/urandom"
|
||||||
|
|
||||||
void
|
void
|
||||||
UTI_GetRandomBytes(void *buf, unsigned int len)
|
UTI_GetRandomBytesUrandom(void *buf, unsigned int len)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_ARC4RANDOM
|
|
||||||
arc4random_buf(buf, len);
|
|
||||||
#else
|
|
||||||
static FILE *f = NULL;
|
static FILE *f = NULL;
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
f = fopen(DEV_URANDOM, "r");
|
f = fopen(DEV_URANDOM, "r");
|
||||||
if (!f)
|
if (!f)
|
||||||
LOG_FATAL(LOGF_Util, "Can't open %s : %s", DEV_URANDOM, strerror(errno));
|
LOG_FATAL(LOGF_Util, "Can't open %s : %s", DEV_URANDOM, strerror(errno));
|
||||||
if (fread(buf, 1, len, f) != len)
|
if (fread(buf, 1, len, f) != len)
|
||||||
LOG_FATAL(LOGF_Util, "Can't read from %s", DEV_URANDOM);
|
LOG_FATAL(LOGF_Util, "Can't read from %s", DEV_URANDOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
void
|
||||||
|
UTI_GetRandomBytes(void *buf, unsigned int len)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_ARC4RANDOM
|
||||||
|
arc4random_buf(buf, len);
|
||||||
|
#else
|
||||||
|
UTI_GetRandomBytesUrandom(buf, len);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
7
util.h
7
util.h
|
@ -148,7 +148,12 @@ extern int UTI_CheckDirPermissions(const char *path, mode_t perm, uid_t uid, gid
|
||||||
/* Set process user/group IDs and drop supplementary groups */
|
/* Set process user/group IDs and drop supplementary groups */
|
||||||
extern void UTI_DropRoot(uid_t uid, gid_t gid);
|
extern void UTI_DropRoot(uid_t uid, gid_t gid);
|
||||||
|
|
||||||
/* Fill buffer with random bytes */
|
/* Fill buffer with random bytes from /dev/urandom */
|
||||||
|
extern void UTI_GetRandomBytesUrandom(void *buf, unsigned int len);
|
||||||
|
|
||||||
|
/* Fill buffer with random bytes from /dev/urandom or a faster source if it's
|
||||||
|
available (e.g. arc4random()), which may not necessarily be suitable for
|
||||||
|
generating long-term keys */
|
||||||
extern void UTI_GetRandomBytes(void *buf, unsigned int len);
|
extern void UTI_GetRandomBytes(void *buf, unsigned int len);
|
||||||
|
|
||||||
/* Macros to get maximum and minimum of two values */
|
/* Macros to get maximum and minimum of two values */
|
||||||
|
|
Loading…
Reference in a new issue