Skip to main content

wasmtime_wasi/p2/host/
random.rs

1use crate::p2::bindings::random::{insecure, insecure_seed, random};
2use crate::random::WasiRandomCtx;
3use rand::RngExt;
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            .random_iter()
13            .take(len as usize)
14            .collect())
15    }
16
17    fn get_random_u64(&mut self) -> wasmtime::Result<u64> {
18        Ok(self.random.random())
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            .random_iter()
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.random())
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}
44
45mod named {
46    use crate::p2::bindings::named_imports::wasi::random::{insecure, insecure_seed, random};
47    use crate::random::WasiRandomNamedView;
48    use crate::{NamedId, WasiCtxNamedView};
49
50    impl<T> random::Host for WasiCtxNamedView<'_, T>
51    where
52        T: WasiRandomNamedView,
53    {
54        fn get_random_bytes(&mut self, id: NamedId, len: u64) -> wasmtime::Result<Vec<u8>> {
55            super::random::Host::get_random_bytes(self.0.random(id), len)
56        }
57
58        fn get_random_u64(&mut self, id: NamedId) -> wasmtime::Result<u64> {
59            super::random::Host::get_random_u64(self.0.random(id))
60        }
61    }
62
63    impl<T> insecure::Host for WasiCtxNamedView<'_, T>
64    where
65        T: WasiRandomNamedView,
66    {
67        fn get_insecure_random_bytes(
68            &mut self,
69            id: NamedId,
70            len: u64,
71        ) -> wasmtime::Result<Vec<u8>> {
72            super::insecure::Host::get_insecure_random_bytes(self.0.random(id), len)
73        }
74
75        fn get_insecure_random_u64(&mut self, id: NamedId) -> wasmtime::Result<u64> {
76            super::insecure::Host::get_insecure_random_u64(self.0.random(id))
77        }
78    }
79
80    impl<T> insecure_seed::Host for WasiCtxNamedView<'_, T>
81    where
82        T: WasiRandomNamedView,
83    {
84        fn insecure_seed(&mut self, id: NamedId) -> wasmtime::Result<(u64, u64)> {
85            super::insecure_seed::Host::insecure_seed(self.0.random(id))
86        }
87    }
88}