diff options
author | nia <nia@NetBSD.org> | 2019-10-21 20:33:48 +0100 |
---|---|---|
committer | Saúl Ibarra Corretgé <s@saghul.net> | 2019-10-29 13:36:05 +0100 |
commit | a62f8ced7af51d1c4fd8abceb521bd24f362ab14 (patch) | |
tree | 1a310442703c2f05a79dbb6c2094386d4f2adfae /src | |
parent | 2dcf2e8188f433fb668ffc586ffd485d0ff91059 (diff) | |
download | libuv-a62f8ced7af51d1c4fd8abceb521bd24f362ab14.tar.gz libuv-a62f8ced7af51d1c4fd8abceb521bd24f362ab14.zip |
netbsd: use KERN_ARND sysctl to get entropy
PR-URL: https://github.com/libuv/libuv/pull/2528
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Saúl Ibarra Corretgé <s@saghul.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/random.c | 2 | ||||
-rw-r--r-- | src/unix/netbsd.c | 23 | ||||
-rw-r--r-- | src/unix/random-devurandom.c | 8 | ||||
-rw-r--r-- | src/unix/random-sysctl-linux.c | 1 |
4 files changed, 29 insertions, 5 deletions
diff --git a/src/random.c b/src/random.c index 8c4fe320..491bf703 100644 --- a/src/random.c +++ b/src/random.c @@ -40,6 +40,8 @@ static int uv__random(void* buf, size_t buflen) { rc = uv__random_getentropy(buf, buflen); if (rc == UV_ENOSYS) rc = uv__random_devurandom(buf, buflen); +#elif defined(__NetBSD__) + rc = uv__random_sysctl(buf, buflen); #elif defined(__FreeBSD__) || defined(__linux__) rc = uv__random_getrandom(buf, buflen); if (rc == UV_ENOSYS) diff --git a/src/unix/netbsd.c b/src/unix/netbsd.c index cfe2c6a4..690bd79e 100644 --- a/src/unix/netbsd.c +++ b/src/unix/netbsd.c @@ -234,3 +234,26 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { uv__free(cp_times); return 0; } + +int uv__random_sysctl(void* buf, size_t len) { + static int name[] = {CTL_KERN, KERN_ARND}; + size_t count, req; + unsigned char* p; + + p = buf; + while (len) { + req = len < 32 ? len : 32; + count = req; + + if (sysctl(name, ARRAY_SIZE(name), p, &count, NULL, 0) == -1) + return UV__ERR(errno); + + if (count != req) + return UV_EIO; /* Can't happen. */ + + p += count; + len -= count; + } + + return 0; +} diff --git a/src/unix/random-devurandom.c b/src/unix/random-devurandom.c index bfc40d20..9aa762e3 100644 --- a/src/unix/random-devurandom.c +++ b/src/unix/random-devurandom.c @@ -74,10 +74,10 @@ int uv__random_readpath(const char* path, void* buf, size_t buflen) { static void uv__random_devurandom_init(void) { char c; - /* Linux's and NetBSD's random(4) man page suggests applications should read - * at least once from /dev/random before switching to /dev/urandom in order - * to seed the system RNG. Reads from /dev/random can of course block - * indefinitely until entropy is available but that's the point. + /* Linux's random(4) man page suggests applications should read at least + * once from /dev/random before switching to /dev/urandom in order to seed + * the system RNG. Reads from /dev/random can of course block indefinitely + * until entropy is available but that's the point. */ status = uv__random_readpath("/dev/random", &c, 1); } diff --git a/src/unix/random-sysctl-linux.c b/src/unix/random-sysctl-linux.c index fb182ded..66ba8d74 100644 --- a/src/unix/random-sysctl-linux.c +++ b/src/unix/random-sysctl-linux.c @@ -40,7 +40,6 @@ struct uv__sysctl_args { }; -/* TODO(bnoordhuis) Use {CTL_KERN, KERN_ARND} on FreeBSD (and NetBSD?) */ int uv__random_sysctl(void* buf, size_t buflen) { static int name[] = {1 /*CTL_KERN*/, 40 /*KERN_RANDOM*/, 6 /*RANDOM_UUID*/}; struct uv__sysctl_args args; |