diff options
Diffstat (limited to 'embassy-stm32/src/hash/mod.rs')
| -rw-r--r-- | embassy-stm32/src/hash/mod.rs | 16 |
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 | ||
