wasmtime_wasi/p2/host/
random.rs1use 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}