Skip to content

Commit fc434fb

Browse files
committed
docs are done
1 parent 56cb038 commit fc434fb

8 files changed

Lines changed: 481 additions & 257 deletions

File tree

boards/nucleo_u545re_q/src/main.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ unsafe fn start() -> (
183183
stm32u545::hash::sha256::Sha256Adapter::new(hash)
184184
);
185185

186+
// Adapter receives callbacks from the peripheral
186187
let _ = hash.set_sha256_adapter(sha256);
187188

188189
// Kernel and Muxes
@@ -264,6 +265,9 @@ unsafe fn start() -> (
264265
]
265266
);
266267

268+
// An example from STM32 RM0456 Reference manual
269+
//
270+
// “Sample message for keylen = blocklen”
267271
let hash_data_buffer = static_init!(
268272
[u8; 34],
269273
[

chips/stm32u5xx/src/hash/core_unit.rs

Lines changed: 311 additions & 110 deletions
Large diffs are not rendered by default.

chips/stm32u5xx/src/hash/md5.rs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33
// Copyright OxidOS Automotive 2026.
44

5+
//! MD5 adapter for the hash core.
6+
57
use kernel::hil::digest;
68
use kernel::utilities::cells::OptionalCell;
79
use kernel::ErrorCode;
@@ -50,7 +52,9 @@ impl Md5Adapter<'_> {
5052
result: Result<(), kernel::ErrorCode>,
5153
digest: &'static mut [u8],
5254
) {
53-
// terrible
55+
// terrible because of `unwrap()`
56+
//
57+
// TODO: handle conversion of references of arrays better
5458
self.client
5559
.map(|client| client.hash_done(result, digest.try_into().unwrap()));
5660
}
@@ -60,20 +64,21 @@ impl Md5Adapter<'_> {
6064
result: Result<bool, kernel::ErrorCode>,
6165
compare: &'static mut [u8],
6266
) {
63-
//terrible
67+
// terrible because of `unwrap()`
68+
//
69+
// TODO: handle conversion of references of arrays better
6470
self.client
6571
.map(|client| client.verification_done(result, compare.try_into().unwrap()));
6672
}
6773
}
6874

6975
impl<'a> digest::DigestData<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
7076
fn set_data_client(&'a self, client: &'a dyn kernel::hil::digest::ClientData<MD5_DIGEST_LEN>) {
71-
if let Some(HashClient::Single(_, hash, verify)) = self.client.get() {
77+
if let Some(HashClient::Split(_, hash, verify)) = self.client.get() {
7278
self.client
73-
.set(HashClient::Single(Some(client), hash, verify));
79+
.set(HashClient::Split(Some(client), hash, verify));
7480
} else {
75-
self.client
76-
.set(HashClient::Single(Some(client), None, None));
81+
self.client.set(HashClient::Split(Some(client), None, None));
7782
}
7883
}
7984

@@ -110,12 +115,11 @@ impl<'a> digest::DigestData<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
110115

111116
impl<'a> digest::DigestHash<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
112117
fn set_hash_client(&'a self, client: &'a dyn kernel::hil::digest::ClientHash<MD5_DIGEST_LEN>) {
113-
if let Some(HashClient::Single(data, _, verify)) = self.client.get() {
118+
if let Some(HashClient::Split(data, _, verify)) = self.client.get() {
114119
self.client
115-
.set(HashClient::Single(data, Some(client), verify));
120+
.set(HashClient::Split(data, Some(client), verify));
116121
} else {
117-
self.client
118-
.set(HashClient::Single(None, Some(client), None));
122+
self.client.set(HashClient::Split(None, Some(client), None));
119123
}
120124
}
121125

@@ -124,7 +128,9 @@ impl<'a> digest::DigestHash<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
124128
digest: &'static mut [u8; MD5_DIGEST_LEN],
125129
) -> Result<(), (kernel::ErrorCode, &'static mut [u8; MD5_DIGEST_LEN])> {
126130
self.hash.run(digest).map_err(|(e, buf)| {
127-
//terrible
131+
// terrible because of `unwrap()`
132+
//
133+
// TODO: handle conversion of references of arrays better
128134
let correct_buf: &'static mut [u8; MD5_DIGEST_LEN] = buf.try_into().unwrap();
129135
(e, correct_buf)
130136
})
@@ -136,12 +142,10 @@ impl<'a> digest::DigestVerify<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
136142
&'a self,
137143
client: &'a dyn kernel::hil::digest::ClientVerify<MD5_DIGEST_LEN>,
138144
) {
139-
if let Some(HashClient::Single(data, hash, _)) = self.client.get() {
140-
self.client
141-
.set(HashClient::Single(data, hash, Some(client)));
145+
if let Some(HashClient::Split(data, hash, _)) = self.client.get() {
146+
self.client.set(HashClient::Split(data, hash, Some(client)));
142147
} else {
143-
self.client
144-
.set(HashClient::Single(None, None, Some(client)));
148+
self.client.set(HashClient::Split(None, None, Some(client)));
145149
}
146150
}
147151

@@ -150,7 +154,9 @@ impl<'a> digest::DigestVerify<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
150154
compare: &'static mut [u8; MD5_DIGEST_LEN],
151155
) -> Result<(), (kernel::ErrorCode, &'static mut [u8; MD5_DIGEST_LEN])> {
152156
self.hash.verify(compare).map_err(|(e, buf)| {
153-
//terrible
157+
// terrible because of `unwrap()`
158+
//
159+
// TODO: handle conversion of references of arrays better
154160
let correct_buf: &'static mut [u8; MD5_DIGEST_LEN] = buf.try_into().unwrap();
155161
(e, correct_buf)
156162
})
@@ -159,19 +165,19 @@ impl<'a> digest::DigestVerify<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
159165

160166
impl<'a> digest::Digest<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
161167
fn set_client(&'a self, client: &'a dyn digest::Client<MD5_DIGEST_LEN>) {
162-
self.client.set(HashClient::Full(client));
168+
self.client.set(HashClient::AllInOne(client));
163169
}
164170
}
165171

166172
impl<'a> digest::DigestDataHash<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
167173
fn set_client(&'a self, client: &'a dyn digest::ClientDataHash<MD5_DIGEST_LEN>) {
168-
self.client.set(HashClient::DoubleHash(client));
174+
self.client.set(HashClient::DataHasher(client));
169175
}
170176
}
171177

