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