added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32f7xx_hal_hash_ex.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @version V1.1.0
<> 144:ef7eb2e8f9f7 6 * @date 22-April-2016
<> 144:ef7eb2e8f9f7 7 * @brief HASH HAL Extension module driver.
<> 144:ef7eb2e8f9f7 8 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 9 * functionalities of HASH peripheral:
<> 144:ef7eb2e8f9f7 10 * + Extended HASH processing functions based on SHA224 Algorithm
<> 144:ef7eb2e8f9f7 11 * + Extended HASH processing functions based on SHA256 Algorithm
<> 144:ef7eb2e8f9f7 12 *
<> 144:ef7eb2e8f9f7 13 @verbatim
<> 144:ef7eb2e8f9f7 14 ==============================================================================
<> 144:ef7eb2e8f9f7 15 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 16 ==============================================================================
<> 144:ef7eb2e8f9f7 17 [..]
<> 144:ef7eb2e8f9f7 18 The HASH HAL driver can be used as follows:
<> 144:ef7eb2e8f9f7 19 (#)Initialize the HASH low level resources by implementing the HAL_HASH_MspInit():
<> 144:ef7eb2e8f9f7 20 (##) Enable the HASH interface clock using __HAL_RCC_HASH_CLK_ENABLE()
<> 144:ef7eb2e8f9f7 21 (##) In case of using processing APIs based on interrupts (e.g. HAL_HMACEx_SHA224_Start())
<> 144:ef7eb2e8f9f7 22 (+++) Configure the HASH interrupt priority using HAL_NVIC_SetPriority()
<> 144:ef7eb2e8f9f7 23 (+++) Enable the HASH IRQ handler using HAL_NVIC_EnableIRQ()
<> 144:ef7eb2e8f9f7 24 (+++) In HASH IRQ handler, call HAL_HASH_IRQHandler()
<> 144:ef7eb2e8f9f7 25 (##) In case of using DMA to control data transfer (e.g. HAL_HMACEx_SH224_Start_DMA())
<> 144:ef7eb2e8f9f7 26 (+++) Enable the DMAx interface clock using __DMAx_CLK_ENABLE()
<> 144:ef7eb2e8f9f7 27 (+++) Configure and enable one DMA stream one for managing data transfer from
<> 144:ef7eb2e8f9f7 28 memory to peripheral (input stream). Managing data transfer from
<> 144:ef7eb2e8f9f7 29 peripheral to memory can be performed only using CPU
<> 144:ef7eb2e8f9f7 30 (+++) Associate the initialized DMA handle to the HASH DMA handle
<> 144:ef7eb2e8f9f7 31 using __HAL_LINKDMA()
<> 144:ef7eb2e8f9f7 32 (+++) Configure the priority and enable the NVIC for the transfer complete
<> 144:ef7eb2e8f9f7 33 interrupt on the DMA Stream: HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ()
<> 144:ef7eb2e8f9f7 34 (#)Initialize the HASH HAL using HAL_HASH_Init(). This function configures mainly:
<> 144:ef7eb2e8f9f7 35 (##) The data type: 1-bit, 8-bit, 16-bit and 32-bit.
<> 144:ef7eb2e8f9f7 36 (##) For HMAC, the encryption key.
<> 144:ef7eb2e8f9f7 37 (##) For HMAC, the key size used for encryption.
<> 144:ef7eb2e8f9f7 38 (#)Three processing functions are available:
<> 144:ef7eb2e8f9f7 39 (##) Polling mode: processing APIs are blocking functions
<> 144:ef7eb2e8f9f7 40 i.e. they process the data and wait till the digest computation is finished
<> 144:ef7eb2e8f9f7 41 e.g. HAL_HASHEx_SHA224_Start()
<> 144:ef7eb2e8f9f7 42 (##) Interrupt mode: encryption and decryption APIs are not blocking functions
<> 144:ef7eb2e8f9f7 43 i.e. they process the data under interrupt
<> 144:ef7eb2e8f9f7 44 e.g. HAL_HASHEx_SHA224_Start_IT()
<> 144:ef7eb2e8f9f7 45 (##) DMA mode: processing APIs are not blocking functions and the CPU is
<> 144:ef7eb2e8f9f7 46 not used for data transfer i.e. the data transfer is ensured by DMA
<> 144:ef7eb2e8f9f7 47 e.g. HAL_HASHEx_SHA224_Start_DMA()
<> 144:ef7eb2e8f9f7 48 (#)When the processing function is called at first time after HAL_HASH_Init()
<> 144:ef7eb2e8f9f7 49 the HASH peripheral is initialized and processes the buffer in input.
<> 144:ef7eb2e8f9f7 50 After that, the digest computation is started.
<> 144:ef7eb2e8f9f7 51 When processing multi-buffer use the accumulate function to write the
<> 144:ef7eb2e8f9f7 52 data in the peripheral without starting the digest computation. In last
<> 144:ef7eb2e8f9f7 53 buffer use the start function to input the last buffer ans start the digest
<> 144:ef7eb2e8f9f7 54 computation.
<> 144:ef7eb2e8f9f7 55 (##) e.g. HAL_HASHEx_SHA224_Accumulate() : write 1st data buffer in the peripheral without starting the digest computation
<> 144:ef7eb2e8f9f7 56 (##) write (n-1)th data buffer in the peripheral without starting the digest computation
<> 144:ef7eb2e8f9f7 57 (##) HAL_HASHEx_SHA224_Start() : write (n)th data buffer in the peripheral and start the digest computation
<> 144:ef7eb2e8f9f7 58 (#)In HMAC mode, there is no Accumulate API. Only Start API is available.
<> 144:ef7eb2e8f9f7 59 (#)In case of using DMA, call the DMA start processing e.g. HAL_HASHEx_SHA224_Start_DMA().
<> 144:ef7eb2e8f9f7 60 After that, call the finish function in order to get the digest value
<> 144:ef7eb2e8f9f7 61 e.g. HAL_HASHEx_SHA224_Finish()
<> 144:ef7eb2e8f9f7 62 (#)Call HAL_HASH_DeInit() to deinitialize the HASH peripheral.
<> 144:ef7eb2e8f9f7 63
<> 144:ef7eb2e8f9f7 64 @endverbatim
<> 144:ef7eb2e8f9f7 65 ******************************************************************************
<> 144:ef7eb2e8f9f7 66 * @attention
<> 144:ef7eb2e8f9f7 67 *
<> 144:ef7eb2e8f9f7 68 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 69 *
<> 144:ef7eb2e8f9f7 70 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 71 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 72 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 73 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 74 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 75 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 76 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 77 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 78 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 79 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 80 *
<> 144:ef7eb2e8f9f7 81 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 82 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 83 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 84 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 85 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 86 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 87 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 88 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 89 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 90 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 91 *
<> 144:ef7eb2e8f9f7 92 ******************************************************************************
<> 144:ef7eb2e8f9f7 93 */
<> 144:ef7eb2e8f9f7 94
<> 144:ef7eb2e8f9f7 95 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 96 #include "stm32f7xx_hal.h"
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 /** @addtogroup STM32F7xx_HAL_Driver
<> 144:ef7eb2e8f9f7 99 * @{
<> 144:ef7eb2e8f9f7 100 */
<> 144:ef7eb2e8f9f7 101 #if defined(STM32F756xx) || defined(STM32F777xx) || defined(STM32F779xx)
<> 144:ef7eb2e8f9f7 102
<> 144:ef7eb2e8f9f7 103 /** @defgroup HASHEx HASHEx
<> 144:ef7eb2e8f9f7 104 * @brief HASH Extension HAL module driver.
<> 144:ef7eb2e8f9f7 105 * @{
<> 144:ef7eb2e8f9f7 106 */
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 #ifdef HAL_HASH_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 109
<> 144:ef7eb2e8f9f7 110 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 111 /* Private define ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 112 /* Private macro -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 113 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 114 /* Private function prototypes -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 115 /** @addtogroup HASHEx_Private_Functions
<> 144:ef7eb2e8f9f7 116 * @{
<> 144:ef7eb2e8f9f7 117 */
<> 144:ef7eb2e8f9f7 118 static void HASHEx_DMAXferCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 119 static void HASHEx_WriteData(uint8_t *pInBuffer, uint32_t Size);
<> 144:ef7eb2e8f9f7 120 static void HASHEx_GetDigest(uint8_t *pMsgDigest, uint8_t Size);
<> 144:ef7eb2e8f9f7 121 static void HASHEx_DMAError(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 122 /**
<> 144:ef7eb2e8f9f7 123 * @}
<> 144:ef7eb2e8f9f7 124 */
<> 144:ef7eb2e8f9f7 125
<> 144:ef7eb2e8f9f7 126 /* Private functions ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 127
<> 144:ef7eb2e8f9f7 128 /** @addtogroup HASHEx_Private_Functions
<> 144:ef7eb2e8f9f7 129 * @{
<> 144:ef7eb2e8f9f7 130 */
<> 144:ef7eb2e8f9f7 131
<> 144:ef7eb2e8f9f7 132 /**
<> 144:ef7eb2e8f9f7 133 * @brief Writes the input buffer in data register.
<> 144:ef7eb2e8f9f7 134 * @param pInBuffer: Pointer to input buffer
<> 144:ef7eb2e8f9f7 135 * @param Size: The size of input buffer
<> 144:ef7eb2e8f9f7 136 * @retval None
<> 144:ef7eb2e8f9f7 137 */
<> 144:ef7eb2e8f9f7 138 static void HASHEx_WriteData(uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 139 {
<> 144:ef7eb2e8f9f7 140 uint32_t buffercounter;
<> 144:ef7eb2e8f9f7 141 uint32_t inputaddr = (uint32_t) pInBuffer;
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 for(buffercounter = 0; buffercounter < Size; buffercounter+=4)
<> 144:ef7eb2e8f9f7 144 {
<> 144:ef7eb2e8f9f7 145 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 146 inputaddr+=4;
<> 144:ef7eb2e8f9f7 147 }
<> 144:ef7eb2e8f9f7 148 }
<> 144:ef7eb2e8f9f7 149
<> 144:ef7eb2e8f9f7 150 /**
<> 144:ef7eb2e8f9f7 151 * @brief Provides the message digest result.
<> 144:ef7eb2e8f9f7 152 * @param pMsgDigest: Pointer to the message digest
<> 144:ef7eb2e8f9f7 153 * @param Size: The size of the message digest in bytes
<> 144:ef7eb2e8f9f7 154 * @retval None
<> 144:ef7eb2e8f9f7 155 */
<> 144:ef7eb2e8f9f7 156 static void HASHEx_GetDigest(uint8_t *pMsgDigest, uint8_t Size)
<> 144:ef7eb2e8f9f7 157 {
<> 144:ef7eb2e8f9f7 158 uint32_t msgdigest = (uint32_t)pMsgDigest;
<> 144:ef7eb2e8f9f7 159
<> 144:ef7eb2e8f9f7 160 switch(Size)
<> 144:ef7eb2e8f9f7 161 {
<> 144:ef7eb2e8f9f7 162 case 16:
<> 144:ef7eb2e8f9f7 163 /* Read the message digest */
<> 144:ef7eb2e8f9f7 164 *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]);
<> 144:ef7eb2e8f9f7 165 msgdigest+=4;
<> 144:ef7eb2e8f9f7 166 *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]);
<> 144:ef7eb2e8f9f7 167 msgdigest+=4;
<> 144:ef7eb2e8f9f7 168 *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]);
<> 144:ef7eb2e8f9f7 169 msgdigest+=4;
<> 144:ef7eb2e8f9f7 170 *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]);
<> 144:ef7eb2e8f9f7 171 break;
<> 144:ef7eb2e8f9f7 172 case 20:
<> 144:ef7eb2e8f9f7 173 /* Read the message digest */
<> 144:ef7eb2e8f9f7 174 *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]);
<> 144:ef7eb2e8f9f7 175 msgdigest+=4;
<> 144:ef7eb2e8f9f7 176 *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]);
<> 144:ef7eb2e8f9f7 177 msgdigest+=4;
<> 144:ef7eb2e8f9f7 178 *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]);
<> 144:ef7eb2e8f9f7 179 msgdigest+=4;
<> 144:ef7eb2e8f9f7 180 *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]);
<> 144:ef7eb2e8f9f7 181 msgdigest+=4;
<> 144:ef7eb2e8f9f7 182 *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]);
<> 144:ef7eb2e8f9f7 183 break;
<> 144:ef7eb2e8f9f7 184 case 28:
<> 144:ef7eb2e8f9f7 185 /* Read the message digest */
<> 144:ef7eb2e8f9f7 186 *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]);
<> 144:ef7eb2e8f9f7 187 msgdigest+=4;
<> 144:ef7eb2e8f9f7 188 *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]);
<> 144:ef7eb2e8f9f7 189 msgdigest+=4;
<> 144:ef7eb2e8f9f7 190 *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]);
<> 144:ef7eb2e8f9f7 191 msgdigest+=4;
<> 144:ef7eb2e8f9f7 192 *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]);
<> 144:ef7eb2e8f9f7 193 msgdigest+=4;
<> 144:ef7eb2e8f9f7 194 *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]);
<> 144:ef7eb2e8f9f7 195 msgdigest+=4;
<> 144:ef7eb2e8f9f7 196 *(uint32_t*)(msgdigest) = __REV(HASH_DIGEST->HR[5]);
<> 144:ef7eb2e8f9f7 197 msgdigest+=4;
<> 144:ef7eb2e8f9f7 198 *(uint32_t*)(msgdigest) = __REV(HASH_DIGEST->HR[6]);
<> 144:ef7eb2e8f9f7 199 break;
<> 144:ef7eb2e8f9f7 200 case 32:
<> 144:ef7eb2e8f9f7 201 /* Read the message digest */
<> 144:ef7eb2e8f9f7 202 *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]);
<> 144:ef7eb2e8f9f7 203 msgdigest+=4;
<> 144:ef7eb2e8f9f7 204 *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]);
<> 144:ef7eb2e8f9f7 205 msgdigest+=4;
<> 144:ef7eb2e8f9f7 206 *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]);
<> 144:ef7eb2e8f9f7 207 msgdigest+=4;
<> 144:ef7eb2e8f9f7 208 *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]);
<> 144:ef7eb2e8f9f7 209 msgdigest+=4;
<> 144:ef7eb2e8f9f7 210 *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]);
<> 144:ef7eb2e8f9f7 211 msgdigest+=4;
<> 144:ef7eb2e8f9f7 212 *(uint32_t*)(msgdigest) = __REV(HASH_DIGEST->HR[5]);
<> 144:ef7eb2e8f9f7 213 msgdigest+=4;
<> 144:ef7eb2e8f9f7 214 *(uint32_t*)(msgdigest) = __REV(HASH_DIGEST->HR[6]);
<> 144:ef7eb2e8f9f7 215 msgdigest+=4;
<> 144:ef7eb2e8f9f7 216 *(uint32_t*)(msgdigest) = __REV(HASH_DIGEST->HR[7]);
<> 144:ef7eb2e8f9f7 217 break;
<> 144:ef7eb2e8f9f7 218 default:
<> 144:ef7eb2e8f9f7 219 break;
<> 144:ef7eb2e8f9f7 220 }
<> 144:ef7eb2e8f9f7 221 }
<> 144:ef7eb2e8f9f7 222
<> 144:ef7eb2e8f9f7 223 /**
<> 144:ef7eb2e8f9f7 224 * @brief DMA HASH Input Data complete callback.
<> 144:ef7eb2e8f9f7 225 * @param hdma: DMA handle
<> 144:ef7eb2e8f9f7 226 * @retval None
<> 144:ef7eb2e8f9f7 227 */
<> 144:ef7eb2e8f9f7 228 static void HASHEx_DMAXferCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 229 {
<> 144:ef7eb2e8f9f7 230 HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 231 uint32_t inputaddr = 0;
<> 144:ef7eb2e8f9f7 232 uint32_t buffersize = 0;
<> 144:ef7eb2e8f9f7 233
<> 144:ef7eb2e8f9f7 234 if((HASH->CR & HASH_CR_MODE) != HASH_CR_MODE)
<> 144:ef7eb2e8f9f7 235 {
<> 144:ef7eb2e8f9f7 236 /* Disable the DMA transfer */
<> 144:ef7eb2e8f9f7 237 HASH->CR &= (uint32_t)(~HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 238
<> 144:ef7eb2e8f9f7 239 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 240 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 241
<> 144:ef7eb2e8f9f7 242 /* Call Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 243 HAL_HASH_InCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 244 }
<> 144:ef7eb2e8f9f7 245 else
<> 144:ef7eb2e8f9f7 246 {
<> 144:ef7eb2e8f9f7 247 /* Increment Interrupt counter */
<> 144:ef7eb2e8f9f7 248 hhash->HashInCount++;
<> 144:ef7eb2e8f9f7 249 /* Disable the DMA transfer before starting the next transfer */
<> 144:ef7eb2e8f9f7 250 HASH->CR &= (uint32_t)(~HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 251
<> 144:ef7eb2e8f9f7 252 if(hhash->HashInCount <= 2)
<> 144:ef7eb2e8f9f7 253 {
<> 144:ef7eb2e8f9f7 254 /* In case HashInCount = 1, set the DMA to transfer data to HASH DIN register */
<> 144:ef7eb2e8f9f7 255 if(hhash->HashInCount == 1)
<> 144:ef7eb2e8f9f7 256 {
<> 144:ef7eb2e8f9f7 257 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
<> 144:ef7eb2e8f9f7 258 buffersize = hhash->HashBuffSize;
<> 144:ef7eb2e8f9f7 259 }
<> 144:ef7eb2e8f9f7 260 /* In case HashInCount = 2, set the DMA to transfer key to HASH DIN register */
<> 144:ef7eb2e8f9f7 261 else if(hhash->HashInCount == 2)
<> 144:ef7eb2e8f9f7 262 {
<> 144:ef7eb2e8f9f7 263 inputaddr = (uint32_t)hhash->Init.pKey;
<> 144:ef7eb2e8f9f7 264 buffersize = hhash->Init.KeySize;
<> 144:ef7eb2e8f9f7 265 }
<> 144:ef7eb2e8f9f7 266 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 267 MODIFY_REG(HASH->STR, HASH_STR_NBLW, 8 * (buffersize % 4));
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 /* Set the HASH DMA transfer complete */
<> 144:ef7eb2e8f9f7 270 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
<> 144:ef7eb2e8f9f7 271
<> 144:ef7eb2e8f9f7 272 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 273 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (buffersize%4 ? (buffersize+3)/4:buffersize/4));
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 /* Enable DMA requests */
<> 144:ef7eb2e8f9f7 276 HASH->CR |= (HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278 else
<> 144:ef7eb2e8f9f7 279 {
<> 144:ef7eb2e8f9f7 280 /* Disable the DMA transfer */
<> 144:ef7eb2e8f9f7 281 HASH->CR &= (uint32_t)(~HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 282
<> 144:ef7eb2e8f9f7 283 /* Reset the InCount */
<> 144:ef7eb2e8f9f7 284 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 285
<> 144:ef7eb2e8f9f7 286 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 287 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 288
<> 144:ef7eb2e8f9f7 289 /* Call Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 290 HAL_HASH_InCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 291 }
<> 144:ef7eb2e8f9f7 292 }
<> 144:ef7eb2e8f9f7 293 }
<> 144:ef7eb2e8f9f7 294
<> 144:ef7eb2e8f9f7 295 /**
<> 144:ef7eb2e8f9f7 296 * @brief DMA HASH communication error callback.
<> 144:ef7eb2e8f9f7 297 * @param hdma: DMA handle
<> 144:ef7eb2e8f9f7 298 * @retval None
<> 144:ef7eb2e8f9f7 299 */
<> 144:ef7eb2e8f9f7 300 static void HASHEx_DMAError(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 301 {
<> 144:ef7eb2e8f9f7 302 HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 303 hhash->State= HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 304 HAL_HASH_ErrorCallback(hhash);
<> 144:ef7eb2e8f9f7 305 }
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 /**
<> 144:ef7eb2e8f9f7 308 * @}
<> 144:ef7eb2e8f9f7 309 */
<> 144:ef7eb2e8f9f7 310
<> 144:ef7eb2e8f9f7 311 /* Exported functions --------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 312 /** @addtogroup HASHEx_Exported_Functions
<> 144:ef7eb2e8f9f7 313 * @{
<> 144:ef7eb2e8f9f7 314 */
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 /** @defgroup HASHEx_Group1 HASH processing functions
<> 144:ef7eb2e8f9f7 317 * @brief processing functions using polling mode
<> 144:ef7eb2e8f9f7 318 *
<> 144:ef7eb2e8f9f7 319 @verbatim
<> 144:ef7eb2e8f9f7 320 ===============================================================================
<> 144:ef7eb2e8f9f7 321 ##### HASH processing using polling mode functions #####
<> 144:ef7eb2e8f9f7 322 ===============================================================================
<> 144:ef7eb2e8f9f7 323 [..] This section provides functions allowing to calculate in polling mode
<> 144:ef7eb2e8f9f7 324 the hash value using one of the following algorithms:
<> 144:ef7eb2e8f9f7 325 (+) SHA224
<> 144:ef7eb2e8f9f7 326 (+) SHA256
<> 144:ef7eb2e8f9f7 327
<> 144:ef7eb2e8f9f7 328 @endverbatim
<> 144:ef7eb2e8f9f7 329 * @{
<> 144:ef7eb2e8f9f7 330 */
<> 144:ef7eb2e8f9f7 331
<> 144:ef7eb2e8f9f7 332 /**
<> 144:ef7eb2e8f9f7 333 * @brief Initializes the HASH peripheral in SHA224 mode
<> 144:ef7eb2e8f9f7 334 * then processes pInBuffer. The digest is available in pOutBuffer
<> 144:ef7eb2e8f9f7 335 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 336 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 337 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 338 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 339 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 340 * @param pOutBuffer: Pointer to the computed digest. Its size must be 28 bytes.
<> 144:ef7eb2e8f9f7 341 * @param Timeout: Specify Timeout value
<> 144:ef7eb2e8f9f7 342 * @retval HAL status
<> 144:ef7eb2e8f9f7 343 */
<> 144:ef7eb2e8f9f7 344 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 345 {
<> 144:ef7eb2e8f9f7 346 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 347
<> 144:ef7eb2e8f9f7 348 /* Process Locked */
<> 144:ef7eb2e8f9f7 349 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 350
<> 144:ef7eb2e8f9f7 351 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 352 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 353
<> 144:ef7eb2e8f9f7 354 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 355 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 356 {
<> 144:ef7eb2e8f9f7 357 /* Select the SHA224 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 358 the message digest of a new message */
<> 144:ef7eb2e8f9f7 359 HASH->CR |= HASH_ALGOSELECTION_SHA224 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 360 }
<> 144:ef7eb2e8f9f7 361
<> 144:ef7eb2e8f9f7 362 /* Set the phase */
<> 144:ef7eb2e8f9f7 363 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 366 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 367
<> 144:ef7eb2e8f9f7 368 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 369 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 370
<> 144:ef7eb2e8f9f7 371 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 372 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 373
<> 144:ef7eb2e8f9f7 374 /* Get tick */
<> 144:ef7eb2e8f9f7 375 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 376
<> 144:ef7eb2e8f9f7 377 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 378 {
<> 144:ef7eb2e8f9f7 379 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 380 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 381 {
<> 144:ef7eb2e8f9f7 382 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 383 {
<> 144:ef7eb2e8f9f7 384 /* Change state */
<> 144:ef7eb2e8f9f7 385 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 386
<> 144:ef7eb2e8f9f7 387 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 388 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 389
<> 144:ef7eb2e8f9f7 390 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 391 }
<> 144:ef7eb2e8f9f7 392 }
<> 144:ef7eb2e8f9f7 393 }
<> 144:ef7eb2e8f9f7 394
<> 144:ef7eb2e8f9f7 395 /* Read the message digest */
<> 144:ef7eb2e8f9f7 396 HASHEx_GetDigest(pOutBuffer, 28);
<> 144:ef7eb2e8f9f7 397
<> 144:ef7eb2e8f9f7 398 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 399 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 400
<> 144:ef7eb2e8f9f7 401 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 402 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 403
<> 144:ef7eb2e8f9f7 404 /* Return function status */
<> 144:ef7eb2e8f9f7 405 return HAL_OK;
<> 144:ef7eb2e8f9f7 406 }
<> 144:ef7eb2e8f9f7 407
<> 144:ef7eb2e8f9f7 408 /**
<> 144:ef7eb2e8f9f7 409 * @brief Initializes the HASH peripheral in SHA256 mode then processes pInBuffer.
<> 144:ef7eb2e8f9f7 410 The digest is available in pOutBuffer.
<> 144:ef7eb2e8f9f7 411 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 412 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 413 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 414 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 415 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 416 * @param pOutBuffer: Pointer to the computed digest. Its size must be 32 bytes.
<> 144:ef7eb2e8f9f7 417 * @param Timeout: Specify Timeout value
<> 144:ef7eb2e8f9f7 418 * @retval HAL status
<> 144:ef7eb2e8f9f7 419 */
<> 144:ef7eb2e8f9f7 420 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 421 {
<> 144:ef7eb2e8f9f7 422 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 /* Process Locked */
<> 144:ef7eb2e8f9f7 425 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 426
<> 144:ef7eb2e8f9f7 427 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 428 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 431 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 432 {
<> 144:ef7eb2e8f9f7 433 /* Select the SHA256 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 434 the message digest of a new message */
<> 144:ef7eb2e8f9f7 435 HASH->CR |= HASH_ALGOSELECTION_SHA256 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 436 }
<> 144:ef7eb2e8f9f7 437
<> 144:ef7eb2e8f9f7 438 /* Set the phase */
<> 144:ef7eb2e8f9f7 439 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 440
<> 144:ef7eb2e8f9f7 441 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 442 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 443
<> 144:ef7eb2e8f9f7 444 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 445 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 446
<> 144:ef7eb2e8f9f7 447 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 448 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 449
<> 144:ef7eb2e8f9f7 450 /* Get tick */
<> 144:ef7eb2e8f9f7 451 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 452
<> 144:ef7eb2e8f9f7 453 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 454 {
<> 144:ef7eb2e8f9f7 455 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 456 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 457 {
<> 144:ef7eb2e8f9f7 458 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 459 {
<> 144:ef7eb2e8f9f7 460 /* Change state */
<> 144:ef7eb2e8f9f7 461 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 462
<> 144:ef7eb2e8f9f7 463 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 464 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 465
<> 144:ef7eb2e8f9f7 466 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 467 }
<> 144:ef7eb2e8f9f7 468 }
<> 144:ef7eb2e8f9f7 469 }
<> 144:ef7eb2e8f9f7 470
<> 144:ef7eb2e8f9f7 471 /* Read the message digest */
<> 144:ef7eb2e8f9f7 472 HASHEx_GetDigest(pOutBuffer, 32);
<> 144:ef7eb2e8f9f7 473
<> 144:ef7eb2e8f9f7 474 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 475 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 476
<> 144:ef7eb2e8f9f7 477 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 478 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 479
<> 144:ef7eb2e8f9f7 480 /* Return function status */
<> 144:ef7eb2e8f9f7 481 return HAL_OK;
<> 144:ef7eb2e8f9f7 482 }
<> 144:ef7eb2e8f9f7 483
<> 144:ef7eb2e8f9f7 484
<> 144:ef7eb2e8f9f7 485 /**
<> 144:ef7eb2e8f9f7 486 * @brief Initializes the HASH peripheral in SHA224 mode
<> 144:ef7eb2e8f9f7 487 * then processes pInBuffer. The digest is available in pOutBuffer
<> 144:ef7eb2e8f9f7 488 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 489 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 490 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 491 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 492 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 493 * @retval HAL status
<> 144:ef7eb2e8f9f7 494 */
<> 144:ef7eb2e8f9f7 495 HAL_StatusTypeDef HAL_HASHEx_SHA224_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 496 {
<> 144:ef7eb2e8f9f7 497 /* Process Locked */
<> 144:ef7eb2e8f9f7 498 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 499
<> 144:ef7eb2e8f9f7 500 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 501 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 502
<> 144:ef7eb2e8f9f7 503 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 504 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 505 {
<> 144:ef7eb2e8f9f7 506 /* Select the SHA224 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 507 the message digest of a new message */
<> 144:ef7eb2e8f9f7 508 HASH->CR |= HASH_ALGOSELECTION_SHA224 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 509 }
<> 144:ef7eb2e8f9f7 510
<> 144:ef7eb2e8f9f7 511 /* Set the phase */
<> 144:ef7eb2e8f9f7 512 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 515 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 516
<> 144:ef7eb2e8f9f7 517 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 518 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 519
<> 144:ef7eb2e8f9f7 520 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 521 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 522
<> 144:ef7eb2e8f9f7 523 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 524 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 525
<> 144:ef7eb2e8f9f7 526 /* Return function status */
<> 144:ef7eb2e8f9f7 527 return HAL_OK;
<> 144:ef7eb2e8f9f7 528 }
<> 144:ef7eb2e8f9f7 529
<> 144:ef7eb2e8f9f7 530
<> 144:ef7eb2e8f9f7 531 /**
<> 144:ef7eb2e8f9f7 532 * @brief Initializes the HASH peripheral in SHA256 mode then processes pInBuffer.
<> 144:ef7eb2e8f9f7 533 The digest is available in pOutBuffer.
<> 144:ef7eb2e8f9f7 534 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 535 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 536 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 537 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 538 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 539 * @retval HAL status
<> 144:ef7eb2e8f9f7 540 */
<> 144:ef7eb2e8f9f7 541 HAL_StatusTypeDef HAL_HASHEx_SHA256_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 542 {
<> 144:ef7eb2e8f9f7 543 /* Process Locked */
<> 144:ef7eb2e8f9f7 544 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 545
<> 144:ef7eb2e8f9f7 546 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 547 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 548
<> 144:ef7eb2e8f9f7 549 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 550 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 551 {
<> 144:ef7eb2e8f9f7 552 /* Select the SHA256 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 553 the message digest of a new message */
<> 144:ef7eb2e8f9f7 554 HASH->CR |= HASH_ALGOSELECTION_SHA256 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 555 }
<> 144:ef7eb2e8f9f7 556
<> 144:ef7eb2e8f9f7 557 /* Set the phase */
<> 144:ef7eb2e8f9f7 558 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 559
<> 144:ef7eb2e8f9f7 560 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 561 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 562
<> 144:ef7eb2e8f9f7 563 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 564 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 565
<> 144:ef7eb2e8f9f7 566 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 567 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 568
<> 144:ef7eb2e8f9f7 569 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 570 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 571
<> 144:ef7eb2e8f9f7 572 /* Return function status */
<> 144:ef7eb2e8f9f7 573 return HAL_OK;
<> 144:ef7eb2e8f9f7 574 }
<> 144:ef7eb2e8f9f7 575
<> 144:ef7eb2e8f9f7 576
<> 144:ef7eb2e8f9f7 577 /**
<> 144:ef7eb2e8f9f7 578 * @}
<> 144:ef7eb2e8f9f7 579 */
<> 144:ef7eb2e8f9f7 580
<> 144:ef7eb2e8f9f7 581 /** @defgroup HASHEx_Group2 HMAC processing functions using polling mode
<> 144:ef7eb2e8f9f7 582 * @brief HMAC processing functions using polling mode .
<> 144:ef7eb2e8f9f7 583 *
<> 144:ef7eb2e8f9f7 584 @verbatim
<> 144:ef7eb2e8f9f7 585 ===============================================================================
<> 144:ef7eb2e8f9f7 586 ##### HMAC processing using polling mode functions #####
<> 144:ef7eb2e8f9f7 587 ===============================================================================
<> 144:ef7eb2e8f9f7 588 [..] This section provides functions allowing to calculate in polling mode
<> 144:ef7eb2e8f9f7 589 the HMAC value using one of the following algorithms:
<> 144:ef7eb2e8f9f7 590 (+) SHA224
<> 144:ef7eb2e8f9f7 591 (+) SHA256
<> 144:ef7eb2e8f9f7 592
<> 144:ef7eb2e8f9f7 593 @endverbatim
<> 144:ef7eb2e8f9f7 594 * @{
<> 144:ef7eb2e8f9f7 595 */
<> 144:ef7eb2e8f9f7 596
<> 144:ef7eb2e8f9f7 597 /**
<> 144:ef7eb2e8f9f7 598 * @brief Initializes the HASH peripheral in HMAC SHA224 mode
<> 144:ef7eb2e8f9f7 599 * then processes pInBuffer. The digest is available in pOutBuffer.
<> 144:ef7eb2e8f9f7 600 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 601 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 602 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 603 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 604 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 605 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
<> 144:ef7eb2e8f9f7 606 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 607 * @retval HAL status
<> 144:ef7eb2e8f9f7 608 */
<> 144:ef7eb2e8f9f7 609 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 610 {
<> 144:ef7eb2e8f9f7 611 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 612
<> 144:ef7eb2e8f9f7 613 /* Process Locked */
<> 144:ef7eb2e8f9f7 614 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 615
<> 144:ef7eb2e8f9f7 616 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 617 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 618
<> 144:ef7eb2e8f9f7 619 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 620 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 621 {
<> 144:ef7eb2e8f9f7 622 /* Check if key size is greater than 64 bytes */
<> 144:ef7eb2e8f9f7 623 if(hhash->Init.KeySize > 64)
<> 144:ef7eb2e8f9f7 624 {
<> 144:ef7eb2e8f9f7 625 /* Select the HMAC SHA224 mode */
<> 144:ef7eb2e8f9f7 626 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
<> 144:ef7eb2e8f9f7 627 }
<> 144:ef7eb2e8f9f7 628 else
<> 144:ef7eb2e8f9f7 629 {
<> 144:ef7eb2e8f9f7 630 /* Select the HMAC SHA224 mode */
<> 144:ef7eb2e8f9f7 631 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
<> 144:ef7eb2e8f9f7 632 }
<> 144:ef7eb2e8f9f7 633 }
<> 144:ef7eb2e8f9f7 634
<> 144:ef7eb2e8f9f7 635 /* Set the phase */
<> 144:ef7eb2e8f9f7 636 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 637
<> 144:ef7eb2e8f9f7 638 /************************** STEP 1 ******************************************/
<> 144:ef7eb2e8f9f7 639 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 640 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 641
<> 144:ef7eb2e8f9f7 642 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 643 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 644
<> 144:ef7eb2e8f9f7 645 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 646 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 647
<> 144:ef7eb2e8f9f7 648 /* Get tick */
<> 144:ef7eb2e8f9f7 649 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 650
<> 144:ef7eb2e8f9f7 651 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 652 {
<> 144:ef7eb2e8f9f7 653 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 654 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 655 {
<> 144:ef7eb2e8f9f7 656 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 657 {
<> 144:ef7eb2e8f9f7 658 /* Change state */
<> 144:ef7eb2e8f9f7 659 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 660
<> 144:ef7eb2e8f9f7 661 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 662 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 663
<> 144:ef7eb2e8f9f7 664 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 665 }
<> 144:ef7eb2e8f9f7 666 }
<> 144:ef7eb2e8f9f7 667 }
<> 144:ef7eb2e8f9f7 668 /************************** STEP 2 ******************************************/
<> 144:ef7eb2e8f9f7 669 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 670 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 671
<> 144:ef7eb2e8f9f7 672 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 673 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 674
<> 144:ef7eb2e8f9f7 675 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 676 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 677
<> 144:ef7eb2e8f9f7 678 /* Get tick */
<> 144:ef7eb2e8f9f7 679 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 680
<> 144:ef7eb2e8f9f7 681 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 682 {
<> 144:ef7eb2e8f9f7 683 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 684 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 685 {
<> 144:ef7eb2e8f9f7 686 if((HAL_GetTick() - tickstart ) > Timeout)
<> 144:ef7eb2e8f9f7 687 {
<> 144:ef7eb2e8f9f7 688 /* Change state */
<> 144:ef7eb2e8f9f7 689 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 690
<> 144:ef7eb2e8f9f7 691 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 692 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 693
<> 144:ef7eb2e8f9f7 694 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 695 }
<> 144:ef7eb2e8f9f7 696 }
<> 144:ef7eb2e8f9f7 697 }
<> 144:ef7eb2e8f9f7 698 /************************** STEP 3 ******************************************/
<> 144:ef7eb2e8f9f7 699 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 700 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 701
<> 144:ef7eb2e8f9f7 702 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 703 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 704
<> 144:ef7eb2e8f9f7 705 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 706 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 707
<> 144:ef7eb2e8f9f7 708 /* Get tick */
<> 144:ef7eb2e8f9f7 709 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 710
<> 144:ef7eb2e8f9f7 711 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 712 {
<> 144:ef7eb2e8f9f7 713 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 714 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 715 {
<> 144:ef7eb2e8f9f7 716 if((HAL_GetTick() - tickstart ) > Timeout)
<> 144:ef7eb2e8f9f7 717 {
<> 144:ef7eb2e8f9f7 718 /* Change state */
<> 144:ef7eb2e8f9f7 719 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 720
<> 144:ef7eb2e8f9f7 721 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 722 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 723
<> 144:ef7eb2e8f9f7 724 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 725 }
<> 144:ef7eb2e8f9f7 726 }
<> 144:ef7eb2e8f9f7 727 }
<> 144:ef7eb2e8f9f7 728 /* Read the message digest */
<> 144:ef7eb2e8f9f7 729 HASHEx_GetDigest(pOutBuffer, 28);
<> 144:ef7eb2e8f9f7 730
<> 144:ef7eb2e8f9f7 731 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 732 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 733
<> 144:ef7eb2e8f9f7 734 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 735 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 736
<> 144:ef7eb2e8f9f7 737 /* Return function status */
<> 144:ef7eb2e8f9f7 738 return HAL_OK;
<> 144:ef7eb2e8f9f7 739 }
<> 144:ef7eb2e8f9f7 740
<> 144:ef7eb2e8f9f7 741 /**
<> 144:ef7eb2e8f9f7 742 * @brief Initializes the HASH peripheral in HMAC SHA256 mode
<> 144:ef7eb2e8f9f7 743 * then processes pInBuffer. The digest is available in pOutBuffer
<> 144:ef7eb2e8f9f7 744 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 745 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 746 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 747 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 748 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 749 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
<> 144:ef7eb2e8f9f7 750 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 751 * @retval HAL status
<> 144:ef7eb2e8f9f7 752 */
<> 144:ef7eb2e8f9f7 753 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 754 {
<> 144:ef7eb2e8f9f7 755 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 756
<> 144:ef7eb2e8f9f7 757 /* Process Locked */
<> 144:ef7eb2e8f9f7 758 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 759
<> 144:ef7eb2e8f9f7 760 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 761 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 762
<> 144:ef7eb2e8f9f7 763 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 764 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 765 {
<> 144:ef7eb2e8f9f7 766 /* Check if key size is greater than 64 bytes */
<> 144:ef7eb2e8f9f7 767 if(hhash->Init.KeySize > 64)
<> 144:ef7eb2e8f9f7 768 {
<> 144:ef7eb2e8f9f7 769 /* Select the HMAC SHA256 mode */
<> 144:ef7eb2e8f9f7 770 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY);
<> 144:ef7eb2e8f9f7 771 }
<> 144:ef7eb2e8f9f7 772 else
<> 144:ef7eb2e8f9f7 773 {
<> 144:ef7eb2e8f9f7 774 /* Select the HMAC SHA256 mode */
<> 144:ef7eb2e8f9f7 775 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC);
<> 144:ef7eb2e8f9f7 776 }
<> 144:ef7eb2e8f9f7 777 /* Reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 778 the message digest of a new message */
<> 144:ef7eb2e8f9f7 779 HASH->CR |= HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 780 }
<> 144:ef7eb2e8f9f7 781
<> 144:ef7eb2e8f9f7 782 /* Set the phase */
<> 144:ef7eb2e8f9f7 783 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 784
<> 144:ef7eb2e8f9f7 785 /************************** STEP 1 ******************************************/
<> 144:ef7eb2e8f9f7 786 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 787 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 788
<> 144:ef7eb2e8f9f7 789 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 790 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 791
<> 144:ef7eb2e8f9f7 792 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 793 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 794
<> 144:ef7eb2e8f9f7 795 /* Get tick */
<> 144:ef7eb2e8f9f7 796 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 797
<> 144:ef7eb2e8f9f7 798 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 799 {
<> 144:ef7eb2e8f9f7 800 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 801 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 802 {
<> 144:ef7eb2e8f9f7 803 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 804 {
<> 144:ef7eb2e8f9f7 805 /* Change state */
<> 144:ef7eb2e8f9f7 806 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 807
<> 144:ef7eb2e8f9f7 808 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 809 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 810
<> 144:ef7eb2e8f9f7 811 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 812 }
<> 144:ef7eb2e8f9f7 813 }
<> 144:ef7eb2e8f9f7 814 }
<> 144:ef7eb2e8f9f7 815 /************************** STEP 2 ******************************************/
<> 144:ef7eb2e8f9f7 816 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 817 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 818
<> 144:ef7eb2e8f9f7 819 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 820 HASHEx_WriteData(pInBuffer, Size);
<> 144:ef7eb2e8f9f7 821
<> 144:ef7eb2e8f9f7 822 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 823 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 824
<> 144:ef7eb2e8f9f7 825 /* Get tick */
<> 144:ef7eb2e8f9f7 826 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 827
<> 144:ef7eb2e8f9f7 828 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 829 {
<> 144:ef7eb2e8f9f7 830 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 831 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 832 {
<> 144:ef7eb2e8f9f7 833 if((HAL_GetTick() - tickstart ) > Timeout)
<> 144:ef7eb2e8f9f7 834 {
<> 144:ef7eb2e8f9f7 835 /* Change state */
<> 144:ef7eb2e8f9f7 836 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 837
<> 144:ef7eb2e8f9f7 838 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 839 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 840
<> 144:ef7eb2e8f9f7 841 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 842 }
<> 144:ef7eb2e8f9f7 843 }
<> 144:ef7eb2e8f9f7 844 }
<> 144:ef7eb2e8f9f7 845 /************************** STEP 3 ******************************************/
<> 144:ef7eb2e8f9f7 846 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 847 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 848
<> 144:ef7eb2e8f9f7 849 /* Write input buffer in data register */
<> 144:ef7eb2e8f9f7 850 HASHEx_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 851
<> 144:ef7eb2e8f9f7 852 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 853 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 854
<> 144:ef7eb2e8f9f7 855 /* Get tick */
<> 144:ef7eb2e8f9f7 856 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 857
<> 144:ef7eb2e8f9f7 858 while((HASH->SR & HASH_FLAG_BUSY) == HASH_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 859 {
<> 144:ef7eb2e8f9f7 860 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 861 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 862 {
<> 144:ef7eb2e8f9f7 863 if((HAL_GetTick() - tickstart ) > Timeout)
<> 144:ef7eb2e8f9f7 864 {
<> 144:ef7eb2e8f9f7 865 /* Change state */
<> 144:ef7eb2e8f9f7 866 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 867
<> 144:ef7eb2e8f9f7 868 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 869 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 870
<> 144:ef7eb2e8f9f7 871 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 872 }
<> 144:ef7eb2e8f9f7 873 }
<> 144:ef7eb2e8f9f7 874 }
<> 144:ef7eb2e8f9f7 875 /* Read the message digest */
<> 144:ef7eb2e8f9f7 876 HASHEx_GetDigest(pOutBuffer, 32);
<> 144:ef7eb2e8f9f7 877
<> 144:ef7eb2e8f9f7 878 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 879 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 880
<> 144:ef7eb2e8f9f7 881 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 882 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 883
<> 144:ef7eb2e8f9f7 884 /* Return function status */
<> 144:ef7eb2e8f9f7 885 return HAL_OK;
<> 144:ef7eb2e8f9f7 886 }
<> 144:ef7eb2e8f9f7 887
<> 144:ef7eb2e8f9f7 888 /**
<> 144:ef7eb2e8f9f7 889 * @}
<> 144:ef7eb2e8f9f7 890 */
<> 144:ef7eb2e8f9f7 891
<> 144:ef7eb2e8f9f7 892 /** @defgroup HASHEx_Group3 HASH processing functions using interrupt mode
<> 144:ef7eb2e8f9f7 893 * @brief processing functions using interrupt mode.
<> 144:ef7eb2e8f9f7 894 *
<> 144:ef7eb2e8f9f7 895 @verbatim
<> 144:ef7eb2e8f9f7 896 ===============================================================================
<> 144:ef7eb2e8f9f7 897 ##### HASH processing using interrupt functions #####
<> 144:ef7eb2e8f9f7 898 ===============================================================================
<> 144:ef7eb2e8f9f7 899 [..] This section provides functions allowing to calculate in interrupt mode
<> 144:ef7eb2e8f9f7 900 the hash value using one of the following algorithms:
<> 144:ef7eb2e8f9f7 901 (+) SHA224
<> 144:ef7eb2e8f9f7 902 (+) SHA256
<> 144:ef7eb2e8f9f7 903
<> 144:ef7eb2e8f9f7 904 @endverbatim
<> 144:ef7eb2e8f9f7 905 * @{
<> 144:ef7eb2e8f9f7 906 */
<> 144:ef7eb2e8f9f7 907
<> 144:ef7eb2e8f9f7 908 /**
<> 144:ef7eb2e8f9f7 909 * @brief Initializes the HASH peripheral in SHA224 mode then processes pInBuffer.
<> 144:ef7eb2e8f9f7 910 * The digest is available in pOutBuffer.
<> 144:ef7eb2e8f9f7 911 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 912 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 913 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 914 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 915 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 916 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
<> 144:ef7eb2e8f9f7 917 * @retval HAL status
<> 144:ef7eb2e8f9f7 918 */
<> 144:ef7eb2e8f9f7 919 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
<> 144:ef7eb2e8f9f7 920 {
<> 144:ef7eb2e8f9f7 921 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 922 uint32_t buffercounter;
<> 144:ef7eb2e8f9f7 923 uint32_t inputcounter;
<> 144:ef7eb2e8f9f7 924
<> 144:ef7eb2e8f9f7 925 /* Process Locked */
<> 144:ef7eb2e8f9f7 926 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 927
<> 144:ef7eb2e8f9f7 928 if(hhash->State == HAL_HASH_STATE_READY)
<> 144:ef7eb2e8f9f7 929 {
<> 144:ef7eb2e8f9f7 930 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 931 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 932
<> 144:ef7eb2e8f9f7 933 hhash->HashInCount = Size;
<> 144:ef7eb2e8f9f7 934 hhash->pHashInBuffPtr = pInBuffer;
<> 144:ef7eb2e8f9f7 935 hhash->pHashOutBuffPtr = pOutBuffer;
<> 144:ef7eb2e8f9f7 936
<> 144:ef7eb2e8f9f7 937 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 938 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 939 {
<> 144:ef7eb2e8f9f7 940 /* Select the SHA224 mode */
<> 144:ef7eb2e8f9f7 941 HASH->CR |= HASH_ALGOSELECTION_SHA224;
<> 144:ef7eb2e8f9f7 942 /* Reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 943 the message digest of a new message */
<> 144:ef7eb2e8f9f7 944 HASH->CR |= HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 945 }
<> 144:ef7eb2e8f9f7 946 /* Reset interrupt counter */
<> 144:ef7eb2e8f9f7 947 hhash->HashITCounter = 0;
<> 144:ef7eb2e8f9f7 948 /* Set the phase */
<> 144:ef7eb2e8f9f7 949 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 950
<> 144:ef7eb2e8f9f7 951 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 952 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 953
<> 144:ef7eb2e8f9f7 954 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 955 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
<> 144:ef7eb2e8f9f7 956
<> 144:ef7eb2e8f9f7 957 /* Return function status */
<> 144:ef7eb2e8f9f7 958 return HAL_OK;
<> 144:ef7eb2e8f9f7 959 }
<> 144:ef7eb2e8f9f7 960 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
<> 144:ef7eb2e8f9f7 961 {
<> 144:ef7eb2e8f9f7 962 /* Read the message digest */
<> 144:ef7eb2e8f9f7 963 HASHEx_GetDigest(hhash->pHashOutBuffPtr, 28);
<> 144:ef7eb2e8f9f7 964 if(hhash->HashInCount == 0)
<> 144:ef7eb2e8f9f7 965 {
<> 144:ef7eb2e8f9f7 966 /* Disable Interrupts */
<> 144:ef7eb2e8f9f7 967 HASH->IMR = 0;
<> 144:ef7eb2e8f9f7 968 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 969 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 970 /* Call digest computation complete callback */
<> 144:ef7eb2e8f9f7 971 HAL_HASH_DgstCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 972 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 973 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 974
<> 144:ef7eb2e8f9f7 975 /* Return function status */
<> 144:ef7eb2e8f9f7 976 return HAL_OK;
<> 144:ef7eb2e8f9f7 977 }
<> 144:ef7eb2e8f9f7 978 }
<> 144:ef7eb2e8f9f7 979 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
<> 144:ef7eb2e8f9f7 980 {
<> 144:ef7eb2e8f9f7 981 if(hhash->HashInCount >= 68)
<> 144:ef7eb2e8f9f7 982 {
<> 144:ef7eb2e8f9f7 983 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
<> 144:ef7eb2e8f9f7 984 /* Write the Input block in the Data IN register */
<> 144:ef7eb2e8f9f7 985 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
<> 144:ef7eb2e8f9f7 986 {
<> 144:ef7eb2e8f9f7 987 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 988 inputaddr+=4;
<> 144:ef7eb2e8f9f7 989 }
<> 144:ef7eb2e8f9f7 990 if(hhash->HashITCounter == 0)
<> 144:ef7eb2e8f9f7 991 {
<> 144:ef7eb2e8f9f7 992 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 993 if(hhash->HashInCount >= 68)
<> 144:ef7eb2e8f9f7 994 {
<> 144:ef7eb2e8f9f7 995 /* Decrement buffer counter */
<> 144:ef7eb2e8f9f7 996 hhash->HashInCount -= 68;
<> 144:ef7eb2e8f9f7 997 hhash->pHashInBuffPtr+= 68;
<> 144:ef7eb2e8f9f7 998 }
<> 144:ef7eb2e8f9f7 999 else
<> 144:ef7eb2e8f9f7 1000 {
<> 144:ef7eb2e8f9f7 1001 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1002 hhash->pHashInBuffPtr+= hhash->HashInCount;
<> 144:ef7eb2e8f9f7 1003 }
<> 144:ef7eb2e8f9f7 1004 /* Set Interrupt counter */
<> 144:ef7eb2e8f9f7 1005 hhash->HashITCounter = 1;
<> 144:ef7eb2e8f9f7 1006 }
<> 144:ef7eb2e8f9f7 1007 else
<> 144:ef7eb2e8f9f7 1008 {
<> 144:ef7eb2e8f9f7 1009 /* Decrement buffer counter */
<> 144:ef7eb2e8f9f7 1010 hhash->HashInCount -= 64;
<> 144:ef7eb2e8f9f7 1011 hhash->pHashInBuffPtr+= 64;
<> 144:ef7eb2e8f9f7 1012 }
<> 144:ef7eb2e8f9f7 1013 }
<> 144:ef7eb2e8f9f7 1014 else
<> 144:ef7eb2e8f9f7 1015 {
<> 144:ef7eb2e8f9f7 1016 /* Get the buffer address */
<> 144:ef7eb2e8f9f7 1017 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
<> 144:ef7eb2e8f9f7 1018 /* Get the buffer counter */
<> 144:ef7eb2e8f9f7 1019 inputcounter = hhash->HashInCount;
<> 144:ef7eb2e8f9f7 1020 /* Disable Interrupts */
<> 144:ef7eb2e8f9f7 1021 HASH->IMR &= ~(HASH_IT_DINI);
<> 144:ef7eb2e8f9f7 1022 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1023 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
<> 144:ef7eb2e8f9f7 1024
<> 144:ef7eb2e8f9f7 1025 if((inputcounter > 4) && (inputcounter%4))
<> 144:ef7eb2e8f9f7 1026 {
<> 144:ef7eb2e8f9f7 1027 inputcounter = (inputcounter+4-inputcounter%4);
<> 144:ef7eb2e8f9f7 1028 }
<> 144:ef7eb2e8f9f7 1029 else if ((inputcounter < 4) && (inputcounter != 0))
<> 144:ef7eb2e8f9f7 1030 {
<> 144:ef7eb2e8f9f7 1031 inputcounter = 4;
<> 144:ef7eb2e8f9f7 1032 }
<> 144:ef7eb2e8f9f7 1033 /* Write the Input block in the Data IN register */
<> 144:ef7eb2e8f9f7 1034 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
<> 144:ef7eb2e8f9f7 1035 {
<> 144:ef7eb2e8f9f7 1036 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 1037 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1038 }
<> 144:ef7eb2e8f9f7 1039 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 1040 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 1041 /* Reset buffer counter */
<> 144:ef7eb2e8f9f7 1042 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1043 /* Call Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 1044 HAL_HASH_InCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 1045 }
<> 144:ef7eb2e8f9f7 1046 }
<> 144:ef7eb2e8f9f7 1047
<> 144:ef7eb2e8f9f7 1048 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1049 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1050
<> 144:ef7eb2e8f9f7 1051 /* Return function status */
<> 144:ef7eb2e8f9f7 1052 return HAL_OK;
<> 144:ef7eb2e8f9f7 1053 }
<> 144:ef7eb2e8f9f7 1054
<> 144:ef7eb2e8f9f7 1055
<> 144:ef7eb2e8f9f7 1056 /**
<> 144:ef7eb2e8f9f7 1057 * @brief Initializes the HASH peripheral in SHA256 mode then processes pInBuffer.
<> 144:ef7eb2e8f9f7 1058 * The digest is available in pOutBuffer.
<> 144:ef7eb2e8f9f7 1059 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1060 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1061 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 1062 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 1063 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 1064 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
<> 144:ef7eb2e8f9f7 1065 * @retval HAL status
<> 144:ef7eb2e8f9f7 1066 */
<> 144:ef7eb2e8f9f7 1067 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
<> 144:ef7eb2e8f9f7 1068 {
<> 144:ef7eb2e8f9f7 1069 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1070 uint32_t buffercounter;
<> 144:ef7eb2e8f9f7 1071 uint32_t inputcounter;
<> 144:ef7eb2e8f9f7 1072
<> 144:ef7eb2e8f9f7 1073 /* Process Locked */
<> 144:ef7eb2e8f9f7 1074 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1075
<> 144:ef7eb2e8f9f7 1076 if(hhash->State == HAL_HASH_STATE_READY)
<> 144:ef7eb2e8f9f7 1077 {
<> 144:ef7eb2e8f9f7 1078 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1079 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1080
<> 144:ef7eb2e8f9f7 1081 hhash->HashInCount = Size;
<> 144:ef7eb2e8f9f7 1082 hhash->pHashInBuffPtr = pInBuffer;
<> 144:ef7eb2e8f9f7 1083 hhash->pHashOutBuffPtr = pOutBuffer;
<> 144:ef7eb2e8f9f7 1084
<> 144:ef7eb2e8f9f7 1085 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1086 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 1087 {
<> 144:ef7eb2e8f9f7 1088 /* Select the SHA256 mode */
<> 144:ef7eb2e8f9f7 1089 HASH->CR |= HASH_ALGOSELECTION_SHA256;
<> 144:ef7eb2e8f9f7 1090 /* Reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 1091 the message digest of a new message */
<> 144:ef7eb2e8f9f7 1092 HASH->CR |= HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 1093 }
<> 144:ef7eb2e8f9f7 1094
<> 144:ef7eb2e8f9f7 1095 /* Reset interrupt counter */
<> 144:ef7eb2e8f9f7 1096 hhash->HashITCounter = 0;
<> 144:ef7eb2e8f9f7 1097
<> 144:ef7eb2e8f9f7 1098 /* Set the phase */
<> 144:ef7eb2e8f9f7 1099 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1100
<> 144:ef7eb2e8f9f7 1101 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1102 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1103
<> 144:ef7eb2e8f9f7 1104 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 1105 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
<> 144:ef7eb2e8f9f7 1106
<> 144:ef7eb2e8f9f7 1107 /* Return function status */
<> 144:ef7eb2e8f9f7 1108 return HAL_OK;
<> 144:ef7eb2e8f9f7 1109 }
<> 144:ef7eb2e8f9f7 1110 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
<> 144:ef7eb2e8f9f7 1111 {
<> 144:ef7eb2e8f9f7 1112 /* Read the message digest */
<> 144:ef7eb2e8f9f7 1113 HASHEx_GetDigest(hhash->pHashOutBuffPtr, 32);
<> 144:ef7eb2e8f9f7 1114 if(hhash->HashInCount == 0)
<> 144:ef7eb2e8f9f7 1115 {
<> 144:ef7eb2e8f9f7 1116 /* Disable Interrupts */
<> 144:ef7eb2e8f9f7 1117 HASH->IMR = 0;
<> 144:ef7eb2e8f9f7 1118 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1119 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 1120 /* Call digest computation complete callback */
<> 144:ef7eb2e8f9f7 1121 HAL_HASH_DgstCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 1122
<> 144:ef7eb2e8f9f7 1123 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1124 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1125
<> 144:ef7eb2e8f9f7 1126 /* Return function status */
<> 144:ef7eb2e8f9f7 1127 return HAL_OK;
<> 144:ef7eb2e8f9f7 1128 }
<> 144:ef7eb2e8f9f7 1129 }
<> 144:ef7eb2e8f9f7 1130 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
<> 144:ef7eb2e8f9f7 1131 {
<> 144:ef7eb2e8f9f7 1132 if(hhash->HashInCount >= 68)
<> 144:ef7eb2e8f9f7 1133 {
<> 144:ef7eb2e8f9f7 1134 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
<> 144:ef7eb2e8f9f7 1135 /* Write the Input block in the Data IN register */
<> 144:ef7eb2e8f9f7 1136 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
<> 144:ef7eb2e8f9f7 1137 {
<> 144:ef7eb2e8f9f7 1138 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 1139 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1140 }
<> 144:ef7eb2e8f9f7 1141 if(hhash->HashITCounter == 0)
<> 144:ef7eb2e8f9f7 1142 {
<> 144:ef7eb2e8f9f7 1143 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 1144
<> 144:ef7eb2e8f9f7 1145 if(hhash->HashInCount >= 68)
<> 144:ef7eb2e8f9f7 1146 {
<> 144:ef7eb2e8f9f7 1147 /* Decrement buffer counter */
<> 144:ef7eb2e8f9f7 1148 hhash->HashInCount -= 68;
<> 144:ef7eb2e8f9f7 1149 hhash->pHashInBuffPtr+= 68;
<> 144:ef7eb2e8f9f7 1150 }
<> 144:ef7eb2e8f9f7 1151 else
<> 144:ef7eb2e8f9f7 1152 {
<> 144:ef7eb2e8f9f7 1153 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1154 hhash->pHashInBuffPtr+= hhash->HashInCount;
<> 144:ef7eb2e8f9f7 1155 }
<> 144:ef7eb2e8f9f7 1156 /* Set Interrupt counter */
<> 144:ef7eb2e8f9f7 1157 hhash->HashITCounter = 1;
<> 144:ef7eb2e8f9f7 1158 }
<> 144:ef7eb2e8f9f7 1159 else
<> 144:ef7eb2e8f9f7 1160 {
<> 144:ef7eb2e8f9f7 1161 /* Decrement buffer counter */
<> 144:ef7eb2e8f9f7 1162 hhash->HashInCount -= 64;
<> 144:ef7eb2e8f9f7 1163 hhash->pHashInBuffPtr+= 64;
<> 144:ef7eb2e8f9f7 1164 }
<> 144:ef7eb2e8f9f7 1165 }
<> 144:ef7eb2e8f9f7 1166 else
<> 144:ef7eb2e8f9f7 1167 {
<> 144:ef7eb2e8f9f7 1168 /* Get the buffer address */
<> 144:ef7eb2e8f9f7 1169 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
<> 144:ef7eb2e8f9f7 1170 /* Get the buffer counter */
<> 144:ef7eb2e8f9f7 1171 inputcounter = hhash->HashInCount;
<> 144:ef7eb2e8f9f7 1172 /* Disable Interrupts */
<> 144:ef7eb2e8f9f7 1173 HASH->IMR &= ~(HASH_IT_DINI);
<> 144:ef7eb2e8f9f7 1174 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1175 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
<> 144:ef7eb2e8f9f7 1176
<> 144:ef7eb2e8f9f7 1177 if((inputcounter > 4) && (inputcounter%4))
<> 144:ef7eb2e8f9f7 1178 {
<> 144:ef7eb2e8f9f7 1179 inputcounter = (inputcounter+4-inputcounter%4);
<> 144:ef7eb2e8f9f7 1180 }
<> 144:ef7eb2e8f9f7 1181 else if ((inputcounter < 4) && (inputcounter != 0))
<> 144:ef7eb2e8f9f7 1182 {
<> 144:ef7eb2e8f9f7 1183 inputcounter = 4;
<> 144:ef7eb2e8f9f7 1184 }
<> 144:ef7eb2e8f9f7 1185
<> 144:ef7eb2e8f9f7 1186 /* Write the Input block in the Data IN register */
<> 144:ef7eb2e8f9f7 1187 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
<> 144:ef7eb2e8f9f7 1188 {
<> 144:ef7eb2e8f9f7 1189 HASH->DIN = *(uint32_t*)inputaddr;
<> 144:ef7eb2e8f9f7 1190 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1191 }
<> 144:ef7eb2e8f9f7 1192 /* Start the digest calculation */
<> 144:ef7eb2e8f9f7 1193 __HAL_HASH_START_DIGEST();
<> 144:ef7eb2e8f9f7 1194 /* Reset buffer counter */
<> 144:ef7eb2e8f9f7 1195 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1196 /* Call Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 1197 HAL_HASH_InCpltCallback(hhash);
<> 144:ef7eb2e8f9f7 1198 }
<> 144:ef7eb2e8f9f7 1199 }
<> 144:ef7eb2e8f9f7 1200
<> 144:ef7eb2e8f9f7 1201 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1202 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1203
<> 144:ef7eb2e8f9f7 1204 /* Return function status */
<> 144:ef7eb2e8f9f7 1205 return HAL_OK;
<> 144:ef7eb2e8f9f7 1206 }
<> 144:ef7eb2e8f9f7 1207
<> 144:ef7eb2e8f9f7 1208 /**
<> 144:ef7eb2e8f9f7 1209 * @brief This function handles HASH interrupt request.
<> 144:ef7eb2e8f9f7 1210 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1211 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1212 * @retval None
<> 144:ef7eb2e8f9f7 1213 */
<> 144:ef7eb2e8f9f7 1214 void HAL_HASHEx_IRQHandler(HASH_HandleTypeDef *hhash)
<> 144:ef7eb2e8f9f7 1215 {
<> 144:ef7eb2e8f9f7 1216 switch(HASH->CR & HASH_CR_ALGO)
<> 144:ef7eb2e8f9f7 1217 {
<> 144:ef7eb2e8f9f7 1218
<> 144:ef7eb2e8f9f7 1219 case HASH_ALGOSELECTION_SHA224:
<> 144:ef7eb2e8f9f7 1220 HAL_HASHEx_SHA224_Start_IT(hhash, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 1221 break;
<> 144:ef7eb2e8f9f7 1222
<> 144:ef7eb2e8f9f7 1223 case HASH_ALGOSELECTION_SHA256:
<> 144:ef7eb2e8f9f7 1224 HAL_HASHEx_SHA256_Start_IT(hhash, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 1225 break;
<> 144:ef7eb2e8f9f7 1226
<> 144:ef7eb2e8f9f7 1227 default:
<> 144:ef7eb2e8f9f7 1228 break;
<> 144:ef7eb2e8f9f7 1229 }
<> 144:ef7eb2e8f9f7 1230 }
<> 144:ef7eb2e8f9f7 1231
<> 144:ef7eb2e8f9f7 1232 /**
<> 144:ef7eb2e8f9f7 1233 * @}
<> 144:ef7eb2e8f9f7 1234 */
<> 144:ef7eb2e8f9f7 1235
<> 144:ef7eb2e8f9f7 1236 /** @defgroup HASHEx_Group4 HASH processing functions using DMA mode
<> 144:ef7eb2e8f9f7 1237 * @brief processing functions using DMA mode.
<> 144:ef7eb2e8f9f7 1238 *
<> 144:ef7eb2e8f9f7 1239 @verbatim
<> 144:ef7eb2e8f9f7 1240 ===============================================================================
<> 144:ef7eb2e8f9f7 1241 ##### HASH processing using DMA functions #####
<> 144:ef7eb2e8f9f7 1242 ===============================================================================
<> 144:ef7eb2e8f9f7 1243 [..] This section provides functions allowing to calculate in DMA mode
<> 144:ef7eb2e8f9f7 1244 the hash value using one of the following algorithms:
<> 144:ef7eb2e8f9f7 1245 (+) SHA224
<> 144:ef7eb2e8f9f7 1246 (+) SHA256
<> 144:ef7eb2e8f9f7 1247
<> 144:ef7eb2e8f9f7 1248 @endverbatim
<> 144:ef7eb2e8f9f7 1249 * @{
<> 144:ef7eb2e8f9f7 1250 */
<> 144:ef7eb2e8f9f7 1251
<> 144:ef7eb2e8f9f7 1252
<> 144:ef7eb2e8f9f7 1253 /**
<> 144:ef7eb2e8f9f7 1254 * @brief Initializes the HASH peripheral in SHA224 mode then enables DMA to
<> 144:ef7eb2e8f9f7 1255 control data transfer. Use HAL_HASH_SHA224_Finish() to get the digest.
<> 144:ef7eb2e8f9f7 1256 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1257 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1258 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 1259 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 1260 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 1261 * @retval HAL status
<> 144:ef7eb2e8f9f7 1262 */
<> 144:ef7eb2e8f9f7 1263 HAL_StatusTypeDef HAL_HASHEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 1264 {
<> 144:ef7eb2e8f9f7 1265 uint32_t inputaddr = (uint32_t)pInBuffer;
<> 144:ef7eb2e8f9f7 1266
<> 144:ef7eb2e8f9f7 1267 /* Process Locked */
<> 144:ef7eb2e8f9f7 1268 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1269
<> 144:ef7eb2e8f9f7 1270 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1271 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1272
<> 144:ef7eb2e8f9f7 1273 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1274 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 1275 {
<> 144:ef7eb2e8f9f7 1276 /* Select the SHA224 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 1277 the message digest of a new message */
<> 144:ef7eb2e8f9f7 1278 HASH->CR |= HASH_ALGOSELECTION_SHA224 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 1279 }
<> 144:ef7eb2e8f9f7 1280
<> 144:ef7eb2e8f9f7 1281 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1282 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 1283
<> 144:ef7eb2e8f9f7 1284 /* Set the phase */
<> 144:ef7eb2e8f9f7 1285 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1286
<> 144:ef7eb2e8f9f7 1287 /* Set the HASH DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 1288 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
<> 144:ef7eb2e8f9f7 1289 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 1290 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
<> 144:ef7eb2e8f9f7 1291
<> 144:ef7eb2e8f9f7 1292 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 1293 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
<> 144:ef7eb2e8f9f7 1294
<> 144:ef7eb2e8f9f7 1295 /* Enable DMA requests */
<> 144:ef7eb2e8f9f7 1296 HASH->CR |= (HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 1297
<> 144:ef7eb2e8f9f7 1298 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1299 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1300
<> 144:ef7eb2e8f9f7 1301 /* Return function status */
<> 144:ef7eb2e8f9f7 1302 return HAL_OK;
<> 144:ef7eb2e8f9f7 1303 }
<> 144:ef7eb2e8f9f7 1304
<> 144:ef7eb2e8f9f7 1305 /**
<> 144:ef7eb2e8f9f7 1306 * @brief Returns the computed digest in SHA224
<> 144:ef7eb2e8f9f7 1307 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1308 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1309 * @param pOutBuffer: Pointer to the computed digest. Its size must be 28 bytes.
<> 144:ef7eb2e8f9f7 1310 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 1311 * @retval HAL status
<> 144:ef7eb2e8f9f7 1312 */
<> 144:ef7eb2e8f9f7 1313 HAL_StatusTypeDef HAL_HASHEx_SHA224_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 1314 {
<> 144:ef7eb2e8f9f7 1315 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1316
<> 144:ef7eb2e8f9f7 1317 /* Process Locked */
<> 144:ef7eb2e8f9f7 1318 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1319
<> 144:ef7eb2e8f9f7 1320 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 1321 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1322
<> 144:ef7eb2e8f9f7 1323 /* Get tick */
<> 144:ef7eb2e8f9f7 1324 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1325
<> 144:ef7eb2e8f9f7 1326 while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS))
<> 144:ef7eb2e8f9f7 1327 {
<> 144:ef7eb2e8f9f7 1328 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1329 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1330 {
<> 144:ef7eb2e8f9f7 1331 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1332 {
<> 144:ef7eb2e8f9f7 1333 /* Change state */
<> 144:ef7eb2e8f9f7 1334 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1335
<> 144:ef7eb2e8f9f7 1336 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1337 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1338
<> 144:ef7eb2e8f9f7 1339 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1340 }
<> 144:ef7eb2e8f9f7 1341 }
<> 144:ef7eb2e8f9f7 1342 }
<> 144:ef7eb2e8f9f7 1343
<> 144:ef7eb2e8f9f7 1344 /* Read the message digest */
<> 144:ef7eb2e8f9f7 1345 HASHEx_GetDigest(pOutBuffer, 28);
<> 144:ef7eb2e8f9f7 1346
<> 144:ef7eb2e8f9f7 1347 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 1348 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 1349
<> 144:ef7eb2e8f9f7 1350 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1351 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1352
<> 144:ef7eb2e8f9f7 1353 /* Return function status */
<> 144:ef7eb2e8f9f7 1354 return HAL_OK;
<> 144:ef7eb2e8f9f7 1355 }
<> 144:ef7eb2e8f9f7 1356
<> 144:ef7eb2e8f9f7 1357 /**
<> 144:ef7eb2e8f9f7 1358 * @brief Initializes the HASH peripheral in SHA256 mode then enables DMA to
<> 144:ef7eb2e8f9f7 1359 control data transfer. Use HAL_HASH_SHA256_Finish() to get the digest.
<> 144:ef7eb2e8f9f7 1360 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1361 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1362 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 1363 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 1364 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 1365 * @retval HAL status
<> 144:ef7eb2e8f9f7 1366 */
<> 144:ef7eb2e8f9f7 1367 HAL_StatusTypeDef HAL_HASHEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 1368 {
<> 144:ef7eb2e8f9f7 1369 uint32_t inputaddr = (uint32_t)pInBuffer;
<> 144:ef7eb2e8f9f7 1370
<> 144:ef7eb2e8f9f7 1371 /* Process Locked */
<> 144:ef7eb2e8f9f7 1372 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1373
<> 144:ef7eb2e8f9f7 1374 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1375 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1376
<> 144:ef7eb2e8f9f7 1377 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1378 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 1379 {
<> 144:ef7eb2e8f9f7 1380 /* Select the SHA256 mode and reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 1381 the message digest of a new message */
<> 144:ef7eb2e8f9f7 1382 HASH->CR |= HASH_ALGOSELECTION_SHA256 | HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 1383 }
<> 144:ef7eb2e8f9f7 1384
<> 144:ef7eb2e8f9f7 1385 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1386 __HAL_HASH_SET_NBVALIDBITS(Size);
<> 144:ef7eb2e8f9f7 1387
<> 144:ef7eb2e8f9f7 1388 /* Set the phase */
<> 144:ef7eb2e8f9f7 1389 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1390
<> 144:ef7eb2e8f9f7 1391 /* Set the HASH DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 1392 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
<> 144:ef7eb2e8f9f7 1393 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 1394 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
<> 144:ef7eb2e8f9f7 1395
<> 144:ef7eb2e8f9f7 1396 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 1397 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
<> 144:ef7eb2e8f9f7 1398
<> 144:ef7eb2e8f9f7 1399 /* Enable DMA requests */
<> 144:ef7eb2e8f9f7 1400 HASH->CR |= (HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 1401
<> 144:ef7eb2e8f9f7 1402 /* Process UnLock */
<> 144:ef7eb2e8f9f7 1403 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1404
<> 144:ef7eb2e8f9f7 1405 /* Return function status */
<> 144:ef7eb2e8f9f7 1406 return HAL_OK;
<> 144:ef7eb2e8f9f7 1407 }
<> 144:ef7eb2e8f9f7 1408
<> 144:ef7eb2e8f9f7 1409 /**
<> 144:ef7eb2e8f9f7 1410 * @brief Returns the computed digest in SHA256.
<> 144:ef7eb2e8f9f7 1411 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1412 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1413 * @param pOutBuffer: Pointer to the computed digest. Its size must be 32 bytes.
<> 144:ef7eb2e8f9f7 1414 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 1415 * @retval HAL status
<> 144:ef7eb2e8f9f7 1416 */
<> 144:ef7eb2e8f9f7 1417 HAL_StatusTypeDef HAL_HASHEx_SHA256_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 1418 {
<> 144:ef7eb2e8f9f7 1419 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1420
<> 144:ef7eb2e8f9f7 1421 /* Process Locked */
<> 144:ef7eb2e8f9f7 1422 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1423
<> 144:ef7eb2e8f9f7 1424 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 1425 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1426
<> 144:ef7eb2e8f9f7 1427 /* Get tick */
<> 144:ef7eb2e8f9f7 1428 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1429
<> 144:ef7eb2e8f9f7 1430 while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS))
<> 144:ef7eb2e8f9f7 1431 {
<> 144:ef7eb2e8f9f7 1432 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1433 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1434 {
<> 144:ef7eb2e8f9f7 1435 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1436 {
<> 144:ef7eb2e8f9f7 1437 /* Change state */
<> 144:ef7eb2e8f9f7 1438 hhash->State = HAL_HASH_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1439
<> 144:ef7eb2e8f9f7 1440 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1441 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1442
<> 144:ef7eb2e8f9f7 1443 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1444 }
<> 144:ef7eb2e8f9f7 1445 }
<> 144:ef7eb2e8f9f7 1446 }
<> 144:ef7eb2e8f9f7 1447
<> 144:ef7eb2e8f9f7 1448 /* Read the message digest */
<> 144:ef7eb2e8f9f7 1449 HASHEx_GetDigest(pOutBuffer, 32);
<> 144:ef7eb2e8f9f7 1450
<> 144:ef7eb2e8f9f7 1451 /* Change HASH peripheral state */
<> 144:ef7eb2e8f9f7 1452 hhash->State = HAL_HASH_STATE_READY;
<> 144:ef7eb2e8f9f7 1453
<> 144:ef7eb2e8f9f7 1454 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1455 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1456
<> 144:ef7eb2e8f9f7 1457 /* Return function status */
<> 144:ef7eb2e8f9f7 1458 return HAL_OK;
<> 144:ef7eb2e8f9f7 1459 }
<> 144:ef7eb2e8f9f7 1460
<> 144:ef7eb2e8f9f7 1461
<> 144:ef7eb2e8f9f7 1462 /**
<> 144:ef7eb2e8f9f7 1463 * @}
<> 144:ef7eb2e8f9f7 1464 */
<> 144:ef7eb2e8f9f7 1465 /** @defgroup HASHEx_Group5 HMAC processing functions using DMA mode
<> 144:ef7eb2e8f9f7 1466 * @brief HMAC processing functions using DMA mode .
<> 144:ef7eb2e8f9f7 1467 *
<> 144:ef7eb2e8f9f7 1468 @verbatim
<> 144:ef7eb2e8f9f7 1469 ===============================================================================
<> 144:ef7eb2e8f9f7 1470 ##### HMAC processing using DMA functions #####
<> 144:ef7eb2e8f9f7 1471 ===============================================================================
<> 144:ef7eb2e8f9f7 1472 [..] This section provides functions allowing to calculate in DMA mode
<> 144:ef7eb2e8f9f7 1473 the HMAC value using one of the following algorithms:
<> 144:ef7eb2e8f9f7 1474 (+) SHA224
<> 144:ef7eb2e8f9f7 1475 (+) SHA256
<> 144:ef7eb2e8f9f7 1476
<> 144:ef7eb2e8f9f7 1477 @endverbatim
<> 144:ef7eb2e8f9f7 1478 * @{
<> 144:ef7eb2e8f9f7 1479 */
<> 144:ef7eb2e8f9f7 1480
<> 144:ef7eb2e8f9f7 1481 /**
<> 144:ef7eb2e8f9f7 1482 * @brief Initializes the HASH peripheral in HMAC SHA224 mode
<> 144:ef7eb2e8f9f7 1483 * then enables DMA to control data transfer.
<> 144:ef7eb2e8f9f7 1484 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1485 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1486 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 1487 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 1488 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 1489 * @retval HAL status
<> 144:ef7eb2e8f9f7 1490 */
<> 144:ef7eb2e8f9f7 1491 HAL_StatusTypeDef HAL_HMACEx_SHA224_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 1492 {
<> 144:ef7eb2e8f9f7 1493 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1494
<> 144:ef7eb2e8f9f7 1495 /* Process Locked */
<> 144:ef7eb2e8f9f7 1496 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1497
<> 144:ef7eb2e8f9f7 1498 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1499 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1500
<> 144:ef7eb2e8f9f7 1501 /* Save buffer pointer and size in handle */
<> 144:ef7eb2e8f9f7 1502 hhash->pHashInBuffPtr = pInBuffer;
<> 144:ef7eb2e8f9f7 1503 hhash->HashBuffSize = Size;
<> 144:ef7eb2e8f9f7 1504 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1505
<> 144:ef7eb2e8f9f7 1506 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1507 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 1508 {
<> 144:ef7eb2e8f9f7 1509 /* Check if key size is greater than 64 bytes */
<> 144:ef7eb2e8f9f7 1510 if(hhash->Init.KeySize > 64)
<> 144:ef7eb2e8f9f7 1511 {
<> 144:ef7eb2e8f9f7 1512 /* Select the HMAC SHA224 mode */
<> 144:ef7eb2e8f9f7 1513 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
<> 144:ef7eb2e8f9f7 1514 }
<> 144:ef7eb2e8f9f7 1515 else
<> 144:ef7eb2e8f9f7 1516 {
<> 144:ef7eb2e8f9f7 1517 /* Select the HMAC SHA224 mode */
<> 144:ef7eb2e8f9f7 1518 HASH->CR |= (HASH_ALGOSELECTION_SHA224 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
<> 144:ef7eb2e8f9f7 1519 }
<> 144:ef7eb2e8f9f7 1520 }
<> 144:ef7eb2e8f9f7 1521
<> 144:ef7eb2e8f9f7 1522 /* Set the phase */
<> 144:ef7eb2e8f9f7 1523 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1524
<> 144:ef7eb2e8f9f7 1525 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1526 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 1527
<> 144:ef7eb2e8f9f7 1528 /* Get the key address */
<> 144:ef7eb2e8f9f7 1529 inputaddr = (uint32_t)(hhash->Init.pKey);
<> 144:ef7eb2e8f9f7 1530
<> 144:ef7eb2e8f9f7 1531 /* Set the HASH DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 1532 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
<> 144:ef7eb2e8f9f7 1533 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 1534 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
<> 144:ef7eb2e8f9f7 1535
<> 144:ef7eb2e8f9f7 1536 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 1537 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
<> 144:ef7eb2e8f9f7 1538 /* Enable DMA requests */
<> 144:ef7eb2e8f9f7 1539 HASH->CR |= (HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 1540
<> 144:ef7eb2e8f9f7 1541 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1542 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1543
<> 144:ef7eb2e8f9f7 1544 /* Return function status */
<> 144:ef7eb2e8f9f7 1545 return HAL_OK;
<> 144:ef7eb2e8f9f7 1546 }
<> 144:ef7eb2e8f9f7 1547
<> 144:ef7eb2e8f9f7 1548 /**
<> 144:ef7eb2e8f9f7 1549 * @brief Initializes the HASH peripheral in HMAC SHA256 mode
<> 144:ef7eb2e8f9f7 1550 * then enables DMA to control data transfer.
<> 144:ef7eb2e8f9f7 1551 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1552 * the configuration information for HASH module
<> 144:ef7eb2e8f9f7 1553 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
<> 144:ef7eb2e8f9f7 1554 * @param Size: Length of the input buffer in bytes.
<> 144:ef7eb2e8f9f7 1555 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
<> 144:ef7eb2e8f9f7 1556 * @retval HAL status
<> 144:ef7eb2e8f9f7 1557 */
<> 144:ef7eb2e8f9f7 1558 HAL_StatusTypeDef HAL_HMACEx_SHA256_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
<> 144:ef7eb2e8f9f7 1559 {
<> 144:ef7eb2e8f9f7 1560 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1561
<> 144:ef7eb2e8f9f7 1562 /* Process Locked */
<> 144:ef7eb2e8f9f7 1563 __HAL_LOCK(hhash);
<> 144:ef7eb2e8f9f7 1564
<> 144:ef7eb2e8f9f7 1565 /* Change the HASH state */
<> 144:ef7eb2e8f9f7 1566 hhash->State = HAL_HASH_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1567
<> 144:ef7eb2e8f9f7 1568 /* Save buffer pointer and size in handle */
<> 144:ef7eb2e8f9f7 1569 hhash->pHashInBuffPtr = pInBuffer;
<> 144:ef7eb2e8f9f7 1570 hhash->HashBuffSize = Size;
<> 144:ef7eb2e8f9f7 1571 hhash->HashInCount = 0;
<> 144:ef7eb2e8f9f7 1572
<> 144:ef7eb2e8f9f7 1573 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1574 if(hhash->Phase == HAL_HASH_PHASE_READY)
<> 144:ef7eb2e8f9f7 1575 {
<> 144:ef7eb2e8f9f7 1576 /* Check if key size is greater than 64 bytes */
<> 144:ef7eb2e8f9f7 1577 if(hhash->Init.KeySize > 64)
<> 144:ef7eb2e8f9f7 1578 {
<> 144:ef7eb2e8f9f7 1579 /* Select the HMAC SHA256 mode */
<> 144:ef7eb2e8f9f7 1580 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY);
<> 144:ef7eb2e8f9f7 1581 }
<> 144:ef7eb2e8f9f7 1582 else
<> 144:ef7eb2e8f9f7 1583 {
<> 144:ef7eb2e8f9f7 1584 /* Select the HMAC SHA256 mode */
<> 144:ef7eb2e8f9f7 1585 HASH->CR |= (HASH_ALGOSELECTION_SHA256 | HASH_ALGOMODE_HMAC);
<> 144:ef7eb2e8f9f7 1586 }
<> 144:ef7eb2e8f9f7 1587 /* Reset the HASH processor core, so that the HASH will be ready to compute
<> 144:ef7eb2e8f9f7 1588 the message digest of a new message */
<> 144:ef7eb2e8f9f7 1589 HASH->CR |= HASH_CR_INIT;
<> 144:ef7eb2e8f9f7 1590 }
<> 144:ef7eb2e8f9f7 1591
<> 144:ef7eb2e8f9f7 1592 /* Set the phase */
<> 144:ef7eb2e8f9f7 1593 hhash->Phase = HAL_HASH_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1594
<> 144:ef7eb2e8f9f7 1595 /* Configure the number of valid bits in last word of the message */
<> 144:ef7eb2e8f9f7 1596 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
<> 144:ef7eb2e8f9f7 1597
<> 144:ef7eb2e8f9f7 1598 /* Get the key address */
<> 144:ef7eb2e8f9f7 1599 inputaddr = (uint32_t)(hhash->Init.pKey);
<> 144:ef7eb2e8f9f7 1600
<> 144:ef7eb2e8f9f7 1601 /* Set the HASH DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 1602 hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
<> 144:ef7eb2e8f9f7 1603 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 1604 hhash->hdmain->XferErrorCallback = HASHEx_DMAError;
<> 144:ef7eb2e8f9f7 1605
<> 144:ef7eb2e8f9f7 1606 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 1607 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
<> 144:ef7eb2e8f9f7 1608 /* Enable DMA requests */
<> 144:ef7eb2e8f9f7 1609 HASH->CR |= (HASH_CR_DMAE);
<> 144:ef7eb2e8f9f7 1610
<> 144:ef7eb2e8f9f7 1611 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1612 __HAL_UNLOCK(hhash);
<> 144:ef7eb2e8f9f7 1613
<> 144:ef7eb2e8f9f7 1614 /* Return function status */
<> 144:ef7eb2e8f9f7 1615 return HAL_OK;
<> 144:ef7eb2e8f9f7 1616 }
<> 144:ef7eb2e8f9f7 1617
<> 144:ef7eb2e8f9f7 1618 /**
<> 144:ef7eb2e8f9f7 1619 * @}
<> 144:ef7eb2e8f9f7 1620 */
<> 144:ef7eb2e8f9f7 1621
<> 144:ef7eb2e8f9f7 1622 /**
<> 144:ef7eb2e8f9f7 1623 * @}
<> 144:ef7eb2e8f9f7 1624 */
<> 144:ef7eb2e8f9f7 1625 #endif /* HAL_HASH_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 1626
<> 144:ef7eb2e8f9f7 1627 /**
<> 144:ef7eb2e8f9f7 1628 * @}
<> 144:ef7eb2e8f9f7 1629 */
<> 144:ef7eb2e8f9f7 1630 #endif /* STM32F756xx || STM32F777xx || STM32F779xx */
<> 144:ef7eb2e8f9f7 1631
<> 144:ef7eb2e8f9f7 1632 /**
<> 144:ef7eb2e8f9f7 1633 * @}
<> 144:ef7eb2e8f9f7 1634 */
<> 144:ef7eb2e8f9f7 1635
<> 144:ef7eb2e8f9f7 1636 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/