#define DEV_URANDOM "/dev/urandom"
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;
+
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);
+}
+
+/* ================================================== */
+
+void
+UTI_GetRandomBytes(void *buf, unsigned int len)
+{
+#ifdef HAVE_ARC4RANDOM
+ arc4random_buf(buf, len);
+#else
+ UTI_GetRandomBytesUrandom(buf, len);
#endif
}
/* Set process user/group IDs and drop supplementary groups */
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);
/* Macros to get maximum and minimum of two values */