SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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