1 | use crate::{Block, BlockSizeUser, Sha1Core}; |
2 | use digest::typenum::Unsigned; |
3 | |
4 | cfg_if::cfg_if! { |
5 | if #[cfg(feature = "force-soft" )] { |
6 | mod soft; |
7 | use soft::compress as compress_inner; |
8 | } else if #[cfg(all(feature = "asm" , target_arch = "aarch64" ))] { |
9 | mod soft; |
10 | mod aarch64; |
11 | use aarch64::compress as compress_inner; |
12 | } else if #[cfg(all(feature = "loongarch64_asm" , target_arch = "loongarch64" ))] { |
13 | mod loongarch64_asm; |
14 | use loongarch64_asm::compress as compress_inner; |
15 | } else if #[cfg(any(target_arch = "x86" , target_arch = "x86_64" ))] { |
16 | #[cfg (not(feature = "asm" ))] |
17 | mod soft; |
18 | #[cfg (feature = "asm" )] |
19 | mod soft { |
20 | pub use sha1_asm::compress; |
21 | } |
22 | mod x86; |
23 | use x86::compress as compress_inner; |
24 | } else { |
25 | mod soft; |
26 | use soft::compress as compress_inner; |
27 | } |
28 | } |
29 | |
30 | const BLOCK_SIZE: usize = <Sha1Core as BlockSizeUser>::BlockSize::USIZE; |
31 | |
32 | /// SHA-1 compression function |
33 | #[cfg_attr (docsrs, doc(cfg(feature = "compress" )))] |
34 | pub fn compress(state: &mut [u32; 5], blocks: &[Block<Sha1Core>]) { |
35 | // SAFETY: GenericArray<u8, U64> and [u8; 64] have |
36 | // exactly the same memory layout |
37 | let blocks: &[[u8; BLOCK_SIZE]] = |
38 | unsafe { &*(blocks as *const _ as *const [[u8; BLOCK_SIZE]]) }; |
39 | compress_inner(state, blocks); |
40 | } |
41 | |