From 11985f8c59cccc0364bde7dd314e246ea53cff90 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 1 Jan 2020 17:57:12 -0800 Subject: fixes #1083 Random number improvements --- src/platform/posix/posix_rand_getrandom.c | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/platform/posix/posix_rand_getrandom.c (limited to 'src/platform/posix/posix_rand_getrandom.c') diff --git a/src/platform/posix/posix_rand_getrandom.c b/src/platform/posix/posix_rand_getrandom.c new file mode 100644 index 00000000..489b2c76 --- /dev/null +++ b/src/platform/posix/posix_rand_getrandom.c @@ -0,0 +1,40 @@ +// +// Copyright 2020 Staysail Systems, Inc. +// +// This software is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +// getrandom is not as nice as arc4random, but on platforms where it +// exists and arc4random does not, we should use it. +// +// getrandom will block only if the urandom device is not seeded yet. +// That can only happen during very early boot (earlier than we should +// normally be running. This is the only time it can fail with correct +// arguments, and then only if it is interrupted with a signal. + +#include + +#include "core/nng_impl.h" + +#ifdef NNG_HAVE_GETRANDOM + +uint32_t +nni_random(void) +{ + uint32_t val; + + // Documentation claims that as long as we are not using + // GRND_RANDOM and buflen < 256, this should never fail. + // The exception here is that we could fail if for some + // reason we got a signal while blocked at very early boot + // (i.e. /dev/urandom was not yet seeded). + if (getrandom(&val, sizeof(val), 0) != sizeof(val)) { + nni_panic("getrandom failed"); + } + return (val); +} + +#endif \ No newline at end of file -- cgit v1.2.3-70-g09d2