172178
impl<'a> digest::DigestDataVerify<'a, MD5_DIGEST_LEN> for Md5Adapter<'a> {
173179
fn set_client(&'a self, client: &'a dyn digest::ClientDataVerify<MD5_DIGEST_LEN>) {
174-
self.client.set(HashClient::DoubleVerify(client));
180+
self.client.set(HashClient::DataVerifier(client));
175181
}
176182
}
177183

chips/stm32u5xx/src/hash/regs.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33
// Copyright OxidOS Automotive 2026.
44

5+
//! HASH registers.
6+
57
use kernel::utilities::{
68
registers::{register_bitfields, register_structs, ReadOnly, ReadWrite, WriteOnly},
79
StaticRef,

chips/stm32u5xx/src/hash/sha1.rs

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33
// Copyright OxidOS Automotive 2026.
44

5+
//! SHA1 adapter for the hash core.
6+
57
use kernel::hil::digest;
68
use kernel::utilities::cells::OptionalCell;
79
use kernel::ErrorCode;
@@ -50,7 +52,9 @@ impl Sha1Adapter<'_> {
5052
result: Result<(), kernel::ErrorCode>,
5153
digest: &'static mut [u8],
5254
) {
53-
// terrible
55+
// terrible because of `unwrap()`
56+
//
57+
// TODO: handle conversion of references of arrays better
5458
self.client
5559
.map(|client| client.hash_done(result, digest.try_into().unwrap()));
5660
}
@@ -60,20 +64,21 @@ impl Sha1Adapter<'_> {
6064
result: Result<bool, kernel::ErrorCode>,
6165
compare: &'static mut [u8],
6266
) {
63-
//terrible
67+
// terrible because of `unwrap()`
68+
//
69+
// TODO: handle conversion of references of arrays better
6470
self.client
6571
.map(|client| client.verification_done(result, compare.try_into().unwrap()));
6672
}
6773
}
6874

6975
impl<'a> digest::DigestData<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
7076
fn set_data_client(&'a self, client: &'a dyn kernel::hil::digest::ClientData<SHA1_DIGEST_LEN>) {
71-
if let Some(HashClient::Single(_, hash, verify)) = self.client.get() {
77+
if let Some(HashClient::Split(_, hash, verify)) = self.client.get() {
7278
self.client
73-
.set(HashClient::Single(Some(client), hash, verify));
79+
.set(HashClient::Split(Some(client), hash, verify));
7480
} else {
75-
self.client
76-
.set(HashClient::Single(Some(client), None, None));
81+
self.client.set(HashClient::Split(Some(client), None, None));
7782
}
7883
}
7984

@@ -101,9 +106,6 @@ impl<'a> digest::DigestData<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
101106
),
102107
> {
103108
self.hash.add_mut_data(data)
104-
105-
// self.hash
106-
// .map_or(Err((ErrorCode::FAIL, data)), |hash| hash.add_mut_data(data))
107109
}
108110

