summaryrefslogtreecommitdiff
path: root/shared/nm-glib-aux/nm-random-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'shared/nm-glib-aux/nm-random-utils.c')
-rw-r--r--shared/nm-glib-aux/nm-random-utils.c165
1 files changed, 82 insertions, 83 deletions
diff --git a/shared/nm-glib-aux/nm-random-utils.c b/shared/nm-glib-aux/nm-random-utils.c
index 95063c94c4..93c943ab66 100644
--- a/shared/nm-glib-aux/nm-random-utils.c
+++ b/shared/nm-glib-aux/nm-random-utils.c
@@ -10,9 +10,9 @@
#include <fcntl.h>
#if USE_SYS_RANDOM_H
-#include <sys/random.h>
+ #include <sys/random.h>
#else
-#include <linux/random.h>
+ #include <linux/random.h>
#endif
#include "nm-shared-utils.h"
@@ -41,109 +41,108 @@
* a warning.
*/
gboolean
-nm_utils_random_bytes (void *p, size_t n)
+nm_utils_random_bytes(void *p, size_t n)
{
- int fd;
- int r;
- gboolean has_high_quality = TRUE;
- gboolean urandom_success;
- guint8 *buf = p;
- gboolean avoid_urandom = FALSE;
+ int fd;
+ int r;
+ gboolean has_high_quality = TRUE;
+ gboolean urandom_success;
+ guint8 * buf = p;
+ gboolean avoid_urandom = FALSE;
- g_return_val_if_fail (p, FALSE);
- g_return_val_if_fail (n > 0, FALSE);
+ g_return_val_if_fail(p, FALSE);
+ g_return_val_if_fail(n > 0, FALSE);
#if HAVE_GETRANDOM
- {
- static gboolean have_syscall = TRUE;
+ {
+ static gboolean have_syscall = TRUE;
- if (have_syscall) {
- r = getrandom (buf, n, GRND_NONBLOCK);
- if (r > 0) {
- if ((size_t) r == n)
- return TRUE;
+ if (have_syscall) {
+ r = getrandom(buf, n, GRND_NONBLOCK);
+ if (r > 0) {
+ if ((size_t) r == n)
+ return TRUE;
- /* no or partial read. There is not enough entropy.
+ /* no or partial read. There is not enough entropy.
* Fill the rest reading from urandom, and remember that
* some bits are not high quality. */
- nm_assert (r < n);
- buf += r;
- n -= r;
- has_high_quality = FALSE;
+ nm_assert(r < n);
+ buf += r;
+ n -= r;
+ has_high_quality = FALSE;
- /* At this point, we don't want to read /dev/urandom, because
+ /* At this point, we don't want to read /dev/urandom, because
* the entropy pool is low (early boot?), and asking for more
* entropy causes kernel messages to be logged.
*
* We use our fallback via GRand. Note that g_rand_new() also
* tries to seed itself with data from /dev/urandom, but since
* we reuse the instance, it shouldn't matter. */
- avoid_urandom = TRUE;
- } else {
- if (errno == ENOSYS) {
- /* no support for getrandom(). We don't know whether
+ avoid_urandom = TRUE;
+ } else {
+ if (errno == ENOSYS) {
+ /* no support for getrandom(). We don't know whether
* we urandom will give us good quality. Assume yes. */
- have_syscall = FALSE;
- } else {
- /* unknown error. We'll read urandom below, but we don't have
+ have_syscall = FALSE;
+ } else {
+ /* unknown error. We'll read urandom below, but we don't have
* high-quality randomness. */
- has_high_quality = FALSE;
- }
- }
- }
- }
+ has_high_quality = FALSE;
+ }
+ }
+ }
+ }
#endif
- urandom_success = FALSE;
- if (!avoid_urandom) {
+ urandom_success = FALSE;
+ if (!avoid_urandom) {
fd_open:
- fd = open ("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOCTTY);
- if (fd < 0) {
- r = errno;
- if (r == EINTR)
- goto fd_open;
- } else {
- r = nm_utils_fd_read_loop_exact (fd, buf, n, TRUE);
- nm_close (fd);
- if (r >= 0)
- urandom_success = TRUE;
- }
- }
-
- if (!urandom_success) {
- static _nm_thread_local GRand *rand = NULL;
- gsize i;
- int j;
-
- /* we failed to fill the bytes reading from urandom.
+ fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOCTTY);
+ if (fd < 0) {
+ r = errno;
+ if (r == EINTR)
+ goto fd_open;
+ } else {
+ r = nm_utils_fd_read_loop_exact(fd, buf, n, TRUE);
+ nm_close(fd);
+ if (r >= 0)
+ urandom_success = TRUE;
+ }
+ }
+
+ if (!urandom_success) {
+ static _nm_thread_local GRand *rand = NULL;
+ gsize i;
+ int j;
+
+ /* we failed to fill the bytes reading from urandom.
* Fill the bits using GRand pseudo random numbers.
*
* We don't have good quality.
*/
- has_high_quality = FALSE;
-
- if (G_UNLIKELY (!rand))
- rand = g_rand_new ();
-
- nm_assert (n > 0);
- i = 0;
- for (;;) {
- const union {
- guint32 v32;
- guint8 v8[4];
- } v = {
- .v32 = g_rand_int (rand),
- };
-
- for (j = 0; j < 4; ) {
- buf[i++] = v.v8[j++];
- if (i >= n)
- goto done;
- }
- }
-done:
- ;
- }
-
- return has_high_quality;
+ has_high_quality = FALSE;
+
+ if (G_UNLIKELY(!rand))
+ rand = g_rand_new();
+
+ nm_assert(n > 0);
+ i = 0;
+ for (;;) {
+ const union {
+ guint32 v32;
+ guint8 v8[4];
+ } v = {
+ .v32 = g_rand_int(rand),
+ };
+
+ for (j = 0; j < 4;) {
+ buf[i++] = v.v8[j++];
+ if (i >= n)
+ goto done;
+ }
+ }
+done:;
+ }
+
+ return has_high_quality;
}