summaryrefslogtreecommitdiff
path: root/util/nvmutil/include/common.h
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-19 18:34:28 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-19 18:34:28 +0000
commitf8b07dba2932714507f7ead6b8464ba3157d84bd (patch)
tree3e16546c3827d7a18f5b14ec28217161eb0f01f2 /util/nvmutil/include/common.h
parent7c66a788bdfc8136a603eec6d805b75cc382b239 (diff)
util/nvmutil: rand: use getrandom on newer linux
we still fall back to the old /dev/urandom read on older linux, via runtime detection (ENOSYS). getrandom is better, because it guarantees entropy via blocking, and works even when /dev/urandom is unavailable. it has the same practical benefit as arc4random, which i use on bsd. linux can have arc4random, but not every linux libc has it, so it's better to use getrandom on linux. older linux will fall back to /dev/urandom Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util/nvmutil/include/common.h')
-rw-r--r--util/nvmutil/include/common.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/util/nvmutil/include/common.h b/util/nvmutil/include/common.h
index 36218d25..0a3beeac 100644
--- a/util/nvmutil/include/common.h
+++ b/util/nvmutil/include/common.h
@@ -9,6 +9,25 @@
#include <sys/stat.h>
#include <limits.h>
+/* for linux getrandom
+ */
+#if defined(__linux__)
+#include <errno.h>
+#if defined(__has_include)
+#if __has_include(<sys/random.h>)
+#include <sys/random.h>
+#define HAVE_GETRANDOM 1
+#endif
+#endif
+#if !defined(HAVE_GETRANDOM)
+#include <sys/syscall.h>
+#if defined(SYS_getrandom)
+#define HAVE_GETRANDOM_SYSCALL 1
+#endif
+#endif
+
+#endif
+
#define items(x) (sizeof((x)) / sizeof((x)[0]))
/* system prototypes
@@ -318,6 +337,12 @@ void set_mac_nib(unsigned long mac_str_pos,
unsigned long mac_byte_pos, unsigned long mac_nib_pos);
unsigned short hextonum(char ch_s);
unsigned long rlong(void);
+#if defined(__linux__)
+#if defined(HAVE_GETRANDOM) || \
+ defined(HAVE_GETRANDOM_SYSCALL)
+int fallback_rand_getrandom(void *buf, size_t len);
+#endif
+#endif
void write_mac_part(unsigned long partnum);
/* Helper functions for command: dump