aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/hash/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/hash/mod.rs')
-rw-r--r--embassy-stm32/src/hash/mod.rs16
1 files changed, 11 insertions, 5 deletions
diff --git a/embassy-stm32/src/hash/mod.rs b/embassy-stm32/src/hash/mod.rs
index e62151bb5..90c06c0d8 100644
--- a/embassy-stm32/src/hash/mod.rs
+++ b/embassy-stm32/src/hash/mod.rs
@@ -198,6 +198,8 @@ impl<'d, T: Instance, M: Mode> Hash<'d, T, M> {
198 if key.len() > 64 { 198 if key.len() > 64 {
199 T::regs().cr().modify(|w| w.set_lkey(true)); 199 T::regs().cr().modify(|w| w.set_lkey(true));
200 } 200 }
201 } else {
202 T::regs().cr().modify(|w| w.set_mode(false));
201 } 203 }
202 204
203 T::regs().cr().modify(|w| w.set_init(true)); 205 T::regs().cr().modify(|w| w.set_init(true));
@@ -351,13 +353,17 @@ impl<'d, T: Instance, M: Mode> Hash<'d, T, M> {
351 let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8; 353 let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8;
352 T::regs().str().modify(|w| w.set_nblw(num_valid_bits)); 354 T::regs().str().modify(|w| w.set_nblw(num_valid_bits));
353 355
354 let mut i = 0; 356 let mut chunks = input.chunks_exact(4);
355 while i < input.len() { 357 for chunk in &mut chunks {
358 T::regs()
359 .din()
360 .write_value(u32::from_ne_bytes(chunk.try_into().unwrap()));
361 }
362 let rem = chunks.remainder();
363 if !rem.is_empty() {
356 let mut word: [u8; 4] = [0; 4]; 364 let mut word: [u8; 4] = [0; 4];
357 let copy_idx = min(i + 4, input.len()); 365 word[0..rem.len()].copy_from_slice(rem);
358 word[0..copy_idx - i].copy_from_slice(&input[i..copy_idx]);
359 T::regs().din().write_value(u32::from_ne_bytes(word)); 366 T::regs().din().write_value(u32::from_ne_bytes(word));
360 i += 4;
361 } 367 }
362 } 368 }
363 369