1 use crate::p2::bindings::random::{insecure, insecure_seed, random}; 2 use crate::random::WasiRandomCtx; 3 use cap_rand::{Rng, distributions::Standard}; 4 use wasmtime::bail; 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 if len > self.max_size { 9 bail!("requested len {len:?} exceeds limit {}", self.max_size); 10 } 11 Ok((&mut self.random) 12 .sample_iter(Standard) 13 .take(len as usize) 14 .collect()) 15 } 16 get_random_u64(&mut self) -> wasmtime::Result<u64>17 fn get_random_u64(&mut self) -> wasmtime::Result<u64> { 18 Ok(self.random.sample(Standard)) 19 } 20 } 21 22 impl insecure::Host for WasiRandomCtx { get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>>23 fn get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>> { 24 if len > self.max_size { 25 bail!("requested len {len:?} exceeds limit {}", self.max_size); 26 } 27 Ok((&mut self.insecure_random) 28 .sample_iter(Standard) 29 .take(len as usize) 30 .collect()) 31 } 32 get_insecure_random_u64(&mut self) -> wasmtime::Result<u64>33 fn get_insecure_random_u64(&mut self) -> wasmtime::Result<u64> { 34 Ok(self.insecure_random.sample(Standard)) 35 } 36 } 37 38 impl insecure_seed::Host for WasiRandomCtx { insecure_seed(&mut self) -> wasmtime::Result<(u64, u64)>39 fn insecure_seed(&mut self) -> wasmtime::Result<(u64, u64)> { 40 let seed: u128 = self.insecure_random_seed; 41 Ok((seed as u64, (seed >> 64) as u64)) 42 } 43 } 44