|
1 | | -//! Implementation for WASI |
| 1 | +//! Implementation for WASI (preview 1 and 2) |
| 2 | +//! |
| 3 | +//! `target_env = "p1"` was introduced only in Rust 1.80, so on earlier compiler versions this |
| 4 | +//! code will result in a compilation error. |
2 | 5 | use crate::Error; |
3 | 6 | use core::mem::MaybeUninit; |
4 | | -use wasi::random_get; |
5 | 7 |
|
| 8 | +#[cfg(not(any(target_env = "p1", target_env = "p2")))] |
| 9 | +compile_error!( |
| 10 | + "Unknown version of WASI (only previews 1 and 2 are supported) \ |
| 11 | + or Rust version older than 1.80 was used" |
| 12 | +); |
| 13 | + |
| 14 | +#[cfg(target_env = "p1")] |
6 | 15 | pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> { |
7 | | - unsafe { random_get(dest.as_mut_ptr().cast::<u8>(), dest.len()) } |
| 16 | + unsafe { wasi::random_get(dest.as_mut_ptr().cast::<u8>(), dest.len()) } |
8 | 17 | .map_err(|e| Error::from_os_error(e.raw().into())) |
9 | 18 | } |
| 19 | + |
| 20 | +#[cfg(target_env = "p2")] |
| 21 | +pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> { |
| 22 | + use wasi::random::random::get_random_u64; |
| 23 | + |
| 24 | + let mut chunks = dest.chunks_exact_mut(size_of::<u64>()); |
| 25 | + for chunk in &mut chunks { |
| 26 | + let dst: *mut u64 = chunk.as_mut_ptr().cast(); |
| 27 | + let val = get_random_u64(); |
| 28 | + unsafe { |
| 29 | + core::ptr::write_unaligned(dst, val); |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + let rem = chunks.into_remainder(); |
| 34 | + let val = get_random_u64(); |
| 35 | + let src = &val as *const u64; |
| 36 | + unsafe { |
| 37 | + core::ptr::copy_nonoverlapping(src.cast(), rem.as_mut_ptr(), rem.len()); |
| 38 | + } |
| 39 | + |
| 40 | + Ok(()) |
| 41 | +} |
0 commit comments