11use crate :: memory:: RUNTIME_STATE ;
2- use getrandom:: register_custom_getrandom;
32use getrandom:: Error ;
43use ic_cdk:: spawn;
54use ic_cdk_timers:: set_timer;
65use junobuild_shared:: random:: get_random_seed;
76use rand:: { Rng , RngCore } ;
8- use std:: num:: NonZeroU32 ;
97use std:: time:: Duration ;
108
119pub fn defer_init_random_seed ( ) {
1210 set_timer ( Duration :: ZERO , || spawn ( set_random_seed ( ) ) ) ;
13- register_custom_getrandom ! ( custom_getrandom) ;
1411}
1512
1613async fn set_random_seed ( ) {
@@ -21,13 +18,22 @@ async fn set_random_seed() {
2118 } ) ;
2219}
2320
24- fn custom_getrandom ( buf : & mut [ u8 ] ) -> Result < ( ) , Error > {
21+ /// Source: https://github.com/rust-random/getrandom?tab=readme-ov-file#custom-backend
22+ #[ no_mangle]
23+ unsafe extern "Rust" fn __getrandom_v03_custom ( dest : * mut u8 , len : usize , ) -> Result < ( ) , Error > {
2524 RUNTIME_STATE . with ( |state| {
2625 let rng = & mut state. borrow_mut ( ) . rng ;
2726
2827 match rng {
29- None => Err ( Error :: from ( NonZeroU32 :: new ( Error :: CUSTOM_START ) . unwrap ( ) ) ) ,
28+ None => Err ( Error :: new_custom ( 0 ) ) ,
3029 Some ( rng) => {
30+ let buf: & mut [ u8 ] = unsafe {
31+ // fill the buffer with zeros
32+ core:: ptr:: write_bytes ( dest, 0 , len) ;
33+ // create mutable byte slice
34+ core:: slice:: from_raw_parts_mut ( dest, len)
35+ } ;
36+
3137 rng. fill_bytes ( buf) ;
3238 Ok ( ( ) )
3339 }
@@ -41,7 +47,7 @@ pub fn random() -> Result<i32, String> {
4147
4248 match rng {
4349 None => Err ( "The random number generator has not been initialized." . to_string ( ) ) ,
44- Some ( rng) => Ok ( rng. gen ( ) ) ,
50+ Some ( rng) => Ok ( rng. random ( ) ) ,
4551 }
4652 } )
4753}
0 commit comments