// Copyright 2019 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. //! Type-safe bindings for the Zircon kernel's CPRNG. #![no_std] #![deny(warnings)] /// Draw random bytes from the kernel's CPRNG to fill the given buffer. /// /// Wraps the /// [zx_cprng_draw](https://fuchsia.googlesource.com/fuchsia/+/master/zircon/docs/syscalls/cprng_draw.md) /// syscall. pub fn cprng_draw(buffer: &mut [u8]) { unsafe { zx_cprng_draw(buffer.as_mut_ptr(), buffer.len()) }; } #[link(name = "zircon")] extern "C" { fn zx_cprng_draw(buffer: *mut u8, length: usize); } #[cfg(test)] mod tests { use super::*; #[test] fn cprng() { let mut buffer = [0; 20]; cprng_draw(&mut buffer); let mut first_zero = 0; let mut last_zero = 0; for _ in 0..30 { let mut buffer = [0; 20]; cprng_draw(&mut buffer); if buffer[0] == 0 { first_zero += 1; } if buffer[19] == 0 { last_zero += 1; } } assert_ne!(first_zero, 30); assert_ne!(last_zero, 30); } #[test] fn cprng_large() { let mut buffer = [0; 1024]; cprng_draw(&mut buffer); for mut s in buffer.chunks_mut(256) { cprng_draw(&mut s); } } }