1 use crate::p3::bindings::random::{insecure, insecure_seed, random}; 2 use crate::random::WasiRandomCtx; 3 use cap_rand::Rng; 4 use cap_rand::distributions::Standard; 5 6 impl random::Host for WasiRandomCtx { get_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>>7 fn get_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>> { 8 Ok((&mut self.random) 9 .sample_iter(Standard) 10 .take(len.min(self.max_size) as usize) 11 .collect()) 12 } 13 get_random_u64(&mut self) -> wasmtime::Result<u64>14 fn get_random_u64(&mut self) -> wasmtime::Result<u64> { 15 Ok(self.random.sample(Standard)) 16 } 17 } 18 19 impl insecure::Host for WasiRandomCtx { get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>>20 fn get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>> { 21 Ok((&mut self.insecure_random) 22 .sample_iter(Standard) 23 .take(len.min(self.max_size) as usize) 24 .collect()) 25 } 26 get_insecure_random_u64(&mut self) -> wasmtime::Result<u64>27 fn get_insecure_random_u64(&mut self) -> wasmtime::Result<u64> { 28 Ok(self.insecure_random.sample(Standard)) 29 } 30 } 31 32 impl insecure_seed::Host for WasiRandomCtx { get_insecure_seed(&mut self) -> wasmtime::Result<(u64, u64)>33 fn get_insecure_seed(&mut self) -> wasmtime::Result<(u64, u64)> { 34 let seed: u128 = self.insecure_random_seed; 35 Ok((seed as u64, (seed >> 64) as u64)) 36 } 37 } 38