security-rs 0.2.1

Safe Rust bindings for Apple's Security framework — keychain, identity, certificates, trust, authorization, CMS, SecureTransport, and cryptographic primitives on macOS
Documentation
use crate::bridge;
use crate::error::Result;

pub struct SecureRandom;

impl SecureRandom {
    pub fn fill(buffer: &mut [u8]) -> Result<()> {
        if buffer.is_empty() {
            return Ok(());
        }
        let mut error = std::ptr::null_mut();
        let status = unsafe {
            bridge::security_random_fill(
                buffer.as_mut_ptr().cast(),
                bridge::len_to_isize(buffer.len())?,
                &mut error,
            )
        };
        bridge::status_result("security_random_fill", status, error)
    }

    pub fn bytes(length: usize) -> Result<Vec<u8>> {
        let mut bytes = vec![0_u8; length];
        Self::fill(&mut bytes)?;
        Ok(bytes)
    }
}