Skip to main content

wasmtime_wasi/p3/random/
host.rs

1use crate::p3::bindings::random::{insecure, insecure_seed, random};
2use crate::random::WasiRandomCtx;
3use cap_rand::Rng;
4use cap_rand::distributions::Standard;
5
6impl random::Host for WasiRandomCtx {
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
14    fn get_random_u64(&mut self) -> wasmtime::Result<u64> {
15        Ok(self.random.sample(Standard))
16    }
17}
18
19impl insecure::Host for WasiRandomCtx {
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
27    fn get_insecure_random_u64(&mut self) -> wasmtime::Result<u64> {
28        Ok(self.insecure_random.sample(Standard))
29    }
30}
31
32impl insecure_seed::Host for WasiRandomCtx {
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}