Daiki Kato / mbed-dev_tmp

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
83:a036322b8637
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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