1 /**
2 ******************************************************************************
3 * @file stm32f4xx_hal_hash_ex.c
4 * @author MCD Application Team
5 * @brief Extended HASH HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the HASH peripheral for SHA-224 and SHA-256
8 * algorithms:
9 * + HASH or HMAC processing in polling mode
10 * + HASH or HMAC processing in interrupt mode
11 * + HASH or HMAC processing in DMA mode
12 * Additionally, this file provides functions to manage HMAC
13 * multi-buffer DMA-based processing for MD-5, SHA-1, SHA-224
14 * and SHA-256.
15 *
16 *
17 ******************************************************************************
18 * @attention
19 *
20 * Copyright (c) 2016 STMicroelectronics.
21 * All rights reserved.
22 *
23 * This software is licensed under terms that can be found in the LICENSE file
24 * in the root directory of this software component.
25 * If no LICENSE file comes with this software, it is provided AS-IS.
26 *
27 ******************************************************************************
28 @verbatim
29 ===============================================================================
30 ##### HASH peripheral extended features #####
31 ===============================================================================
32 [..]
33 The SHA-224 and SHA-256 HASH and HMAC processing can be carried out exactly
34 the same way as for SHA-1 or MD-5 algorithms.
35 (#) Three modes are available.
36 (##) Polling mode: processing APIs are blocking functions
37 i.e. they process the data and wait till the digest computation is finished,
38 e.g. HAL_HASHEx_xxx_Start()
39 (##) Interrupt mode: processing APIs are not blocking functions
40 i.e. they process the data under interrupt,
41 e.g. HAL_HASHEx_xxx_Start_IT()
42 (##) DMA mode: processing APIs are not blocking functions and the CPU is
43 not used for data transfer i.e. the data transfer is ensured by DMA,
44 e.g. HAL_HASHEx_xxx_Start_DMA(). Note that in DMA mode, a call to
45 HAL_HASHEx_xxx_Finish() is then required to retrieve the digest.
46
47 (#)Multi-buffer processing is possible in polling, interrupt and DMA modes.
48 (##) In polling mode, only multi-buffer HASH processing is possible.
49 API HAL_HASHEx_xxx_Accumulate() must be called for each input buffer, except for the last one.
50 User must resort to HAL_HASHEx_xxx_Accumulate_End() to enter the last one and retrieve as
51 well the computed digest.
52
53 (##) In interrupt mode, API HAL_HASHEx_xxx_Accumulate_IT() must be called for each input buffer,
54 except for the last one.
55 User must resort to HAL_HASHEx_xxx_Accumulate_End_IT() to enter the last one and retrieve as
56 well the computed digest.
57
58 (##) In DMA mode, multi-buffer HASH and HMAC processing are possible.
59
60 (+++) HASH processing: once initialization is done, MDMAT bit must be set through
61 __HAL_HASH_SET_MDMAT() macro.
62 From that point, each buffer can be fed to the Peripheral through HAL_HASHEx_xxx_Start_DMA() API.
63 Before entering the last buffer, reset the MDMAT bit with __HAL_HASH_RESET_MDMAT()
64 macro then wrap-up the HASH processing in feeding the last input buffer through the
65 same API HAL_HASHEx_xxx_Start_DMA(). The digest can then be retrieved with a call to
66 API HAL_HASHEx_xxx_Finish().
67
68 (+++) HMAC processing (MD-5, SHA-1, SHA-224 and SHA-256 must all resort to
69 extended functions): after initialization, the key and the first input buffer are entered
70 in the Peripheral with the API HAL_HMACEx_xxx_Step1_2_DMA(). This carries out HMAC step 1 and
71 starts step 2.
72 The following buffers are next entered with the API HAL_HMACEx_xxx_Step2_DMA(). At this
73 point, the HMAC processing is still carrying out step 2.
74 Then, step 2 for the last input buffer and step 3 are carried out by a single call
75 to HAL_HMACEx_xxx_Step2_3_DMA().
76
77 The digest can finally be retrieved with a call to API HAL_HASH_xxx_Finish() for
78 MD-5 and SHA-1, to HAL_HASHEx_xxx_Finish() for SHA-224 and SHA-256.
79
80
81 @endverbatim
82 ******************************************************************************
83 */
84
85 /* Includes ------------------------------------------------------------------*/
86 #include "stm32f4xx_hal.h"
87
88
89
90
91 /** @addtogroup STM32F4xx_HAL_Driver
92 * @{
93 */
94 #if defined (HASH)
95
96 /** @defgroup HASHEx HASHEx
97 * @brief HASH HAL extended module driver.
98 * @{
99 */
100 #ifdef HAL_HASH_MODULE_ENABLED
101 /* Private typedef -----------------------------------------------------------*/
102 /* Private define ------------------------------------------------------------*/
103 /* Private functions ---------------------------------------------------------*/
104 #if defined (HASH_CR_MDMAT)
105
106 /** @defgroup HASHEx_Exported_Functions HASH Extended Exported Functions
107 * @{
108 */
109
110 /** @defgroup HASHEx_Exported_Functions_Group1 HASH extended processing functions in polling mode
111 * @brief HASH extended processing functions using polling mode.
112 *
113 @verbatim
114 ===============================================================================
115 ##### Polling mode HASH extended processing functions #####
116 ===============================================================================
117 [..] This section provides functions allowing to calculate in polling mode
118 the hash value using one of the following algorithms:
119 (+) SHA224
120 (++) HAL_HASHEx_SHA224_Start()
121 (++) HAL_HASHEx_SHA224_Accmlt()
122 (++) HAL_HASHEx_SHA224_Accmlt_End()
123 (+) SHA256
124 (++) HAL_HASHEx_SHA256_Start()
125 (++) HAL_HASHEx_SHA256_Accmlt()
126 (++) HAL_HASHEx_SHA256_Accmlt_End()
127
128 [..] For a single buffer to be hashed, user can resort to HAL_HASH_xxx_Start().
129
130 [..] In case of multi-buffer HASH processing (a single digest is computed while
131 several buffers are fed to the Peripheral), the user can resort to successive calls
132 to HAL_HASHEx_xxx_Accumulate() and wrap-up the digest computation by a call
133 to HAL_HASHEx_xxx_Accumulate_End().
134
135 @endverbatim
136 * @{
137 */
138
139
140 /**
141 * @brief Initialize the HASH peripheral in SHA224 mode, next process pInBuffer then
142 * read the computed digest.
143 * @note Digest is available in pOutBuffer.
144 * @param hhash HASH handle.
145 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
146 * @param Size length of the input buffer in bytes.
147 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
148 * @param Timeout Timeout value
149 * @retval HAL status
150 */
HAL_HASHEx_SHA224_Start(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)151 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
152 uint8_t *pOutBuffer, uint32_t Timeout)
153 {
154 return HASH_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA224);
155 }
156
157 /**
158 * @brief If not already done, initialize the HASH peripheral in SHA224 mode then
159 * processes pInBuffer.
160 * @note Consecutive calls to HAL_HASHEx_SHA224_Accmlt() can be used to feed
161 * several input buffers back-to-back to the Peripheral that will yield a single
162 * HASH signature once all buffers have been entered. Wrap-up of input
163 * buffers feeding and retrieval of digest is done by a call to
164 * HAL_HASHEx_SHA224_Accmlt_End().
165 * @note Field hhash->Phase of HASH handle is tested to check whether or not
166 * the Peripheral has already been initialized.
167 * @note Digest is not retrieved by this API, user must resort to HAL_HASHEx_SHA224_Accmlt_End()
168 * to read it, feeding at the same time the last input buffer to the Peripheral.
169 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
170 * HASH digest computation is corrupted. Only HAL_HASHEx_SHA224_Accmlt_End() is able
171 * to manage the ending buffer with a length in bytes not a multiple of 4.
172 * @param hhash HASH handle.
173 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
174 * @param Size length of the input buffer in bytes, must be a multiple of 4.
175 * @retval HAL status
176 */
HAL_HASHEx_SHA224_Accmlt(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)177 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accmlt(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
178 {
179 return HASH_Accumulate(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
180 }
181
182 /**
183 * @brief End computation of a single HASH signature after several calls to HAL_HASHEx_SHA224_Accmlt() API.
184 * @note Digest is available in pOutBuffer.
185 * @param hhash HASH handle.
186 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
187 * @param Size length of the input buffer in bytes.
188 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
189 * @param Timeout Timeout value
190 * @retval HAL status
191 */
HAL_HASHEx_SHA224_Accmlt_End(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)192 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accmlt_End(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
193 uint8_t *pOutBuffer, uint32_t Timeout)
194 {
195 return HASH_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA224);
196 }
197
198 /**
199 * @brief Initialize the HASH peripheral in SHA256 mode, next process pInBuffer then
200 * read the computed digest.
201 * @note Digest is available in pOutBuffer.
202 * @param hhash HASH handle.
203 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
204 * @param Size length of the input buffer in bytes.
205 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
206 * @param Timeout Timeout value
207 * @retval HAL status
208 */
HAL_HASHEx_SHA256_Start(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)209 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
210 uint8_t *pOutBuffer, uint32_t Timeout)
211 {
212 return HASH_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA256);
213 }
214
215 /**
216 * @brief If not already done, initialize the HASH peripheral in SHA256 mode then
217 * processes pInBuffer.
218 * @note Consecutive calls to HAL_HASHEx_SHA256_Accmlt() can be used to feed
219 * several input buffers back-to-back to the Peripheral that will yield a single
220 * HASH signature once all buffers have been entered. Wrap-up of input
221 * buffers feeding and retrieval of digest is done by a call to
222 * HAL_HASHEx_SHA256_Accmlt_End().
223 * @note Field hhash->Phase of HASH handle is tested to check whether or not
224 * the Peripheral has already been initialized.
225 * @note Digest is not retrieved by this API, user must resort to HAL_HASHEx_SHA256_Accmlt_End()
226 * to read it, feeding at the same time the last input buffer to the Peripheral.
227 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
228 * HASH digest computation is corrupted. Only HAL_HASHEx_SHA256_Accmlt_End() is able
229 * to manage the ending buffer with a length in bytes not a multiple of 4.
230 * @param hhash HASH handle.
231 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
232 * @param Size length of the input buffer in bytes, must be a multiple of 4.
233 * @retval HAL status
234 */
HAL_HASHEx_SHA256_Accmlt(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)235 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accmlt(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
236 {
237 return HASH_Accumulate(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
238 }
239
240 /**
241 * @brief End computation of a single HASH signature after several calls to HAL_HASHEx_SHA256_Accmlt() API.
242 * @note Digest is available in pOutBuffer.
243 * @param hhash HASH handle.
244 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
245 * @param Size length of the input buffer in bytes.
246 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
247 * @param Timeout Timeout value
248 * @retval HAL status
249 */
HAL_HASHEx_SHA256_Accmlt_End(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)250 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accmlt_End(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
251 uint8_t *pOutBuffer, uint32_t Timeout)
252 {
253 return HASH_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA256);
254 }
255
256 /**
257 * @}
258 */
259
260 /** @defgroup HASHEx_Exported_Functions_Group2 HASH extended processing functions in interrupt mode
261 * @brief HASH extended processing functions using interrupt mode.
262 *
263 @verbatim
264 ===============================================================================
265 ##### Interruption mode HASH extended processing functions #####
266 ===============================================================================
267 [..] This section provides functions allowing to calculate in interrupt mode
268 the hash value using one of the following algorithms:
269 (+) SHA224
270 (++) HAL_HASHEx_SHA224_Start_IT()
271 (++) HAL_HASHEx_SHA224_Accmlt_IT()
272 (++) HAL_HASHEx_SHA224_Accmlt_End_IT()
273 (+) SHA256
274 (++) HAL_HASHEx_SHA256_Start_IT()
275 (++) HAL_HASHEx_SHA256_Accmlt_IT()
276 (++) HAL_HASHEx_SHA256_Accmlt_End_IT()
277
278 @endverbatim
279 * @{
280 */
281
282
283 /**
284 * @brief Initialize the HASH peripheral in SHA224 mode, next process pInBuffer then
285 * read the computed digest in interruption mode.
286 * @note Digest is available in pOutBuffer.
287 * @param hhash HASH handle.
288 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
289 * @param Size length of the input buffer in bytes.
290 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
291 * @retval HAL status
292 */
HAL_HASHEx_SHA224_Start_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)293 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
294 uint8_t *pOutBuffer)
295 {
296 return HASH_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA224);
297 }
298
299 /**
300 * @brief If not already done, initialize the HASH peripheral in SHA224 mode then
301 * processes pInBuffer in interruption mode.
302 * @note Consecutive calls to HAL_HASHEx_SHA224_Accmlt_IT() can be used to feed
303 * several input buffers back-to-back to the Peripheral that will yield a single
304 * HASH signature once all buffers have been entered. Wrap-up of input
305 * buffers feeding and retrieval of digest is done by a call to
306 * HAL_HASHEx_SHA224_Accmlt_End_IT().
307 * @note Field hhash->Phase of HASH handle is tested to check whether or not
308 * the Peripheral has already been initialized.
309 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
310 * HASH digest computation is corrupted. Only HAL_HASHEx_SHA224_Accmlt_End_IT() is able
311 * to manage the ending buffer with a length in bytes not a multiple of 4.
312 * @param hhash HASH handle.
313 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
314 * @param Size length of the input buffer in bytes, must be a multiple of 4.
315 * @retval HAL status
316 */
HAL_HASHEx_SHA224_Accmlt_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)317 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accmlt_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
318 {
319 return HASH_Accumulate_IT(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
320 }
321
322 /**
323 * @brief End computation of a single HASH signature after several calls to HAL_HASHEx_SHA224_Accmlt_IT() API.
324 * @note Digest is available in pOutBuffer.
325 * @param hhash HASH handle.
326 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
327 * @param Size length of the input buffer in bytes.
328 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
329 * @retval HAL status
330 */
HAL_HASHEx_SHA224_Accmlt_End_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)331 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accmlt_End_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
332 uint8_t *pOutBuffer)
333 {
334 return HASH_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA224);
335 }
336
337 /**
338 * @brief Initialize the HASH peripheral in SHA256 mode, next process pInBuffer then
339 * read the computed digest in interruption mode.
340 * @note Digest is available in pOutBuffer.
341 * @param hhash HASH handle.
342 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
343 * @param Size length of the input buffer in bytes.
344 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
345 * @retval HAL status
346 */
HAL_HASHEx_SHA256_Start_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)347 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
348 uint8_t *pOutBuffer)
349 {
350 return HASH_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA256);
351 }
352
353 /**
354 * @brief If not already done, initialize the HASH peripheral in SHA256 mode then
355 * processes pInBuffer in interruption mode.
356 * @note Consecutive calls to HAL_HASHEx_SHA256_Accmlt_IT() can be used to feed
357 * several input buffers back-to-back to the Peripheral that will yield a single
358 * HASH signature once all buffers have been entered. Wrap-up of input
359 * buffers feeding and retrieval of digest is done by a call to
360 * HAL_HASHEx_SHA256_Accmlt_End_IT().
361 * @note Field hhash->Phase of HASH handle is tested to check whether or not
362 * the Peripheral has already been initialized.
363 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
364 * HASH digest computation is corrupted. Only HAL_HASHEx_SHA256_Accmlt_End_IT() is able
365 * to manage the ending buffer with a length in bytes not a multiple of 4.
366 * @param hhash HASH handle.
367 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
368 * @param Size length of the input buffer in bytes, must be a multiple of 4.
369 * @retval HAL status
370 */
HAL_HASHEx_SHA256_Accmlt_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)371 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accmlt_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
372 {
373 return HASH_Accumulate_IT(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
374 }
375
376 /**
377 * @brief End computation of a single HASH signature after several calls to HAL_HASHEx_SHA256_Accmlt_IT() API.
378 * @note Digest is available in pOutBuffer.
379 * @param hhash HASH handle.
380 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
381 * @param Size length of the input buffer in bytes.
382 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
383 * @retval HAL status
384 */
HAL_HASHEx_SHA256_Accmlt_End_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)385 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accmlt_End_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
386 uint8_t *pOutBuffer)
387 {
388 return HASH_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA256);
389 }
390
391 /**
392 * @}
393 */
394
395 /** @defgroup HASHEx_Exported_Functions_Group3 HASH extended processing functions in DMA mode
396 * @brief HASH extended processing functions using DMA mode.
397 *
398 @verbatim
399 ===============================================================================
400 ##### DMA mode HASH extended processing functions #####
401 ===============================================================================
402 [..] This section provides functions allowing to calculate in DMA mode
403 the hash value using one of the following algorithms:
404 (+) SHA224
405 (++) HAL_HASHEx_SHA224_Start_DMA()
406 (++) HAL_HASHEx_SHA224_Finish()
407 (+) SHA256
408 (++) HAL_HASHEx_SHA256_Start_DMA()
409 (++) HAL_HASHEx_SHA256_Finish()
410
411 [..] When resorting to DMA mode to enter the data in the Peripheral, user must resort
412 to HAL_HASHEx_xxx_Start_DMA() then read the resulting digest with
413 HAL_HASHEx_xxx_Finish().
414
415 [..] In case of multi-buffer HASH processing, MDMAT bit must first be set before
416 the successive calls to HAL_HASHEx_xxx_Start_DMA(). Then, MDMAT bit needs to be
417 reset before the last call to HAL_HASHEx_xxx_Start_DMA(). Digest is finally
418 retrieved thanks to HAL_HASHEx_xxx_Finish().
419
420 @endverbatim
421 * @{
422 */
423
424
425
426
427 /**
428 * @brief Initialize the HASH peripheral in SHA224 mode then initiate a DMA transfer
429 * to feed the input buffer to the Peripheral.
430 * @note Once the DMA transfer is finished, HAL_HASHEx_SHA224_Finish() API must
431 * be called to retrieve the computed digest.
432 * @param hhash HASH handle.
433 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
434 * @param Size length of the input buffer in bytes.
435 * @retval HAL status
436 */
HAL_HASHEx_SHA224_Start_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)437 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
438 {
439 return HASH_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
440 }
441
442 /**
443 * @brief Return the computed digest in SHA224 mode.
444 * @note The API waits for DCIS to be set then reads the computed digest.
445 * @note HAL_HASHEx_SHA224_Finish() can be used as well to retrieve the digest in
446 * HMAC SHA224 mode.
447 * @param hhash HASH handle.
448 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
449 * @param Timeout Timeout value.
450 * @retval HAL status
451 */
HAL_HASHEx_SHA224_Finish(HASH_HandleTypeDef * hhash,uint8_t * pOutBuffer,uint32_t Timeout)452 HAL_StatusTypeDef HAL_HASHEx_SHA224_Finish(HASH_HandleTypeDef *hhash, uint8_t *pOutBuffer, uint32_t Timeout)
453 {
454 return HASH_Finish(hhash, pOutBuffer, Timeout);
455 }
456
457 /**
458 * @brief Initialize the HASH peripheral in SHA256 mode then initiate a DMA transfer
459 * to feed the input buffer to the Peripheral.
460 * @note Once the DMA transfer is finished, HAL_HASHEx_SHA256_Finish() API must
461 * be called to retrieve the computed digest.
462 * @param hhash HASH handle.
463 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
464 * @param Size length of the input buffer in bytes.
465 * @retval HAL status
466 */
HAL_HASHEx_SHA256_Start_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)467 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
468 {
469 return HASH_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
470 }
471
472 /**
473 * @brief Return the computed digest in SHA256 mode.
474 * @note The API waits for DCIS to be set then reads the computed digest.
475 * @note HAL_HASHEx_SHA256_Finish() can be used as well to retrieve the digest in
476 * HMAC SHA256 mode.
477 * @param hhash HASH handle.
478 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
479 * @param Timeout Timeout value.
480 * @retval HAL status
481 */
HAL_HASHEx_SHA256_Finish(HASH_HandleTypeDef * hhash,uint8_t * pOutBuffer,uint32_t Timeout)482 HAL_StatusTypeDef HAL_HASHEx_SHA256_Finish(HASH_HandleTypeDef *hhash, uint8_t *pOutBuffer, uint32_t Timeout)
483 {
484 return HASH_Finish(hhash, pOutBuffer, Timeout);
485 }
486
487 /**
488 * @}
489 */
490
491 /** @defgroup HASHEx_Exported_Functions_Group4 HMAC extended processing functions in polling mode
492 * @brief HMAC extended processing functions using polling mode.
493 *
494 @verbatim
495 ===============================================================================
496 ##### Polling mode HMAC extended processing functions #####
497 ===============================================================================
498 [..] This section provides functions allowing to calculate in polling mode
499 the HMAC value using one of the following algorithms:
500 (+) SHA224
501 (++) HAL_HMACEx_SHA224_Start()
502 (+) SHA256
503 (++) HAL_HMACEx_SHA256_Start()
504
505 @endverbatim
506 * @{
507 */
508
509
510
511 /**
512 * @brief Initialize the HASH peripheral in HMAC SHA224 mode, next process pInBuffer then
513 * read the computed digest.
514 * @note Digest is available in pOutBuffer.
515 * @note Same key is used for the inner and the outer hash functions; pointer to key and
516 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
517 * @param hhash HASH handle.
518 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
519 * @param Size length of the input buffer in bytes.
520 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
521 * @param Timeout Timeout value.
522 * @retval HAL status
523 */
HAL_HMACEx_SHA224_Start(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)524 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
525 uint8_t *pOutBuffer, uint32_t Timeout)
526 {
527 return HMAC_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA224);
528 }
529
530 /**
531 * @brief Initialize the HASH peripheral in HMAC SHA256 mode, next process pInBuffer then
532 * read the computed digest.
533 * @note Digest is available in pOutBuffer.
534 * @note Same key is used for the inner and the outer hash functions; pointer to key and
535 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
536 * @param hhash HASH handle.
537 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
538 * @param Size length of the input buffer in bytes.
539 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
540 * @param Timeout Timeout value.
541 * @retval HAL status
542 */
HAL_HMACEx_SHA256_Start(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer,uint32_t Timeout)543 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
544 uint8_t *pOutBuffer, uint32_t Timeout)
545 {
546 return HMAC_Start(hhash, pInBuffer, Size, pOutBuffer, Timeout, HASH_ALGOSELECTION_SHA256);
547 }
548
549 /**
550 * @}
551 */
552
553
554 /** @defgroup HASHEx_Exported_Functions_Group5 HMAC extended processing functions in interrupt mode
555 * @brief HMAC extended processing functions using interruption mode.
556 *
557 @verbatim
558 ===============================================================================
559 ##### Interrupt mode HMAC extended processing functions #####
560 ===============================================================================
561 [..] This section provides functions allowing to calculate in interrupt mode
562 the HMAC value using one of the following algorithms:
563 (+) SHA224
564 (++) HAL_HMACEx_SHA224_Start_IT()
565 (+) SHA256
566 (++) HAL_HMACEx_SHA256_Start_IT()
567
568 @endverbatim
569 * @{
570 */
571
572
573
574 /**
575 * @brief Initialize the HASH peripheral in HMAC SHA224 mode, next process pInBuffer then
576 * read the computed digest in interrupt mode.
577 * @note Digest is available in pOutBuffer.
578 * @note Same key is used for the inner and the outer hash functions; pointer to key and
579 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
580 * @param hhash HASH handle.
581 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
582 * @param Size length of the input buffer in bytes.
583 * @param pOutBuffer pointer to the computed digest. Digest size is 28 bytes.
584 * @retval HAL status
585 */
HAL_HMACEx_SHA224_Start_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)586 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
587 uint8_t *pOutBuffer)
588 {
589 return HMAC_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA224);
590 }
591
592 /**
593 * @brief Initialize the HASH peripheral in HMAC SHA256 mode, next process pInBuffer then
594 * read the computed digest in interrupt mode.
595 * @note Digest is available in pOutBuffer.
596 * @note Same key is used for the inner and the outer hash functions; pointer to key and
597 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
598 * @param hhash HASH handle.
599 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
600 * @param Size length of the input buffer in bytes.
601 * @param pOutBuffer pointer to the computed digest. Digest size is 32 bytes.
602 * @retval HAL status
603 */
HAL_HMACEx_SHA256_Start_IT(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size,uint8_t * pOutBuffer)604 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size,
605 uint8_t *pOutBuffer)
606 {
607 return HMAC_Start_IT(hhash, pInBuffer, Size, pOutBuffer, HASH_ALGOSELECTION_SHA256);
608 }
609
610
611
612
613 /**
614 * @}
615 */
616
617
618 /** @defgroup HASHEx_Exported_Functions_Group6 HMAC extended processing functions in DMA mode
619 * @brief HMAC extended processing functions using DMA mode.
620 *
621 @verbatim
622 ===============================================================================
623 ##### DMA mode HMAC extended processing functions #####
624 ===============================================================================
625 [..] This section provides functions allowing to calculate in DMA mode
626 the HMAC value using one of the following algorithms:
627 (+) SHA224
628 (++) HAL_HMACEx_SHA224_Start_DMA()
629 (+) SHA256
630 (++) HAL_HMACEx_SHA256_Start_DMA()
631
632 [..] When resorting to DMA mode to enter the data in the Peripheral for HMAC processing,
633 user must resort to HAL_HMACEx_xxx_Start_DMA() then read the resulting digest
634 with HAL_HASHEx_xxx_Finish().
635
636
637 @endverbatim
638 * @{
639 */
640
641
642
643 /**
644 * @brief Initialize the HASH peripheral in HMAC SHA224 mode then initiate the required
645 * DMA transfers to feed the key and the input buffer to the Peripheral.
646 * @note Once the DMA transfers are finished (indicated by hhash->State set back
647 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA224_Finish() API must be called to retrieve
648 * the computed digest.
649 * @note Same key is used for the inner and the outer hash functions; pointer to key and
650 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
651 * @note If MDMAT bit is set before calling this function (multi-buffer
652 * HASH processing case), the input buffer size (in bytes) must be
653 * a multiple of 4 otherwise, the HASH digest computation is corrupted.
654 * For the processing of the last buffer of the thread, MDMAT bit must
655 * be reset and the buffer length (in bytes) doesn't have to be a
656 * multiple of 4.
657 * @param hhash HASH handle.
658 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
659 * @param Size length of the input buffer in bytes.
660 * @retval HAL status
661 */
HAL_HMACEx_SHA224_Start_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)662 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
663 {
664 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
665 }
666
667 /**
668 * @brief Initialize the HASH peripheral in HMAC SHA224 mode then initiate the required
669 * DMA transfers to feed the key and the input buffer to the Peripheral.
670 * @note Once the DMA transfers are finished (indicated by hhash->State set back
671 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA256_Finish() API must be called to retrieve
672 * the computed digest.
673 * @note Same key is used for the inner and the outer hash functions; pointer to key and
674 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
675 * @note If MDMAT bit is set before calling this function (multi-buffer
676 * HASH processing case), the input buffer size (in bytes) must be
677 * a multiple of 4 otherwise, the HASH digest computation is corrupted.
678 * For the processing of the last buffer of the thread, MDMAT bit must
679 * be reset and the buffer length (in bytes) doesn't have to be a
680 * multiple of 4.
681 * @param hhash HASH handle.
682 * @param pInBuffer pointer to the input buffer (buffer to be hashed).
683 * @param Size length of the input buffer in bytes.
684 * @retval HAL status
685 */
HAL_HMACEx_SHA256_Start_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)686 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
687 {
688 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
689 }
690
691
692 /**
693 * @}
694 */
695
696 /** @defgroup HASHEx_Exported_Functions_Group7 Multi-buffer HMAC extended processing functions in DMA mode
697 * @brief HMAC extended processing functions in multi-buffer DMA mode.
698 *
699 @verbatim
700 ===============================================================================
701 ##### Multi-buffer DMA mode HMAC extended processing functions #####
702 ===============================================================================
703 [..] This section provides functions to manage HMAC multi-buffer
704 DMA-based processing for MD5, SHA1, SHA224 and SHA256 algorithms.
705 (+) MD5
706 (++) HAL_HMACEx_MD5_Step1_2_DMA()
707 (++) HAL_HMACEx_MD5_Step2_DMA()
708 (++) HAL_HMACEx_MD5_Step2_3_DMA()
709 (+) SHA1
710 (++) HAL_HMACEx_SHA1_Step1_2_DMA()
711 (++) HAL_HMACEx_SHA1_Step2_DMA()
712 (++) HAL_HMACEx_SHA1_Step2_3_DMA()
713
714 (+) SHA256
715 (++) HAL_HMACEx_SHA224_Step1_2_DMA()
716 (++) HAL_HMACEx_SHA224_Step2_DMA()
717 (++) HAL_HMACEx_SHA224_Step2_3_DMA()
718 (+) SHA256
719 (++) HAL_HMACEx_SHA256_Step1_2_DMA()
720 (++) HAL_HMACEx_SHA256_Step2_DMA()
721 (++) HAL_HMACEx_SHA256_Step2_3_DMA()
722
723 [..] User must first start-up the multi-buffer DMA-based HMAC computation in
724 calling HAL_HMACEx_xxx_Step1_2_DMA(). This carries out HMAC step 1 and
725 intiates step 2 with the first input buffer.
726
727 [..] The following buffers are next fed to the Peripheral with a call to the API
728 HAL_HMACEx_xxx_Step2_DMA(). There may be several consecutive calls
729 to this API.
730
731 [..] Multi-buffer DMA-based HMAC computation is wrapped up by a call to
732 HAL_HMACEx_xxx_Step2_3_DMA(). This finishes step 2 in feeding the last input
733 buffer to the Peripheral then carries out step 3.
734
735 [..] Digest is retrieved by a call to HAL_HASH_xxx_Finish() for MD-5 or
736 SHA-1, to HAL_HASHEx_xxx_Finish() for SHA-224 or SHA-256.
737
738 [..] If only two buffers need to be consecutively processed, a call to
739 HAL_HMACEx_xxx_Step1_2_DMA() followed by a call to HAL_HMACEx_xxx_Step2_3_DMA()
740 is sufficient.
741
742 @endverbatim
743 * @{
744 */
745
746 /**
747 * @brief MD5 HMAC step 1 completion and step 2 start in multi-buffer DMA mode.
748 * @note Step 1 consists in writing the inner hash function key in the Peripheral,
749 * step 2 consists in writing the message text.
750 * @note The API carries out the HMAC step 1 then starts step 2 with
751 * the first buffer entered to the Peripheral. DCAL bit is not automatically set after
752 * the message buffer feeding, allowing other messages DMA transfers to occur.
753 * @note Same key is used for the inner and the outer hash functions; pointer to key and
754 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
755 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
756 * HASH digest computation is corrupted.
757 * @param hhash HASH handle.
758 * @param pInBuffer pointer to the input buffer (message buffer).
759 * @param Size length of the input buffer in bytes.
760 * @retval HAL status
761 */
HAL_HMACEx_MD5_Step1_2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)762 HAL_StatusTypeDef HAL_HMACEx_MD5_Step1_2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
763 {
764 hhash->DigestCalculationDisable = SET;
765 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_MD5);
766 }
767
768 /**
769 * @brief MD5 HMAC step 2 in multi-buffer DMA mode.
770 * @note Step 2 consists in writing the message text in the Peripheral.
771 * @note The API carries on the HMAC step 2, applied to the buffer entered as input
772 * parameter. DCAL bit is not automatically set after the message buffer feeding,
773 * allowing other messages DMA transfers to occur.
774 * @note Same key is used for the inner and the outer hash functions; pointer to key and
775 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
776 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
777 * HASH digest computation is corrupted.
778 * @param hhash HASH handle.
779 * @param pInBuffer pointer to the input buffer (message buffer).
780 * @param Size length of the input buffer in bytes.
781 * @retval HAL status
782 */
HAL_HMACEx_MD5_Step2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)783 HAL_StatusTypeDef HAL_HMACEx_MD5_Step2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
784 {
785 if (hhash->DigestCalculationDisable != SET)
786 {
787 return HAL_ERROR;
788 }
789 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_MD5);
790 }
791
792 /**
793 * @brief MD5 HMAC step 2 wrap-up and step 3 completion in multi-buffer DMA mode.
794 * @note Step 2 consists in writing the message text in the Peripheral,
795 * step 3 consists in writing the outer hash function key.
796 * @note The API wraps up the HMAC step 2 in processing the buffer entered as input
797 * parameter (the input buffer must be the last one of the multi-buffer thread)
798 * then carries out HMAC step 3.
799 * @note Same key is used for the inner and the outer hash functions; pointer to key and
800 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
801 * @note Once the DMA transfers are finished (indicated by hhash->State set back
802 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA256_Finish() API must be called to retrieve
803 * the computed digest.
804 * @param hhash HASH handle.
805 * @param pInBuffer pointer to the input buffer (message buffer).
806 * @param Size length of the input buffer in bytes.
807 * @retval HAL status
808 */
HAL_HMACEx_MD5_Step2_3_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)809 HAL_StatusTypeDef HAL_HMACEx_MD5_Step2_3_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
810 {
811 hhash->DigestCalculationDisable = RESET;
812 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_MD5);
813 }
814
815
816 /**
817 * @brief SHA1 HMAC step 1 completion and step 2 start in multi-buffer DMA mode.
818 * @note Step 1 consists in writing the inner hash function key in the Peripheral,
819 * step 2 consists in writing the message text.
820 * @note The API carries out the HMAC step 1 then starts step 2 with
821 * the first buffer entered to the Peripheral. DCAL bit is not automatically set after
822 * the message buffer feeding, allowing other messages DMA transfers to occur.
823 * @note Same key is used for the inner and the outer hash functions; pointer to key and
824 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
825 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
826 * HASH digest computation is corrupted.
827 * @param hhash HASH handle.
828 * @param pInBuffer pointer to the input buffer (message buffer).
829 * @param Size length of the input buffer in bytes.
830 * @retval HAL status
831 */
HAL_HMACEx_SHA1_Step1_2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)832 HAL_StatusTypeDef HAL_HMACEx_SHA1_Step1_2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
833 {
834 hhash->DigestCalculationDisable = SET;
835 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA1);
836 }
837
838 /**
839 * @brief SHA1 HMAC step 2 in multi-buffer DMA mode.
840 * @note Step 2 consists in writing the message text in the Peripheral.
841 * @note The API carries on the HMAC step 2, applied to the buffer entered as input
842 * parameter. DCAL bit is not automatically set after the message buffer feeding,
843 * allowing other messages DMA transfers to occur.
844 * @note Same key is used for the inner and the outer hash functions; pointer to key and
845 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
846 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
847 * HASH digest computation is corrupted.
848 * @param hhash HASH handle.
849 * @param pInBuffer pointer to the input buffer (message buffer).
850 * @param Size length of the input buffer in bytes.
851 * @retval HAL status
852 */
HAL_HMACEx_SHA1_Step2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)853 HAL_StatusTypeDef HAL_HMACEx_SHA1_Step2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
854 {
855 if (hhash->DigestCalculationDisable != SET)
856 {
857 return HAL_ERROR;
858 }
859 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA1);
860 }
861
862 /**
863 * @brief SHA1 HMAC step 2 wrap-up and step 3 completion in multi-buffer DMA mode.
864 * @note Step 2 consists in writing the message text in the Peripheral,
865 * step 3 consists in writing the outer hash function key.
866 * @note The API wraps up the HMAC step 2 in processing the buffer entered as input
867 * parameter (the input buffer must be the last one of the multi-buffer thread)
868 * then carries out HMAC step 3.
869 * @note Same key is used for the inner and the outer hash functions; pointer to key and
870 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
871 * @note Once the DMA transfers are finished (indicated by hhash->State set back
872 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA256_Finish() API must be called to retrieve
873 * the computed digest.
874 * @param hhash HASH handle.
875 * @param pInBuffer pointer to the input buffer (message buffer).
876 * @param Size length of the input buffer in bytes.
877 * @retval HAL status
878 */
HAL_HMACEx_SHA1_Step2_3_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)879 HAL_StatusTypeDef HAL_HMACEx_SHA1_Step2_3_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
880 {
881 hhash->DigestCalculationDisable = RESET;
882 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA1);
883 }
884
885 /**
886 * @brief SHA224 HMAC step 1 completion and step 2 start in multi-buffer DMA mode.
887 * @note Step 1 consists in writing the inner hash function key in the Peripheral,
888 * step 2 consists in writing the message text.
889 * @note The API carries out the HMAC step 1 then starts step 2 with
890 * the first buffer entered to the Peripheral. DCAL bit is not automatically set after
891 * the message buffer feeding, allowing other messages DMA transfers to occur.
892 * @note Same key is used for the inner and the outer hash functions; pointer to key and
893 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
894 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
895 * HASH digest computation is corrupted.
896 * @param hhash HASH handle.
897 * @param pInBuffer pointer to the input buffer (message buffer).
898 * @param Size length of the input buffer in bytes.
899 * @retval HAL status
900 */
HAL_HMACEx_SHA224_Step1_2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)901 HAL_StatusTypeDef HAL_HMACEx_SHA224_Step1_2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
902 {
903 hhash->DigestCalculationDisable = SET;
904 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
905 }
906
907 /**
908 * @brief SHA224 HMAC step 2 in multi-buffer DMA mode.
909 * @note Step 2 consists in writing the message text in the Peripheral.
910 * @note The API carries on the HMAC step 2, applied to the buffer entered as input
911 * parameter. DCAL bit is not automatically set after the message buffer feeding,
912 * allowing other messages DMA transfers to occur.
913 * @note Same key is used for the inner and the outer hash functions; pointer to key and
914 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
915 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
916 * HASH digest computation is corrupted.
917 * @param hhash HASH handle.
918 * @param pInBuffer pointer to the input buffer (message buffer).
919 * @param Size length of the input buffer in bytes.
920 * @retval HAL status
921 */
HAL_HMACEx_SHA224_Step2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)922 HAL_StatusTypeDef HAL_HMACEx_SHA224_Step2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
923 {
924 if (hhash->DigestCalculationDisable != SET)
925 {
926 return HAL_ERROR;
927 }
928 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
929 }
930
931 /**
932 * @brief SHA224 HMAC step 2 wrap-up and step 3 completion in multi-buffer DMA mode.
933 * @note Step 2 consists in writing the message text in the Peripheral,
934 * step 3 consists in writing the outer hash function key.
935 * @note The API wraps up the HMAC step 2 in processing the buffer entered as input
936 * parameter (the input buffer must be the last one of the multi-buffer thread)
937 * then carries out HMAC step 3.
938 * @note Same key is used for the inner and the outer hash functions; pointer to key and
939 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
940 * @note Once the DMA transfers are finished (indicated by hhash->State set back
941 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA256_Finish() API must be called to retrieve
942 * the computed digest.
943 * @param hhash HASH handle.
944 * @param pInBuffer pointer to the input buffer (message buffer).
945 * @param Size length of the input buffer in bytes.
946 * @retval HAL status
947 */
HAL_HMACEx_SHA224_Step2_3_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)948 HAL_StatusTypeDef HAL_HMACEx_SHA224_Step2_3_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
949 {
950 hhash->DigestCalculationDisable = RESET;
951 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA224);
952 }
953
954 /**
955 * @brief SHA256 HMAC step 1 completion and step 2 start in multi-buffer DMA mode.
956 * @note Step 1 consists in writing the inner hash function key in the Peripheral,
957 * step 2 consists in writing the message text.
958 * @note The API carries out the HMAC step 1 then starts step 2 with
959 * the first buffer entered to the Peripheral. DCAL bit is not automatically set after
960 * the message buffer feeding, allowing other messages DMA transfers to occur.
961 * @note Same key is used for the inner and the outer hash functions; pointer to key and
962 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
963 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
964 * HASH digest computation is corrupted.
965 * @param hhash HASH handle.
966 * @param pInBuffer pointer to the input buffer (message buffer).
967 * @param Size length of the input buffer in bytes.
968 * @retval HAL status
969 */
HAL_HMACEx_SHA256_Step1_2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)970 HAL_StatusTypeDef HAL_HMACEx_SHA256_Step1_2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
971 {
972 hhash->DigestCalculationDisable = SET;
973 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
974 }
975
976 /**
977 * @brief SHA256 HMAC step 2 in multi-buffer DMA mode.
978 * @note Step 2 consists in writing the message text in the Peripheral.
979 * @note The API carries on the HMAC step 2, applied to the buffer entered as input
980 * parameter. DCAL bit is not automatically set after the message buffer feeding,
981 * allowing other messages DMA transfers to occur.
982 * @note Same key is used for the inner and the outer hash functions; pointer to key and
983 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
984 * @note The input buffer size (in bytes) must be a multiple of 4 otherwise, the
985 * HASH digest computation is corrupted.
986 * @param hhash HASH handle.
987 * @param pInBuffer pointer to the input buffer (message buffer).
988 * @param Size length of the input buffer in bytes.
989 * @retval HAL status
990 */
HAL_HMACEx_SHA256_Step2_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)991 HAL_StatusTypeDef HAL_HMACEx_SHA256_Step2_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
992 {
993 if (hhash->DigestCalculationDisable != SET)
994 {
995 return HAL_ERROR;
996 }
997 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
998 }
999
1000 /**
1001 * @brief SHA256 HMAC step 2 wrap-up and step 3 completion in multi-buffer DMA mode.
1002 * @note Step 2 consists in writing the message text in the Peripheral,
1003 * step 3 consists in writing the outer hash function key.
1004 * @note The API wraps up the HMAC step 2 in processing the buffer entered as input
1005 * parameter (the input buffer must be the last one of the multi-buffer thread)
1006 * then carries out HMAC step 3.
1007 * @note Same key is used for the inner and the outer hash functions; pointer to key and
1008 * key size are respectively stored in hhash->Init.pKey and hhash->Init.KeySize.
1009 * @note Once the DMA transfers are finished (indicated by hhash->State set back
1010 * to HAL_HASH_STATE_READY), HAL_HASHEx_SHA256_Finish() API must be called to retrieve
1011 * the computed digest.
1012 * @param hhash HASH handle.
1013 * @param pInBuffer pointer to the input buffer (message buffer).
1014 * @param Size length of the input buffer in bytes.
1015 * @retval HAL status
1016 */
HAL_HMACEx_SHA256_Step2_3_DMA(HASH_HandleTypeDef * hhash,uint8_t * pInBuffer,uint32_t Size)1017 HAL_StatusTypeDef HAL_HMACEx_SHA256_Step2_3_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
1018 {
1019 hhash->DigestCalculationDisable = RESET;
1020 return HMAC_Start_DMA(hhash, pInBuffer, Size, HASH_ALGOSELECTION_SHA256);
1021 }
1022
1023 /**
1024 * @}
1025 */
1026
1027 #endif /* MDMA defined*/
1028 /**
1029 * @}
1030 */
1031 #endif /* HAL_HASH_MODULE_ENABLED */
1032
1033 /**
1034 * @}
1035 */
1036 #endif /* HASH*/
1037 /**
1038 * @}
1039 */
1040
1041