109111
fn clear_data(&self) {
@@ -113,12 +115,11 @@ impl<'a> digest::DigestData<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
113115

114116
impl<'a> digest::DigestHash<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
115117
fn set_hash_client(&'a self, client: &'a dyn kernel::hil::digest::ClientHash<SHA1_DIGEST_LEN>) {
116-
if let Some(HashClient::Single(data, _, verify)) = self.client.get() {
118+
if let Some(HashClient::Split(data, _, verify)) = self.client.get() {
117119
self.client
118-
.set(HashClient::Single(data, Some(client), verify));
120+
.set(HashClient::Split(data, Some(client), verify));
119121
} else {
120-
self.client
121-
.set(HashClient::Single(None, Some(client), None));
122+
self.client.set(HashClient::Split(None, Some(client), None));
122123
}
123124
}
124125

@@ -127,13 +128,12 @@ impl<'a> digest::DigestHash<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
127128
digest: &'static mut [u8; SHA1_DIGEST_LEN],
128129
) -> Result<(), (kernel::ErrorCode, &'static mut [u8; SHA1_DIGEST_LEN])> {
129130
self.hash.run(digest).map_err(|(e, buf)| {
130-
//terrible
131+
// terrible because of `unwrap()`
132+
//
133+
// TODO: handle conversion of references of arrays better
131134
let correct_buf: &'static mut [u8; SHA1_DIGEST_LEN] = buf.try_into().unwrap();
132135
(e, correct_buf)
133136
})
134-
135-
// self.hash
136-
// .map(|hash| hash.run(digest).inspect_err(|(e, buf)| {}))
137137
}
138138
}
139139

@@ -142,12 +142,10 @@ impl<'a> digest::DigestVerify<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
142142
&'a self,
143143
client: &'a dyn kernel::hil::digest::ClientVerify<SHA1_DIGEST_LEN>,
144144
) {
145-
if let Some(HashClient::Single(data, hash, _)) = self.client.get() {
146-
self.client
147-
.set(HashClient::Single(data, hash, Some(client)));
145+
if let Some(HashClient::Split(data, hash, _)) = self.client.get() {
146+
self.client.set(HashClient::Split(data, hash, Some(client)));
148147
} else {
149-
self.client
150-
.set(HashClient::Single(None, None, Some(client)));
148+
self.client.set(HashClient::Split(None, None, Some(client)));
151149
}
152150
}
153151

@@ -156,34 +154,30 @@ impl<'a> digest::DigestVerify<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
156154
compare: &'static mut [u8; SHA1_DIGEST_LEN],
157155
) -> Result<(), (kernel::ErrorCode, &'static mut [u8; SHA1_DIGEST_LEN])> {
158156
self.hash.verify(compare).map_err(|(e, buf)| {
159-
//terrible
157+
// terrible because of `unwrap()`
158+
//
159+
// TODO: handle conversion of references of arrays better
160160
let correct_buf: &'static mut [u8; SHA1_DIGEST_LEN] = buf.try_into().unwrap();
161161
(e, correct_buf)
162162
})
163-
164-
// self.hash.verify(compare).map_err(|(error, buf)| {
165-
// // terrible
166-
// let correct_buf: &'static mut [u8; 32] = buf.try_into().unwrap();
167-
// (error, correct_buf)
168-
// })
169163
}
170164
}
171165

172166
impl<'a> digest::Digest<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
173167
fn set_client(&'a self, client: &'a dyn digest::Client<SHA1_DIGEST_LEN>) {
174-
self.client.set(HashClient::Full(client));
168+
self.client.set(HashClient::AllInOne(client));
175169
}
176170
}
177171

178172
impl<'a> digest::DigestDataHash<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
179173
fn set_client(&'a self, client: &'a dyn digest::ClientDataHash<SHA1_DIGEST_LEN>) {
180-
self.client.set(HashClient::DoubleHash(client));
174+
self.client.set(HashClient::DataHasher(client));
181175
}
182176
}
183177

184178
impl<'a> digest::DigestDataVerify<'a, SHA1_DIGEST_LEN> for Sha1Adapter<'a> {
185179
fn set_client(&'a self, client: &'a dyn digest::ClientDataVerify<SHA1_DIGEST_LEN>) {
186-
self.client.set(HashClient::DoubleVerify(client));
180+
self.client.set(HashClient::DataVerifier(client));
187181
}
188182
}
189183

0 commit comments

Comments
 (0)