diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/platform/posix/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/platform/posix/posix_rand_getentropy.c | 39 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/platform/posix/CMakeLists.txt b/src/platform/posix/CMakeLists.txt index 2212c8c8..6f3dfcaf 100644 --- a/src/platform/posix/CMakeLists.txt +++ b/src/platform/posix/CMakeLists.txt @@ -26,6 +26,7 @@ if (NNG_PLATFORM_POSIX) nng_check_func(lockf NNG_HAVE_LOCKF) nng_check_func(flock NNG_HAVE_FLOCK) + nng_check_func(getentropy NNG_HAVE_GETENTROPY) nng_check_func(getrandom NNG_HAVE_GETRANDOM) nng_check_func(arc4random_buf NNG_HAVE_ARC4RANDOM) @@ -69,6 +70,7 @@ if (NNG_PLATFORM_POSIX) nng_check_sym(socketpair sys/socket.h NNG_HAVE_SOCKETPAIR) nng_check_sym(AF_INET6 netinet/in.h NNG_HAVE_INET6) nng_check_sym(timespec_get time.h NNG_HAVE_TIMESPEC_GET) + nng_check_sym(getentropy sys/random.h NNG_HAVE_SYS_RANDOM) nng_sources( posix_impl.h @@ -111,6 +113,8 @@ if (NNG_PLATFORM_POSIX) if (NNG_HAVE_ARC4RANDOM) nng_sources(posix_rand_arc4random.c) + elseif (NNG_HAVE_GETENTROPY) + nng_sources(posix_rand_getentropy.c) elseif (NNG_HAVE_GETRANDOM) nng_sources(posix_rand_getrandom.c) else () diff --git a/src/platform/posix/posix_rand_getentropy.c b/src/platform/posix/posix_rand_getentropy.c new file mode 100644 index 00000000..6f7fbcd7 --- /dev/null +++ b/src/platform/posix/posix_rand_getentropy.c @@ -0,0 +1,39 @@ +// +// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech> +// +// 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 <stddef.h> +#include <stdint.h> +#include <unistd.h> +#ifdef NNG_HAVE_SYS_RANDOM +#include <sys/random.h> +#endif + +#include "core/panic.h" + +#ifdef NNG_HAVE_GETENTROPY + +uint32_t +nni_random(void) +{ + uint32_t val; + if (getentropy(&val, sizeof(val)) != 0) { + nni_panic("getentropy failed"); + } + return (val); +} + +#endif |
