From e56a806dbba5dc2495c85cf700e79aa9cd909393 Mon Sep 17 00:00:00 2001 From: jason-nitro Date: Wed, 30 Jul 2025 20:07:19 -0500 Subject: [PATCH 1/2] Added v0.3.3 backend for zkvm --- src/backends.rs | 8 +++++++- src/backends/zkvm.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/backends/zkvm.rs diff --git a/src/backends.rs b/src/backends.rs index d7b73cec0..fc6a65427 100644 --- a/src/backends.rs +++ b/src/backends.rs @@ -7,8 +7,14 @@ //! The function MUST NOT ever write uninitialized bytes into `dest`, //! regardless of what value it returns. +mod zkvm; + cfg_if! { - if #[cfg(getrandom_backend = "custom")] { + if #[cfg(target_arch = "riscv32")] { + // Auto-detect SP1 zkVM target + pub use zkvm::*; + } + else if #[cfg(getrandom_backend = "custom")] { mod custom; pub use custom::*; } else if #[cfg(getrandom_backend = "linux_getrandom")] { diff --git a/src/backends/zkvm.rs b/src/backends/zkvm.rs new file mode 100644 index 000000000..e2219670a --- /dev/null +++ b/src/backends/zkvm.rs @@ -0,0 +1,49 @@ +// Copyright 2018 Developers of the Rand project. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! zkVM implementation using custom backend +use crate::Error; +use core::mem::MaybeUninit; + +// Main function for getrandom 0.3.3 API - note the MaybeUninit +pub fn fill_inner(dest: &mut [MaybeUninit]) -> Result<(), Error> { + unsafe { + __getrandom_v03_custom(dest.as_mut_ptr() as *mut u8, dest.len()) + } +} + +pub fn inner_u32() -> Result { + let mut buf = [MaybeUninit::::uninit(); 4]; + fill_inner(&mut buf)?; + // Safe because fill_inner initialized the bytes + let buf: [u8; 4] = unsafe { core::mem::transmute(buf) }; + Ok(u32::from_ne_bytes(buf)) +} + +pub fn inner_u64() -> Result { + let mut buf = [MaybeUninit::::uninit(); 8]; + fill_inner(&mut buf)?; + // Safe because fill_inner initialized the bytes + let buf: [u8; 8] = unsafe { core::mem::transmute(buf) }; + Ok(u64::from_ne_bytes(buf)) +} + +// Custom backend function - to be overridden by user implementations +#[no_mangle] +pub unsafe extern "Rust" fn __getrandom_v03_custom( + dest: *mut u8, + len: usize, +) -> Result<(), Error> { + // Should be overridden by the correct sp1 implementation. Previous version was: + // unsafe { sp1_zkvm::syscalls::sys_rand(s.as_mut_ptr(), s.len()) }; + + for i in 0..len { + *dest.add(i) = (i as u8).wrapping_mul(17).wrapping_add(42); + } + Ok(()) +} From 291d8218807fdf6dc71928c72925558a8bcc646a Mon Sep 17 00:00:00 2001 From: jason-nitro Date: Thu, 7 Aug 2025 13:51:32 -0500 Subject: [PATCH 2/2] Removed redundant getrandom core code, already in SP1 --- src/backends/zkvm.rs | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/backends/zkvm.rs b/src/backends/zkvm.rs index e2219670a..538cf7473 100644 --- a/src/backends/zkvm.rs +++ b/src/backends/zkvm.rs @@ -11,12 +11,18 @@ use crate::Error; use core::mem::MaybeUninit; // Main function for getrandom 0.3.3 API - note the MaybeUninit +#[allow(dead_code)] pub fn fill_inner(dest: &mut [MaybeUninit]) -> Result<(), Error> { + extern "Rust" { // Call SP1's version + fn __getrandom_v03_custom(dest: *mut u8, len: usize) -> Result<(), Error>; + } + unsafe { __getrandom_v03_custom(dest.as_mut_ptr() as *mut u8, dest.len()) } } +#[allow(dead_code)] pub fn inner_u32() -> Result { let mut buf = [MaybeUninit::::uninit(); 4]; fill_inner(&mut buf)?; @@ -25,6 +31,7 @@ pub fn inner_u32() -> Result { Ok(u32::from_ne_bytes(buf)) } +#[allow(dead_code)] pub fn inner_u64() -> Result { let mut buf = [MaybeUninit::::uninit(); 8]; fill_inner(&mut buf)?; @@ -32,18 +39,3 @@ pub fn inner_u64() -> Result { let buf: [u8; 8] = unsafe { core::mem::transmute(buf) }; Ok(u64::from_ne_bytes(buf)) } - -// Custom backend function - to be overridden by user implementations -#[no_mangle] -pub unsafe extern "Rust" fn __getrandom_v03_custom( - dest: *mut u8, - len: usize, -) -> Result<(), Error> { - // Should be overridden by the correct sp1 implementation. Previous version was: - // unsafe { sp1_zkvm::syscalls::sys_rand(s.as_mut_ptr(), s.len()) }; - - for i in 0..len { - *dest.add(i) = (i as u8).wrapping_mul(17).wrapping_add(42); - } - Ok(()) -}