From 14a954f3507d97e1a6e6c995f3e4d3db76c64b3d Mon Sep 17 00:00:00 2001 From: nia Date: Fri, 1 May 2020 17:22:27 +0100 Subject: [PATCH 1/2] Add arc4random_buf() in NetBSD libc, use it to implement getrandom() --- lib/std/c/netbsd.zig | 1 + lib/std/os.zig | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index f3c34b5cad2a110edf9bdb756696d426c230f737..20960b3f779991d2329a1baa1c2d5a4e425f6abf 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -9,6 +9,7 @@ pub const _errno = __errno; pub const dl_iterate_phdr_callback = extern fn (info: *dl_phdr_info, size: usize, data: ?*c_void) c_int; pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int; +pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void; pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int; pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int; pub extern "c" fn __clock_gettime50(clk_id: c_int, tp: *timespec) c_int; diff --git a/lib/std/os.zig b/lib/std/os.zig index 06a4c12dfc21bce8e66f123900011dad1a3523d3..9502e8d9dfb095b379dd6c5aeebf8f99e6bdf8d6 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -153,6 +153,10 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { } return; } + if (builtin.os.tag == .netbsd) { + netbsd.arc4random_buf(buffer.ptr, buffer.len); + return; + } if (builtin.os.tag == .wasi) { switch (wasi.random_get(buffer.ptr, buffer.len)) { 0 => return, -- 2.54.0 From 74ad31536051e68b4b9edf924662b34c30b09da7 Mon Sep 17 00:00:00 2001 From: nia Date: Fri, 1 May 2020 17:23:27 +0100 Subject: [PATCH 2/2] In init_rand avoid reading from /dev/urandom on NetBSD/FreeBSD Use the KERN_ARND sysctl instead. --- src/os.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/os.cpp b/src/os.cpp index 16d6847d4e5011a767c688e93d1adad46147d819..26ed0dc4e171aba4878ff199b13193eb6970e5b7 100644 --- a/src/os.cpp +++ b/src/os.cpp @@ -1462,6 +1462,14 @@ static void init_rand() { unsigned seed; memcpy(&seed, ptr_random, sizeof(seed)); srand(seed); +#elif defined(ZIG_OS_FREEBSD) || defined(ZIG_OS_NETBSD) + unsigned seed; + size_t len = sizeof(seed); + int mib[2] = { CTL_KERN, KERN_ARND }; + if (sysctl(mib, 2, &seed, &len, NULL, 0) != 0) { + zig_panic("unable to query random data from sysctl"); + } + srand(seed); #else int fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); if (fd == -1) { -- 2.54.0