Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 117 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ sha2 = "0.10.8"
hex = "0.4.3"
url = "2.5.4"
regex = "1.11.1"
getrandom = { version = "0.2", features = ["custom"] }
rand = { version = "0.8.5", features = ["getrandom"]}
getrandom = "0.3.1"
rand = { version = "0.9.0", features = ["os_rng"]}

[patch.crates-io]
junobuild-shared = { path = "./src/libs/shared" }
Expand Down
10 changes: 8 additions & 2 deletions docker/build
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ EOF

ONLY_DEPS=
CANISTER=

# Candid metadata supported_certificate_versions 1 and 2
WITH_CERTIFICATION=0
# Candid metadata juno:build
Expand Down Expand Up @@ -128,9 +129,14 @@ function build_canister() {

SRC_DIR="$SRC_ROOT_DIR/$canister"
TARGET="wasm32-unknown-unknown"
# standardize source references

# Standardize source references
CARGO_HOME="${CARGO_HOME:-"$HOME/.cargo"}"
RUSTFLAGS="--remap-path-prefix $CARGO_HOME=/cargo -C link-args=-zstack-size=3000000"

# Flags required by third party dependencies such as getrandom
FEATURES="--cfg getrandom_backend=\"custom\""

RUSTFLAGS="--remap-path-prefix $CARGO_HOME=/cargo -C link-args=-zstack-size=3000000 $FEATURES"

cargo_build_args=(
--manifest-path "$SRC_DIR/Cargo.toml"
Expand Down
6 changes: 5 additions & 1 deletion scripts/cargo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ while [[ $# -gt 0 ]]; do
done

TARGET="wasm32-unknown-unknown"
RUSTFLAGS="--remap-path-prefix $CARGO_HOME=/cargo -C link-args=-zstack-size=3000000"

# Flags required by third party dependencies such as getrandom
FEATURES="--cfg getrandom_backend=\"custom\""

RUSTFLAGS="--remap-path-prefix $CARGO_HOME=/cargo -C link-args=-zstack-size=3000000 $FEATURES"

# Build module WASM
RUSTFLAGS="$RUSTFLAGS" cargo build --target "$TARGET" -p "$MODULE" --release --locked
Expand Down
2 changes: 1 addition & 1 deletion src/libs/satellite/src/logs/loggers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ fn random() -> Result<i32, String> {

match rng {
None => Err("The random number generator has not been initialized.".to_string()),
Some(rng) => Ok(rng.gen()),
Some(rng) => Ok(rng.random()),
}
})
}
16 changes: 11 additions & 5 deletions src/libs/satellite/src/random.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
use crate::memory::STATE;
use getrandom::register_custom_getrandom;
use getrandom::Error;
use ic_cdk::spawn;
use ic_cdk_timers::set_timer;
use junobuild_shared::random::get_random_seed;
use rand::RngCore;
use std::num::NonZeroU32;
use std::time::Duration;

pub fn defer_init_random_seed() {
set_timer(Duration::ZERO, || spawn(set_random_seed()));
register_custom_getrandom!(custom_getrandom);
}

async fn set_random_seed() {
Expand All @@ -21,13 +18,22 @@ async fn set_random_seed() {
});
}

fn custom_getrandom(buf: &mut [u8]) -> Result<(), Error> {
/// Source: https://github.com/rust-random/getrandom?tab=readme-ov-file#custom-backend
#[no_mangle]
unsafe extern "Rust" fn __getrandom_v03_custom(dest: *mut u8, len: usize,) -> Result<(), Error> {
STATE.with(|state| {
let rng = &mut state.borrow_mut().runtime.rng;

match rng {
None => Err(Error::from(NonZeroU32::new(Error::CUSTOM_START).unwrap())),
None => Err(Error::new_custom(0)),
Some(rng) => {
let buf: &mut [u8] = unsafe {
// fill the buffer with zeros
core::ptr::write_bytes(dest, 0, len);
// create mutable byte slice
core::slice::from_raw_parts_mut(dest, len)
};

rng.fill_bytes(buf);
Ok(())
}
Expand Down
18 changes: 12 additions & 6 deletions src/mission_control/src/random.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
use crate::memory::RUNTIME_STATE;
use getrandom::register_custom_getrandom;
use getrandom::Error;
use ic_cdk::spawn;
use ic_cdk_timers::set_timer;
use junobuild_shared::random::get_random_seed;
use rand::{Rng, RngCore};
use std::num::NonZeroU32;
use std::time::Duration;

pub fn defer_init_random_seed() {
set_timer(Duration::ZERO, || spawn(set_random_seed()));
register_custom_getrandom!(custom_getrandom);
}

async fn set_random_seed() {
Expand All @@ -21,13 +18,22 @@ async fn set_random_seed() {
});
}

fn custom_getrandom(buf: &mut [u8]) -> Result<(), Error> {
/// Source: https://github.com/rust-random/getrandom?tab=readme-ov-file#custom-backend
#[no_mangle]
unsafe extern "Rust" fn __getrandom_v03_custom(dest: *mut u8, len: usize,) -> Result<(), Error> {
RUNTIME_STATE.with(|state| {
let rng = &mut state.borrow_mut().rng;

match rng {
None => Err(Error::from(NonZeroU32::new(Error::CUSTOM_START).unwrap())),
None => Err(Error::new_custom(0)),
Some(rng) => {
let buf: &mut [u8] = unsafe {
// fill the buffer with zeros
core::ptr::write_bytes(dest, 0, len);
// create mutable byte slice
core::slice::from_raw_parts_mut(dest, len)
};

rng.fill_bytes(buf);
Ok(())
}
Expand All @@ -41,7 +47,7 @@ pub fn random() -> Result<i32, String> {

match rng {
None => Err("The random number generator has not been initialized.".to_string()),
Some(rng) => Ok(rng.gen()),
Some(rng) => Ok(rng.random()),
}
})
}
Loading