From 6810557942a3174ff484f970f7b643d10ba1a6e9 Mon Sep 17 00:00:00 2001 From: sjfhsjfh Date: Fri, 11 Apr 2025 23:08:33 +0800 Subject: [PATCH] feat: runtime rng feature --- Cargo.toml | 7 +++++-- src/helper/crypt.rs | 6 +++--- src/lib.rs | 2 +- src/random.rs | 21 +++++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 src/random.rs diff --git a/Cargo.toml b/Cargo.toml index a21d1c8e..5c7f7a0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" [dependencies] aes = "0.8.4" -ahash = "0.8.11" +ahash = { version = "0.8.11", default-features = false, features = ["std"] } base64 = "0.22.1" byteorder = "1.5" cbc = "0.1.2" @@ -21,12 +21,12 @@ cfb = "0.10.0" chrono = { version = "0.4.38", default-features = false, features = ["clock"] } encoding_rs = "0.8.35" fancy-regex = "0.14.0" -getrandom = { version = "0.2.15" } hmac = "0.12.1" html_parser = "0.7.0" image = { version = "0.25.5", optional = true } lazy_static = "1.5.0" md-5 = "0.10.6" +rand = { version = "0.9.0", default-features = false, features = ["small_rng"] } regex = "1.11.1" sha2 = "0.10.8" thin-vec = "0.2.13" @@ -34,9 +34,12 @@ thousands = "0.2.0" quick-xml = { version = "0.37.1", features = ["serialize"] } zip = { version = "2.2.1", default-features = false, features = ["deflate"] } +getrandom = { version = "0.2.15", optional = true } + [lib] doctest = false [features] js = ["getrandom/js"] +runtime-rng = ["getrandom"] default = ["image"] diff --git a/src/helper/crypt.rs b/src/helper/crypt.rs index 2e7847c9..90b4357f 100644 --- a/src/helper/crypt.rs +++ b/src/helper/crypt.rs @@ -480,21 +480,21 @@ fn hash(algorithm: &str, buffers: Vec<&[u8]>) -> Result, String> { #[inline] fn gen_random_16() -> Vec { let buf: &mut [u8] = &mut [0; 16]; - getrandom::getrandom(buf); + crate::random::getrandom(buf); buf.to_vec() } #[inline] fn gen_random_32() -> Vec { let buf: &mut [u8] = &mut [0; 32]; - getrandom::getrandom(buf); + crate::random::getrandom(buf); buf.to_vec() } #[inline] fn gen_random_64() -> Vec { let buf: &mut [u8] = &mut [0; 64]; - getrandom::getrandom(buf); + crate::random::getrandom(buf); buf.to_vec() } diff --git a/src/lib.rs b/src/lib.rs index 4b391c84..35394854 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -134,7 +134,6 @@ extern crate base64; extern crate byteorder; extern crate cbc; extern crate cfb; -extern crate getrandom; extern crate hmac; extern crate html_parser; extern crate sha2; @@ -147,6 +146,7 @@ pub mod reader; pub mod structs; pub mod traits; pub mod writer; +mod random; pub use self::structs::*; pub use self::traits::*; diff --git a/src/random.rs b/src/random.rs new file mode 100644 index 00000000..50eedb57 --- /dev/null +++ b/src/random.rs @@ -0,0 +1,21 @@ +pub(crate) fn getrandom(buf: &mut [u8]) -> Result<(), String> { + #[cfg(feature = "runtime-rng")] + { + extern crate getrandom; + match getrandom::getrandom(buf) { + Ok(_) => Ok(()), + Err(e) => Err(format!("getrandom error: {}", e)), + } + } + #[cfg(not(feature = "runtime-rng"))] + { + use rand::{RngCore, SeedableRng}; + let seed = b"No Runtime RNG HERE!!!!!!!!!!111"; + let len = buf.len(); + let mut rng = rand::rngs::SmallRng::from_seed(*seed); + for byte in buf.iter_mut() { + *byte = rng.next_u32() as u8; + } + Ok(()) + } +}