diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15711985..b1d4ce32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,6 +85,33 @@ jobs: cargo install cargo-ndk cargo ndk -t aarch64-linux-android build + wasm32-unknown-unknown: + name: wasm32-unknown-unknown + runs-on: ubuntu-latest + strategy: + matrix: + rust: [ stable, beta, nightly ] + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Install Rust + run: | + rustup toolchain install ${{ matrix.rust }} --profile minimal --component clippy + rustup default ${{ matrix.rust }} + rustup target add wasm32-unknown-unknown + + - name: Check workspace (all crates except classicmceliece & umbrella) + run: | + cargo check --workspace --target wasm32-unknown-unknown --features getrandom_wasm_js \ + --exclude pqcrypto-classicmceliece \ + --exclude pqcrypto + + - name: Check umbrella crate (explicitly enable only supported wasm crates) + run: | + cargo check --target wasm32-unknown-unknown \ + -p pqcrypto --no-default-features -F pqcrypto-mlkem,pqcrypto-hqc,pqcrypto-mldsa,pqcrypto-falcon,pqcrypto-sphincsplus,serialization,getrandom_wasm_js # wasi: # name: wasi # runs-on: ubuntu-latest diff --git a/pqcrypto-classicmceliece/Cargo.toml b/pqcrypto-classicmceliece/Cargo.toml index 1b6aa284..50472e8e 100644 --- a/pqcrypto-classicmceliece/Cargo.toml +++ b/pqcrypto-classicmceliece/Cargo.toml @@ -14,15 +14,18 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["avx2", "std"] avx2 = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] diff --git a/pqcrypto-classicmceliece/build.rs b/pqcrypto-classicmceliece/build.rs index ee04a9a8..ebbd1198 100644 --- a/pqcrypto-classicmceliece/build.rs +++ b/pqcrypto-classicmceliece/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } @@ -68,12 +73,17 @@ macro_rules! build_avx2 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_avx2", $variant).as_str()); }; } diff --git a/pqcrypto-classicmceliece/src/ffi.rs b/pqcrypto-classicmceliece/src/ffi.rs index 615cbcb0..09eb7be3 100644 --- a/pqcrypto-classicmceliece/src/ffi.rs +++ b/pqcrypto-classicmceliece/src/ffi.rs @@ -15,7 +15,7 @@ //! * mceliece8192128f // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-falcon/Cargo.toml b/pqcrypto-falcon/Cargo.toml index faa5932a..cf2020e8 100644 --- a/pqcrypto-falcon/Cargo.toml +++ b/pqcrypto-falcon/Cargo.toml @@ -14,16 +14,19 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["avx2", "neon", "std"] avx2 = ["std"] neon = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] rand = "0.9" diff --git a/pqcrypto-falcon/build.rs b/pqcrypto-falcon/build.rs index 0074a90c..f41a3b67 100644 --- a/pqcrypto-falcon/build.rs +++ b/pqcrypto-falcon/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } @@ -70,12 +75,17 @@ macro_rules! build_avx2 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_avx2", $variant).as_str()); }; } @@ -103,12 +113,17 @@ macro_rules! build_aarch64 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_aarch64", $variant).as_str()); }; } diff --git a/pqcrypto-falcon/src/ffi.rs b/pqcrypto-falcon/src/ffi.rs index d8f0e20a..8e5715e4 100644 --- a/pqcrypto-falcon/src/ffi.rs +++ b/pqcrypto-falcon/src/ffi.rs @@ -9,7 +9,7 @@ //! * falcon-padded-1024 // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-hqc/Cargo.toml b/pqcrypto-hqc/Cargo.toml index 6ba2ba05..5d821954 100644 --- a/pqcrypto-hqc/Cargo.toml +++ b/pqcrypto-hqc/Cargo.toml @@ -14,14 +14,17 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] diff --git a/pqcrypto-hqc/build.rs b/pqcrypto-hqc/build.rs index 57e3210e..5a3cab2b 100644 --- a/pqcrypto-hqc/build.rs +++ b/pqcrypto-hqc/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } diff --git a/pqcrypto-hqc/src/ffi.rs b/pqcrypto-hqc/src/ffi.rs index 9eb95bc5..fd5cfddc 100644 --- a/pqcrypto-hqc/src/ffi.rs +++ b/pqcrypto-hqc/src/ffi.rs @@ -8,7 +8,7 @@ //! * hqc-256 // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-internals/Cargo.toml b/pqcrypto-internals/Cargo.toml index 3defd460..026e7f4f 100644 --- a/pqcrypto-internals/Cargo.toml +++ b/pqcrypto-internals/Cargo.toml @@ -10,10 +10,15 @@ links = "pqcrypto_internals" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +getrandom_wasm_js = ["getrandom/wasm_js"] + [build-dependencies] cc = { version = "1.0", features = ["parallel"] } dunce = "1.0" [dependencies] getrandom = "0.3" -libc = "0.2" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" diff --git a/pqcrypto-internals/build.rs b/pqcrypto-internals/build.rs index 97bdcb67..3155eaa7 100644 --- a/pqcrypto-internals/build.rs +++ b/pqcrypto-internals/build.rs @@ -30,10 +30,14 @@ fn main() { build.flag(format!("--sysroot={wasi_sdk_path}").as_str()); } - build - .include(&includepath) - .files(common_files) - .compile("pqclean_common"); + build.include(&includepath); + + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + build.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + build.files(common_files).compile("pqclean_common"); println!("cargo:rustc-link-lib=pqclean_common"); let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default(); diff --git a/pqcrypto-internals/src/lib.rs b/pqcrypto-internals/src/lib.rs index 7791f0dd..7c5dfdbe 100644 --- a/pqcrypto-internals/src/lib.rs +++ b/pqcrypto-internals/src/lib.rs @@ -2,6 +2,10 @@ use core::slice; +#[allow(nonstandard_style)] +type size_t = usize; +use core::ffi::c_int; + /// Get random bytes; exposed for PQClean implementations. /// /// # Safety @@ -16,7 +20,7 @@ use core::slice; /// } /// ``` #[no_mangle] -pub unsafe extern "C" fn PQCRYPTO_RUST_randombytes(buf: *mut u8, len: libc::size_t) -> libc::c_int { +pub unsafe extern "C" fn PQCRYPTO_RUST_randombytes(buf: *mut u8, len: size_t) -> c_int { let buf = slice::from_raw_parts_mut(buf, len); getrandom::fill(buf).expect("RNG Failed"); 0 diff --git a/pqcrypto-mldsa/Cargo.toml b/pqcrypto-mldsa/Cargo.toml index 9fda07df..8cd9d43a 100644 --- a/pqcrypto-mldsa/Cargo.toml +++ b/pqcrypto-mldsa/Cargo.toml @@ -14,17 +14,20 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } paste = "1.0" +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["avx2", "neon", "std"] avx2 = ["std"] neon = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] rand = "0.9" diff --git a/pqcrypto-mldsa/build.rs b/pqcrypto-mldsa/build.rs index 790447d0..a954b63e 100644 --- a/pqcrypto-mldsa/build.rs +++ b/pqcrypto-mldsa/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } @@ -70,12 +75,17 @@ macro_rules! build_avx2 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_avx2", $variant).as_str()); }; } @@ -103,12 +113,17 @@ macro_rules! build_aarch64 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_aarch64", $variant).as_str()); }; } diff --git a/pqcrypto-mldsa/src/ffi.rs b/pqcrypto-mldsa/src/ffi.rs index 55b906ec..531eefdb 100644 --- a/pqcrypto-mldsa/src/ffi.rs +++ b/pqcrypto-mldsa/src/ffi.rs @@ -8,7 +8,7 @@ //! * ml-dsa-87 // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-mlkem/Cargo.toml b/pqcrypto-mlkem/Cargo.toml index a0c79288..40a4bcc6 100644 --- a/pqcrypto-mlkem/Cargo.toml +++ b/pqcrypto-mlkem/Cargo.toml @@ -14,16 +14,19 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["avx2", "neon", "std"] avx2 = ["std"] neon = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] diff --git a/pqcrypto-mlkem/build.rs b/pqcrypto-mlkem/build.rs index 969aa599..0012dd90 100644 --- a/pqcrypto-mlkem/build.rs +++ b/pqcrypto-mlkem/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } @@ -68,12 +73,17 @@ macro_rules! build_avx2 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_avx2", $variant).as_str()); }; } @@ -101,12 +111,17 @@ macro_rules! build_aarch64 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_aarch64", $variant).as_str()); }; } diff --git a/pqcrypto-mlkem/src/ffi.rs b/pqcrypto-mlkem/src/ffi.rs index c93bba77..e4a1681b 100644 --- a/pqcrypto-mlkem/src/ffi.rs +++ b/pqcrypto-mlkem/src/ffi.rs @@ -8,7 +8,7 @@ //! * ml-kem-1024 // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-sphincsplus/Cargo.toml b/pqcrypto-sphincsplus/Cargo.toml index 3e121b03..12cce284 100644 --- a/pqcrypto-sphincsplus/Cargo.toml +++ b/pqcrypto-sphincsplus/Cargo.toml @@ -14,15 +14,18 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "0.3.5", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = ["avx2", "std"] avx2 = ["std"] std = ["pqcrypto-traits/std"] serialization = ["serde", "serde-big-array"] +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] rand = "0.9" diff --git a/pqcrypto-sphincsplus/build.rs b/pqcrypto-sphincsplus/build.rs index 013e61df..edd44eed 100644 --- a/pqcrypto-sphincsplus/build.rs +++ b/pqcrypto-sphincsplus/build.rs @@ -26,12 +26,17 @@ macro_rules! build_clean { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_clean", $variant).as_str()); }; } @@ -70,12 +75,17 @@ macro_rules! build_avx2 { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( - scheme_files - .into_iter() - .map(|p| p.unwrap().to_string_lossy().into_owned()), - ); + .include(target_dir); + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + + builder.files( + scheme_files + .into_iter() + .map(|p| p.unwrap().to_string_lossy().into_owned()), + ); builder.compile(format!("{}_avx2", $variant).as_str()); }; } diff --git a/pqcrypto-sphincsplus/src/ffi.rs b/pqcrypto-sphincsplus/src/ffi.rs index d00d48d8..6c96cd92 100644 --- a/pqcrypto-sphincsplus/src/ffi.rs +++ b/pqcrypto-sphincsplus/src/ffi.rs @@ -17,7 +17,7 @@ //! * sphincs-sha2-256s-simple // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto-template/pqcrypto/Cargo.toml.j2 b/pqcrypto-template/pqcrypto/Cargo.toml.j2 index 3484ac7a..89240fa1 100644 --- a/pqcrypto-template/pqcrypto/Cargo.toml.j2 +++ b/pqcrypto-template/pqcrypto/Cargo.toml.j2 @@ -20,7 +20,8 @@ pqcrypto-{{ name }} = { path = "../pqcrypto-{{ name }}", version = "{{ props.ver [features] default = [{% for (name, props) in kems.items()|list + signs.items()|list %}{% if not props.insecure|default(False) %}"pqcrypto-{{name}}",{% endif %}{% endfor %}] cryptographically-insecure = [{% for (name, props) in kems.items()|list + signs.items()|list %}{% if props.insecure|default(False) %}"pqcrypto-{{name}}/cryptographically-insecure",{% endif %}{% endfor %}] -serialization = [{% for (name, props) in kems.items()|list + signs.items()|list %}"pqcrypto-{{name}}/serialization",{% endfor %}] +serialization = [{% for (name, props) in kems.items()|list + signs.items()|list %}"pqcrypto-{{name}}?/serialization",{% endfor %}] +getrandom_wasm_js = [{% for (name, props) in kems.items()|list + signs.items()|list %}"pqcrypto-{{name}}?/getrandom_wasm_js",{% endfor %}] [badges] travis-ci = { repository = "rustpq/pqcrypto", branch = "master" } diff --git a/pqcrypto-template/scheme/Cargo.toml.j2 b/pqcrypto-template/scheme/Cargo.toml.j2 index 3a15d418..ea9bf0cd 100644 --- a/pqcrypto-template/scheme/Cargo.toml.j2 +++ b/pqcrypto-template/scheme/Cargo.toml.j2 @@ -14,13 +14,15 @@ categories = ["cryptography", "no-std"] [dependencies] pqcrypto-internals = { path = "../pqcrypto-internals", version = "0.2.6" } pqcrypto-traits = { path = "../pqcrypto-traits", version = "{{ traits_version }}", default-features = false } -libc = "0.2.0" serde = { version = "1.0", features = ["derive"], optional = true } serde-big-array = { version = "0.5.1", optional = true } {% if supports_context %} paste = "1.0" {% endif %} +[target.wasm32-unknown-unknown.dependencies] +wasm32-unknown-unknown-openbsd-libc = "0.2" + [features] default = [{% if 'avx2' in implementations or 'avx' in implementations %}"avx2", {% endif %}{% if 'aesni' in implementations %}"aes", {% endif %}{% if 'aarch64' in implementations %}"neon", {% endif %}"std"] {% if 'avx2' in implementations or 'avx' in implementations %} @@ -37,6 +39,7 @@ serialization = ["serde", "serde-big-array"] {% if insecure %} cryptographically-insecure = [] {% endif %} +getrandom_wasm_js = ["pqcrypto-internals/getrandom_wasm_js"] [dev-dependencies] {% if type == "sign" %} diff --git a/pqcrypto-template/scheme/build.rs.j2 b/pqcrypto-template/scheme/build.rs.j2 index 81dca28a..a5e8e4c8 100644 --- a/pqcrypto-template/scheme/build.rs.j2 +++ b/pqcrypto-template/scheme/build.rs.j2 @@ -62,8 +62,15 @@ macro_rules! build_{{ implementation }} { builder .include(internals_include_path) .include(&common_dir) - .include(target_dir) - .files( + .include(target_dir); + {% if name != 'classicmceliece2' %} + if let Some(libc) = std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE") { + builder.include(libc); + println!("cargo::rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } + {% endif %} + + builder.files( scheme_files .into_iter() .map(|p| p.unwrap().to_string_lossy().into_owned()), diff --git a/pqcrypto-template/scheme/src/ffi.rs.j2 b/pqcrypto-template/scheme/src/ffi.rs.j2 index 544e738d..e21a1f54 100644 --- a/pqcrypto-template/scheme/src/ffi.rs.j2 +++ b/pqcrypto-template/scheme/src/ffi.rs.j2 @@ -7,7 +7,7 @@ {% endfor %} // This file has been generated from PQClean. // Find the templates in pqcrypto-template -use libc::c_int; +use core::ffi::c_int; // ensures we link correctly #[allow(unused_imports)] diff --git a/pqcrypto/Cargo.toml b/pqcrypto/Cargo.toml index b8bfa406..b1b01715 100644 --- a/pqcrypto/Cargo.toml +++ b/pqcrypto/Cargo.toml @@ -23,7 +23,8 @@ pqcrypto-sphincsplus = { path = "../pqcrypto-sphincsplus", version = "0.7.2", op [features] default = ["pqcrypto-mlkem","pqcrypto-classicmceliece","pqcrypto-hqc","pqcrypto-mldsa","pqcrypto-falcon","pqcrypto-sphincsplus",] cryptographically-insecure = [] -serialization = ["pqcrypto-mlkem/serialization","pqcrypto-classicmceliece/serialization","pqcrypto-hqc/serialization","pqcrypto-mldsa/serialization","pqcrypto-falcon/serialization","pqcrypto-sphincsplus/serialization",] +serialization = ["pqcrypto-mlkem?/serialization","pqcrypto-classicmceliece?/serialization","pqcrypto-hqc?/serialization","pqcrypto-mldsa?/serialization","pqcrypto-falcon?/serialization","pqcrypto-sphincsplus?/serialization",] +getrandom_wasm_js = ["pqcrypto-mlkem?/getrandom_wasm_js","pqcrypto-classicmceliece?/getrandom_wasm_js","pqcrypto-hqc?/getrandom_wasm_js","pqcrypto-mldsa?/getrandom_wasm_js","pqcrypto-falcon?/getrandom_wasm_js","pqcrypto-sphincsplus?/getrandom_wasm_js",] [badges] travis-ci = { repository = "rustpq/pqcrypto", branch = "master" }