|
@@ -0,0 +1,67 @@
|
|
|
+#![allow(unsafe_code)]
|
|
|
+#![allow(unused)]
|
|
|
+
|
|
|
+#[cfg(not(any(test, feature = "std", feature = "rand-custom-impl")))]
|
|
|
+compile_error!("None of the Cargo features `std` or `rand-custom-impl` is enabled. smoltcp needs a `rand` implementation to work. If your target supports `std`, enable the `std` feature to use the OS's RNG. Otherwise, you must enable the `rand-custom-impl` Cargo feature, and supply your own custom implementation using the `smoltcp::rand_custom_impl!()` macro");
|
|
|
+
|
|
|
+pub fn rand_u32() -> u32 {
|
|
|
+ let mut val = [0; 4];
|
|
|
+ rand_bytes(&mut val);
|
|
|
+ u32::from_ne_bytes(val)
|
|
|
+}
|
|
|
+
|
|
|
+/// Fill `buf` with random bytes.
|
|
|
+pub fn rand_bytes(buf: &mut [u8]) {
|
|
|
+ extern "Rust" {
|
|
|
+ fn _smoltcp_rand(buf: &mut [u8]);
|
|
|
+ }
|
|
|
+
|
|
|
+ unsafe { _smoltcp_rand(buf) }
|
|
|
+}
|
|
|
+
|
|
|
+/// Methods required for a custom rand implementation.
|
|
|
+///
|
|
|
+/// This trait is not intended to be used directly, just to supply a custom rand implementation to smoltcp.
|
|
|
+#[cfg(feature = "rand-custom-impl")]
|
|
|
+pub trait Rand {
|
|
|
+ /// Fill `buf` with random bytes.
|
|
|
+ fn rand_bytes(buf: &mut [u8]);
|
|
|
+}
|
|
|
+
|
|
|
+/// Set the custom rand implementation.
|
|
|
+///
|
|
|
+/// # Example
|
|
|
+///
|
|
|
+/// ```
|
|
|
+/// struct Rand;
|
|
|
+/// smoltcp::rand_custom_impl!(Rand);
|
|
|
+/// impl smoltcp::Rand for Rand {
|
|
|
+/// fn rand_bytes(buf: &mut [u8]) {
|
|
|
+/// // TODO
|
|
|
+/// }
|
|
|
+/// }
|
|
|
+///
|
|
|
+#[macro_export]
|
|
|
+#[cfg(feature = "rand-custom-impl")]
|
|
|
+macro_rules! rand_custom_impl {
|
|
|
+ ($t: ty) => {
|
|
|
+ #[no_mangle]
|
|
|
+ fn _smoltcp_rand(buf: &mut [u8]) {
|
|
|
+ <$t as $crate::Rand>::rand_bytes(buf)
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(all(feature = "std", not(feature = "rand-custom-impl"), not(test)))]
|
|
|
+#[no_mangle]
|
|
|
+fn _smoltcp_rand(buf: &mut [u8]) {
|
|
|
+ use rand_core::RngCore;
|
|
|
+
|
|
|
+ rand_core::OsRng.fill_bytes(buf)
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(test)]
|
|
|
+#[no_mangle]
|
|
|
+fn _smoltcp_rand(buf: &mut [u8]) {
|
|
|
+ panic!("Rand should not be used when testing");
|
|
|
+}
|