84 lines
3.2 KiB
Rust
84 lines
3.2 KiB
Rust
cfg_if::cfg_if! {
|
|
if #[cfg(any(sha2_backend = "soft", sha2_256_backend = "soft"))] {
|
|
mod soft;
|
|
use soft::compress;
|
|
} else if #[cfg(any(sha2_backend = "riscv-zknh", sha2_256_backend = "riscv-zknh"))] {
|
|
mod riscv_zknh;
|
|
|
|
#[cfg(not(all(
|
|
target_feature = "zknh",
|
|
any(target_feature = "zbb", target_feature = "zbkb")
|
|
)))]
|
|
compile_error!("riscv-zknh backend requires zknh and zbkb (or zbb) target features");
|
|
|
|
fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) {
|
|
// SAFETY: we checked above that the required target features are enabled
|
|
unsafe { riscv_zknh::compress(state, blocks) }
|
|
}
|
|
} else if #[cfg(sha2_512_backend = "x86-avx2")] {
|
|
mod x86_avx2;
|
|
|
|
#[cfg(not(target_feature = "avx2"))]
|
|
compile_error!("x86-avx2 backend requires avx2 target feature");
|
|
|
|
fn compress(state: &mut [u32; 8], blocks: &[[u8; 64]]) {
|
|
// SAFETY: we checked above that the required target features are enabled
|
|
unsafe { x86_avx2::compress(state, blocks) }
|
|
}
|
|
} else if #[cfg(sha2_512_backend = "aarch64-sha3")] {
|
|
mod aarch64_sha3;
|
|
|
|
#[cfg(not(target_feature = "sha3"))]
|
|
compile_error!("aarch64-sha3 backend requires sha3 target feature");
|
|
|
|
fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) {
|
|
// SAFETY: we checked above that the required target features are enabled
|
|
unsafe { aarch64_sha3::compress(state, blocks) }
|
|
}
|
|
} else if #[cfg(target_arch = "loongarch64")] {
|
|
mod loongarch64_asm;
|
|
use loongarch64_asm::compress;
|
|
} else if #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))] {
|
|
mod wasm32_simd128;
|
|
use wasm32_simd128::compress;
|
|
} else {
|
|
mod soft;
|
|
|
|
cfg_if::cfg_if! {
|
|
if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
|
|
mod x86_avx2;
|
|
cpufeatures::new!(avx2_cpuid, "avx2");
|
|
} else if #[cfg(target_arch = "aarch64")] {
|
|
mod aarch64_sha3;
|
|
cpufeatures::new!(sha3_hwcap, "sha3");
|
|
}
|
|
}
|
|
|
|
fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) {
|
|
cfg_if::cfg_if! {
|
|
if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
|
|
if avx2_cpuid::get() {
|
|
// SAFETY: we checked that required target features are available
|
|
return unsafe { x86_avx2::compress(state, blocks) };
|
|
}
|
|
} else if #[cfg(target_arch = "aarch64")] {
|
|
if sha3_hwcap::get() {
|
|
// SAFETY: we checked that `sha3` target feature is available
|
|
return unsafe { aarch64_sha3::compress(state, blocks) };
|
|
}
|
|
}
|
|
}
|
|
|
|
soft::compress(state, blocks);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Raw SHA-512 compression function.
|
|
///
|
|
/// This is a low-level "hazmat" API which provides direct access to the core
|
|
/// functionality of SHA-512.
|
|
pub fn compress512(state: &mut [u64; 8], blocks: &[[u8; 128]]) {
|
|
compress(state, blocks)
|
|
}
|