// Copyright 2018 Developers of the Rand project. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Implementation for iOS use crate::{error::SEC_RANDOM_FAILED, Error}; // TODO: Make extern once extern_types feature is stabilized. See: // https://github.com/rust-lang/rust/issues/43467 #[repr(C)] struct SecRandom([u8; 0]); #[link(name = "Security", kind = "framework")] extern "C" { static kSecRandomDefault: *const SecRandom; fn SecRandomCopyBytes(rnd: *const SecRandom, count: usize, bytes: *mut u8) -> i32; } pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { let ret = unsafe { SecRandomCopyBytes(kSecRandomDefault, dest.len(), dest.as_mut_ptr()) }; if ret == -1 { Err(SEC_RANDOM_FAILED) } else { Ok(()) } }