wasmtime_wasi/p2/host/
random.rs1use crate::p2::bindings::random::{insecure, insecure_seed, random};
2use crate::random::WasiRandomCtx;
3use cap_rand::{Rng, distributions::Standard};
4use wasmtime::bail;
5
6impl random::Host for WasiRandomCtx {
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
17 fn get_random_u64(&mut self) -> wasmtime::Result<u64> {
18 Ok(self.random.sample(Standard))
19 }
20}
21
22impl insecure::Host for WasiRandomCtx {
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
33 fn get_insecure_random_u64(&mut self) -> wasmtime::Result<u64> {
34 Ok(self.insecure_random.sample(Standard))
35 }
36}
37
38impl insecure_seed::Host for WasiRandomCtx {
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}