digest: Remove CPU features from the digest context.

Take a step towards refactoring the CPU feature detection.
This commit is contained in:
Brian Smith 2023-12-11 08:39:10 -08:00
parent 5b437d514f
commit 89d22e23fa

View File

@ -41,8 +41,6 @@ pub(crate) struct BlockContext {
/// The context's algorithm. /// The context's algorithm.
pub algorithm: &'static Algorithm, pub algorithm: &'static Algorithm,
cpu_features: cpu::Features,
} }
impl BlockContext { impl BlockContext {
@ -51,7 +49,6 @@ impl BlockContext {
state: algorithm.initial_state, state: algorithm.initial_state,
completed_data_blocks: 0, completed_data_blocks: 0,
algorithm, algorithm,
cpu_features: cpu::features(),
} }
} }
@ -62,7 +59,7 @@ impl BlockContext {
if num_blocks > 0 { if num_blocks > 0 {
unsafe { unsafe {
self.block_data_order(input.as_ptr(), num_blocks); self.block_data_order(input.as_ptr(), num_blocks, cpu::features());
} }
self.completed_data_blocks = self self.completed_data_blocks = self
.completed_data_blocks .completed_data_blocks
@ -82,7 +79,7 @@ impl BlockContext {
if padding_pos > block_len - self.algorithm.len_len { if padding_pos > block_len - self.algorithm.len_len {
pending[padding_pos..block_len].fill(0); pending[padding_pos..block_len].fill(0);
unsafe { self.block_data_order(pending.as_ptr(), 1) }; unsafe { self.block_data_order(pending.as_ptr(), 1, cpu::features()) };
// We don't increase |self.completed_data_blocks| because the // We don't increase |self.completed_data_blocks| because the
// padding isn't data, and so it isn't included in the data length. // padding isn't data, and so it isn't included in the data length.
padding_pos = 0; padding_pos = 0;
@ -101,7 +98,7 @@ impl BlockContext {
.unwrap(); .unwrap();
pending[(block_len - 8)..block_len].copy_from_slice(&u64::to_be_bytes(completed_data_bits)); pending[(block_len - 8)..block_len].copy_from_slice(&u64::to_be_bytes(completed_data_bits));
unsafe { self.block_data_order(pending.as_ptr(), 1) }; unsafe { self.block_data_order(pending.as_ptr(), 1, cpu::features()) };
Digest { Digest {
algorithm: self.algorithm, algorithm: self.algorithm,
@ -109,9 +106,13 @@ impl BlockContext {
} }
} }
unsafe fn block_data_order(&mut self, pending: *const u8, num_blocks: usize) { unsafe fn block_data_order(
&mut self,
pending: *const u8,
num_blocks: usize,
_cpu_features: cpu::Features,
) {
// CPU features are inspected by assembly implementations. // CPU features are inspected by assembly implementations.
let _cpu_features = self.cpu_features;
unsafe { unsafe {
(self.algorithm.block_data_order)(&mut self.state, pending, num_blocks); (self.algorithm.block_data_order)(&mut self.state, pending, num_blocks);
} }
@ -582,7 +583,6 @@ mod tests {
state: alg.initial_state, state: alg.initial_state,
completed_data_blocks: max_blocks - 1, completed_data_blocks: max_blocks - 1,
algorithm: alg, algorithm: alg,
cpu_features: crate::cpu::features(),
}, },
pending: [0u8; digest::MAX_BLOCK_LEN], pending: [0u8; digest::MAX_BLOCK_LEN],
num_pending: 0, num_pending: 0,