From 549068dfc760d3d3c81e8d5341ab18009a1e4846 Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Tue, 18 Feb 2020 22:42:51 -0800 Subject: [PATCH 1/5] custom: Allow no_std custom RNG handlers Signed-off-by: Joe Richey --- src/custom.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/custom.rs b/src/custom.rs index 11abf0c4..71a1533c 100644 --- a/src/custom.rs +++ b/src/custom.rs @@ -23,7 +23,7 @@ macro_rules! register_custom_getrandom { // We use an extern "C" function to get the guarantees of a stable ABI. #[no_mangle] extern "C" fn __getrandom_custom(dest: *mut u8, len: usize) -> u32 { - let slice = unsafe { ::std::slice::from_raw_parts_mut(dest, len) }; + let slice = unsafe { ::core::slice::from_raw_parts_mut(dest, len) }; match $path(slice) { Ok(()) => 0, Err(e) => e.code().get(), From 7aed17e4bc48a1c5ff34fe78164e58faa4126c7d Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Tue, 18 Feb 2020 22:43:42 -0800 Subject: [PATCH 2/5] target: Drop support for some x86_64 targets We will use a more generic "cpu" mechanism to support these. Signed-off-by: Joe Richey --- src/lib.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cb62223b..a19ed716 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,8 +25,7 @@ //! | Redox | [`rand:`][12] //! | CloudABI | [`cloudabi_sys_random_get`][13] //! | Haiku | `/dev/random` (identical to `/dev/urandom`) -//! | L4RE, SGX, UEFI | [RDRAND][18] -//! | Hermit | [RDRAND][18] as [`sys_rand`][22] is currently broken. +//! | SGX | [RDRAND][18] //! | VxWorks | `randABytes` after checking entropy pool initialization with `randSecure` //! | Web browsers | [`Crypto.getRandomValues`][14] (see [Support for WebAssembly and asm.js][16]) //! | Node.js | [`crypto.randomBytes`][15] (see [Support for WebAssembly and asm.js][16]) @@ -118,7 +117,6 @@ //! [19]: https://www.unix.com/man-page/mojave/2/getentropy/ //! [20]: https://www.unix.com/man-page/mojave/4/random/ //! [21]: https://www.freebsd.org/cgi/man.cgi?query=getrandom&manpath=FreeBSD+12.0-stable -//! [22]: https://github.com/hermitcore/libhermit-rs/blob/09c38b0371cee6f56a541400ba453e319e43db53/src/syscalls/random.rs#L21 #![doc( html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png", @@ -183,12 +181,7 @@ cfg_if! { #[path = "windows_uwp.rs"] mod imp; } else if #[cfg(windows)] { #[path = "windows.rs"] mod imp; - } else if #[cfg(all(target_arch = "x86_64", any( - target_os = "hermit", - target_os = "l4re", - target_os = "uefi", - target_env = "sgx", - )))] { + } else if #[cfg(all(target_arch = "x86_64", target_env = "sgx"))] { #[path = "rdrand.rs"] mod imp; } else if #[cfg(feature = "custom")] { use custom as imp; From 8ac79d425c4fa84c439cb29ad359fe016fc10c2d Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Tue, 18 Feb 2020 22:45:02 -0800 Subject: [PATCH 3/5] cpu: Add support for CPU-based randomness This allows freestanding targets to use getrandom. Signed-off-by: Joe Richey --- Cargo.toml | 2 ++ src/lib.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index b576b840..0488cc19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,8 @@ wasi = "0.9" [features] std = [] +# Feature to enable fallback CPU-based implementation +cpu = [] # Feature to enable custom RNG implementations custom = [] # Unstable feature to support being a libstd dependency diff --git a/src/lib.rs b/src/lib.rs index a19ed716..db8665b2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -185,6 +185,8 @@ cfg_if! { #[path = "rdrand.rs"] mod imp; } else if #[cfg(feature = "custom")] { use custom as imp; + } else if #[cfg(all(feature = "cpu", target_arch = "x86_64"))] { + #[path = "rdrand.rs"] mod imp; } else { compile_error!("\ target is not supported, for more information see: \ From ed0e04718ab4c464205a693db2a6516ae4239e0d Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Tue, 18 Feb 2020 22:36:58 -0800 Subject: [PATCH 4/5] tests: Improve testing infrastructure - Cleanup .travis.yml - Loops over std/no_std targets - Remove deprecated/useless keys - No more `cd`, we just use `--package`. - Improve tests - Main `getrandom` tests are now unit test modules instead of integration tests, making the code cleaner. - The custom RNG crates now use this common module as part of their integration tests. - No more weird test-only features needed to get the crate to build. Signed-off-by: Joe Richey --- .travis.yml | 85 ++++++++++----------------- benches/mod.rs | 1 - custom/stdweb/Cargo.toml | 11 +--- custom/stdweb/tests/test.rs | 7 +++ custom/wasm-bindgen/Cargo.toml | 16 +---- custom/wasm-bindgen/tests/node.rs | 7 +++ custom/wasm-bindgen/tests/web.rs | 9 +++ src/lib.rs | 3 + tests/common.rs => src/test_common.rs | 27 +++------ 9 files changed, 69 insertions(+), 97 deletions(-) create mode 100644 custom/stdweb/tests/test.rs create mode 100644 custom/wasm-bindgen/tests/node.rs create mode 100644 custom/wasm-bindgen/tests/web.rs rename tests/common.rs => src/test_common.rs (64%) diff --git a/.travis.yml b/.travis.yml index 70bed8b9..4d58a143 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,16 @@ language: rust -sudo: false +os: linux -matrix: +# Targets that we just build (rather than run and test) +env: + global: + - STD_TARGETS="x86_64-sun-solaris x86_64-unknown-cloudabi x86_64-unknown-freebsd x86_64-fuchsia x86_64-unknown-netbsd x86_64-unknown-redox x86_64-fortanix-unknown-sgx" + - NO_STD_TARGETS="x86_64-unknown-uefi x86_64-unknown-hermit x86_64-unknown-l4re-uclibc x86_64-uwp-windows-gnu x86_64-wrs-vxworks" + +jobs: include: - name: "Linux, 1.32.0" rust: 1.32.0 - os: linux - name: "OSX, 1.32.0" rust: 1.32.0 @@ -68,41 +73,40 @@ matrix: # This is actually useful as it finds stuff such as rust-random/rand#669 - cargo web test --target wasm32-unknown-emscripten --no-run - cargo web test --target asmjs-unknown-emscripten --no-run - # wasi tests - cargo test --target wasm32-wasi - # stdweb tests (Node, Chrome) - - cd custom/stdweb - - cargo web test --nodejs --target=wasm32-unknown-unknown - - cargo web test --target=wasm32-unknown-unknown - # wasm-bindgen tests (Node, Firefox, Chrome) - - cd ../wasm-bindgen - - cargo test --target wasm32-unknown-unknown - - GECKODRIVER=$HOME/geckodriver cargo test --target wasm32-unknown-unknown --features=test-in-browser - - CHROMEDRIVER=$HOME/chromedriver cargo test --target wasm32-unknown-unknown --features=test-in-browser + # stdweb (wasm32-unknown-unknown) tests (Node, Chrome) + - cargo web test --package stdweb-getrandom + - cargo web test --package stdweb-getrandom --nodejs + # wasm-bindgen (wasm32-unknown-unknown) tests (Node, Firefox, Chrome) + - cargo test --package wasm-bindgen-getrandom + --target wasm32-unknown-unknown --test node + - GECKODRIVER=$HOME/geckodriver + cargo test --package wasm-bindgen-getrandom + --target wasm32-unknown-unknown --test web + - CHROMEDRIVER=$HOME/chromedriver + cargo test --package wasm-bindgen-getrandom + --target wasm32-unknown-unknown --test web - &nightly_and_docs name: "Linux, nightly, docs" rust: nightly - os: linux install: - rustup target add wasm32-unknown-unknown - cargo --list | egrep "^\s*deadlinks$" -q || cargo install cargo-deadlinks - cargo deadlinks -V script: - # Check that our tests pass in the default configuration - - cargo test - - cargo test --benches # Check that setting various features does not break the build - cargo build --features=std - cargo build --features=custom # remove cached documentation, otherwise files from previous PRs can get included - rm -rf target/doc - cargo doc --no-deps --features=std,custom - - cargo doc --no-deps --manifest-path=custom/wasm-bindgen/Cargo.toml --target=wasm32-unknown-unknown + - cargo doc --no-deps --package wasm-bindgen-getrandom --target=wasm32-unknown-unknown - cargo deadlinks --dir target/doc - # also test minimum dependency versions are usable + # Check that our tests pass in the default/minimal configuration + - cargo test --tests --benches - cargo generate-lockfile -Z minimal-versions - - cargo test --features=std,custom + - cargo test --tests --benches - <<: *nightly_and_docs name: "OSX, nightly, docs" @@ -111,49 +115,23 @@ matrix: - name: "cross-platform build only" rust: nightly install: - - rustup target add x86_64-sun-solaris - - rustup target add x86_64-unknown-cloudabi - - rustup target add x86_64-unknown-freebsd - - rustup target add x86_64-fuchsia - - rustup target add x86_64-unknown-netbsd - - rustup target add x86_64-unknown-redox - - rustup target add x86_64-fortanix-unknown-sgx + - echo $STD_TARGETS | xargs -n1 rustup target add # For no_std targets - rustup component add rust-src - - cargo install cargo-xbuild || true + - cargo --list | egrep "^\s*xbuild$" -q || cargo install cargo-xbuild script: - - cargo build --target=x86_64-sun-solaris - - cargo build --target=x86_64-unknown-cloudabi - - cargo build --target=x86_64-unknown-freebsd - - cargo build --target=x86_64-fuchsia - - cargo build --target=x86_64-unknown-netbsd - - cargo build --target=x86_64-unknown-redox - - cargo build --target=x86_64-fortanix-unknown-sgx - - cargo xbuild --target=x86_64-unknown-uefi - - cargo xbuild --target=x86_64-unknown-hermit - - cargo xbuild --target=x86_64-unknown-l4re-uclibc - - cargo xbuild --target=x86_64-uwp-windows-gnu - - cargo xbuild --target=x86_64-wrs-vxworks + # We test that getrandom builds for all targets + - echo $STD_TARGETS | xargs -t -n1 cargo build --target + - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --target # also test minimum dependency versions are usable - cargo generate-lockfile -Z minimal-versions - - cargo build --target=x86_64-sun-solaris - - cargo build --target=x86_64-unknown-cloudabi - - cargo build --target=x86_64-unknown-freebsd - - cargo build --target=x86_64-fuchsia - - cargo build --target=x86_64-unknown-netbsd - - cargo build --target=x86_64-unknown-redox - - cargo build --target=x86_64-fortanix-unknown-sgx - - cargo xbuild --target=x86_64-unknown-uefi - - cargo xbuild --target=x86_64-unknown-hermit - - cargo xbuild --target=x86_64-unknown-l4re-uclibc - - cargo xbuild --target=x86_64-uwp-windows-gnu - - cargo xbuild --target=x86_64-wrs-vxworks + - echo $STD_TARGETS | xargs -t -n1 cargo build --target + - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --target # Trust cross-built/emulated targets. We must repeat all non-default values. - name: "Linux (MIPS, big-endian)" env: TARGET=mips-unknown-linux-gnu rust: stable - sudo: required dist: trusty services: docker install: @@ -165,7 +143,6 @@ matrix: - name: "Android (ARMv7)" env: TARGET=armv7-linux-androideabi rust: stable - sudo: required dist: trusty services: docker install: diff --git a/benches/mod.rs b/benches/mod.rs index 07953f13..a93e7206 100644 --- a/benches/mod.rs +++ b/benches/mod.rs @@ -1,5 +1,4 @@ #![feature(test)] -extern crate getrandom; extern crate test; #[bench] diff --git a/custom/stdweb/Cargo.toml b/custom/stdweb/Cargo.toml index 2b94124d..67e44b99 100644 --- a/custom/stdweb/Cargo.toml +++ b/custom/stdweb/Cargo.toml @@ -13,14 +13,5 @@ categories = ["wasm"] getrandom = { path = "../..", version = "0.2", features = ["custom"] } stdweb = "0.4.18" -# Test-only features allowing us to reuse most of the code in common.rs -[features] -default = ["test-stdweb"] -test-stdweb = [] - -[[test]] -name = "common" -path = "../../tests/common.rs" - [package.metadata.docs.rs] -default-target = "wasm32-unknown-unknown" \ No newline at end of file +default-target = "wasm32-unknown-unknown" diff --git a/custom/stdweb/tests/test.rs b/custom/stdweb/tests/test.rs new file mode 100644 index 00000000..744da522 --- /dev/null +++ b/custom/stdweb/tests/test.rs @@ -0,0 +1,7 @@ +// Explicitly use the Custom RNG crate to link it in. +use stdweb_getrandom as _; + +use getrandom::getrandom; +use test; +#[path = "../../../src/test_common.rs"] +mod test_common; diff --git a/custom/wasm-bindgen/Cargo.toml b/custom/wasm-bindgen/Cargo.toml index 93202fa6..2a665928 100644 --- a/custom/wasm-bindgen/Cargo.toml +++ b/custom/wasm-bindgen/Cargo.toml @@ -11,20 +11,10 @@ categories = ["wasm"] [dependencies] getrandom = { path = "../..", version = "0.2", features = ["custom"] } -wasm-bindgen = "0.2.29" +wasm-bindgen = "0.2.46" [dev-dependencies] -wasm-bindgen-test = "0.2" - -# Test-only features allowing us to reuse most of the code in common.rs -[features] -default = ["test-bindgen"] -test-bindgen = [] -test-in-browser = ["test-bindgen"] - -[[test]] -name = "common" -path = "../../tests/common.rs" +wasm-bindgen-test = "0.2.46" [package.metadata.docs.rs] -default-target = "wasm32-unknown-unknown" \ No newline at end of file +default-target = "wasm32-unknown-unknown" diff --git a/custom/wasm-bindgen/tests/node.rs b/custom/wasm-bindgen/tests/node.rs new file mode 100644 index 00000000..0861401c --- /dev/null +++ b/custom/wasm-bindgen/tests/node.rs @@ -0,0 +1,7 @@ +// Explicitly use the Custom RNG crate to link it in. +use wasm_bindgen_getrandom as _; + +use getrandom::getrandom; +use wasm_bindgen_test::wasm_bindgen_test as test; +#[path = "../../../src/test_common.rs"] +mod test_common; diff --git a/custom/wasm-bindgen/tests/web.rs b/custom/wasm-bindgen/tests/web.rs new file mode 100644 index 00000000..f09ddca2 --- /dev/null +++ b/custom/wasm-bindgen/tests/web.rs @@ -0,0 +1,9 @@ +// Explicitly use the Custom RNG crate to link it in. +use wasm_bindgen_getrandom as _; + +wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); + +use getrandom::getrandom; +use wasm_bindgen_test::wasm_bindgen_test as test; +#[path = "../../../src/test_common.rs"] +mod test_common; diff --git a/src/lib.rs b/src/lib.rs index db8665b2..f579d9ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -214,3 +214,6 @@ pub fn getrandom(dest: &mut [u8]) -> Result<(), Error> { } imp::getrandom_inner(dest) } + +#[cfg(test)] +mod test_common; diff --git a/tests/common.rs b/src/test_common.rs similarity index 64% rename from tests/common.rs rename to src/test_common.rs index a19af2d5..bbcf0e09 100644 --- a/tests/common.rs +++ b/src/test_common.rs @@ -1,25 +1,14 @@ -// Explicitly use the Custom RNG crates to link them in. -#[cfg(feature = "test-stdweb")] -use stdweb_getrandom as _; -#[cfg(feature = "test-bindgen")] -use wasm_bindgen_getrandom as _; +// Both getrandom and test can be renamed by the parent module. +use super::getrandom; +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +use super::test; -#[cfg(feature = "test-bindgen")] -use wasm_bindgen_test::*; - -use getrandom::getrandom; - -#[cfg(feature = "test-in-browser")] -wasm_bindgen_test_configure!(run_in_browser); - -#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)] #[test] fn test_zero() { // Test that APIs are happy with zero-length requests getrandom(&mut [0u8; 0]).unwrap(); } -#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)] #[test] fn test_diff() { let mut v1 = [0u8; 1000]; @@ -37,18 +26,18 @@ fn test_diff() { assert!(n_diff_bits >= v1.len() as u32); } -#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)] #[test] fn test_huge() { let mut huge = [0u8; 100_000]; getrandom(&mut huge).unwrap(); } -#[cfg(any(unix, windows, target_os = "redox", target_os = "fuchsia"))] +// On WASM, the thread API always fails/panics +#[cfg(not(target_arch = "wasm32"))] #[test] fn test_multithreading() { - use std::sync::mpsc::channel; - use std::thread; + extern crate std; + use std::{sync::mpsc::channel, thread, vec}; let mut txs = vec![]; for _ in 0..20 { From 68d61759f09a9e7aa376d290dab642d4609cc565 Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Tue, 18 Feb 2020 22:45:51 -0800 Subject: [PATCH 5/5] tests: Test CPU-based RNG on all x86 targets This allows us to verify the RDRAND implementation on Linux. Signed-off-by: Joe Richey --- .travis.yml | 4 ++-- src/lib.rs | 2 ++ src/test_cpu.rs | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/test_cpu.rs diff --git a/.travis.yml b/.travis.yml index 4d58a143..916dcb30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -122,11 +122,11 @@ jobs: script: # We test that getrandom builds for all targets - echo $STD_TARGETS | xargs -t -n1 cargo build --target - - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --target + - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --features=cpu --target # also test minimum dependency versions are usable - cargo generate-lockfile -Z minimal-versions - echo $STD_TARGETS | xargs -t -n1 cargo build --target - - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --target + - echo $NO_STD_TARGETS | xargs -t -n1 cargo xbuild --features=cpu --target # Trust cross-built/emulated targets. We must repeat all non-default values. - name: "Linux (MIPS, big-endian)" diff --git a/src/lib.rs b/src/lib.rs index f579d9ae..98dcff67 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -217,3 +217,5 @@ pub fn getrandom(dest: &mut [u8]) -> Result<(), Error> { #[cfg(test)] mod test_common; +#[cfg(test)] +mod test_cpu; diff --git a/src/test_cpu.rs b/src/test_cpu.rs new file mode 100644 index 00000000..efcb1c83 --- /dev/null +++ b/src/test_cpu.rs @@ -0,0 +1,8 @@ +// We only test the CPU-based RNG source on supported architectures. +#![cfg(target_arch = "x86_64")] + +#[path = "rdrand.rs"] +mod rdrand; +use rdrand::getrandom_inner as getrandom; +#[path = "test_common.rs"] +mod test_common;