Steven Wray / mbed-dev

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon Mar 07 10:00:14 2016 +0000
Revision:
83:a036322b8637
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision ee20d03969aa5c570152f88e8f3d8a4739eed40b

Full URL: https://github.com/mbedmicro/mbed/commit/ee20d03969aa5c570152f88e8f3d8a4739eed40b/

[STM32F7] Update STM32F7Cube_FW version

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
mbed_official 83:a036322b8637 5 * @version V1.0.4
mbed_official 83:a036322b8637 6 * @date 09-December-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 {
mbed_official 83:a036322b8637 431 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 432 UNUSED(hhash);
mbed_official 83:a036322b8637 433
bogdanm 0:9b334a45a8ff 434 /* NOTE: This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 435 the HAL_HASH_MspInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 436 */
bogdanm 0:9b334a45a8ff 437 }
bogdanm 0:9b334a45a8ff 438
bogdanm 0:9b334a45a8ff 439 /**
bogdanm 0:9b334a45a8ff 440 * @brief DeInitializes HASH MSP.
bogdanm 0:9b334a45a8ff 441 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 442 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 443 * @retval None
bogdanm 0:9b334a45a8ff 444 */
bogdanm 0:9b334a45a8ff 445 __weak void HAL_HASH_MspDeInit(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 446 {
mbed_official 83:a036322b8637 447 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 448 UNUSED(hhash);
mbed_official 83:a036322b8637 449
bogdanm 0:9b334a45a8ff 450 /* NOTE: This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 451 the HAL_HASH_MspDeInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 452 */
bogdanm 0:9b334a45a8ff 453 }
bogdanm 0:9b334a45a8ff 454
bogdanm 0:9b334a45a8ff 455 /**
bogdanm 0:9b334a45a8ff 456 * @brief Input data transfer complete callback.
bogdanm 0:9b334a45a8ff 457 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 458 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 459 * @retval None
bogdanm 0:9b334a45a8ff 460 */
bogdanm 0:9b334a45a8ff 461 __weak void HAL_HASH_InCpltCallback(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 462 {
mbed_official 83:a036322b8637 463 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 464 UNUSED(hhash);
mbed_official 83:a036322b8637 465
bogdanm 0:9b334a45a8ff 466 /* NOTE: This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 467 the HAL_HASH_InCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 468 */
bogdanm 0:9b334a45a8ff 469 }
bogdanm 0:9b334a45a8ff 470
bogdanm 0:9b334a45a8ff 471 /**
bogdanm 0:9b334a45a8ff 472 * @brief Data transfer Error callback.
bogdanm 0:9b334a45a8ff 473 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 474 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 475 * @retval None
bogdanm 0:9b334a45a8ff 476 */
bogdanm 0:9b334a45a8ff 477 __weak void HAL_HASH_ErrorCallback(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 478 {
mbed_official 83:a036322b8637 479 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 480 UNUSED(hhash);
mbed_official 83:a036322b8637 481
bogdanm 0:9b334a45a8ff 482 /* NOTE: This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 483 the HAL_HASH_ErrorCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 484 */
bogdanm 0:9b334a45a8ff 485 }
bogdanm 0:9b334a45a8ff 486
bogdanm 0:9b334a45a8ff 487 /**
bogdanm 0:9b334a45a8ff 488 * @brief Digest computation complete callback. It is used only with interrupt.
bogdanm 0:9b334a45a8ff 489 * @note This callback is not relevant with DMA.
bogdanm 0:9b334a45a8ff 490 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 491 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 492 * @retval None
bogdanm 0:9b334a45a8ff 493 */
bogdanm 0:9b334a45a8ff 494 __weak void HAL_HASH_DgstCpltCallback(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 495 {
mbed_official 83:a036322b8637 496 /* Prevent unused argument(s) compilation warning */
mbed_official 83:a036322b8637 497 UNUSED(hhash);
mbed_official 83:a036322b8637 498
bogdanm 0:9b334a45a8ff 499 /* NOTE: This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 500 the HAL_HASH_DgstCpltCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 501 */
bogdanm 0:9b334a45a8ff 502 }
bogdanm 0:9b334a45a8ff 503
bogdanm 0:9b334a45a8ff 504 /**
bogdanm 0:9b334a45a8ff 505 * @}
bogdanm 0:9b334a45a8ff 506 */
bogdanm 0:9b334a45a8ff 507
bogdanm 0:9b334a45a8ff 508 /** @defgroup HASH_Exported_Functions_Group2 HASH processing functions using polling mode
bogdanm 0:9b334a45a8ff 509 * @brief processing functions using polling mode
bogdanm 0:9b334a45a8ff 510 *
bogdanm 0:9b334a45a8ff 511 @verbatim
bogdanm 0:9b334a45a8ff 512 ===============================================================================
bogdanm 0:9b334a45a8ff 513 ##### HASH processing using polling mode functions#####
bogdanm 0:9b334a45a8ff 514 ===============================================================================
bogdanm 0:9b334a45a8ff 515 [..] This section provides functions allowing to calculate in polling mode
bogdanm 0:9b334a45a8ff 516 the hash value using one of the following algorithms:
bogdanm 0:9b334a45a8ff 517 (+) MD5
bogdanm 0:9b334a45a8ff 518 (+) SHA1
bogdanm 0:9b334a45a8ff 519
bogdanm 0:9b334a45a8ff 520 @endverbatim
bogdanm 0:9b334a45a8ff 521 * @{
bogdanm 0:9b334a45a8ff 522 */
bogdanm 0:9b334a45a8ff 523
bogdanm 0:9b334a45a8ff 524 /**
bogdanm 0:9b334a45a8ff 525 * @brief Initializes the HASH peripheral in MD5 mode then processes pInBuffer.
bogdanm 0:9b334a45a8ff 526 The digest is available in pOutBuffer.
bogdanm 0:9b334a45a8ff 527 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 528 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 529 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 530 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 531 * If the Size is multiple of 64 bytes, appending the input buffer is possible.
bogdanm 0:9b334a45a8ff 532 * If the Size is not multiple of 64 bytes, the padding is managed by hardware
bogdanm 0:9b334a45a8ff 533 * and appending the input buffer is no more possible.
bogdanm 0:9b334a45a8ff 534 * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes.
bogdanm 0:9b334a45a8ff 535 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 536 * @retval HAL status
bogdanm 0:9b334a45a8ff 537 */
bogdanm 0:9b334a45a8ff 538 HAL_StatusTypeDef HAL_HASH_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 539 {
bogdanm 0:9b334a45a8ff 540 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 541
bogdanm 0:9b334a45a8ff 542 /* Process Locked */
bogdanm 0:9b334a45a8ff 543 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 544
bogdanm 0:9b334a45a8ff 545 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 546 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 547
bogdanm 0:9b334a45a8ff 548 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 549 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 550 {
bogdanm 0:9b334a45a8ff 551 /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 552 the message digest of a new message */
bogdanm 0:9b334a45a8ff 553 HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 554 }
bogdanm 0:9b334a45a8ff 555
bogdanm 0:9b334a45a8ff 556 /* Set the phase */
bogdanm 0:9b334a45a8ff 557 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 558
bogdanm 0:9b334a45a8ff 559 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 560 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 561
bogdanm 0:9b334a45a8ff 562 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 563 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 564
bogdanm 0:9b334a45a8ff 565 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 566 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 567
bogdanm 0:9b334a45a8ff 568 /* Get tick */
bogdanm 0:9b334a45a8ff 569 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 570
bogdanm 0:9b334a45a8ff 571 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 572 {
bogdanm 0:9b334a45a8ff 573 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 574 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 575 {
bogdanm 0:9b334a45a8ff 576 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 577 {
bogdanm 0:9b334a45a8ff 578 /* Change state */
bogdanm 0:9b334a45a8ff 579 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 580
bogdanm 0:9b334a45a8ff 581 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 582 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 583
bogdanm 0:9b334a45a8ff 584 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 585 }
bogdanm 0:9b334a45a8ff 586 }
bogdanm 0:9b334a45a8ff 587 }
bogdanm 0:9b334a45a8ff 588
bogdanm 0:9b334a45a8ff 589 /* Read the message digest */
bogdanm 0:9b334a45a8ff 590 HASH_GetDigest(pOutBuffer, 16);
bogdanm 0:9b334a45a8ff 591
bogdanm 0:9b334a45a8ff 592 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 593 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 594
bogdanm 0:9b334a45a8ff 595 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 596 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 597
bogdanm 0:9b334a45a8ff 598 /* Return function status */
bogdanm 0:9b334a45a8ff 599 return HAL_OK;
bogdanm 0:9b334a45a8ff 600 }
bogdanm 0:9b334a45a8ff 601
bogdanm 0:9b334a45a8ff 602 /**
bogdanm 0:9b334a45a8ff 603 * @brief Initializes the HASH peripheral in MD5 mode then writes the pInBuffer.
bogdanm 0:9b334a45a8ff 604 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 605 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 606 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 607 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 608 * If the Size is multiple of 64 bytes, appending the input buffer is possible.
bogdanm 0:9b334a45a8ff 609 * If the Size is not multiple of 64 bytes, the padding is managed by hardware
bogdanm 0:9b334a45a8ff 610 * and appending the input buffer is no more possible.
bogdanm 0:9b334a45a8ff 611 * @retval HAL status
bogdanm 0:9b334a45a8ff 612 */
bogdanm 0:9b334a45a8ff 613 HAL_StatusTypeDef HAL_HASH_MD5_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 614 {
bogdanm 0:9b334a45a8ff 615 /* Process Locked */
bogdanm 0:9b334a45a8ff 616 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 617
bogdanm 0:9b334a45a8ff 618 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 619 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 620
bogdanm 0:9b334a45a8ff 621 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 622 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 623 {
bogdanm 0:9b334a45a8ff 624 /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 625 the message digest of a new message */
bogdanm 0:9b334a45a8ff 626 HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 627 }
bogdanm 0:9b334a45a8ff 628
bogdanm 0:9b334a45a8ff 629 /* Set the phase */
bogdanm 0:9b334a45a8ff 630 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 631
bogdanm 0:9b334a45a8ff 632 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 633 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 634
bogdanm 0:9b334a45a8ff 635 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 636 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 637
bogdanm 0:9b334a45a8ff 638 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 639 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 640
bogdanm 0:9b334a45a8ff 641 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 642 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 643
bogdanm 0:9b334a45a8ff 644 /* Return function status */
bogdanm 0:9b334a45a8ff 645 return HAL_OK;
bogdanm 0:9b334a45a8ff 646 }
bogdanm 0:9b334a45a8ff 647
bogdanm 0:9b334a45a8ff 648 /**
bogdanm 0:9b334a45a8ff 649 * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer.
bogdanm 0:9b334a45a8ff 650 The digest is available in pOutBuffer.
bogdanm 0:9b334a45a8ff 651 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 652 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 653 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 654 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 655 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 656 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
bogdanm 0:9b334a45a8ff 657 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 658 * @retval HAL status
bogdanm 0:9b334a45a8ff 659 */
bogdanm 0:9b334a45a8ff 660 HAL_StatusTypeDef HAL_HASH_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 661 {
bogdanm 0:9b334a45a8ff 662 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 663
bogdanm 0:9b334a45a8ff 664 /* Process Locked */
bogdanm 0:9b334a45a8ff 665 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 666
bogdanm 0:9b334a45a8ff 667 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 668 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 669
bogdanm 0:9b334a45a8ff 670 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 671 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 672 {
bogdanm 0:9b334a45a8ff 673 /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 674 the message digest of a new message */
bogdanm 0:9b334a45a8ff 675 HASH->CR |= HASH_ALGOSELECTION_SHA1 | HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 676 }
bogdanm 0:9b334a45a8ff 677
bogdanm 0:9b334a45a8ff 678 /* Set the phase */
bogdanm 0:9b334a45a8ff 679 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 680
bogdanm 0:9b334a45a8ff 681 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 682 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 683
bogdanm 0:9b334a45a8ff 684 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 685 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 686
bogdanm 0:9b334a45a8ff 687 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 688 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 689
bogdanm 0:9b334a45a8ff 690 /* Get tick */
bogdanm 0:9b334a45a8ff 691 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 692
bogdanm 0:9b334a45a8ff 693 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 694 {
bogdanm 0:9b334a45a8ff 695 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 696 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 697 {
bogdanm 0:9b334a45a8ff 698 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 699 {
bogdanm 0:9b334a45a8ff 700 /* Change state */
bogdanm 0:9b334a45a8ff 701 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 702
bogdanm 0:9b334a45a8ff 703 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 704 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 705
bogdanm 0:9b334a45a8ff 706 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 707 }
bogdanm 0:9b334a45a8ff 708 }
bogdanm 0:9b334a45a8ff 709 }
bogdanm 0:9b334a45a8ff 710
bogdanm 0:9b334a45a8ff 711 /* Read the message digest */
bogdanm 0:9b334a45a8ff 712 HASH_GetDigest(pOutBuffer, 20);
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 715 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 716
bogdanm 0:9b334a45a8ff 717 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 718 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 719
bogdanm 0:9b334a45a8ff 720 /* Return function status */
bogdanm 0:9b334a45a8ff 721 return HAL_OK;
bogdanm 0:9b334a45a8ff 722 }
bogdanm 0:9b334a45a8ff 723
bogdanm 0:9b334a45a8ff 724 /**
bogdanm 0:9b334a45a8ff 725 * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer.
bogdanm 0:9b334a45a8ff 726 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 727 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 728 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 729 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 730 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 731 * @note Input buffer size in bytes must be a multiple of 4 otherwise the digest computation is corrupted.
bogdanm 0:9b334a45a8ff 732 * @retval HAL status
bogdanm 0:9b334a45a8ff 733 */
bogdanm 0:9b334a45a8ff 734 HAL_StatusTypeDef HAL_HASH_SHA1_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 735 {
bogdanm 0:9b334a45a8ff 736 /* Check the parameters */
bogdanm 0:9b334a45a8ff 737 assert_param(IS_HASH_SHA1_BUFFER_SIZE(Size));
bogdanm 0:9b334a45a8ff 738
bogdanm 0:9b334a45a8ff 739 /* Process Locked */
bogdanm 0:9b334a45a8ff 740 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 741
bogdanm 0:9b334a45a8ff 742 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 743 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 744
bogdanm 0:9b334a45a8ff 745 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 746 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 747 {
bogdanm 0:9b334a45a8ff 748 /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 749 the message digest of a new message */
bogdanm 0:9b334a45a8ff 750 HASH->CR |= HASH_ALGOSELECTION_SHA1 | HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 751 }
bogdanm 0:9b334a45a8ff 752
bogdanm 0:9b334a45a8ff 753 /* Set the phase */
bogdanm 0:9b334a45a8ff 754 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 755
bogdanm 0:9b334a45a8ff 756 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 757 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 758
bogdanm 0:9b334a45a8ff 759 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 760 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 761
bogdanm 0:9b334a45a8ff 762 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 763 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 764
bogdanm 0:9b334a45a8ff 765 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 766 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 767
bogdanm 0:9b334a45a8ff 768 /* Return function status */
bogdanm 0:9b334a45a8ff 769 return HAL_OK;
bogdanm 0:9b334a45a8ff 770 }
bogdanm 0:9b334a45a8ff 771
bogdanm 0:9b334a45a8ff 772 /**
bogdanm 0:9b334a45a8ff 773 * @}
bogdanm 0:9b334a45a8ff 774 */
bogdanm 0:9b334a45a8ff 775
bogdanm 0:9b334a45a8ff 776 /** @defgroup HASH_Exported_Functions_Group3 HASH processing functions using interrupt mode
bogdanm 0:9b334a45a8ff 777 * @brief processing functions using interrupt mode.
bogdanm 0:9b334a45a8ff 778 *
bogdanm 0:9b334a45a8ff 779 @verbatim
bogdanm 0:9b334a45a8ff 780 ===============================================================================
bogdanm 0:9b334a45a8ff 781 ##### HASH processing using interrupt mode functions #####
bogdanm 0:9b334a45a8ff 782 ===============================================================================
bogdanm 0:9b334a45a8ff 783 [..] This section provides functions allowing to calculate in interrupt mode
bogdanm 0:9b334a45a8ff 784 the hash value using one of the following algorithms:
bogdanm 0:9b334a45a8ff 785 (+) MD5
bogdanm 0:9b334a45a8ff 786 (+) SHA1
bogdanm 0:9b334a45a8ff 787
bogdanm 0:9b334a45a8ff 788 @endverbatim
bogdanm 0:9b334a45a8ff 789 * @{
bogdanm 0:9b334a45a8ff 790 */
bogdanm 0:9b334a45a8ff 791
bogdanm 0:9b334a45a8ff 792 /**
bogdanm 0:9b334a45a8ff 793 * @brief Initializes the HASH peripheral in MD5 mode then processes pInBuffer.
bogdanm 0:9b334a45a8ff 794 * The digest is available in pOutBuffer.
bogdanm 0:9b334a45a8ff 795 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 796 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 797 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 798 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 799 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 800 * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes.
bogdanm 0:9b334a45a8ff 801 * @retval HAL status
bogdanm 0:9b334a45a8ff 802 */
bogdanm 0:9b334a45a8ff 803 HAL_StatusTypeDef HAL_HASH_MD5_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
bogdanm 0:9b334a45a8ff 804 {
bogdanm 0:9b334a45a8ff 805 uint32_t inputaddr;
bogdanm 0:9b334a45a8ff 806 uint32_t outputaddr;
bogdanm 0:9b334a45a8ff 807 uint32_t buffercounter;
bogdanm 0:9b334a45a8ff 808 uint32_t inputcounter;
bogdanm 0:9b334a45a8ff 809
bogdanm 0:9b334a45a8ff 810 /* Process Locked */
bogdanm 0:9b334a45a8ff 811 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 812
bogdanm 0:9b334a45a8ff 813 if(hhash->State == HAL_HASH_STATE_READY)
bogdanm 0:9b334a45a8ff 814 {
bogdanm 0:9b334a45a8ff 815 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 816 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 817
bogdanm 0:9b334a45a8ff 818 hhash->HashInCount = Size;
bogdanm 0:9b334a45a8ff 819 hhash->pHashInBuffPtr = pInBuffer;
bogdanm 0:9b334a45a8ff 820 hhash->pHashOutBuffPtr = pOutBuffer;
bogdanm 0:9b334a45a8ff 821
bogdanm 0:9b334a45a8ff 822 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 823 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 824 {
bogdanm 0:9b334a45a8ff 825 /* Select the SHA1 mode */
bogdanm 0:9b334a45a8ff 826 HASH->CR |= HASH_ALGOSELECTION_MD5;
bogdanm 0:9b334a45a8ff 827 /* Reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 828 the message digest of a new message */
bogdanm 0:9b334a45a8ff 829 HASH->CR |= HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 830 }
bogdanm 0:9b334a45a8ff 831
bogdanm 0:9b334a45a8ff 832 /* Reset interrupt counter */
bogdanm 0:9b334a45a8ff 833 hhash->HashITCounter = 0;
bogdanm 0:9b334a45a8ff 834
bogdanm 0:9b334a45a8ff 835 /* Set the phase */
bogdanm 0:9b334a45a8ff 836 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 837
bogdanm 0:9b334a45a8ff 838 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 839 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 840
bogdanm 0:9b334a45a8ff 841 /* Enable Interrupts */
bogdanm 0:9b334a45a8ff 842 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
bogdanm 0:9b334a45a8ff 843
bogdanm 0:9b334a45a8ff 844 /* Return function status */
bogdanm 0:9b334a45a8ff 845 return HAL_OK;
bogdanm 0:9b334a45a8ff 846 }
bogdanm 0:9b334a45a8ff 847 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
bogdanm 0:9b334a45a8ff 848 {
bogdanm 0:9b334a45a8ff 849 outputaddr = (uint32_t)hhash->pHashOutBuffPtr;
bogdanm 0:9b334a45a8ff 850 /* Read the Output block from the Output FIFO */
bogdanm 0:9b334a45a8ff 851 *(uint32_t*)(outputaddr) = __REV(HASH->HR[0]);
bogdanm 0:9b334a45a8ff 852 outputaddr+=4;
bogdanm 0:9b334a45a8ff 853 *(uint32_t*)(outputaddr) = __REV(HASH->HR[1]);
bogdanm 0:9b334a45a8ff 854 outputaddr+=4;
bogdanm 0:9b334a45a8ff 855 *(uint32_t*)(outputaddr) = __REV(HASH->HR[2]);
bogdanm 0:9b334a45a8ff 856 outputaddr+=4;
bogdanm 0:9b334a45a8ff 857 *(uint32_t*)(outputaddr) = __REV(HASH->HR[3]);
bogdanm 0:9b334a45a8ff 858
bogdanm 0:9b334a45a8ff 859 if(hhash->HashInCount == 0)
bogdanm 0:9b334a45a8ff 860 {
bogdanm 0:9b334a45a8ff 861 /* Disable Interrupts */
bogdanm 0:9b334a45a8ff 862 HASH->IMR = 0;
bogdanm 0:9b334a45a8ff 863 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 864 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 865 /* Call digest computation complete callback */
bogdanm 0:9b334a45a8ff 866 HAL_HASH_DgstCpltCallback(hhash);
bogdanm 0:9b334a45a8ff 867
bogdanm 0:9b334a45a8ff 868 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 869 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 870
bogdanm 0:9b334a45a8ff 871 /* Return function status */
bogdanm 0:9b334a45a8ff 872 return HAL_OK;
bogdanm 0:9b334a45a8ff 873 }
bogdanm 0:9b334a45a8ff 874 }
bogdanm 0:9b334a45a8ff 875
bogdanm 0:9b334a45a8ff 876 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
bogdanm 0:9b334a45a8ff 877 {
bogdanm 0:9b334a45a8ff 878 if(hhash->HashInCount >= 68)
bogdanm 0:9b334a45a8ff 879 {
bogdanm 0:9b334a45a8ff 880 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
bogdanm 0:9b334a45a8ff 881 /* Write the Input block in the Data IN register */
bogdanm 0:9b334a45a8ff 882 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
bogdanm 0:9b334a45a8ff 883 {
bogdanm 0:9b334a45a8ff 884 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 885 inputaddr+=4;
bogdanm 0:9b334a45a8ff 886 }
bogdanm 0:9b334a45a8ff 887 if(hhash->HashITCounter == 0)
bogdanm 0:9b334a45a8ff 888 {
bogdanm 0:9b334a45a8ff 889 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 if(hhash->HashInCount >= 68)
bogdanm 0:9b334a45a8ff 892 {
bogdanm 0:9b334a45a8ff 893 /* Decrement buffer counter */
bogdanm 0:9b334a45a8ff 894 hhash->HashInCount -= 68;
bogdanm 0:9b334a45a8ff 895 hhash->pHashInBuffPtr+= 68;
bogdanm 0:9b334a45a8ff 896 }
bogdanm 0:9b334a45a8ff 897 else
bogdanm 0:9b334a45a8ff 898 {
bogdanm 0:9b334a45a8ff 899 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 900 hhash->pHashInBuffPtr+= hhash->HashInCount;
bogdanm 0:9b334a45a8ff 901 }
bogdanm 0:9b334a45a8ff 902 /* Set Interrupt counter */
bogdanm 0:9b334a45a8ff 903 hhash->HashITCounter = 1;
bogdanm 0:9b334a45a8ff 904 }
bogdanm 0:9b334a45a8ff 905 else
bogdanm 0:9b334a45a8ff 906 {
bogdanm 0:9b334a45a8ff 907 /* Decrement buffer counter */
bogdanm 0:9b334a45a8ff 908 hhash->HashInCount -= 64;
bogdanm 0:9b334a45a8ff 909 hhash->pHashInBuffPtr+= 64;
bogdanm 0:9b334a45a8ff 910 }
bogdanm 0:9b334a45a8ff 911 }
bogdanm 0:9b334a45a8ff 912 else
bogdanm 0:9b334a45a8ff 913 {
bogdanm 0:9b334a45a8ff 914 /* Get the buffer address */
bogdanm 0:9b334a45a8ff 915 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
bogdanm 0:9b334a45a8ff 916 /* Get the buffer counter */
bogdanm 0:9b334a45a8ff 917 inputcounter = hhash->HashInCount;
bogdanm 0:9b334a45a8ff 918 /* Disable Interrupts */
bogdanm 0:9b334a45a8ff 919 HASH->IMR &= ~(HASH_IT_DINI);
bogdanm 0:9b334a45a8ff 920 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 921 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
bogdanm 0:9b334a45a8ff 922
bogdanm 0:9b334a45a8ff 923 if((inputcounter > 4) && (inputcounter%4))
bogdanm 0:9b334a45a8ff 924 {
bogdanm 0:9b334a45a8ff 925 inputcounter = (inputcounter+4-inputcounter%4);
bogdanm 0:9b334a45a8ff 926 }
bogdanm 0:9b334a45a8ff 927 else if ((inputcounter < 4) && (inputcounter != 0))
bogdanm 0:9b334a45a8ff 928 {
bogdanm 0:9b334a45a8ff 929 inputcounter = 4;
bogdanm 0:9b334a45a8ff 930 }
bogdanm 0:9b334a45a8ff 931
bogdanm 0:9b334a45a8ff 932 /* Write the Input block in the Data IN register */
bogdanm 0:9b334a45a8ff 933 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
bogdanm 0:9b334a45a8ff 934 {
bogdanm 0:9b334a45a8ff 935 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 936 inputaddr+=4;
bogdanm 0:9b334a45a8ff 937 }
bogdanm 0:9b334a45a8ff 938 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 939 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 940 /* Reset buffer counter */
bogdanm 0:9b334a45a8ff 941 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 942 /* Call Input data transfer complete callback */
bogdanm 0:9b334a45a8ff 943 HAL_HASH_InCpltCallback(hhash);
bogdanm 0:9b334a45a8ff 944 }
bogdanm 0:9b334a45a8ff 945 }
bogdanm 0:9b334a45a8ff 946
bogdanm 0:9b334a45a8ff 947 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 948 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 949
bogdanm 0:9b334a45a8ff 950 /* Return function status */
bogdanm 0:9b334a45a8ff 951 return HAL_OK;
bogdanm 0:9b334a45a8ff 952 }
bogdanm 0:9b334a45a8ff 953
bogdanm 0:9b334a45a8ff 954 /**
bogdanm 0:9b334a45a8ff 955 * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer.
bogdanm 0:9b334a45a8ff 956 * The digest is available in pOutBuffer.
bogdanm 0:9b334a45a8ff 957 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 958 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 959 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 960 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 961 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 962 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
bogdanm 0:9b334a45a8ff 963 * @retval HAL status
bogdanm 0:9b334a45a8ff 964 */
bogdanm 0:9b334a45a8ff 965 HAL_StatusTypeDef HAL_HASH_SHA1_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer)
bogdanm 0:9b334a45a8ff 966 {
bogdanm 0:9b334a45a8ff 967 uint32_t inputaddr;
bogdanm 0:9b334a45a8ff 968 uint32_t outputaddr;
bogdanm 0:9b334a45a8ff 969 uint32_t buffercounter;
bogdanm 0:9b334a45a8ff 970 uint32_t inputcounter;
bogdanm 0:9b334a45a8ff 971
bogdanm 0:9b334a45a8ff 972 /* Process Locked */
bogdanm 0:9b334a45a8ff 973 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 974
bogdanm 0:9b334a45a8ff 975 if(hhash->State == HAL_HASH_STATE_READY)
bogdanm 0:9b334a45a8ff 976 {
bogdanm 0:9b334a45a8ff 977 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 978 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 979
bogdanm 0:9b334a45a8ff 980 hhash->HashInCount = Size;
bogdanm 0:9b334a45a8ff 981 hhash->pHashInBuffPtr = pInBuffer;
bogdanm 0:9b334a45a8ff 982 hhash->pHashOutBuffPtr = pOutBuffer;
bogdanm 0:9b334a45a8ff 983
bogdanm 0:9b334a45a8ff 984 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 985 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 986 {
bogdanm 0:9b334a45a8ff 987 /* Select the SHA1 mode */
bogdanm 0:9b334a45a8ff 988 HASH->CR |= HASH_ALGOSELECTION_SHA1;
bogdanm 0:9b334a45a8ff 989 /* Reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 990 the message digest of a new message */
bogdanm 0:9b334a45a8ff 991 HASH->CR |= HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 992 }
bogdanm 0:9b334a45a8ff 993
bogdanm 0:9b334a45a8ff 994 /* Reset interrupt counter */
bogdanm 0:9b334a45a8ff 995 hhash->HashITCounter = 0;
bogdanm 0:9b334a45a8ff 996
bogdanm 0:9b334a45a8ff 997 /* Set the phase */
bogdanm 0:9b334a45a8ff 998 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 999
bogdanm 0:9b334a45a8ff 1000 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1001 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1002
bogdanm 0:9b334a45a8ff 1003 /* Enable Interrupts */
bogdanm 0:9b334a45a8ff 1004 HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI);
bogdanm 0:9b334a45a8ff 1005
bogdanm 0:9b334a45a8ff 1006 /* Return function status */
bogdanm 0:9b334a45a8ff 1007 return HAL_OK;
bogdanm 0:9b334a45a8ff 1008 }
bogdanm 0:9b334a45a8ff 1009 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS))
bogdanm 0:9b334a45a8ff 1010 {
bogdanm 0:9b334a45a8ff 1011 outputaddr = (uint32_t)hhash->pHashOutBuffPtr;
bogdanm 0:9b334a45a8ff 1012 /* Read the Output block from the Output FIFO */
bogdanm 0:9b334a45a8ff 1013 *(uint32_t*)(outputaddr) = __REV(HASH->HR[0]);
bogdanm 0:9b334a45a8ff 1014 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1015 *(uint32_t*)(outputaddr) = __REV(HASH->HR[1]);
bogdanm 0:9b334a45a8ff 1016 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1017 *(uint32_t*)(outputaddr) = __REV(HASH->HR[2]);
bogdanm 0:9b334a45a8ff 1018 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1019 *(uint32_t*)(outputaddr) = __REV(HASH->HR[3]);
bogdanm 0:9b334a45a8ff 1020 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1021 *(uint32_t*)(outputaddr) = __REV(HASH->HR[4]);
bogdanm 0:9b334a45a8ff 1022 if(hhash->HashInCount == 0)
bogdanm 0:9b334a45a8ff 1023 {
bogdanm 0:9b334a45a8ff 1024 /* Disable Interrupts */
bogdanm 0:9b334a45a8ff 1025 HASH->IMR = 0;
bogdanm 0:9b334a45a8ff 1026 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1027 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 1028 /* Call digest computation complete callback */
bogdanm 0:9b334a45a8ff 1029 HAL_HASH_DgstCpltCallback(hhash);
bogdanm 0:9b334a45a8ff 1030
bogdanm 0:9b334a45a8ff 1031 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1032 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1033
bogdanm 0:9b334a45a8ff 1034 /* Return function status */
bogdanm 0:9b334a45a8ff 1035 return HAL_OK;
bogdanm 0:9b334a45a8ff 1036 }
bogdanm 0:9b334a45a8ff 1037 }
bogdanm 0:9b334a45a8ff 1038 if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
bogdanm 0:9b334a45a8ff 1039 {
bogdanm 0:9b334a45a8ff 1040 if(hhash->HashInCount >= 68)
bogdanm 0:9b334a45a8ff 1041 {
bogdanm 0:9b334a45a8ff 1042 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
bogdanm 0:9b334a45a8ff 1043 /* Write the Input block in the Data IN register */
bogdanm 0:9b334a45a8ff 1044 for(buffercounter = 0; buffercounter < 64; buffercounter+=4)
bogdanm 0:9b334a45a8ff 1045 {
bogdanm 0:9b334a45a8ff 1046 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 1047 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1048 }
bogdanm 0:9b334a45a8ff 1049 if(hhash->HashITCounter == 0)
bogdanm 0:9b334a45a8ff 1050 {
bogdanm 0:9b334a45a8ff 1051 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 1052
bogdanm 0:9b334a45a8ff 1053 if(hhash->HashInCount >= 68)
bogdanm 0:9b334a45a8ff 1054 {
bogdanm 0:9b334a45a8ff 1055 /* Decrement buffer counter */
bogdanm 0:9b334a45a8ff 1056 hhash->HashInCount -= 68;
bogdanm 0:9b334a45a8ff 1057 hhash->pHashInBuffPtr+= 68;
bogdanm 0:9b334a45a8ff 1058 }
bogdanm 0:9b334a45a8ff 1059 else
bogdanm 0:9b334a45a8ff 1060 {
bogdanm 0:9b334a45a8ff 1061 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 1062 hhash->pHashInBuffPtr+= hhash->HashInCount;
bogdanm 0:9b334a45a8ff 1063 }
bogdanm 0:9b334a45a8ff 1064 /* Set Interrupt counter */
bogdanm 0:9b334a45a8ff 1065 hhash->HashITCounter = 1;
bogdanm 0:9b334a45a8ff 1066 }
bogdanm 0:9b334a45a8ff 1067 else
bogdanm 0:9b334a45a8ff 1068 {
bogdanm 0:9b334a45a8ff 1069 /* Decrement buffer counter */
bogdanm 0:9b334a45a8ff 1070 hhash->HashInCount -= 64;
bogdanm 0:9b334a45a8ff 1071 hhash->pHashInBuffPtr+= 64;
bogdanm 0:9b334a45a8ff 1072 }
bogdanm 0:9b334a45a8ff 1073 }
bogdanm 0:9b334a45a8ff 1074 else
bogdanm 0:9b334a45a8ff 1075 {
bogdanm 0:9b334a45a8ff 1076 /* Get the buffer address */
bogdanm 0:9b334a45a8ff 1077 inputaddr = (uint32_t)hhash->pHashInBuffPtr;
bogdanm 0:9b334a45a8ff 1078 /* Get the buffer counter */
bogdanm 0:9b334a45a8ff 1079 inputcounter = hhash->HashInCount;
bogdanm 0:9b334a45a8ff 1080 /* Disable Interrupts */
bogdanm 0:9b334a45a8ff 1081 HASH->IMR &= ~(HASH_IT_DINI);
bogdanm 0:9b334a45a8ff 1082 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1083 __HAL_HASH_SET_NBVALIDBITS(inputcounter);
bogdanm 0:9b334a45a8ff 1084
bogdanm 0:9b334a45a8ff 1085 if((inputcounter > 4) && (inputcounter%4))
bogdanm 0:9b334a45a8ff 1086 {
bogdanm 0:9b334a45a8ff 1087 inputcounter = (inputcounter+4-inputcounter%4);
bogdanm 0:9b334a45a8ff 1088 }
bogdanm 0:9b334a45a8ff 1089 else if ((inputcounter < 4) && (inputcounter != 0))
bogdanm 0:9b334a45a8ff 1090 {
bogdanm 0:9b334a45a8ff 1091 inputcounter = 4;
bogdanm 0:9b334a45a8ff 1092 }
bogdanm 0:9b334a45a8ff 1093 /* Write the Input block in the Data IN register */
bogdanm 0:9b334a45a8ff 1094 for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
bogdanm 0:9b334a45a8ff 1095 {
bogdanm 0:9b334a45a8ff 1096 HASH->DIN = *(uint32_t*)inputaddr;
bogdanm 0:9b334a45a8ff 1097 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1098 }
bogdanm 0:9b334a45a8ff 1099 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1100 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1101 /* Reset buffer counter */
bogdanm 0:9b334a45a8ff 1102 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 1103 /* Call Input data transfer complete callback */
bogdanm 0:9b334a45a8ff 1104 HAL_HASH_InCpltCallback(hhash);
bogdanm 0:9b334a45a8ff 1105 }
bogdanm 0:9b334a45a8ff 1106 }
bogdanm 0:9b334a45a8ff 1107
bogdanm 0:9b334a45a8ff 1108 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1109 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1110
bogdanm 0:9b334a45a8ff 1111 /* Return function status */
bogdanm 0:9b334a45a8ff 1112 return HAL_OK;
bogdanm 0:9b334a45a8ff 1113 }
bogdanm 0:9b334a45a8ff 1114
bogdanm 0:9b334a45a8ff 1115 /**
bogdanm 0:9b334a45a8ff 1116 * @brief This function handles HASH interrupt request.
bogdanm 0:9b334a45a8ff 1117 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1118 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1119 * @retval None
bogdanm 0:9b334a45a8ff 1120 */
bogdanm 0:9b334a45a8ff 1121 void HAL_HASH_IRQHandler(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 1122 {
bogdanm 0:9b334a45a8ff 1123 switch(HASH->CR & HASH_CR_ALGO)
bogdanm 0:9b334a45a8ff 1124 {
bogdanm 0:9b334a45a8ff 1125 case HASH_ALGOSELECTION_MD5:
bogdanm 0:9b334a45a8ff 1126 HAL_HASH_MD5_Start_IT(hhash, NULL, 0, NULL);
bogdanm 0:9b334a45a8ff 1127 break;
bogdanm 0:9b334a45a8ff 1128
bogdanm 0:9b334a45a8ff 1129 case HASH_ALGOSELECTION_SHA1:
bogdanm 0:9b334a45a8ff 1130 HAL_HASH_SHA1_Start_IT(hhash, NULL, 0, NULL);
bogdanm 0:9b334a45a8ff 1131 break;
bogdanm 0:9b334a45a8ff 1132
bogdanm 0:9b334a45a8ff 1133 default:
bogdanm 0:9b334a45a8ff 1134 break;
bogdanm 0:9b334a45a8ff 1135 }
bogdanm 0:9b334a45a8ff 1136 }
bogdanm 0:9b334a45a8ff 1137
bogdanm 0:9b334a45a8ff 1138 /**
bogdanm 0:9b334a45a8ff 1139 * @}
bogdanm 0:9b334a45a8ff 1140 */
bogdanm 0:9b334a45a8ff 1141
bogdanm 0:9b334a45a8ff 1142 /** @defgroup HASH_Exported_Functions_Group4 HASH processing functions using DMA mode
bogdanm 0:9b334a45a8ff 1143 * @brief processing functions using DMA mode.
bogdanm 0:9b334a45a8ff 1144 *
bogdanm 0:9b334a45a8ff 1145 @verbatim
bogdanm 0:9b334a45a8ff 1146 ===============================================================================
bogdanm 0:9b334a45a8ff 1147 ##### HASH processing using DMA mode functions #####
bogdanm 0:9b334a45a8ff 1148 ===============================================================================
bogdanm 0:9b334a45a8ff 1149 [..] This section provides functions allowing to calculate in DMA mode
bogdanm 0:9b334a45a8ff 1150 the hash value using one of the following algorithms:
bogdanm 0:9b334a45a8ff 1151 (+) MD5
bogdanm 0:9b334a45a8ff 1152 (+) SHA1
bogdanm 0:9b334a45a8ff 1153
bogdanm 0:9b334a45a8ff 1154 @endverbatim
bogdanm 0:9b334a45a8ff 1155 * @{
bogdanm 0:9b334a45a8ff 1156 */
bogdanm 0:9b334a45a8ff 1157
bogdanm 0:9b334a45a8ff 1158 /**
bogdanm 0:9b334a45a8ff 1159 * @brief Initializes the HASH peripheral in MD5 mode then enables DMA to
bogdanm 0:9b334a45a8ff 1160 control data transfer. Use HAL_HASH_MD5_Finish() to get the digest.
bogdanm 0:9b334a45a8ff 1161 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1162 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1163 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1164 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1165 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1166 * @retval HAL status
bogdanm 0:9b334a45a8ff 1167 */
bogdanm 0:9b334a45a8ff 1168 HAL_StatusTypeDef HAL_HASH_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 1169 {
bogdanm 0:9b334a45a8ff 1170 uint32_t inputaddr = (uint32_t)pInBuffer;
bogdanm 0:9b334a45a8ff 1171
bogdanm 0:9b334a45a8ff 1172 /* Process Locked */
bogdanm 0:9b334a45a8ff 1173 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1174
bogdanm 0:9b334a45a8ff 1175 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1176 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1177
bogdanm 0:9b334a45a8ff 1178 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1179 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1180 {
bogdanm 0:9b334a45a8ff 1181 /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 1182 the message digest of a new message */
bogdanm 0:9b334a45a8ff 1183 HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 1184 }
bogdanm 0:9b334a45a8ff 1185
bogdanm 0:9b334a45a8ff 1186 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1187 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 1188
bogdanm 0:9b334a45a8ff 1189 /* Set the phase */
bogdanm 0:9b334a45a8ff 1190 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1191
bogdanm 0:9b334a45a8ff 1192 /* Set the HASH DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1193 hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt;
bogdanm 0:9b334a45a8ff 1194 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1195 hhash->hdmain->XferErrorCallback = HASH_DMAError;
bogdanm 0:9b334a45a8ff 1196
bogdanm 0:9b334a45a8ff 1197 /* Enable the DMA In DMA Stream */
bogdanm 0:9b334a45a8ff 1198 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
bogdanm 0:9b334a45a8ff 1199
bogdanm 0:9b334a45a8ff 1200 /* Enable DMA requests */
bogdanm 0:9b334a45a8ff 1201 HASH->CR |= (HASH_CR_DMAE);
bogdanm 0:9b334a45a8ff 1202
bogdanm 0:9b334a45a8ff 1203 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1204 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1205
bogdanm 0:9b334a45a8ff 1206 /* Return function status */
bogdanm 0:9b334a45a8ff 1207 return HAL_OK;
bogdanm 0:9b334a45a8ff 1208 }
bogdanm 0:9b334a45a8ff 1209
bogdanm 0:9b334a45a8ff 1210 /**
bogdanm 0:9b334a45a8ff 1211 * @brief Returns the computed digest in MD5 mode
bogdanm 0:9b334a45a8ff 1212 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1213 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1214 * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes.
bogdanm 0:9b334a45a8ff 1215 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 1216 * @retval HAL status
bogdanm 0:9b334a45a8ff 1217 */
bogdanm 0:9b334a45a8ff 1218 HAL_StatusTypeDef HAL_HASH_MD5_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1219 {
bogdanm 0:9b334a45a8ff 1220 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1221
bogdanm 0:9b334a45a8ff 1222 /* Process Locked */
bogdanm 0:9b334a45a8ff 1223 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1224
bogdanm 0:9b334a45a8ff 1225 /* Change HASH peripheral state */
bogdanm 0:9b334a45a8ff 1226 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1227
bogdanm 0:9b334a45a8ff 1228 /* Get tick */
bogdanm 0:9b334a45a8ff 1229 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1230
bogdanm 0:9b334a45a8ff 1231 while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS))
bogdanm 0:9b334a45a8ff 1232 {
bogdanm 0:9b334a45a8ff 1233 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1234 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1235 {
bogdanm 0:9b334a45a8ff 1236 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1237 {
bogdanm 0:9b334a45a8ff 1238 /* Change state */
bogdanm 0:9b334a45a8ff 1239 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1240
bogdanm 0:9b334a45a8ff 1241 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1242 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1243
bogdanm 0:9b334a45a8ff 1244 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1245 }
bogdanm 0:9b334a45a8ff 1246 }
bogdanm 0:9b334a45a8ff 1247 }
bogdanm 0:9b334a45a8ff 1248
bogdanm 0:9b334a45a8ff 1249 /* Read the message digest */
bogdanm 0:9b334a45a8ff 1250 HASH_GetDigest(pOutBuffer, 16);
bogdanm 0:9b334a45a8ff 1251
bogdanm 0:9b334a45a8ff 1252 /* Change HASH peripheral state */
bogdanm 0:9b334a45a8ff 1253 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 1254
bogdanm 0:9b334a45a8ff 1255 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1256 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1257
bogdanm 0:9b334a45a8ff 1258 /* Return function status */
bogdanm 0:9b334a45a8ff 1259 return HAL_OK;
bogdanm 0:9b334a45a8ff 1260 }
bogdanm 0:9b334a45a8ff 1261
bogdanm 0:9b334a45a8ff 1262 /**
bogdanm 0:9b334a45a8ff 1263 * @brief Initializes the HASH peripheral in SHA1 mode then enables DMA to
bogdanm 0:9b334a45a8ff 1264 control data transfer. Use HAL_HASH_SHA1_Finish() to get the digest.
bogdanm 0:9b334a45a8ff 1265 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1266 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1267 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1268 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1269 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1270 * @retval HAL status
bogdanm 0:9b334a45a8ff 1271 */
bogdanm 0:9b334a45a8ff 1272 HAL_StatusTypeDef HAL_HASH_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 1273 {
bogdanm 0:9b334a45a8ff 1274 uint32_t inputaddr = (uint32_t)pInBuffer;
bogdanm 0:9b334a45a8ff 1275
bogdanm 0:9b334a45a8ff 1276 /* Process Locked */
bogdanm 0:9b334a45a8ff 1277 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1278
bogdanm 0:9b334a45a8ff 1279 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1280 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1281
bogdanm 0:9b334a45a8ff 1282 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1283 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1284 {
bogdanm 0:9b334a45a8ff 1285 /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute
bogdanm 0:9b334a45a8ff 1286 the message digest of a new message */
bogdanm 0:9b334a45a8ff 1287 HASH->CR |= HASH_ALGOSELECTION_SHA1;
bogdanm 0:9b334a45a8ff 1288 HASH->CR |= HASH_CR_INIT;
bogdanm 0:9b334a45a8ff 1289 }
bogdanm 0:9b334a45a8ff 1290
bogdanm 0:9b334a45a8ff 1291 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1292 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 1293
bogdanm 0:9b334a45a8ff 1294 /* Set the phase */
bogdanm 0:9b334a45a8ff 1295 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1296
bogdanm 0:9b334a45a8ff 1297 /* Set the HASH DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1298 hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt;
bogdanm 0:9b334a45a8ff 1299 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1300 hhash->hdmain->XferErrorCallback = HASH_DMAError;
bogdanm 0:9b334a45a8ff 1301
bogdanm 0:9b334a45a8ff 1302 /* Enable the DMA In DMA Stream */
bogdanm 0:9b334a45a8ff 1303 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4));
bogdanm 0:9b334a45a8ff 1304
bogdanm 0:9b334a45a8ff 1305 /* Enable DMA requests */
bogdanm 0:9b334a45a8ff 1306 HASH->CR |= (HASH_CR_DMAE);
bogdanm 0:9b334a45a8ff 1307
bogdanm 0:9b334a45a8ff 1308 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1309 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1310
bogdanm 0:9b334a45a8ff 1311 /* Return function status */
bogdanm 0:9b334a45a8ff 1312 return HAL_OK;
bogdanm 0:9b334a45a8ff 1313 }
bogdanm 0:9b334a45a8ff 1314
bogdanm 0:9b334a45a8ff 1315 /**
bogdanm 0:9b334a45a8ff 1316 * @brief Returns the computed digest in SHA1 mode.
bogdanm 0:9b334a45a8ff 1317 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1318 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1319 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
bogdanm 0:9b334a45a8ff 1320 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 1321 * @retval HAL status
bogdanm 0:9b334a45a8ff 1322 */
bogdanm 0:9b334a45a8ff 1323 HAL_StatusTypeDef HAL_HASH_SHA1_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1324 {
bogdanm 0:9b334a45a8ff 1325 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1326
bogdanm 0:9b334a45a8ff 1327 /* Process Locked */
bogdanm 0:9b334a45a8ff 1328 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1329
bogdanm 0:9b334a45a8ff 1330 /* Change HASH peripheral state */
bogdanm 0:9b334a45a8ff 1331 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1332
bogdanm 0:9b334a45a8ff 1333 /* Get tick */
bogdanm 0:9b334a45a8ff 1334 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1335 while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS))
bogdanm 0:9b334a45a8ff 1336 {
bogdanm 0:9b334a45a8ff 1337 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1338 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1339 {
bogdanm 0:9b334a45a8ff 1340 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1341 {
bogdanm 0:9b334a45a8ff 1342 /* Change state */
bogdanm 0:9b334a45a8ff 1343 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1344
bogdanm 0:9b334a45a8ff 1345 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1346 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1347
bogdanm 0:9b334a45a8ff 1348 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1349 }
bogdanm 0:9b334a45a8ff 1350 }
bogdanm 0:9b334a45a8ff 1351 }
bogdanm 0:9b334a45a8ff 1352
bogdanm 0:9b334a45a8ff 1353 /* Read the message digest */
bogdanm 0:9b334a45a8ff 1354 HASH_GetDigest(pOutBuffer, 20);
bogdanm 0:9b334a45a8ff 1355
bogdanm 0:9b334a45a8ff 1356 /* Change HASH peripheral state */
bogdanm 0:9b334a45a8ff 1357 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 1358
bogdanm 0:9b334a45a8ff 1359 /* Process UnLock */
bogdanm 0:9b334a45a8ff 1360 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1361
bogdanm 0:9b334a45a8ff 1362 /* Return function status */
bogdanm 0:9b334a45a8ff 1363 return HAL_OK;
bogdanm 0:9b334a45a8ff 1364 }
bogdanm 0:9b334a45a8ff 1365
bogdanm 0:9b334a45a8ff 1366
bogdanm 0:9b334a45a8ff 1367 /**
bogdanm 0:9b334a45a8ff 1368 * @}
bogdanm 0:9b334a45a8ff 1369 */
bogdanm 0:9b334a45a8ff 1370
bogdanm 0:9b334a45a8ff 1371 /** @defgroup HASH_Exported_Functions_Group5 HASH-MAC (HMAC) processing functions using polling mode
bogdanm 0:9b334a45a8ff 1372 * @brief HMAC processing functions using polling mode .
bogdanm 0:9b334a45a8ff 1373 *
bogdanm 0:9b334a45a8ff 1374 @verbatim
bogdanm 0:9b334a45a8ff 1375 ===============================================================================
bogdanm 0:9b334a45a8ff 1376 ##### HMAC processing using polling mode functions #####
bogdanm 0:9b334a45a8ff 1377 ===============================================================================
bogdanm 0:9b334a45a8ff 1378 [..] This section provides functions allowing to calculate in polling mode
bogdanm 0:9b334a45a8ff 1379 the HMAC value using one of the following algorithms:
bogdanm 0:9b334a45a8ff 1380 (+) MD5
bogdanm 0:9b334a45a8ff 1381 (+) SHA1
bogdanm 0:9b334a45a8ff 1382
bogdanm 0:9b334a45a8ff 1383 @endverbatim
bogdanm 0:9b334a45a8ff 1384 * @{
bogdanm 0:9b334a45a8ff 1385 */
bogdanm 0:9b334a45a8ff 1386
bogdanm 0:9b334a45a8ff 1387 /**
bogdanm 0:9b334a45a8ff 1388 * @brief Initializes the HASH peripheral in HMAC MD5 mode
bogdanm 0:9b334a45a8ff 1389 * then processes pInBuffer. The digest is available in pOutBuffer
bogdanm 0:9b334a45a8ff 1390 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1391 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1392 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1393 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1394 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1395 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
bogdanm 0:9b334a45a8ff 1396 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 1397 * @retval HAL status
bogdanm 0:9b334a45a8ff 1398 */
bogdanm 0:9b334a45a8ff 1399 HAL_StatusTypeDef HAL_HMAC_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1400 {
bogdanm 0:9b334a45a8ff 1401 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1402
bogdanm 0:9b334a45a8ff 1403 /* Process Locked */
bogdanm 0:9b334a45a8ff 1404 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1405
bogdanm 0:9b334a45a8ff 1406 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1407 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1408
bogdanm 0:9b334a45a8ff 1409 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1410 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1411 {
bogdanm 0:9b334a45a8ff 1412 /* Check if key size is greater than 64 bytes */
bogdanm 0:9b334a45a8ff 1413 if(hhash->Init.KeySize > 64)
bogdanm 0:9b334a45a8ff 1414 {
bogdanm 0:9b334a45a8ff 1415 /* Select the HMAC MD5 mode */
bogdanm 0:9b334a45a8ff 1416 HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1417 }
bogdanm 0:9b334a45a8ff 1418 else
bogdanm 0:9b334a45a8ff 1419 {
bogdanm 0:9b334a45a8ff 1420 /* Select the HMAC MD5 mode */
bogdanm 0:9b334a45a8ff 1421 HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1422 }
bogdanm 0:9b334a45a8ff 1423 }
bogdanm 0:9b334a45a8ff 1424
bogdanm 0:9b334a45a8ff 1425 /* Set the phase */
bogdanm 0:9b334a45a8ff 1426 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1427
bogdanm 0:9b334a45a8ff 1428 /************************** STEP 1 ******************************************/
bogdanm 0:9b334a45a8ff 1429 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1430 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1431
bogdanm 0:9b334a45a8ff 1432 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1433 HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1434
bogdanm 0:9b334a45a8ff 1435 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1436 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1437
bogdanm 0:9b334a45a8ff 1438 /* Get tick */
bogdanm 0:9b334a45a8ff 1439 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1440
bogdanm 0:9b334a45a8ff 1441 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1442 {
bogdanm 0:9b334a45a8ff 1443 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1444 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1445 {
bogdanm 0:9b334a45a8ff 1446 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1447 {
bogdanm 0:9b334a45a8ff 1448 /* Change state */
bogdanm 0:9b334a45a8ff 1449 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1450
bogdanm 0:9b334a45a8ff 1451 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1452 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1453
bogdanm 0:9b334a45a8ff 1454 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1455 }
bogdanm 0:9b334a45a8ff 1456 }
bogdanm 0:9b334a45a8ff 1457 }
bogdanm 0:9b334a45a8ff 1458 /************************** STEP 2 ******************************************/
bogdanm 0:9b334a45a8ff 1459 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1460 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 1461
bogdanm 0:9b334a45a8ff 1462 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1463 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 1464
bogdanm 0:9b334a45a8ff 1465 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1466 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1467
bogdanm 0:9b334a45a8ff 1468 /* Get tick */
bogdanm 0:9b334a45a8ff 1469 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1470
bogdanm 0:9b334a45a8ff 1471 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1472 {
bogdanm 0:9b334a45a8ff 1473 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1474 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1475 {
bogdanm 0:9b334a45a8ff 1476 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 1477 {
bogdanm 0:9b334a45a8ff 1478 /* Change state */
bogdanm 0:9b334a45a8ff 1479 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1480
bogdanm 0:9b334a45a8ff 1481 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1482 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1483
bogdanm 0:9b334a45a8ff 1484 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1485 }
bogdanm 0:9b334a45a8ff 1486 }
bogdanm 0:9b334a45a8ff 1487 }
bogdanm 0:9b334a45a8ff 1488 /************************** STEP 3 ******************************************/
bogdanm 0:9b334a45a8ff 1489 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1490 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1491
bogdanm 0:9b334a45a8ff 1492 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1493 HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1494
bogdanm 0:9b334a45a8ff 1495 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1496 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1497
bogdanm 0:9b334a45a8ff 1498 /* Get tick */
bogdanm 0:9b334a45a8ff 1499 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1500
bogdanm 0:9b334a45a8ff 1501 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1502 {
bogdanm 0:9b334a45a8ff 1503 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1504 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1505 {
bogdanm 0:9b334a45a8ff 1506 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 1507 {
bogdanm 0:9b334a45a8ff 1508 /* Change state */
bogdanm 0:9b334a45a8ff 1509 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1510
bogdanm 0:9b334a45a8ff 1511 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1512 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1513
bogdanm 0:9b334a45a8ff 1514 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1515 }
bogdanm 0:9b334a45a8ff 1516 }
bogdanm 0:9b334a45a8ff 1517 }
bogdanm 0:9b334a45a8ff 1518
bogdanm 0:9b334a45a8ff 1519 /* Read the message digest */
bogdanm 0:9b334a45a8ff 1520 HASH_GetDigest(pOutBuffer, 16);
bogdanm 0:9b334a45a8ff 1521
bogdanm 0:9b334a45a8ff 1522 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1523 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 1524
bogdanm 0:9b334a45a8ff 1525 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1526 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1527
bogdanm 0:9b334a45a8ff 1528 /* Return function status */
bogdanm 0:9b334a45a8ff 1529 return HAL_OK;
bogdanm 0:9b334a45a8ff 1530 }
bogdanm 0:9b334a45a8ff 1531
bogdanm 0:9b334a45a8ff 1532 /**
bogdanm 0:9b334a45a8ff 1533 * @brief Initializes the HASH peripheral in HMAC SHA1 mode
bogdanm 0:9b334a45a8ff 1534 * then processes pInBuffer. The digest is available in pOutBuffer.
bogdanm 0:9b334a45a8ff 1535 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1536 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1537 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1538 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1539 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1540 * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes.
bogdanm 0:9b334a45a8ff 1541 * @param Timeout: Timeout value
bogdanm 0:9b334a45a8ff 1542 * @retval HAL status
bogdanm 0:9b334a45a8ff 1543 */
bogdanm 0:9b334a45a8ff 1544 HAL_StatusTypeDef HAL_HMAC_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1545 {
bogdanm 0:9b334a45a8ff 1546 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1547
bogdanm 0:9b334a45a8ff 1548 /* Process Locked */
bogdanm 0:9b334a45a8ff 1549 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1550
bogdanm 0:9b334a45a8ff 1551 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1552 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1553
bogdanm 0:9b334a45a8ff 1554 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1555 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1556 {
bogdanm 0:9b334a45a8ff 1557 /* Check if key size is greater than 64 bytes */
bogdanm 0:9b334a45a8ff 1558 if(hhash->Init.KeySize > 64)
bogdanm 0:9b334a45a8ff 1559 {
bogdanm 0:9b334a45a8ff 1560 /* Select the HMAC SHA1 mode */
bogdanm 0:9b334a45a8ff 1561 HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1562 }
bogdanm 0:9b334a45a8ff 1563 else
bogdanm 0:9b334a45a8ff 1564 {
bogdanm 0:9b334a45a8ff 1565 /* Select the HMAC SHA1 mode */
bogdanm 0:9b334a45a8ff 1566 HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1567 }
bogdanm 0:9b334a45a8ff 1568 }
bogdanm 0:9b334a45a8ff 1569
bogdanm 0:9b334a45a8ff 1570 /* Set the phase */
bogdanm 0:9b334a45a8ff 1571 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1572
bogdanm 0:9b334a45a8ff 1573 /************************** STEP 1 ******************************************/
bogdanm 0:9b334a45a8ff 1574 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1575 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1576
bogdanm 0:9b334a45a8ff 1577 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1578 HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1579
bogdanm 0:9b334a45a8ff 1580 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1581 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1582
bogdanm 0:9b334a45a8ff 1583 /* Get tick */
bogdanm 0:9b334a45a8ff 1584 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1585
bogdanm 0:9b334a45a8ff 1586 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1587 {
bogdanm 0:9b334a45a8ff 1588 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1589 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1590 {
bogdanm 0:9b334a45a8ff 1591 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1592 {
bogdanm 0:9b334a45a8ff 1593 /* Change state */
bogdanm 0:9b334a45a8ff 1594 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1595
bogdanm 0:9b334a45a8ff 1596 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1597 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1598
bogdanm 0:9b334a45a8ff 1599 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1600 }
bogdanm 0:9b334a45a8ff 1601 }
bogdanm 0:9b334a45a8ff 1602 }
bogdanm 0:9b334a45a8ff 1603 /************************** STEP 2 ******************************************/
bogdanm 0:9b334a45a8ff 1604 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1605 __HAL_HASH_SET_NBVALIDBITS(Size);
bogdanm 0:9b334a45a8ff 1606
bogdanm 0:9b334a45a8ff 1607 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1608 HASH_WriteData(pInBuffer, Size);
bogdanm 0:9b334a45a8ff 1609
bogdanm 0:9b334a45a8ff 1610 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1611 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1612
bogdanm 0:9b334a45a8ff 1613 /* Get tick */
bogdanm 0:9b334a45a8ff 1614 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1615
bogdanm 0:9b334a45a8ff 1616 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1617 {
bogdanm 0:9b334a45a8ff 1618 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1619 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1620 {
bogdanm 0:9b334a45a8ff 1621 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 1622 {
bogdanm 0:9b334a45a8ff 1623 /* Change state */
bogdanm 0:9b334a45a8ff 1624 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1625
bogdanm 0:9b334a45a8ff 1626 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1627 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1628
bogdanm 0:9b334a45a8ff 1629 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1630 }
bogdanm 0:9b334a45a8ff 1631 }
bogdanm 0:9b334a45a8ff 1632 }
bogdanm 0:9b334a45a8ff 1633 /************************** STEP 3 ******************************************/
bogdanm 0:9b334a45a8ff 1634 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1635 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1636
bogdanm 0:9b334a45a8ff 1637 /* Write input buffer in data register */
bogdanm 0:9b334a45a8ff 1638 HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1639
bogdanm 0:9b334a45a8ff 1640 /* Start the digest calculation */
bogdanm 0:9b334a45a8ff 1641 __HAL_HASH_START_DIGEST();
bogdanm 0:9b334a45a8ff 1642
bogdanm 0:9b334a45a8ff 1643 /* Get tick */
bogdanm 0:9b334a45a8ff 1644 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1645
bogdanm 0:9b334a45a8ff 1646 while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY))
bogdanm 0:9b334a45a8ff 1647 {
bogdanm 0:9b334a45a8ff 1648 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 1649 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1650 {
bogdanm 0:9b334a45a8ff 1651 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 1652 {
bogdanm 0:9b334a45a8ff 1653 /* Change state */
bogdanm 0:9b334a45a8ff 1654 hhash->State = HAL_HASH_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1655
bogdanm 0:9b334a45a8ff 1656 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1657 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1658
bogdanm 0:9b334a45a8ff 1659 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1660 }
bogdanm 0:9b334a45a8ff 1661 }
bogdanm 0:9b334a45a8ff 1662 }
bogdanm 0:9b334a45a8ff 1663 /* Read the message digest */
bogdanm 0:9b334a45a8ff 1664 HASH_GetDigest(pOutBuffer, 20);
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1667 hhash->State = HAL_HASH_STATE_READY;
bogdanm 0:9b334a45a8ff 1668
bogdanm 0:9b334a45a8ff 1669 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1670 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1671
bogdanm 0:9b334a45a8ff 1672 /* Return function status */
bogdanm 0:9b334a45a8ff 1673 return HAL_OK;
bogdanm 0:9b334a45a8ff 1674 }
bogdanm 0:9b334a45a8ff 1675
bogdanm 0:9b334a45a8ff 1676 /**
bogdanm 0:9b334a45a8ff 1677 * @}
bogdanm 0:9b334a45a8ff 1678 */
bogdanm 0:9b334a45a8ff 1679
bogdanm 0:9b334a45a8ff 1680 /** @defgroup HASH_Exported_Functions_Group6 HASH-MAC (HMAC) processing functions using DMA mode
bogdanm 0:9b334a45a8ff 1681 * @brief HMAC processing functions using DMA mode .
bogdanm 0:9b334a45a8ff 1682 *
bogdanm 0:9b334a45a8ff 1683 @verbatim
bogdanm 0:9b334a45a8ff 1684 ===============================================================================
bogdanm 0:9b334a45a8ff 1685 ##### HMAC processing using DMA mode functions #####
bogdanm 0:9b334a45a8ff 1686 ===============================================================================
bogdanm 0:9b334a45a8ff 1687 [..] This section provides functions allowing to calculate in DMA mode
bogdanm 0:9b334a45a8ff 1688 the HMAC value using one of the following algorithms:
bogdanm 0:9b334a45a8ff 1689 (+) MD5
bogdanm 0:9b334a45a8ff 1690 (+) SHA1
bogdanm 0:9b334a45a8ff 1691
bogdanm 0:9b334a45a8ff 1692 @endverbatim
bogdanm 0:9b334a45a8ff 1693 * @{
bogdanm 0:9b334a45a8ff 1694 */
bogdanm 0:9b334a45a8ff 1695
bogdanm 0:9b334a45a8ff 1696 /**
bogdanm 0:9b334a45a8ff 1697 * @brief Initializes the HASH peripheral in HMAC MD5 mode
bogdanm 0:9b334a45a8ff 1698 * then enables DMA to control data transfer.
bogdanm 0:9b334a45a8ff 1699 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1700 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1701 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1702 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1703 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1704 * @retval HAL status
bogdanm 0:9b334a45a8ff 1705 */
bogdanm 0:9b334a45a8ff 1706 HAL_StatusTypeDef HAL_HMAC_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 1707 {
bogdanm 0:9b334a45a8ff 1708 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 1709
bogdanm 0:9b334a45a8ff 1710 /* Process Locked */
bogdanm 0:9b334a45a8ff 1711 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1712
bogdanm 0:9b334a45a8ff 1713 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1714 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1715
bogdanm 0:9b334a45a8ff 1716 /* Save buffer pointer and size in handle */
bogdanm 0:9b334a45a8ff 1717 hhash->pHashInBuffPtr = pInBuffer;
bogdanm 0:9b334a45a8ff 1718 hhash->HashBuffSize = Size;
bogdanm 0:9b334a45a8ff 1719 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 1720
bogdanm 0:9b334a45a8ff 1721 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1722 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1723 {
bogdanm 0:9b334a45a8ff 1724 /* Check if key size is greater than 64 bytes */
bogdanm 0:9b334a45a8ff 1725 if(hhash->Init.KeySize > 64)
bogdanm 0:9b334a45a8ff 1726 {
bogdanm 0:9b334a45a8ff 1727 /* Select the HMAC MD5 mode */
bogdanm 0:9b334a45a8ff 1728 HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1729 }
bogdanm 0:9b334a45a8ff 1730 else
bogdanm 0:9b334a45a8ff 1731 {
bogdanm 0:9b334a45a8ff 1732 /* Select the HMAC MD5 mode */
bogdanm 0:9b334a45a8ff 1733 HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1734 }
bogdanm 0:9b334a45a8ff 1735 }
bogdanm 0:9b334a45a8ff 1736
bogdanm 0:9b334a45a8ff 1737 /* Set the phase */
bogdanm 0:9b334a45a8ff 1738 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1739
bogdanm 0:9b334a45a8ff 1740 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1741 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1742
bogdanm 0:9b334a45a8ff 1743 /* Get the key address */
bogdanm 0:9b334a45a8ff 1744 inputaddr = (uint32_t)(hhash->Init.pKey);
bogdanm 0:9b334a45a8ff 1745
bogdanm 0:9b334a45a8ff 1746 /* Set the HASH DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1747 hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt;
bogdanm 0:9b334a45a8ff 1748 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1749 hhash->hdmain->XferErrorCallback = HASH_DMAError;
bogdanm 0:9b334a45a8ff 1750
bogdanm 0:9b334a45a8ff 1751 /* Enable the DMA In DMA Stream */
bogdanm 0:9b334a45a8ff 1752 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
bogdanm 0:9b334a45a8ff 1753 /* Enable DMA requests */
bogdanm 0:9b334a45a8ff 1754 HASH->CR |= (HASH_CR_DMAE);
bogdanm 0:9b334a45a8ff 1755
bogdanm 0:9b334a45a8ff 1756 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1757 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1758
bogdanm 0:9b334a45a8ff 1759 /* Return function status */
bogdanm 0:9b334a45a8ff 1760 return HAL_OK;
bogdanm 0:9b334a45a8ff 1761 }
bogdanm 0:9b334a45a8ff 1762
bogdanm 0:9b334a45a8ff 1763 /**
bogdanm 0:9b334a45a8ff 1764 * @brief Initializes the HASH peripheral in HMAC SHA1 mode
bogdanm 0:9b334a45a8ff 1765 * then enables DMA to control data transfer.
bogdanm 0:9b334a45a8ff 1766 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1767 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1768 * @param pInBuffer: Pointer to the input buffer (buffer to be hashed).
bogdanm 0:9b334a45a8ff 1769 * @param Size: Length of the input buffer in bytes.
bogdanm 0:9b334a45a8ff 1770 * If the Size is not multiple of 64 bytes, the padding is managed by hardware.
bogdanm 0:9b334a45a8ff 1771 * @retval HAL status
bogdanm 0:9b334a45a8ff 1772 */
bogdanm 0:9b334a45a8ff 1773 HAL_StatusTypeDef HAL_HMAC_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size)
bogdanm 0:9b334a45a8ff 1774 {
bogdanm 0:9b334a45a8ff 1775 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 1776
bogdanm 0:9b334a45a8ff 1777 /* Process Locked */
bogdanm 0:9b334a45a8ff 1778 __HAL_LOCK(hhash);
bogdanm 0:9b334a45a8ff 1779
bogdanm 0:9b334a45a8ff 1780 /* Change the HASH state */
bogdanm 0:9b334a45a8ff 1781 hhash->State = HAL_HASH_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1782
bogdanm 0:9b334a45a8ff 1783 /* Save buffer pointer and size in handle */
bogdanm 0:9b334a45a8ff 1784 hhash->pHashInBuffPtr = pInBuffer;
bogdanm 0:9b334a45a8ff 1785 hhash->HashBuffSize = Size;
bogdanm 0:9b334a45a8ff 1786 hhash->HashInCount = 0;
bogdanm 0:9b334a45a8ff 1787
bogdanm 0:9b334a45a8ff 1788 /* Check if initialization phase has already been performed */
bogdanm 0:9b334a45a8ff 1789 if(hhash->Phase == HAL_HASH_PHASE_READY)
bogdanm 0:9b334a45a8ff 1790 {
bogdanm 0:9b334a45a8ff 1791 /* Check if key size is greater than 64 bytes */
bogdanm 0:9b334a45a8ff 1792 if(hhash->Init.KeySize > 64)
bogdanm 0:9b334a45a8ff 1793 {
bogdanm 0:9b334a45a8ff 1794 /* Select the HMAC SHA1 mode */
bogdanm 0:9b334a45a8ff 1795 HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1796 }
bogdanm 0:9b334a45a8ff 1797 else
bogdanm 0:9b334a45a8ff 1798 {
bogdanm 0:9b334a45a8ff 1799 /* Select the HMAC SHA1 mode */
bogdanm 0:9b334a45a8ff 1800 HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_CR_INIT);
bogdanm 0:9b334a45a8ff 1801 }
bogdanm 0:9b334a45a8ff 1802 }
bogdanm 0:9b334a45a8ff 1803
bogdanm 0:9b334a45a8ff 1804 /* Set the phase */
bogdanm 0:9b334a45a8ff 1805 hhash->Phase = HAL_HASH_PHASE_PROCESS;
bogdanm 0:9b334a45a8ff 1806
bogdanm 0:9b334a45a8ff 1807 /* Configure the number of valid bits in last word of the message */
bogdanm 0:9b334a45a8ff 1808 __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize);
bogdanm 0:9b334a45a8ff 1809
bogdanm 0:9b334a45a8ff 1810 /* Get the key address */
bogdanm 0:9b334a45a8ff 1811 inputaddr = (uint32_t)(hhash->Init.pKey);
bogdanm 0:9b334a45a8ff 1812
bogdanm 0:9b334a45a8ff 1813 /* Set the HASH DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1814 hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt;
bogdanm 0:9b334a45a8ff 1815 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1816 hhash->hdmain->XferErrorCallback = HASH_DMAError;
bogdanm 0:9b334a45a8ff 1817
bogdanm 0:9b334a45a8ff 1818 /* Enable the DMA In DMA Stream */
bogdanm 0:9b334a45a8ff 1819 HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4));
bogdanm 0:9b334a45a8ff 1820 /* Enable DMA requests */
bogdanm 0:9b334a45a8ff 1821 HASH->CR |= (HASH_CR_DMAE);
bogdanm 0:9b334a45a8ff 1822
bogdanm 0:9b334a45a8ff 1823 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1824 __HAL_UNLOCK(hhash);
bogdanm 0:9b334a45a8ff 1825
bogdanm 0:9b334a45a8ff 1826 /* Return function status */
bogdanm 0:9b334a45a8ff 1827 return HAL_OK;
bogdanm 0:9b334a45a8ff 1828 }
bogdanm 0:9b334a45a8ff 1829
bogdanm 0:9b334a45a8ff 1830 /**
bogdanm 0:9b334a45a8ff 1831 * @}
bogdanm 0:9b334a45a8ff 1832 */
bogdanm 0:9b334a45a8ff 1833
bogdanm 0:9b334a45a8ff 1834 /** @defgroup HASH_Exported_Functions_Group7 Peripheral State functions
bogdanm 0:9b334a45a8ff 1835 * @brief Peripheral State functions.
bogdanm 0:9b334a45a8ff 1836 *
bogdanm 0:9b334a45a8ff 1837 @verbatim
bogdanm 0:9b334a45a8ff 1838 ===============================================================================
bogdanm 0:9b334a45a8ff 1839 ##### Peripheral State functions #####
bogdanm 0:9b334a45a8ff 1840 ===============================================================================
bogdanm 0:9b334a45a8ff 1841 [..]
bogdanm 0:9b334a45a8ff 1842 This subsection permits to get in run-time the status of the peripheral.
bogdanm 0:9b334a45a8ff 1843
bogdanm 0:9b334a45a8ff 1844 @endverbatim
bogdanm 0:9b334a45a8ff 1845 * @{
bogdanm 0:9b334a45a8ff 1846 */
bogdanm 0:9b334a45a8ff 1847
bogdanm 0:9b334a45a8ff 1848 /**
bogdanm 0:9b334a45a8ff 1849 * @brief return the HASH state
bogdanm 0:9b334a45a8ff 1850 * @param hhash: pointer to a HASH_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1851 * the configuration information for HASH module
bogdanm 0:9b334a45a8ff 1852 * @retval HAL state
bogdanm 0:9b334a45a8ff 1853 */
mbed_official 83:a036322b8637 1854 HAL_HASH_StateTypeDef HAL_HASH_GetState(HASH_HandleTypeDef *hhash)
bogdanm 0:9b334a45a8ff 1855 {
bogdanm 0:9b334a45a8ff 1856 return hhash->State;
bogdanm 0:9b334a45a8ff 1857 }
bogdanm 0:9b334a45a8ff 1858
bogdanm 0:9b334a45a8ff 1859 /**
bogdanm 0:9b334a45a8ff 1860 * @}
bogdanm 0:9b334a45a8ff 1861 */
bogdanm 0:9b334a45a8ff 1862
bogdanm 0:9b334a45a8ff 1863 /**
bogdanm 0:9b334a45a8ff 1864 * @}
bogdanm 0:9b334a45a8ff 1865 */
bogdanm 0:9b334a45a8ff 1866
bogdanm 0:9b334a45a8ff 1867 #endif /* HAL_HASH_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1868
bogdanm 0:9b334a45a8ff 1869 /**
bogdanm 0:9b334a45a8ff 1870 * @}
bogdanm 0:9b334a45a8ff 1871 */
bogdanm 0:9b334a45a8ff 1872 #endif /* STM32F756xx */
bogdanm 0:9b334a45a8ff 1873
bogdanm 0:9b334a45a8ff 1874 /**
bogdanm 0:9b334a45a8ff 1875 * @}
bogdanm 0:9b334a45a8ff 1876 */
bogdanm 0:9b334a45a8ff 1877
bogdanm 0:9b334a45a8ff 1878 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/