sha2 0.11.1

Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512.
Documentation
#[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
compile_error!("riscv-zknh backend can be used only on riscv32 and riscv64 target arches");

cfg_if::cfg_if! {
    if #[cfg(sha2_backend_riscv_zknh = "compact")] {
        mod compact;
        use compact::compress_block;
    } else {
        mod unroll;
        use unroll::compress_block;
    }
}

#[target_feature(enable = "zknh")]
pub(super) fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) {
    for block in blocks.iter().map(load_block) {
        compress_block(state, block);
    }
}

fn load_block(block: &[u8; 128]) -> [u64; 16] {
    let (chunks, tail) = block.as_chunks();
    assert!(tail.is_empty());
    core::array::from_fn(|i| u64::from_be_bytes(chunks[i]))
}

cfg_if::cfg_if! {
    if #[cfg(target_arch = "riscv64")] {
        use core::arch::riscv64::{sha512sig0, sha512sig1, sha512sum0, sha512sum1};
    } else {
        use core::arch::riscv32::{
            sha512sig0h, sha512sig0l, sha512sig1h, sha512sig1l, sha512sum0r, sha512sum1r,
        };

        #[target_feature(enable = "zknh")]
        fn sha512sum0(x: u64) -> u64 {
            let a = sha512sum0r((x >> 32) as u32, x as u32);
            let b = sha512sum0r(x as u32, (x >> 32) as u32);
            ((a as u64) << 32) | (b as u64)
        }

        #[target_feature(enable = "zknh")]
        fn sha512sum1(x: u64) -> u64 {
            let a = sha512sum1r((x >> 32) as u32, x as u32);
            let b = sha512sum1r(x as u32, (x >> 32) as u32);
            ((a as u64) << 32) | (b as u64)
        }

        #[target_feature(enable = "zknh")]
        fn sha512sig0(x: u64) -> u64 {
            let a = sha512sig0h((x >> 32) as u32, x as u32);
            let b = sha512sig0l(x as u32, (x >> 32) as u32);
            ((a as u64) << 32) | (b as u64)
        }

        #[target_feature(enable = "zknh")]
        fn sha512sig1(x: u64) -> u64 {
            let a = sha512sig1h((x >> 32) as u32, x as u32);
            let b = sha512sig1l(x as u32, (x >> 32) as u32);
            ((a as u64) << 32) | (b as u64)
        }
    }
}