Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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