summaryrefslogtreecommitdiffstats
path: root/vendor/security-framework/src/random.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/security-framework/src/random.rs')
-rw-r--r--vendor/security-framework/src/random.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/vendor/security-framework/src/random.rs b/vendor/security-framework/src/random.rs
new file mode 100644
index 000000000..7bd7f6141
--- /dev/null
+++ b/vendor/security-framework/src/random.rs
@@ -0,0 +1,39 @@
+//! Randomness support.
+
+use security_framework_sys::random::{SecRandomCopyBytes, SecRandomRef, kSecRandomDefault};
+use std::io;
+
+/// A source of random data.
+pub struct SecRandom(SecRandomRef);
+
+unsafe impl Sync for SecRandom {}
+unsafe impl Send for SecRandom {}
+
+impl Default for SecRandom {
+ #[inline(always)]
+ fn default() -> Self {
+ unsafe { Self(kSecRandomDefault) }
+ }
+}
+
+impl SecRandom {
+ /// Fills the buffer with cryptographically secure random bytes.
+ pub fn copy_bytes(&self, buf: &mut [u8]) -> io::Result<()> {
+ if unsafe { SecRandomCopyBytes(self.0, buf.len(), buf.as_mut_ptr().cast()) } == 0 {
+ Ok(())
+ } else {
+ Err(io::Error::last_os_error())
+ }
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn basic() {
+ let mut buf = [0; 10];
+ SecRandom::default().copy_bytes(&mut buf).unwrap();
+ }
+}