Skip to main content

wasmtime_wasi/p2/host/
random.rs

1use 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}