aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <[email protected]>2025-08-12 15:28:52 +0800
committerMatt Johnston <[email protected]>2025-08-15 17:39:52 +0800
commit86e257bc8df5e76c3857644f78650e65447523ad (patch)
tree34b499c76dc68b600dc7997c3d76f381079939c9
parentd939d901e245c30f924e30a7605e378be0be5cca (diff)
stm32/hash: Improve performance when hashing
chunks_exact produces better code
-rw-r--r--embassy-stm32/CHANGELOG.md1
-rw-r--r--embassy-stm32/src/hash/mod.rs14
2 files changed, 10 insertions, 5 deletions
diff --git a/embassy-stm32/CHANGELOG.md b/embassy-stm32/CHANGELOG.md
index 0f044419e..d2dccaea5 100644
--- a/embassy-stm32/CHANGELOG.md
+++ b/embassy-stm32/CHANGELOG.md
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8<!-- next-header --> 8<!-- next-header -->
9## Unreleased - ReleaseDate 9## Unreleased - ReleaseDate
10 10
11- feat: Improve blocking hash speed
11- fix: Fix vrefbuf building with log feature 12- fix: Fix vrefbuf building with log feature
12- fix: Fix performing a hash after performing a hmac 13- fix: Fix performing a hash after performing a hmac
13- chore: Updated stm32-metapac and stm32-data dependencies 14- chore: Updated stm32-metapac and stm32-data dependencies
diff --git a/embassy-stm32/src/hash/mod.rs b/embassy-stm32/src/hash/mod.rs
index a4c275242..90c06c0d8 100644
--- a/embassy-stm32/src/hash/mod.rs
+++ b/embassy-stm32/src/hash/mod.rs
@@ -353,13 +353,17 @@ impl<'d, T: Instance, M: Mode> Hash<'d, T, M> {
353 let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8; 353 let num_valid_bits: u8 = (8 * (input.len() % 4)) as u8;
354 T::regs().str().modify(|w| w.set_nblw(num_valid_bits)); 354 T::regs().str().modify(|w| w.set_nblw(num_valid_bits));
355 355
356 let mut i = 0; 356 let mut chunks = input.chunks_exact(4);
357 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() {
358 let mut word: [u8; 4] = [0; 4]; 364 let mut word: [u8; 4] = [0; 4];
359 let copy_idx = min(i + 4, input.len()); 365 word[0..rem.len()].copy_from_slice(rem);
360 word[0..copy_idx - i].copy_from_slice(&input[i..copy_idx]);
361 T::regs().din().write_value(u32::from_ne_bytes(word)); 366 T::regs().din().write_value(u32::from_ne_bytes(word));
362 i += 4;
363 } 367 }
364 } 368 }
365 369