-/*
- * m_rand -- provides pseudorandom bytes
+/* m_rand.c -- provides pseudorandom bytes
*
* This code is Copyright (c) 2012, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
-#include <stdlib.h> /* for abs(), srand(), rand() */
-#include <stdio.h> /* for fopen(), fread(), fclose() */
-#include <unistd.h> /* for getpid() */
-#include <time.h> /* for time() */
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <time.h>
-static int seeded = 0;
+#include "config.h"
+#include "m_rand.h"
+
+#if !HAVE_ARC4RANDOM
+static bool seeded = false;
+#endif
int
-m_rand (unsigned char *buf, size_t n) {
+m_rand (unsigned char *buf, size_t n)
+{
+#if !HAVE_ARC4RANDOM
if (! seeded) {
FILE *devurandom;
unsigned int seed;
if ((devurandom = fopen ("/dev/urandom", "r"))) {
- if (fread (&seed, sizeof (seed), 1, devurandom) == 1) seeded = 1;
+ if (fread (&seed, sizeof (seed), 1, devurandom) == 1)
+ seeded = true;
fclose (devurandom);
}
arXiv:1005.4117v1 [physics.comp-ph], 22 May 2010, p. 19.
time() and getpid() shouldn't fail on POSIX platforms. */
seed = abs ((int) ((time (0) * 181 * ((getpid ()-83) * 359)) % 104729));
- seeded = 1;
+ seeded = true;
}
srand (seed);
*buf++ = *rndp++;
}
}
+#else
+ arc4random_buf(buf, n);
+#endif
return 0;
}