wasmtime_wasi/p3/random/
host.rs

1use cap_rand::Rng;
2use cap_rand::distributions::Standard;
3
4use crate::p3::bindings::random::{insecure, insecure_seed, random};
5use crate::random::WasiRandomCtx;
6
7impl random::Host for WasiRandomCtx {
8    fn get_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>> {
9        Ok((&mut self.random)
10            .sample_iter(Standard)
11            .take(len as usize)
12            .collect())
13    }
14
15    fn get_random_u64(&mut self) -> wasmtime::Result<u64> {
16        Ok(self.random.sample(Standard))
17    }
18}
19
20impl insecure::Host for WasiRandomCtx {
21    fn get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result<Vec<u8>> {
22        Ok((&mut self.insecure_random)
23            .sample_iter(Standard)
24            .take(len as usize)
25            .collect())
26    }
27
28    fn get_insecure_random_u64(&mut self) -> wasmtime::Result<u64> {
29        Ok(self.insecure_random.sample(Standard))
30    }
31}
32
33impl insecure_seed::Host for WasiRandomCtx {
34    fn get_insecure_seed(&mut self) -> wasmtime::Result<(u64, u64)> {
35        let seed: u128 = self.insecure_random_seed;
36        Ok((seed as u64, (seed >> 64) as u64))
37    }
38}