about summary refs log tree commit diff
path: root/library/std/src/sys/random/arc4random.rs
diff options
context:
space:
mode:
authorjoboet <jonasboettiger@icloud.com>2024-08-17 16:54:01 +0200
committerjoboet <jonasboettiger@icloud.com>2024-09-23 10:36:16 +0200
commitb9d47cfa9b8f0805bfab2c254a02e598a906f102 (patch)
treee4c681065c6a064adba9ba0d784db8b59a8ad182 /library/std/src/sys/random/arc4random.rs
parent5c1c72572479afe98734d5f78fa862abe662c41a (diff)
downloadrust-b9d47cfa9b8f0805bfab2c254a02e598a906f102.tar.gz
rust-b9d47cfa9b8f0805bfab2c254a02e598a906f102.zip
std: switch to faster random sources on macOS and most BSDs
Diffstat (limited to 'library/std/src/sys/random/arc4random.rs')
-rw-r--r--library/std/src/sys/random/arc4random.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/library/std/src/sys/random/arc4random.rs b/library/std/src/sys/random/arc4random.rs
new file mode 100644
index 00000000000..32467e9ebaa
--- /dev/null
+++ b/library/std/src/sys/random/arc4random.rs
@@ -0,0 +1,34 @@
+//! Random data generation with `arc4random_buf`.
+//!
+//! Contrary to its name, `arc4random` doesn't actually use the horribly-broken
+//! RC4 cypher anymore, at least not on modern systems, but rather something
+//! like ChaCha20 with continual reseeding from the OS. That makes it an ideal
+//! source of large quantities of cryptographically secure data, which is exactly
+//! what we need for `DefaultRandomSource`. Unfortunately, it's not available
+//! on all UNIX systems, most notably Linux (until recently, but it's just a
+//! wrapper for `getrandom`. Since we need to hook into `getrandom` directly
+//! for `HashMap` keys anyway, we just keep our version).
+
+#[cfg(not(any(
+    target_os = "haiku",
+    target_os = "illumos",
+    target_os = "solaris",
+    target_os = "vita",
+)))]
+use libc::arc4random_buf;
+
+// FIXME: move these to libc (except Haiku, that one needs to link to libbsd.so).
+#[cfg(any(
+    target_os = "haiku", // See https://git.haiku-os.org/haiku/tree/headers/compatibility/bsd/stdlib.h
+    target_os = "illumos", // See https://www.illumos.org/man/3C/arc4random
+    target_os = "solaris", // See https://docs.oracle.com/cd/E88353_01/html/E37843/arc4random-3c.html
+    target_os = "vita", // See https://github.com/vitasdk/newlib/blob/b89e5bc183b516945f9ee07eef483ecb916e45ff/newlib/libc/include/stdlib.h#L74
+))]
+#[cfg_attr(target_os = "haiku", link(name = "bsd"))]
+extern "C" {
+    fn arc4random_buf(buf: *mut core::ffi::c_void, nbytes: libc::size_t);
+}
+
+pub fn fill_bytes(bytes: &mut [u8]) {
+    unsafe { arc4random_buf(bytes.as_mut_ptr().cast(), bytes.len()) }
+}