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(any(target_arch = "x86" , target_arch = "x86_64" ))] { |
13 | #[cfg (not(feature = "asm" ))] |
14 | mod soft; |
15 | #[cfg (feature = "asm" )] |
16 | mod soft { |
17 | pub use sha1_asm::compress; |
18 | } |
19 | mod x86; |
20 | use x86::compress as compress_inner; |
21 | } else { |
22 | mod soft; |
23 | use soft::compress as compress_inner; |
24 | } |
25 | } |
26 | |
27 | const BLOCK_SIZE: usize = <Sha1Core as BlockSizeUser>::BlockSize::USIZE; |
28 | |
29 | /// SHA-1 compression function |
30 | #[cfg_attr (docsrs, doc(cfg(feature = "compress" )))] |
31 | pub fn compress(state: &mut [u32; 5], blocks: &[Block<Sha1Core>]) { |
32 | // SAFETY: GenericArray<u8, U64> and [u8; 64] have |
33 | // exactly the same memory layout |
34 | let blocks: &[[u8; BLOCK_SIZE]] = |
35 | unsafe { &*(blocks as *const _ as *const [[u8; BLOCK_SIZE]]) }; |
36 | compress_inner(state, blocks); |
37 | } |
38 | |