mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed Feb 26 09:45:12 2014 +0000
Revision:
106:ced8cbb51063
Parent:
87:085cde657901
Child:
226:b062af740e40
Synchronized with git revision 4222735eff5868389433f0e9271976b39c8115cd

Full URL: https://github.com/mbedmicro/mbed/commit/4222735eff5868389433f0e9271976b39c8115cd/

[NUCLEO_xxx] Update STM32CubeF4 driver V1.0.0 + update license

Who changed what in which revision?

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