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