summaryrefslogtreecommitdiffstats
path: root/third_party/rust/getrandom/src/solaris_illumos.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/getrandom/src/solaris_illumos.rs
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/getrandom/src/solaris_illumos.rs')
-rw-r--r--third_party/rust/getrandom/src/solaris_illumos.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/third_party/rust/getrandom/src/solaris_illumos.rs b/third_party/rust/getrandom/src/solaris_illumos.rs
new file mode 100644
index 0000000000..947312302c
--- /dev/null
+++ b/third_party/rust/getrandom/src/solaris_illumos.rs
@@ -0,0 +1,44 @@
+// Copyright 2018 Developers of the Rand project.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Implementation for the Solaris family
+//!
+//! Read from `/dev/random`, with chunks of limited size (256 bytes).
+//! `/dev/random` uses the Hash_DRBG with SHA512 algorithm from NIST SP 800-90A.
+//! `/dev/urandom` uses the FIPS 186-2 algorithm, which is considered less
+//! secure. We choose to read from `/dev/random`.
+//!
+//! Since Solaris 11.3 and mid-2015 illumos, the `getrandom` syscall is available.
+//! To make sure we can compile on both Solaris and its derivatives, as well as
+//! function, we check for the existence of getrandom(2) in libc by calling
+//! libc::dlsym.
+use crate::util_libc::{sys_fill_exact, Weak};
+use crate::{use_file, Error};
+use core::mem;
+
+#[cfg(target_os = "illumos")]
+type GetRandomFn = unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::ssize_t;
+#[cfg(target_os = "solaris")]
+type GetRandomFn = unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::c_int;
+
+pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> {
+ static GETRANDOM: Weak = unsafe { Weak::new("getrandom\0") };
+ if let Some(fptr) = GETRANDOM.ptr() {
+ let func: GetRandomFn = unsafe { mem::transmute(fptr) };
+ // 256 bytes is the lowest common denominator across all the Solaris
+ // derived platforms for atomically obtaining random data.
+ for chunk in dest.chunks_mut(256) {
+ sys_fill_exact(chunk, |buf| unsafe {
+ func(buf.as_mut_ptr(), buf.len(), 0) as libc::ssize_t
+ })?
+ }
+ Ok(())
+ } else {
+ use_file::getrandom_inner(dest)
+ }
+}