fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

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

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32l4xx_hal_cryp_ex.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
bogdanm 0:9b334a45a8ff 5 * @version V1.0.0
bogdanm 0:9b334a45a8ff 6 * @date 26-June-2015
bogdanm 0:9b334a45a8ff 7 * @brief CRYPEx HAL module driver.
bogdanm 0:9b334a45a8ff 8 * This file provides firmware functions to manage the extended
bogdanm 0:9b334a45a8ff 9 * functionalities of the Cryptography (CRYP) peripheral.
bogdanm 0:9b334a45a8ff 10 *
bogdanm 0:9b334a45a8ff 11 ******************************************************************************
bogdanm 0:9b334a45a8ff 12 * @attention
bogdanm 0:9b334a45a8ff 13 *
bogdanm 0:9b334a45a8ff 14 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 15 *
bogdanm 0:9b334a45a8ff 16 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 17 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 18 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 19 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 20 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 21 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 22 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 23 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 24 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 25 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 26 *
bogdanm 0:9b334a45a8ff 27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 30 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 33 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 34 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 35 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 36 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 37 *
bogdanm 0:9b334a45a8ff 38 ******************************************************************************
bogdanm 0:9b334a45a8ff 39 */
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 42 #include "stm32l4xx_hal.h"
bogdanm 0:9b334a45a8ff 43
bogdanm 0:9b334a45a8ff 44 #ifdef HAL_CRYP_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 #if defined(STM32L485xx) || defined(STM32L486xx)
bogdanm 0:9b334a45a8ff 47
bogdanm 0:9b334a45a8ff 48 /** @addtogroup STM32L4xx_HAL_Driver
bogdanm 0:9b334a45a8ff 49 * @{
bogdanm 0:9b334a45a8ff 50 */
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 /** @defgroup CRYPEx CRYPEx
bogdanm 0:9b334a45a8ff 53 * @brief CRYP Extended HAL module driver
bogdanm 0:9b334a45a8ff 54 * @{
bogdanm 0:9b334a45a8ff 55 */
bogdanm 0:9b334a45a8ff 56
bogdanm 0:9b334a45a8ff 57 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 58 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 59 /** @defgroup CRYPEx_Private_Constants CRYPEx Private Constants
bogdanm 0:9b334a45a8ff 60 * @{
bogdanm 0:9b334a45a8ff 61 */
bogdanm 0:9b334a45a8ff 62 #define CRYP_CCF_TIMEOUTVALUE 22000 /*!< CCF flag raising time-out value */
bogdanm 0:9b334a45a8ff 63 #define CRYP_BUSY_TIMEOUTVALUE 22000 /*!< BUSY flag reset time-out value */
bogdanm 0:9b334a45a8ff 64 /**
bogdanm 0:9b334a45a8ff 65 * @}
bogdanm 0:9b334a45a8ff 66 */
bogdanm 0:9b334a45a8ff 67
bogdanm 0:9b334a45a8ff 68 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 69 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 70 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 71 /** @defgroup CRYPEx_Private_Functions CRYPEx Private Functions
bogdanm 0:9b334a45a8ff 72 * @{
bogdanm 0:9b334a45a8ff 73 */
bogdanm 0:9b334a45a8ff 74 static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 75 static HAL_StatusTypeDef CRYP_ReadKey(CRYP_HandleTypeDef *hcryp, uint8_t* Output, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 76 static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr);
bogdanm 0:9b334a45a8ff 77 static void CRYP_GCMCMAC_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr);
bogdanm 0:9b334a45a8ff 78 static void CRYP_GCMCMAC_DMAInCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 79 static void CRYP_GCMCMAC_DMAError(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 80 static void CRYP_GCMCMAC_DMAOutCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 81 static HAL_StatusTypeDef CRYP_WaitOnCCFlag(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 82 static HAL_StatusTypeDef CRYP_WaitOnBusyFlagReset(CRYP_HandleTypeDef *hcryp, uint32_t Timeout);
bogdanm 0:9b334a45a8ff 83 static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 84 static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 85 static void CRYP_DMAError(DMA_HandleTypeDef *hdma);
bogdanm 0:9b334a45a8ff 86 /**
bogdanm 0:9b334a45a8ff 87 * @}
bogdanm 0:9b334a45a8ff 88 */
bogdanm 0:9b334a45a8ff 89
bogdanm 0:9b334a45a8ff 90 /* Exported functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 91
bogdanm 0:9b334a45a8ff 92 /** @defgroup CRYPEx_Exported_Functions CRYPEx Exported Functions
bogdanm 0:9b334a45a8ff 93 * @{
bogdanm 0:9b334a45a8ff 94 */
bogdanm 0:9b334a45a8ff 95
bogdanm 0:9b334a45a8ff 96
bogdanm 0:9b334a45a8ff 97 /** @defgroup CRYPEx_Exported_Functions_Group1 Extended callback function
bogdanm 0:9b334a45a8ff 98 * @brief Extended callback functions.
bogdanm 0:9b334a45a8ff 99 *
bogdanm 0:9b334a45a8ff 100 @verbatim
bogdanm 0:9b334a45a8ff 101 ===============================================================================
bogdanm 0:9b334a45a8ff 102 ##### Extended callback functions #####
bogdanm 0:9b334a45a8ff 103 ===============================================================================
bogdanm 0:9b334a45a8ff 104 [..] This section provides callback function:
bogdanm 0:9b334a45a8ff 105 (+) Computation completed.
bogdanm 0:9b334a45a8ff 106
bogdanm 0:9b334a45a8ff 107 @endverbatim
bogdanm 0:9b334a45a8ff 108 * @{
bogdanm 0:9b334a45a8ff 109 */
bogdanm 0:9b334a45a8ff 110
bogdanm 0:9b334a45a8ff 111
bogdanm 0:9b334a45a8ff 112 /**
bogdanm 0:9b334a45a8ff 113 * @brief Computation completed callbacks.
bogdanm 0:9b334a45a8ff 114 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 115 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 116 * @retval None
bogdanm 0:9b334a45a8ff 117 */
bogdanm 0:9b334a45a8ff 118 __weak void HAL_CRYPEx_ComputationCpltCallback(CRYP_HandleTypeDef *hcryp)
bogdanm 0:9b334a45a8ff 119 {
bogdanm 0:9b334a45a8ff 120 /* NOTE : This function should not be modified; when the callback is needed,
bogdanm 0:9b334a45a8ff 121 the HAL_CRYP_ErrorCallback can be implemented in the user file
bogdanm 0:9b334a45a8ff 122 */
bogdanm 0:9b334a45a8ff 123 }
bogdanm 0:9b334a45a8ff 124
bogdanm 0:9b334a45a8ff 125 /**
bogdanm 0:9b334a45a8ff 126 * @}
bogdanm 0:9b334a45a8ff 127 */
bogdanm 0:9b334a45a8ff 128
bogdanm 0:9b334a45a8ff 129 /** @defgroup CRYPEx_Exported_Functions_Group2 AES extended processing functions
bogdanm 0:9b334a45a8ff 130 * @brief Extended processing functions.
bogdanm 0:9b334a45a8ff 131 *
bogdanm 0:9b334a45a8ff 132 @verbatim
bogdanm 0:9b334a45a8ff 133 ==============================================================================
bogdanm 0:9b334a45a8ff 134 ##### AES extended processing functions #####
bogdanm 0:9b334a45a8ff 135 ==============================================================================
bogdanm 0:9b334a45a8ff 136 [..] This section provides functions allowing to:
bogdanm 0:9b334a45a8ff 137 (+) Encrypt plaintext or decrypt cipher text using AES algorithm in different chaining modes.
bogdanm 0:9b334a45a8ff 138 Functions are generic (handles ECB, CBC and CTR and all modes) and are only differentiated
bogdanm 0:9b334a45a8ff 139 based on the processing type. Three processing types are available:
bogdanm 0:9b334a45a8ff 140 (++) Polling mode
bogdanm 0:9b334a45a8ff 141 (++) Interrupt mode
bogdanm 0:9b334a45a8ff 142 (++) DMA mode
bogdanm 0:9b334a45a8ff 143 (+) Generate and authentication tag in addition to encrypt/decrypt a plain/cipher text using AES
bogdanm 0:9b334a45a8ff 144 algorithm in different chaining modes.
bogdanm 0:9b334a45a8ff 145 Functions are generic (handles GCM, GMAC and CMAC) and process only one phase so that steps
bogdanm 0:9b334a45a8ff 146 can be skipped if so required. Functions are only differentiated based on the processing type.
bogdanm 0:9b334a45a8ff 147 Three processing types are available:
bogdanm 0:9b334a45a8ff 148 (++) Polling mode
bogdanm 0:9b334a45a8ff 149 (++) Interrupt mode
bogdanm 0:9b334a45a8ff 150 (++) DMA mode
bogdanm 0:9b334a45a8ff 151
bogdanm 0:9b334a45a8ff 152 @endverbatim
bogdanm 0:9b334a45a8ff 153 * @{
bogdanm 0:9b334a45a8ff 154 */
bogdanm 0:9b334a45a8ff 155
bogdanm 0:9b334a45a8ff 156 /**
bogdanm 0:9b334a45a8ff 157 * @brief Carry out in polling mode the ciphering or deciphering operation according to
bogdanm 0:9b334a45a8ff 158 * hcryp->Init structure fields, all operating modes (encryption, key derivation and/or decryption) and
bogdanm 0:9b334a45a8ff 159 * chaining modes ECB, CBC and CTR are managed by this function in polling mode.
bogdanm 0:9b334a45a8ff 160 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 161 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 162 * @param pInputData: Pointer to the plain text in case of encryption or cipher text in case of decryption
bogdanm 0:9b334a45a8ff 163 * or key derivation+decryption.
bogdanm 0:9b334a45a8ff 164 * Parameter is meaningless in case of key derivation.
bogdanm 0:9b334a45a8ff 165 * @param Size: Length of the input data buffer in bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 166 * Parameter is meaningless in case of key derivation.
bogdanm 0:9b334a45a8ff 167 * @param pOutputData: Pointer to the cipher text in case of encryption or plain text in case of
bogdanm 0:9b334a45a8ff 168 * decryption/key derivation+decryption, or pointer to the derivative keys in
bogdanm 0:9b334a45a8ff 169 * case of key derivation only.
bogdanm 0:9b334a45a8ff 170 * @param Timeout: Specify Timeout value
bogdanm 0:9b334a45a8ff 171 * @retval HAL status
bogdanm 0:9b334a45a8ff 172 */
bogdanm 0:9b334a45a8ff 173 HAL_StatusTypeDef HAL_CRYPEx_AES(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint16_t Size, uint8_t *pOutputData, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 174 {
bogdanm 0:9b334a45a8ff 175
bogdanm 0:9b334a45a8ff 176 if (hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 177 {
bogdanm 0:9b334a45a8ff 178 /* Check parameters setting */
bogdanm 0:9b334a45a8ff 179 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 180 {
bogdanm 0:9b334a45a8ff 181 if (pOutputData == NULL)
bogdanm 0:9b334a45a8ff 182 {
bogdanm 0:9b334a45a8ff 183 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 184 }
bogdanm 0:9b334a45a8ff 185 }
bogdanm 0:9b334a45a8ff 186 else
bogdanm 0:9b334a45a8ff 187 {
bogdanm 0:9b334a45a8ff 188 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 189 {
bogdanm 0:9b334a45a8ff 190 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 191 }
bogdanm 0:9b334a45a8ff 192 }
bogdanm 0:9b334a45a8ff 193
bogdanm 0:9b334a45a8ff 194 /* Process Locked */
bogdanm 0:9b334a45a8ff 195 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 196
bogdanm 0:9b334a45a8ff 197 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 198 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 199
bogdanm 0:9b334a45a8ff 200 /* Call CRYP_ReadKey() API if the operating mode is set to
bogdanm 0:9b334a45a8ff 201 key derivation, CRYP_ProcessData() otherwise */
bogdanm 0:9b334a45a8ff 202 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 203 {
bogdanm 0:9b334a45a8ff 204 if(CRYP_ReadKey(hcryp, pOutputData, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 205 {
bogdanm 0:9b334a45a8ff 206 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 207 }
bogdanm 0:9b334a45a8ff 208 }
bogdanm 0:9b334a45a8ff 209 else
bogdanm 0:9b334a45a8ff 210 {
bogdanm 0:9b334a45a8ff 211 if(CRYP_ProcessData(hcryp, pInputData, Size, pOutputData, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 212 {
bogdanm 0:9b334a45a8ff 213 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 214 }
bogdanm 0:9b334a45a8ff 215 }
bogdanm 0:9b334a45a8ff 216
bogdanm 0:9b334a45a8ff 217 /* If the state has not been set to SUSPENDED, set it to
bogdanm 0:9b334a45a8ff 218 READY, otherwise keep it as it is */
bogdanm 0:9b334a45a8ff 219 if (hcryp->State != HAL_CRYP_STATE_SUSPENDED)
bogdanm 0:9b334a45a8ff 220 {
bogdanm 0:9b334a45a8ff 221 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 222 }
bogdanm 0:9b334a45a8ff 223
bogdanm 0:9b334a45a8ff 224 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 225 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 226
bogdanm 0:9b334a45a8ff 227 return HAL_OK;
bogdanm 0:9b334a45a8ff 228 }
bogdanm 0:9b334a45a8ff 229 else
bogdanm 0:9b334a45a8ff 230 {
bogdanm 0:9b334a45a8ff 231 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 232 }
bogdanm 0:9b334a45a8ff 233 }
bogdanm 0:9b334a45a8ff 234
bogdanm 0:9b334a45a8ff 235
bogdanm 0:9b334a45a8ff 236
bogdanm 0:9b334a45a8ff 237 /**
bogdanm 0:9b334a45a8ff 238 * @brief Carry out in interrupt mode the ciphering or deciphering operation according to
bogdanm 0:9b334a45a8ff 239 * hcryp->Init structure fields, all operating modes (encryption, key derivation and/or decryption) and
bogdanm 0:9b334a45a8ff 240 * chaining modes ECB, CBC and CTR are managed by this function in interrupt mode.
bogdanm 0:9b334a45a8ff 241 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 242 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 243 * @param pInputData: Pointer to the plain text in case of encryption or cipher text in case of decryption
bogdanm 0:9b334a45a8ff 244 * or key derivation+decryption.
bogdanm 0:9b334a45a8ff 245 * Parameter is meaningless in case of key derivation.
bogdanm 0:9b334a45a8ff 246 * @param Size: Length of the input data buffer in bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 247 * Parameter is meaningless in case of key derivation.
bogdanm 0:9b334a45a8ff 248 * @param pOutputData: Pointer to the cipher text in case of encryption or plain text in case of
bogdanm 0:9b334a45a8ff 249 * decryption/key derivation+decryption, or pointer to the derivative keys in
bogdanm 0:9b334a45a8ff 250 * case of key derivation only.
bogdanm 0:9b334a45a8ff 251 * @retval HAL status
bogdanm 0:9b334a45a8ff 252 */
bogdanm 0:9b334a45a8ff 253 HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint16_t Size, uint8_t *pOutputData)
bogdanm 0:9b334a45a8ff 254 {
bogdanm 0:9b334a45a8ff 255 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 256
bogdanm 0:9b334a45a8ff 257 if(hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 258 {
bogdanm 0:9b334a45a8ff 259 /* Check parameters setting */
bogdanm 0:9b334a45a8ff 260 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 261 {
bogdanm 0:9b334a45a8ff 262 if (pOutputData == NULL)
bogdanm 0:9b334a45a8ff 263 {
bogdanm 0:9b334a45a8ff 264 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 265 }
bogdanm 0:9b334a45a8ff 266 }
bogdanm 0:9b334a45a8ff 267 else
bogdanm 0:9b334a45a8ff 268 {
bogdanm 0:9b334a45a8ff 269 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 270 {
bogdanm 0:9b334a45a8ff 271 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 272 }
bogdanm 0:9b334a45a8ff 273 }
bogdanm 0:9b334a45a8ff 274 /* Process Locked */
bogdanm 0:9b334a45a8ff 275 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 276
bogdanm 0:9b334a45a8ff 277 /* If operating mode is not limited to key derivation only,
bogdanm 0:9b334a45a8ff 278 get the buffers addresses and sizes */
bogdanm 0:9b334a45a8ff 279 if (hcryp->Init.OperatingMode != CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 280 {
bogdanm 0:9b334a45a8ff 281
bogdanm 0:9b334a45a8ff 282 hcryp->CrypInCount = Size;
bogdanm 0:9b334a45a8ff 283 hcryp->pCrypInBuffPtr = pInputData;
bogdanm 0:9b334a45a8ff 284 hcryp->pCrypOutBuffPtr = pOutputData;
bogdanm 0:9b334a45a8ff 285 hcryp->CrypOutCount = Size;
bogdanm 0:9b334a45a8ff 286 }
bogdanm 0:9b334a45a8ff 287
bogdanm 0:9b334a45a8ff 288 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 289 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 290
bogdanm 0:9b334a45a8ff 291 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 292 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 293
bogdanm 0:9b334a45a8ff 294 /* Enable Computation Complete Flag and Error Interrupts */
bogdanm 0:9b334a45a8ff 295 __HAL_CRYP_ENABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 296
bogdanm 0:9b334a45a8ff 297
bogdanm 0:9b334a45a8ff 298 /* If operating mode is key derivation only, the input data have
bogdanm 0:9b334a45a8ff 299 already been entered during the initialization process. For
bogdanm 0:9b334a45a8ff 300 the other operating modes, they are fed to the CRYP hardware
bogdanm 0:9b334a45a8ff 301 block at this point. */
bogdanm 0:9b334a45a8ff 302 if (hcryp->Init.OperatingMode != CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 303 {
bogdanm 0:9b334a45a8ff 304 /* Initiate the processing under interrupt in entering
bogdanm 0:9b334a45a8ff 305 the first input data */
bogdanm 0:9b334a45a8ff 306 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
bogdanm 0:9b334a45a8ff 307 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 308 hcryp->pCrypInBuffPtr += 16;
bogdanm 0:9b334a45a8ff 309 hcryp->CrypInCount -= 16;
bogdanm 0:9b334a45a8ff 310 /* Write the first input block in the Data Input register */
bogdanm 0:9b334a45a8ff 311 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 312 inputaddr+=4;
bogdanm 0:9b334a45a8ff 313 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 314 inputaddr+=4;
bogdanm 0:9b334a45a8ff 315 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 316 inputaddr+=4;
bogdanm 0:9b334a45a8ff 317 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 318 }
bogdanm 0:9b334a45a8ff 319
bogdanm 0:9b334a45a8ff 320 /* Return function status */
bogdanm 0:9b334a45a8ff 321 return HAL_OK;
bogdanm 0:9b334a45a8ff 322 }
bogdanm 0:9b334a45a8ff 323 else
bogdanm 0:9b334a45a8ff 324 {
bogdanm 0:9b334a45a8ff 325 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 326 }
bogdanm 0:9b334a45a8ff 327 }
bogdanm 0:9b334a45a8ff 328
bogdanm 0:9b334a45a8ff 329
bogdanm 0:9b334a45a8ff 330
bogdanm 0:9b334a45a8ff 331
bogdanm 0:9b334a45a8ff 332
bogdanm 0:9b334a45a8ff 333 /**
bogdanm 0:9b334a45a8ff 334 * @brief Carry out in DMA mode the ciphering or deciphering operation according to
bogdanm 0:9b334a45a8ff 335 * hcryp->Init structure fields.
bogdanm 0:9b334a45a8ff 336 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 337 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 338 * @param pInputData: Pointer to the plain text in case of encryption or cipher text in case of decryption
bogdanm 0:9b334a45a8ff 339 * or key derivation+decryption.
bogdanm 0:9b334a45a8ff 340 * @param Size: Length of the input data buffer in bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 341 * @param pOutputData: Pointer to the cipher text in case of encryption or plain text in case of
bogdanm 0:9b334a45a8ff 342 * decryption/key derivation+decryption.
bogdanm 0:9b334a45a8ff 343 * @note Chaining modes ECB, CBC and CTR are managed by this function in DMA mode.
bogdanm 0:9b334a45a8ff 344 * @note Supported operating modes are encryption, decryption and key derivation with decryption.
bogdanm 0:9b334a45a8ff 345 * @note No DMA channel is provided for key derivation only and therefore, access to AES_KEYRx
bogdanm 0:9b334a45a8ff 346 * registers must be done by software.
bogdanm 0:9b334a45a8ff 347 * @note This API is not applicable to key derivation only; for such a mode, access to AES_KEYRx
bogdanm 0:9b334a45a8ff 348 * registers must be done by software thru HAL_CRYPEx_AES() or HAL_CRYPEx_AES_IT() APIs.
bogdanm 0:9b334a45a8ff 349 * @retval HAL status
bogdanm 0:9b334a45a8ff 350 */
bogdanm 0:9b334a45a8ff 351 HAL_StatusTypeDef HAL_CRYPEx_AES_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint16_t Size, uint8_t *pOutputData)
bogdanm 0:9b334a45a8ff 352 {
bogdanm 0:9b334a45a8ff 353 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 354 uint32_t outputaddr = 0;
bogdanm 0:9b334a45a8ff 355
bogdanm 0:9b334a45a8ff 356 if (hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 357 {
bogdanm 0:9b334a45a8ff 358 /* Check parameters setting */
bogdanm 0:9b334a45a8ff 359 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)
bogdanm 0:9b334a45a8ff 360 {
bogdanm 0:9b334a45a8ff 361 /* no DMA channel is provided for key derivation operating mode,
bogdanm 0:9b334a45a8ff 362 access to AES_KEYRx registers must be done by software */
bogdanm 0:9b334a45a8ff 363 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 364 }
bogdanm 0:9b334a45a8ff 365 else
bogdanm 0:9b334a45a8ff 366 {
bogdanm 0:9b334a45a8ff 367 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 368 {
bogdanm 0:9b334a45a8ff 369 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 370 }
bogdanm 0:9b334a45a8ff 371 }
bogdanm 0:9b334a45a8ff 372
bogdanm 0:9b334a45a8ff 373
bogdanm 0:9b334a45a8ff 374 /* Process Locked */
bogdanm 0:9b334a45a8ff 375 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 376
bogdanm 0:9b334a45a8ff 377 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 378 outputaddr = (uint32_t)pOutputData;
bogdanm 0:9b334a45a8ff 379
bogdanm 0:9b334a45a8ff 380 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 381 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 382
bogdanm 0:9b334a45a8ff 383 /* Set the input and output addresses and start DMA transfer */
bogdanm 0:9b334a45a8ff 384 CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
bogdanm 0:9b334a45a8ff 385
bogdanm 0:9b334a45a8ff 386 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 387 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 388
bogdanm 0:9b334a45a8ff 389 /* Return function status */
bogdanm 0:9b334a45a8ff 390 return HAL_OK;
bogdanm 0:9b334a45a8ff 391 }
bogdanm 0:9b334a45a8ff 392 else
bogdanm 0:9b334a45a8ff 393 {
bogdanm 0:9b334a45a8ff 394 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 395 }
bogdanm 0:9b334a45a8ff 396 }
bogdanm 0:9b334a45a8ff 397
bogdanm 0:9b334a45a8ff 398
bogdanm 0:9b334a45a8ff 399
bogdanm 0:9b334a45a8ff 400
bogdanm 0:9b334a45a8ff 401
bogdanm 0:9b334a45a8ff 402
bogdanm 0:9b334a45a8ff 403 /**
bogdanm 0:9b334a45a8ff 404 * @brief Carry out in polling mode the authentication tag generation as well as the ciphering or deciphering
bogdanm 0:9b334a45a8ff 405 * operation according to hcryp->Init structure fields.
bogdanm 0:9b334a45a8ff 406 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 407 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 408 * @param pInputData: Pointer to payload data in GCM payload phase,
bogdanm 0:9b334a45a8ff 409 * Parameter is meaningless in case of GCM/GMAC init, header and final phases,
bogdanm 0:9b334a45a8ff 410 * Pointer to B0 blocks in CMAC header phase,
bogdanm 0:9b334a45a8ff 411 * Pointer to C block in CMAC final phase.
bogdanm 0:9b334a45a8ff 412 * @param Size: Length of the input payload data buffer in bytes, must be a multiple of 16,
bogdanm 0:9b334a45a8ff 413 * Parameter is meaningless in case of GCM/GMAC init and header phases,
bogdanm 0:9b334a45a8ff 414 * Length of B blocks (in bytes, must be a multiple of 16) in CMAC header phase,
bogdanm 0:9b334a45a8ff 415 * Length of C block (in bytes) in CMAC final phase.
bogdanm 0:9b334a45a8ff 416 * @param pOutputData: Pointer to plain or cipher text in GCM payload phase,
bogdanm 0:9b334a45a8ff 417 * pointer to authentication tag in GCM/GMAC and CMAC final phases.
bogdanm 0:9b334a45a8ff 418 * Parameter is meaningless in case of GCM/GMAC init and header phases
bogdanm 0:9b334a45a8ff 419 * and in case of CMAC header phase.
bogdanm 0:9b334a45a8ff 420 * @param Timeout: Specify Timeout value
bogdanm 0:9b334a45a8ff 421 * @note Supported operating modes are encryption and decryption, supported chaining modes are GCM, GMAC and CMAC.
bogdanm 0:9b334a45a8ff 422 * @note Phases are singly processed according to hcryp->Init.GCMCMACPhase so that steps in these specific chaining modes
bogdanm 0:9b334a45a8ff 423 * can be skipped by the user if so required.
bogdanm 0:9b334a45a8ff 424 * @retval HAL status
bogdanm 0:9b334a45a8ff 425 */
bogdanm 0:9b334a45a8ff 426 HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 427 {
bogdanm 0:9b334a45a8ff 428 uint32_t index = 0;
bogdanm 0:9b334a45a8ff 429 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 430 uint32_t outputaddr = 0;
bogdanm 0:9b334a45a8ff 431 uint32_t tagaddr = 0;
bogdanm 0:9b334a45a8ff 432 uint64_t headerlength = 0;
bogdanm 0:9b334a45a8ff 433 uint64_t inputlength = 0;
bogdanm 0:9b334a45a8ff 434
bogdanm 0:9b334a45a8ff 435 if (hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 436 {
bogdanm 0:9b334a45a8ff 437 /* input/output parameters check */
bogdanm 0:9b334a45a8ff 438 if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 439 {
bogdanm 0:9b334a45a8ff 440 if ((hcryp->Init.Header == NULL) || (hcryp->Init.HeaderSize == 0))
bogdanm 0:9b334a45a8ff 441 {
bogdanm 0:9b334a45a8ff 442 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 443 }
bogdanm 0:9b334a45a8ff 444 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 445 {
bogdanm 0:9b334a45a8ff 446 /* In case of CMAC header phase resumption, we can have pInputData = NULL and Size = 0 */
bogdanm 0:9b334a45a8ff 447 if (((pInputData != NULL) && (Size == 0)) || ((pInputData == NULL) && (Size != 0)))
bogdanm 0:9b334a45a8ff 448 {
bogdanm 0:9b334a45a8ff 449 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 450 }
bogdanm 0:9b334a45a8ff 451 }
bogdanm 0:9b334a45a8ff 452 }
bogdanm 0:9b334a45a8ff 453 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 454 {
bogdanm 0:9b334a45a8ff 455 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 456 {
bogdanm 0:9b334a45a8ff 457 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 458 }
bogdanm 0:9b334a45a8ff 459 }
bogdanm 0:9b334a45a8ff 460 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 461 {
bogdanm 0:9b334a45a8ff 462 if (pOutputData == NULL)
bogdanm 0:9b334a45a8ff 463 {
bogdanm 0:9b334a45a8ff 464 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 465 }
bogdanm 0:9b334a45a8ff 466 if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (pInputData == NULL))
bogdanm 0:9b334a45a8ff 467 {
bogdanm 0:9b334a45a8ff 468 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 469 }
bogdanm 0:9b334a45a8ff 470 }
bogdanm 0:9b334a45a8ff 471
bogdanm 0:9b334a45a8ff 472
bogdanm 0:9b334a45a8ff 473 /* Process Locked */
bogdanm 0:9b334a45a8ff 474 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 475
bogdanm 0:9b334a45a8ff 476 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 477 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 478
bogdanm 0:9b334a45a8ff 479 /*=====================*/
bogdanm 0:9b334a45a8ff 480 /* GCM/GMAC init phase */
bogdanm 0:9b334a45a8ff 481 /*=====================*/
bogdanm 0:9b334a45a8ff 482 /* In case of init phase, the input data (Key and Initialization Vector) have
bogdanm 0:9b334a45a8ff 483 already been entered during the initialization process. Therefore, the
bogdanm 0:9b334a45a8ff 484 API just waits for the CCF flag to be set. */
bogdanm 0:9b334a45a8ff 485 if (hcryp->Init.GCMCMACPhase == CRYP_GCM_INIT_PHASE)
bogdanm 0:9b334a45a8ff 486 {
bogdanm 0:9b334a45a8ff 487 /* just wait for hash computation */
bogdanm 0:9b334a45a8ff 488 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 489 {
bogdanm 0:9b334a45a8ff 490 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 491 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 492 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 493 }
bogdanm 0:9b334a45a8ff 494
bogdanm 0:9b334a45a8ff 495 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 496 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 497 /* Mark that the initialization phase is over */
bogdanm 0:9b334a45a8ff 498 hcryp->Phase = HAL_CRYP_PHASE_INIT_OVER;
bogdanm 0:9b334a45a8ff 499 }
bogdanm 0:9b334a45a8ff 500 /*===============================*/
bogdanm 0:9b334a45a8ff 501 /* GCM/GMAC or CMAC header phase */
bogdanm 0:9b334a45a8ff 502 /*===============================*/
bogdanm 0:9b334a45a8ff 503 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 504 {
bogdanm 0:9b334a45a8ff 505 /* Set header phase; for GCM or GMAC, set data-byte at this point */
bogdanm 0:9b334a45a8ff 506 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 507 {
bogdanm 0:9b334a45a8ff 508 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH|AES_CR_DATATYPE, CRYP_GCMCMAC_HEADER_PHASE|hcryp->Init.DataType);
bogdanm 0:9b334a45a8ff 509 }
bogdanm 0:9b334a45a8ff 510 else
bogdanm 0:9b334a45a8ff 511 {
bogdanm 0:9b334a45a8ff 512 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_HEADER_PHASE);
bogdanm 0:9b334a45a8ff 513 }
bogdanm 0:9b334a45a8ff 514
bogdanm 0:9b334a45a8ff 515 /* Enable the Peripheral */
bogdanm 0:9b334a45a8ff 516 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 517
bogdanm 0:9b334a45a8ff 518 /* in case of CMAC, enter B0 block in header phase, before the header itself. */
bogdanm 0:9b334a45a8ff 519 /* If Size = 0 (possible case of resumption after CMAC header phase suspension),
bogdanm 0:9b334a45a8ff 520 skip these steps and go directly to header buffer feeding to the HW */
bogdanm 0:9b334a45a8ff 521 if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (Size != 0))
bogdanm 0:9b334a45a8ff 522 {
bogdanm 0:9b334a45a8ff 523 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 for(index=0; (index < Size); index += 16)
bogdanm 0:9b334a45a8ff 526 {
bogdanm 0:9b334a45a8ff 527 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 528 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 529 inputaddr+=4;
bogdanm 0:9b334a45a8ff 530 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 531 inputaddr+=4;
bogdanm 0:9b334a45a8ff 532 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 533 inputaddr+=4;
bogdanm 0:9b334a45a8ff 534 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 535 inputaddr+=4;
bogdanm 0:9b334a45a8ff 536
bogdanm 0:9b334a45a8ff 537 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 538 {
bogdanm 0:9b334a45a8ff 539 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 540 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 541 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 542 }
bogdanm 0:9b334a45a8ff 543 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 544 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 545
bogdanm 0:9b334a45a8ff 546 /* If the suspension flag has been raised and if the processing is not about
bogdanm 0:9b334a45a8ff 547 to end, suspend processing */
bogdanm 0:9b334a45a8ff 548 if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < Size))
bogdanm 0:9b334a45a8ff 549 {
bogdanm 0:9b334a45a8ff 550 /* reset SuspendRequest */
bogdanm 0:9b334a45a8ff 551 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 552 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 553 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 554 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 555 hcryp->Phase = HAL_CRYP_PHASE_HEADER_SUSPENDED;
bogdanm 0:9b334a45a8ff 556
bogdanm 0:9b334a45a8ff 557 /* Save current reading and writing locations of Input and Output buffers */
bogdanm 0:9b334a45a8ff 558 hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr;
bogdanm 0:9b334a45a8ff 559 /* Save the total number of bytes (B blocks + header) that remain to be
bogdanm 0:9b334a45a8ff 560 processed at this point */
bogdanm 0:9b334a45a8ff 561 hcryp->CrypInCount = hcryp->Init.HeaderSize + Size - (index+16);
bogdanm 0:9b334a45a8ff 562
bogdanm 0:9b334a45a8ff 563 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 564 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 565
bogdanm 0:9b334a45a8ff 566 return HAL_OK;
bogdanm 0:9b334a45a8ff 567 }
bogdanm 0:9b334a45a8ff 568 } /* for(index=0; (index < Size); index += 16) */
bogdanm 0:9b334a45a8ff 569 }
bogdanm 0:9b334a45a8ff 570
bogdanm 0:9b334a45a8ff 571 /* Enter header */
bogdanm 0:9b334a45a8ff 572 inputaddr = (uint32_t)hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 573 for(index=0; (index < hcryp->Init.HeaderSize); index += 16)
bogdanm 0:9b334a45a8ff 574 {
bogdanm 0:9b334a45a8ff 575 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 576 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 577 inputaddr+=4;
bogdanm 0:9b334a45a8ff 578 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 579 inputaddr+=4;
bogdanm 0:9b334a45a8ff 580 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 581 inputaddr+=4;
bogdanm 0:9b334a45a8ff 582 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 583 inputaddr+=4;
bogdanm 0:9b334a45a8ff 584
bogdanm 0:9b334a45a8ff 585 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 586 {
bogdanm 0:9b334a45a8ff 587 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 588 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 589 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 590 }
bogdanm 0:9b334a45a8ff 591 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 592 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 593
bogdanm 0:9b334a45a8ff 594 /* If the suspension flag has been raised and if the processing is not about
bogdanm 0:9b334a45a8ff 595 to end, suspend processing */
bogdanm 0:9b334a45a8ff 596 if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < hcryp->Init.HeaderSize))
bogdanm 0:9b334a45a8ff 597 {
bogdanm 0:9b334a45a8ff 598 /* reset SuspendRequest */
bogdanm 0:9b334a45a8ff 599 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 600 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 601 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 602 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 603 hcryp->Phase = HAL_CRYP_PHASE_HEADER_SUSPENDED;
bogdanm 0:9b334a45a8ff 604
bogdanm 0:9b334a45a8ff 605 /* Save current reading and writing locations of Input and Output buffers */
bogdanm 0:9b334a45a8ff 606 hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr;
bogdanm 0:9b334a45a8ff 607 /* Save the total number of bytes that remain to be processed at this point */
bogdanm 0:9b334a45a8ff 608 hcryp->CrypInCount = hcryp->Init.HeaderSize - (index+16);
bogdanm 0:9b334a45a8ff 609
bogdanm 0:9b334a45a8ff 610 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 611 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 612
bogdanm 0:9b334a45a8ff 613 return HAL_OK;
bogdanm 0:9b334a45a8ff 614 }
bogdanm 0:9b334a45a8ff 615 }
bogdanm 0:9b334a45a8ff 616 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 617 hcryp->Phase = HAL_CRYP_PHASE_HEADER_OVER;
bogdanm 0:9b334a45a8ff 618 }
bogdanm 0:9b334a45a8ff 619 /*========================*/
bogdanm 0:9b334a45a8ff 620 /* GCM/GMAC payload phase */
bogdanm 0:9b334a45a8ff 621 /*========================*/
bogdanm 0:9b334a45a8ff 622 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 623 {
bogdanm 0:9b334a45a8ff 624
bogdanm 0:9b334a45a8ff 625 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCM_PAYLOAD_PHASE);
bogdanm 0:9b334a45a8ff 626
bogdanm 0:9b334a45a8ff 627 /* if the header phase has been bypassed, AES must be enabled again */
bogdanm 0:9b334a45a8ff 628 if (hcryp->Phase == HAL_CRYP_PHASE_INIT_OVER)
bogdanm 0:9b334a45a8ff 629 {
bogdanm 0:9b334a45a8ff 630 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 631 }
bogdanm 0:9b334a45a8ff 632
bogdanm 0:9b334a45a8ff 633 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 634 outputaddr = (uint32_t)pOutputData;
bogdanm 0:9b334a45a8ff 635
bogdanm 0:9b334a45a8ff 636 /* Enter payload */
bogdanm 0:9b334a45a8ff 637 for(index=0; (index < Size); index += 16)
bogdanm 0:9b334a45a8ff 638 {
bogdanm 0:9b334a45a8ff 639 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 640 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 641 inputaddr+=4;
bogdanm 0:9b334a45a8ff 642 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 643 inputaddr+=4;
bogdanm 0:9b334a45a8ff 644 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 645 inputaddr+=4;
bogdanm 0:9b334a45a8ff 646 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 647 inputaddr+=4;
bogdanm 0:9b334a45a8ff 648
bogdanm 0:9b334a45a8ff 649 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 650 {
bogdanm 0:9b334a45a8ff 651 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 652 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 653 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 654 }
bogdanm 0:9b334a45a8ff 655
bogdanm 0:9b334a45a8ff 656 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 657 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 658
bogdanm 0:9b334a45a8ff 659 /* Retrieve output data: read the output block
bogdanm 0:9b334a45a8ff 660 from the Data Output Register */
bogdanm 0:9b334a45a8ff 661 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 662 outputaddr+=4;
bogdanm 0:9b334a45a8ff 663 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 664 outputaddr+=4;
bogdanm 0:9b334a45a8ff 665 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 666 outputaddr+=4;
bogdanm 0:9b334a45a8ff 667 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 668 outputaddr+=4;
bogdanm 0:9b334a45a8ff 669
bogdanm 0:9b334a45a8ff 670 /* If the suspension flag has been raised and if the processing is not about
bogdanm 0:9b334a45a8ff 671 to end, suspend processing */
bogdanm 0:9b334a45a8ff 672 if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < Size))
bogdanm 0:9b334a45a8ff 673 {
bogdanm 0:9b334a45a8ff 674 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_ENCRYPT)
bogdanm 0:9b334a45a8ff 675 {
bogdanm 0:9b334a45a8ff 676 /* Ensure that Busy flag is reset */
bogdanm 0:9b334a45a8ff 677 if(CRYP_WaitOnBusyFlagReset(hcryp, CRYP_BUSY_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 678 {
bogdanm 0:9b334a45a8ff 679 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 680 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 681 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 682 }
bogdanm 0:9b334a45a8ff 683 }
bogdanm 0:9b334a45a8ff 684 /* reset SuspendRequest */
bogdanm 0:9b334a45a8ff 685 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 686 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 687 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 688 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 689 hcryp->Phase = HAL_CRYP_PHASE_HEADER_SUSPENDED;
bogdanm 0:9b334a45a8ff 690
bogdanm 0:9b334a45a8ff 691 /* Save current reading and writing locations of Input and Output buffers */
bogdanm 0:9b334a45a8ff 692 hcryp->pCrypOutBuffPtr = (uint8_t *)outputaddr;
bogdanm 0:9b334a45a8ff 693 hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr;
bogdanm 0:9b334a45a8ff 694 /* Save the number of bytes that remain to be processed at this point */
bogdanm 0:9b334a45a8ff 695 hcryp->CrypInCount = Size - (index+16);
bogdanm 0:9b334a45a8ff 696
bogdanm 0:9b334a45a8ff 697 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 698 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 699
bogdanm 0:9b334a45a8ff 700 return HAL_OK;
bogdanm 0:9b334a45a8ff 701 }
bogdanm 0:9b334a45a8ff 702
bogdanm 0:9b334a45a8ff 703 }
bogdanm 0:9b334a45a8ff 704 /* Mark that the payload phase is over */
bogdanm 0:9b334a45a8ff 705 hcryp->Phase = HAL_CRYP_PHASE_PAYLOAD_OVER;
bogdanm 0:9b334a45a8ff 706 }
bogdanm 0:9b334a45a8ff 707 /*==============================*/
bogdanm 0:9b334a45a8ff 708 /* GCM/GMAC or CMAC final phase */
bogdanm 0:9b334a45a8ff 709 /*==============================*/
bogdanm 0:9b334a45a8ff 710 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 711 {
bogdanm 0:9b334a45a8ff 712 tagaddr = (uint32_t)pOutputData;
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_FINAL_PHASE);
bogdanm 0:9b334a45a8ff 715
bogdanm 0:9b334a45a8ff 716 /* if the header and payload phases have been bypassed, AES must be enabled again */
bogdanm 0:9b334a45a8ff 717 if (hcryp->Phase == HAL_CRYP_PHASE_INIT_OVER)
bogdanm 0:9b334a45a8ff 718 {
bogdanm 0:9b334a45a8ff 719 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 720 }
bogdanm 0:9b334a45a8ff 721
bogdanm 0:9b334a45a8ff 722 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 723 {
bogdanm 0:9b334a45a8ff 724 headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */
bogdanm 0:9b334a45a8ff 725 inputlength = Size * 8; /* input length in bits */
bogdanm 0:9b334a45a8ff 726
bogdanm 0:9b334a45a8ff 727
bogdanm 0:9b334a45a8ff 728 if(hcryp->Init.DataType == CRYP_DATATYPE_1B)
bogdanm 0:9b334a45a8ff 729 {
bogdanm 0:9b334a45a8ff 730 hcryp->Instance->DINR = __RBIT((headerlength)>>32);
bogdanm 0:9b334a45a8ff 731 hcryp->Instance->DINR = __RBIT(headerlength);
bogdanm 0:9b334a45a8ff 732 hcryp->Instance->DINR = __RBIT((inputlength)>>32);
bogdanm 0:9b334a45a8ff 733 hcryp->Instance->DINR = __RBIT(inputlength);
bogdanm 0:9b334a45a8ff 734 }
bogdanm 0:9b334a45a8ff 735 else if(hcryp->Init.DataType == CRYP_DATATYPE_8B)
bogdanm 0:9b334a45a8ff 736 {
bogdanm 0:9b334a45a8ff 737 hcryp->Instance->DINR = __REV((headerlength)>>32);
bogdanm 0:9b334a45a8ff 738 hcryp->Instance->DINR = __REV(headerlength);
bogdanm 0:9b334a45a8ff 739 hcryp->Instance->DINR = __REV((inputlength)>>32);
bogdanm 0:9b334a45a8ff 740 hcryp->Instance->DINR = __REV(inputlength);
bogdanm 0:9b334a45a8ff 741 }
bogdanm 0:9b334a45a8ff 742 else if(hcryp->Init.DataType == CRYP_DATATYPE_16B)
bogdanm 0:9b334a45a8ff 743 {
bogdanm 0:9b334a45a8ff 744 hcryp->Instance->DINR = __ROR((headerlength)>>32, 16);
bogdanm 0:9b334a45a8ff 745 hcryp->Instance->DINR = __ROR(headerlength, 16);
bogdanm 0:9b334a45a8ff 746 hcryp->Instance->DINR = __ROR((inputlength)>>32, 16);
bogdanm 0:9b334a45a8ff 747 hcryp->Instance->DINR = __ROR(inputlength, 16);
bogdanm 0:9b334a45a8ff 748 }
bogdanm 0:9b334a45a8ff 749 else if(hcryp->Init.DataType == CRYP_DATATYPE_32B)
bogdanm 0:9b334a45a8ff 750 {
bogdanm 0:9b334a45a8ff 751 hcryp->Instance->DINR = (uint32_t)(headerlength>>32);
bogdanm 0:9b334a45a8ff 752 hcryp->Instance->DINR = (uint32_t)(headerlength);
bogdanm 0:9b334a45a8ff 753 hcryp->Instance->DINR = (uint32_t)(inputlength>>32);
bogdanm 0:9b334a45a8ff 754 hcryp->Instance->DINR = (uint32_t)(inputlength);
bogdanm 0:9b334a45a8ff 755 }
bogdanm 0:9b334a45a8ff 756 }
bogdanm 0:9b334a45a8ff 757 else if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 758 {
bogdanm 0:9b334a45a8ff 759 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 760 /* Enter the last block made of a 128-bit value formatted
bogdanm 0:9b334a45a8ff 761 from the original B0 packet. */
bogdanm 0:9b334a45a8ff 762 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 763 inputaddr+=4;
bogdanm 0:9b334a45a8ff 764 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 765 inputaddr+=4;
bogdanm 0:9b334a45a8ff 766 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 767 inputaddr+=4;
bogdanm 0:9b334a45a8ff 768 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 769 }
bogdanm 0:9b334a45a8ff 770
bogdanm 0:9b334a45a8ff 771
bogdanm 0:9b334a45a8ff 772 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 773 {
bogdanm 0:9b334a45a8ff 774 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 775 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 776 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 777 }
bogdanm 0:9b334a45a8ff 778
bogdanm 0:9b334a45a8ff 779 /* Read the Auth TAG in the Data Out register */
bogdanm 0:9b334a45a8ff 780 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 781 tagaddr+=4;
bogdanm 0:9b334a45a8ff 782 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 783 tagaddr+=4;
bogdanm 0:9b334a45a8ff 784 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 785 tagaddr+=4;
bogdanm 0:9b334a45a8ff 786 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 787
bogdanm 0:9b334a45a8ff 788
bogdanm 0:9b334a45a8ff 789 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 790 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 791 /* Mark that the final phase is over */
bogdanm 0:9b334a45a8ff 792 hcryp->Phase = HAL_CRYP_PHASE_FINAL_OVER;
bogdanm 0:9b334a45a8ff 793 /* Disable the Peripheral */
bogdanm 0:9b334a45a8ff 794 __HAL_CRYP_DISABLE();
bogdanm 0:9b334a45a8ff 795 }
bogdanm 0:9b334a45a8ff 796 /*=================================================*/
bogdanm 0:9b334a45a8ff 797 /* case incorrect hcryp->Init.GCMCMACPhase setting */
bogdanm 0:9b334a45a8ff 798 /*=================================================*/
bogdanm 0:9b334a45a8ff 799 else
bogdanm 0:9b334a45a8ff 800 {
bogdanm 0:9b334a45a8ff 801 hcryp->State = HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 802 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 803 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 804 }
bogdanm 0:9b334a45a8ff 805
bogdanm 0:9b334a45a8ff 806 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 807 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 808
bogdanm 0:9b334a45a8ff 809 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 810 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 811
bogdanm 0:9b334a45a8ff 812 return HAL_OK;
bogdanm 0:9b334a45a8ff 813 }
bogdanm 0:9b334a45a8ff 814 else
bogdanm 0:9b334a45a8ff 815 {
bogdanm 0:9b334a45a8ff 816 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 817 }
bogdanm 0:9b334a45a8ff 818 }
bogdanm 0:9b334a45a8ff 819
bogdanm 0:9b334a45a8ff 820
bogdanm 0:9b334a45a8ff 821
bogdanm 0:9b334a45a8ff 822
bogdanm 0:9b334a45a8ff 823 /**
bogdanm 0:9b334a45a8ff 824 * @brief Carry out in interrupt mode the authentication tag generation as well as the ciphering or deciphering
bogdanm 0:9b334a45a8ff 825 * operation according to hcryp->Init structure fields.
bogdanm 0:9b334a45a8ff 826 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 827 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 828 * @param pInputData: Pointer to payload data in GCM payload phase,
bogdanm 0:9b334a45a8ff 829 * Parameter is meaningless in case of GCM/GMAC init, header and final phases,
bogdanm 0:9b334a45a8ff 830 * Pointer to B0 blocks in CMAC header phase,
bogdanm 0:9b334a45a8ff 831 * Pointer to C block in CMAC final phase.
bogdanm 0:9b334a45a8ff 832 * @param Size: Length of the input payload data buffer in bytes, must be a multiple of 16,
bogdanm 0:9b334a45a8ff 833 * Parameter is meaningless in case of GCM/GMAC init and header phases,
bogdanm 0:9b334a45a8ff 834 * Length of B blocks (in bytes, must be a multiple of 16) in CMAC header phase,
bogdanm 0:9b334a45a8ff 835 * Length of C block (in bytes) in CMAC final phase.
bogdanm 0:9b334a45a8ff 836 * @param pOutputData: Pointer to plain or cipher text in GCM payload phase,
bogdanm 0:9b334a45a8ff 837 * pointer to authentication tag in GCM/GMAC and CMAC final phases.
bogdanm 0:9b334a45a8ff 838 * Parameter is meaningless in case of GCM/GMAC init and header phases
bogdanm 0:9b334a45a8ff 839 * and in case of CMAC header phase.
bogdanm 0:9b334a45a8ff 840 * @note Supported operating modes are encryption and decryption, supported chaining modes are GCM, GMAC and CMAC.
bogdanm 0:9b334a45a8ff 841 * @note Phases are singly processed according to hcryp->Init.GCMCMACPhase so that steps in these specific chaining modes
bogdanm 0:9b334a45a8ff 842 * can be skipped by the user if so required.
bogdanm 0:9b334a45a8ff 843 * @retval HAL status
bogdanm 0:9b334a45a8ff 844 */
bogdanm 0:9b334a45a8ff 845 HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData)
bogdanm 0:9b334a45a8ff 846 {
bogdanm 0:9b334a45a8ff 847
bogdanm 0:9b334a45a8ff 848 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 849 uint64_t headerlength = 0;
bogdanm 0:9b334a45a8ff 850 uint64_t inputlength = 0;
bogdanm 0:9b334a45a8ff 851
bogdanm 0:9b334a45a8ff 852
bogdanm 0:9b334a45a8ff 853 if (hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 854 {
bogdanm 0:9b334a45a8ff 855 /* input/output parameters check */
bogdanm 0:9b334a45a8ff 856 if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 857 {
bogdanm 0:9b334a45a8ff 858 if ((hcryp->Init.Header == NULL) || (hcryp->Init.HeaderSize == 0))
bogdanm 0:9b334a45a8ff 859 {
bogdanm 0:9b334a45a8ff 860 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 861 }
bogdanm 0:9b334a45a8ff 862 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 863 {
bogdanm 0:9b334a45a8ff 864 /* In case of CMAC header phase resumption, we can have pInputData = NULL and Size = 0 */
bogdanm 0:9b334a45a8ff 865 if (((pInputData != NULL) && (Size == 0)) || ((pInputData == NULL) && (Size != 0)))
bogdanm 0:9b334a45a8ff 866 {
bogdanm 0:9b334a45a8ff 867 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 868 }
bogdanm 0:9b334a45a8ff 869 }
bogdanm 0:9b334a45a8ff 870 }
bogdanm 0:9b334a45a8ff 871 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 872 {
bogdanm 0:9b334a45a8ff 873 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 874 {
bogdanm 0:9b334a45a8ff 875 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 876 }
bogdanm 0:9b334a45a8ff 877 }
bogdanm 0:9b334a45a8ff 878 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 879 {
bogdanm 0:9b334a45a8ff 880 if (pOutputData == NULL)
bogdanm 0:9b334a45a8ff 881 {
bogdanm 0:9b334a45a8ff 882 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 883 }
bogdanm 0:9b334a45a8ff 884 if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (pInputData == NULL))
bogdanm 0:9b334a45a8ff 885 {
bogdanm 0:9b334a45a8ff 886 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 887 }
bogdanm 0:9b334a45a8ff 888 }
bogdanm 0:9b334a45a8ff 889
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 /* Process Locked */
bogdanm 0:9b334a45a8ff 892 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 893
bogdanm 0:9b334a45a8ff 894 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 895 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 896
bogdanm 0:9b334a45a8ff 897 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 898 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 899
bogdanm 0:9b334a45a8ff 900 /* Enable Computation Complete Flag and Error Interrupts */
bogdanm 0:9b334a45a8ff 901 __HAL_CRYP_ENABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 902
bogdanm 0:9b334a45a8ff 903
bogdanm 0:9b334a45a8ff 904
bogdanm 0:9b334a45a8ff 905 /*=====================*/
bogdanm 0:9b334a45a8ff 906 /* GCM/GMAC init phase */
bogdanm 0:9b334a45a8ff 907 /*=====================*/
bogdanm 0:9b334a45a8ff 908 if (hcryp->Init.GCMCMACPhase == CRYP_GCM_INIT_PHASE)
bogdanm 0:9b334a45a8ff 909 {
bogdanm 0:9b334a45a8ff 910 /* In case of init phase, the input data (Key and Initialization Vector) have
bogdanm 0:9b334a45a8ff 911 already been entered during the initialization process. Therefore, the
bogdanm 0:9b334a45a8ff 912 software just waits for the CCF interrupt to be raised and which will
bogdanm 0:9b334a45a8ff 913 be handled by CRYP_AES_Auth_IT() API. */
bogdanm 0:9b334a45a8ff 914 }
bogdanm 0:9b334a45a8ff 915 /*===============================*/
bogdanm 0:9b334a45a8ff 916 /* GCM/GMAC or CMAC header phase */
bogdanm 0:9b334a45a8ff 917 /*===============================*/
bogdanm 0:9b334a45a8ff 918 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 919 {
bogdanm 0:9b334a45a8ff 920 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 921 {
bogdanm 0:9b334a45a8ff 922 /* In case of CMAC, B blocks are first entered, before the header.
bogdanm 0:9b334a45a8ff 923 Therefore, B blocks and the header are entered back-to-back
bogdanm 0:9b334a45a8ff 924 as if it was only one single block.
bogdanm 0:9b334a45a8ff 925 However, in case of resumption after suspension, if all the
bogdanm 0:9b334a45a8ff 926 B blocks have been entered (in that case, Size = 0), only the
bogdanm 0:9b334a45a8ff 927 remainder of the non-processed header bytes are entered. */
bogdanm 0:9b334a45a8ff 928 if (Size != 0)
bogdanm 0:9b334a45a8ff 929 {
bogdanm 0:9b334a45a8ff 930 hcryp->CrypInCount = Size + hcryp->Init.HeaderSize;
bogdanm 0:9b334a45a8ff 931 hcryp->pCrypInBuffPtr = pInputData;
bogdanm 0:9b334a45a8ff 932 }
bogdanm 0:9b334a45a8ff 933 else
bogdanm 0:9b334a45a8ff 934 {
bogdanm 0:9b334a45a8ff 935 hcryp->CrypInCount = hcryp->Init.HeaderSize;
bogdanm 0:9b334a45a8ff 936 hcryp->pCrypInBuffPtr = hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 937 }
bogdanm 0:9b334a45a8ff 938 }
bogdanm 0:9b334a45a8ff 939 else
bogdanm 0:9b334a45a8ff 940 {
bogdanm 0:9b334a45a8ff 941 /* Get the header addresses and sizes */
bogdanm 0:9b334a45a8ff 942 hcryp->CrypInCount = hcryp->Init.HeaderSize;
bogdanm 0:9b334a45a8ff 943 hcryp->pCrypInBuffPtr = hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 944 }
bogdanm 0:9b334a45a8ff 945
bogdanm 0:9b334a45a8ff 946 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
bogdanm 0:9b334a45a8ff 947
bogdanm 0:9b334a45a8ff 948 /* Set header phase; for GCM or GMAC, set data-byte at this point */
bogdanm 0:9b334a45a8ff 949 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 950 {
bogdanm 0:9b334a45a8ff 951 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH|AES_CR_DATATYPE, CRYP_GCMCMAC_HEADER_PHASE|hcryp->Init.DataType);
bogdanm 0:9b334a45a8ff 952 }
bogdanm 0:9b334a45a8ff 953 else
bogdanm 0:9b334a45a8ff 954 {
bogdanm 0:9b334a45a8ff 955 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_HEADER_PHASE);
bogdanm 0:9b334a45a8ff 956 }
bogdanm 0:9b334a45a8ff 957
bogdanm 0:9b334a45a8ff 958 /* Enable the Peripheral */
bogdanm 0:9b334a45a8ff 959 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 960
bogdanm 0:9b334a45a8ff 961 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 962 hcryp->pCrypInBuffPtr += 16;
bogdanm 0:9b334a45a8ff 963 hcryp->CrypInCount -= 16;
bogdanm 0:9b334a45a8ff 964
bogdanm 0:9b334a45a8ff 965
bogdanm 0:9b334a45a8ff 966 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 967 {
bogdanm 0:9b334a45a8ff 968 if (hcryp->CrypInCount == hcryp->Init.HeaderSize)
bogdanm 0:9b334a45a8ff 969 {
bogdanm 0:9b334a45a8ff 970 /* All B blocks will have been entered after the next
bogdanm 0:9b334a45a8ff 971 four DINR writing, so point at header buffer for
bogdanm 0:9b334a45a8ff 972 the next iteration */
bogdanm 0:9b334a45a8ff 973 hcryp->pCrypInBuffPtr = hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 974 }
bogdanm 0:9b334a45a8ff 975 }
bogdanm 0:9b334a45a8ff 976
bogdanm 0:9b334a45a8ff 977 /* Enter header first block to initiate the process
bogdanm 0:9b334a45a8ff 978 in the Data Input register */
bogdanm 0:9b334a45a8ff 979 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 980 inputaddr+=4;
bogdanm 0:9b334a45a8ff 981 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 982 inputaddr+=4;
bogdanm 0:9b334a45a8ff 983 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 984 inputaddr+=4;
bogdanm 0:9b334a45a8ff 985 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 986 }
bogdanm 0:9b334a45a8ff 987 /*========================*/
bogdanm 0:9b334a45a8ff 988 /* GCM/GMAC payload phase */
bogdanm 0:9b334a45a8ff 989 /*========================*/
bogdanm 0:9b334a45a8ff 990 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 991 {
bogdanm 0:9b334a45a8ff 992 /* Get the buffer addresses and sizes */
bogdanm 0:9b334a45a8ff 993 hcryp->CrypInCount = Size;
bogdanm 0:9b334a45a8ff 994 hcryp->pCrypInBuffPtr = pInputData;
bogdanm 0:9b334a45a8ff 995 hcryp->pCrypOutBuffPtr = pOutputData;
bogdanm 0:9b334a45a8ff 996 hcryp->CrypOutCount = Size;
bogdanm 0:9b334a45a8ff 997
bogdanm 0:9b334a45a8ff 998 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
bogdanm 0:9b334a45a8ff 999
bogdanm 0:9b334a45a8ff 1000 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCM_PAYLOAD_PHASE);
bogdanm 0:9b334a45a8ff 1001
bogdanm 0:9b334a45a8ff 1002 /* if the header phase has been bypassed, AES must be enabled again */
bogdanm 0:9b334a45a8ff 1003 if (hcryp->Phase == HAL_CRYP_PHASE_INIT_OVER)
bogdanm 0:9b334a45a8ff 1004 {
bogdanm 0:9b334a45a8ff 1005 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 1006 }
bogdanm 0:9b334a45a8ff 1007
bogdanm 0:9b334a45a8ff 1008 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 1009 hcryp->pCrypInBuffPtr += 16;
bogdanm 0:9b334a45a8ff 1010 hcryp->CrypInCount -= 16;
bogdanm 0:9b334a45a8ff 1011
bogdanm 0:9b334a45a8ff 1012 /* Enter payload first block to initiate the process
bogdanm 0:9b334a45a8ff 1013 in the Data Input register */
bogdanm 0:9b334a45a8ff 1014 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1015 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1016 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1017 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1018 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1019 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1020 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1021 }
bogdanm 0:9b334a45a8ff 1022 /*==============================*/
bogdanm 0:9b334a45a8ff 1023 /* GCM/GMAC or CMAC final phase */
bogdanm 0:9b334a45a8ff 1024 /*==============================*/
bogdanm 0:9b334a45a8ff 1025 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 1026 {
bogdanm 0:9b334a45a8ff 1027 hcryp->pCrypOutBuffPtr = pOutputData;
bogdanm 0:9b334a45a8ff 1028
bogdanm 0:9b334a45a8ff 1029 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_FINAL_PHASE);
bogdanm 0:9b334a45a8ff 1030
bogdanm 0:9b334a45a8ff 1031 /* if the header and payload phases have been bypassed, AES must be enabled again */
bogdanm 0:9b334a45a8ff 1032 if (hcryp->Phase == HAL_CRYP_PHASE_INIT_OVER)
bogdanm 0:9b334a45a8ff 1033 {
bogdanm 0:9b334a45a8ff 1034 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 1035 }
bogdanm 0:9b334a45a8ff 1036
bogdanm 0:9b334a45a8ff 1037 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 1038 {
bogdanm 0:9b334a45a8ff 1039 headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */
bogdanm 0:9b334a45a8ff 1040 inputlength = Size * 8; /* input length in bits */
bogdanm 0:9b334a45a8ff 1041 /* Write the number of bits in the header on 64 bits followed by the number
bogdanm 0:9b334a45a8ff 1042 of bits in the payload on 64 bits as well */
bogdanm 0:9b334a45a8ff 1043 if(hcryp->Init.DataType == CRYP_DATATYPE_1B)
bogdanm 0:9b334a45a8ff 1044 {
bogdanm 0:9b334a45a8ff 1045 hcryp->Instance->DINR = __RBIT((headerlength)>>32);
bogdanm 0:9b334a45a8ff 1046 hcryp->Instance->DINR = __RBIT(headerlength);
bogdanm 0:9b334a45a8ff 1047 hcryp->Instance->DINR = __RBIT((inputlength)>>32);
bogdanm 0:9b334a45a8ff 1048 hcryp->Instance->DINR = __RBIT(inputlength);
bogdanm 0:9b334a45a8ff 1049 }
bogdanm 0:9b334a45a8ff 1050 else if(hcryp->Init.DataType == CRYP_DATATYPE_8B)
bogdanm 0:9b334a45a8ff 1051 {
bogdanm 0:9b334a45a8ff 1052 hcryp->Instance->DINR = __REV((headerlength)>>32);
bogdanm 0:9b334a45a8ff 1053 hcryp->Instance->DINR = __REV(headerlength);
bogdanm 0:9b334a45a8ff 1054 hcryp->Instance->DINR = __REV((inputlength)>>32);
bogdanm 0:9b334a45a8ff 1055 hcryp->Instance->DINR = __REV(inputlength);
bogdanm 0:9b334a45a8ff 1056 }
bogdanm 0:9b334a45a8ff 1057 else if(hcryp->Init.DataType == CRYP_DATATYPE_16B)
bogdanm 0:9b334a45a8ff 1058 {
bogdanm 0:9b334a45a8ff 1059 hcryp->Instance->DINR = __ROR((headerlength)>>32, 16);
bogdanm 0:9b334a45a8ff 1060 hcryp->Instance->DINR = __ROR(headerlength, 16);
bogdanm 0:9b334a45a8ff 1061 hcryp->Instance->DINR = __ROR((inputlength)>>32, 16);
bogdanm 0:9b334a45a8ff 1062 hcryp->Instance->DINR = __ROR(inputlength, 16);
bogdanm 0:9b334a45a8ff 1063 }
bogdanm 0:9b334a45a8ff 1064 else if(hcryp->Init.DataType == CRYP_DATATYPE_32B)
bogdanm 0:9b334a45a8ff 1065 {
bogdanm 0:9b334a45a8ff 1066 hcryp->Instance->DINR = (uint32_t)(headerlength>>32);
bogdanm 0:9b334a45a8ff 1067 hcryp->Instance->DINR = (uint32_t)(headerlength);
bogdanm 0:9b334a45a8ff 1068 hcryp->Instance->DINR = (uint32_t)(inputlength>>32);
bogdanm 0:9b334a45a8ff 1069 hcryp->Instance->DINR = (uint32_t)(inputlength);
bogdanm 0:9b334a45a8ff 1070 }
bogdanm 0:9b334a45a8ff 1071 }
bogdanm 0:9b334a45a8ff 1072 else if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 1073 {
bogdanm 0:9b334a45a8ff 1074 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 1075 /* Enter the last block made of a 128-bit value formatted
bogdanm 0:9b334a45a8ff 1076 from the original B0 packet. */
bogdanm 0:9b334a45a8ff 1077 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1078 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1079 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1080 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1081 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1082 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1083 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1084 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1085 }
bogdanm 0:9b334a45a8ff 1086 }
bogdanm 0:9b334a45a8ff 1087 /*=================================================*/
bogdanm 0:9b334a45a8ff 1088 /* case incorrect hcryp->Init.GCMCMACPhase setting */
bogdanm 0:9b334a45a8ff 1089 /*=================================================*/
bogdanm 0:9b334a45a8ff 1090 else
bogdanm 0:9b334a45a8ff 1091 {
bogdanm 0:9b334a45a8ff 1092 hcryp->State = HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1093 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1094 }
bogdanm 0:9b334a45a8ff 1095
bogdanm 0:9b334a45a8ff 1096 return HAL_OK;
bogdanm 0:9b334a45a8ff 1097 }
bogdanm 0:9b334a45a8ff 1098 else
bogdanm 0:9b334a45a8ff 1099 {
bogdanm 0:9b334a45a8ff 1100 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1101 }
bogdanm 0:9b334a45a8ff 1102 }
bogdanm 0:9b334a45a8ff 1103
bogdanm 0:9b334a45a8ff 1104
bogdanm 0:9b334a45a8ff 1105
bogdanm 0:9b334a45a8ff 1106
bogdanm 0:9b334a45a8ff 1107 /**
bogdanm 0:9b334a45a8ff 1108 * @brief Carry out in DMA mode the authentication tag generation as well as the ciphering or deciphering
bogdanm 0:9b334a45a8ff 1109 * operation according to hcryp->Init structure fields.
bogdanm 0:9b334a45a8ff 1110 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1111 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 1112 * @param pInputData: Pointer to payload data in GCM payload phase,
bogdanm 0:9b334a45a8ff 1113 * Parameter is meaningless in case of GCM/GMAC init, header and final phases,
bogdanm 0:9b334a45a8ff 1114 * Pointer to B0 blocks in CMAC header phase,
bogdanm 0:9b334a45a8ff 1115 * Pointer to C block in CMAC final phase.
bogdanm 0:9b334a45a8ff 1116 * @param Size: Length of the input payload data buffer in bytes, must be a multiple of 16,
bogdanm 0:9b334a45a8ff 1117 * Parameter is meaningless in case of GCM/GMAC init and header phases,
bogdanm 0:9b334a45a8ff 1118 * Length of B blocks (in bytes, must be a multiple of 16) in CMAC header phase,
bogdanm 0:9b334a45a8ff 1119 * Length of C block (in bytes) in CMAC final phase.
bogdanm 0:9b334a45a8ff 1120 * @param pOutputData: Pointer to plain or cipher text in GCM payload phase,
bogdanm 0:9b334a45a8ff 1121 * pointer to authentication tag in GCM/GMAC and CMAC final phases.
bogdanm 0:9b334a45a8ff 1122 * Parameter is meaningless in case of GCM/GMAC init and header phases
bogdanm 0:9b334a45a8ff 1123 * and in case of CMAC header phase.
bogdanm 0:9b334a45a8ff 1124 * @note Supported operating modes are encryption and decryption, supported chaining modes are GCM, GMAC and CMAC.
bogdanm 0:9b334a45a8ff 1125 * @note Phases are singly processed according to hcryp->Init.GCMCMACPhase so that steps in these specific chaining modes
bogdanm 0:9b334a45a8ff 1126 * can be skipped by the user if so required.
bogdanm 0:9b334a45a8ff 1127 * @retval HAL status
bogdanm 0:9b334a45a8ff 1128 */
bogdanm 0:9b334a45a8ff 1129 HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData)
bogdanm 0:9b334a45a8ff 1130 {
bogdanm 0:9b334a45a8ff 1131 uint32_t inputaddr = 0;
bogdanm 0:9b334a45a8ff 1132 uint32_t outputaddr = 0;
bogdanm 0:9b334a45a8ff 1133 uint32_t tagaddr = 0;
bogdanm 0:9b334a45a8ff 1134 uint64_t headerlength = 0;
bogdanm 0:9b334a45a8ff 1135 uint64_t inputlength = 0;
bogdanm 0:9b334a45a8ff 1136
bogdanm 0:9b334a45a8ff 1137
bogdanm 0:9b334a45a8ff 1138 if (hcryp->State == HAL_CRYP_STATE_READY)
bogdanm 0:9b334a45a8ff 1139 {
bogdanm 0:9b334a45a8ff 1140 /* input/output parameters check */
bogdanm 0:9b334a45a8ff 1141 if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 1142 {
bogdanm 0:9b334a45a8ff 1143 if ((hcryp->Init.Header == NULL) || (hcryp->Init.HeaderSize == 0))
bogdanm 0:9b334a45a8ff 1144 {
bogdanm 0:9b334a45a8ff 1145 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1146 }
bogdanm 0:9b334a45a8ff 1147 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 1148 {
bogdanm 0:9b334a45a8ff 1149 if ((pInputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1150 {
bogdanm 0:9b334a45a8ff 1151 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1152 }
bogdanm 0:9b334a45a8ff 1153 }
bogdanm 0:9b334a45a8ff 1154 }
bogdanm 0:9b334a45a8ff 1155 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 1156 {
bogdanm 0:9b334a45a8ff 1157 if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0))
bogdanm 0:9b334a45a8ff 1158 {
bogdanm 0:9b334a45a8ff 1159 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1160 }
bogdanm 0:9b334a45a8ff 1161 }
bogdanm 0:9b334a45a8ff 1162 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 1163 {
bogdanm 0:9b334a45a8ff 1164 if (pOutputData == NULL)
bogdanm 0:9b334a45a8ff 1165 {
bogdanm 0:9b334a45a8ff 1166 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1167 }
bogdanm 0:9b334a45a8ff 1168 if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (pInputData == NULL))
bogdanm 0:9b334a45a8ff 1169 {
bogdanm 0:9b334a45a8ff 1170 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1171 }
bogdanm 0:9b334a45a8ff 1172 }
bogdanm 0:9b334a45a8ff 1173
bogdanm 0:9b334a45a8ff 1174
bogdanm 0:9b334a45a8ff 1175 /* Process Locked */
bogdanm 0:9b334a45a8ff 1176 __HAL_LOCK(hcryp);
bogdanm 0:9b334a45a8ff 1177
bogdanm 0:9b334a45a8ff 1178 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1179 hcryp->State = HAL_CRYP_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1180
bogdanm 0:9b334a45a8ff 1181 /*=====================*/
bogdanm 0:9b334a45a8ff 1182 /* GCM/GMAC init phase */
bogdanm 0:9b334a45a8ff 1183 /*=====================*/
bogdanm 0:9b334a45a8ff 1184 /* In case of init phase, the input data (Key and Initialization Vector) have
bogdanm 0:9b334a45a8ff 1185 already been entered during the initialization process. No DMA transfer is
bogdanm 0:9b334a45a8ff 1186 required at that point therefore, the software just waits for the CCF flag
bogdanm 0:9b334a45a8ff 1187 to be raised. */
bogdanm 0:9b334a45a8ff 1188 if (hcryp->Init.GCMCMACPhase == CRYP_GCM_INIT_PHASE)
bogdanm 0:9b334a45a8ff 1189 {
bogdanm 0:9b334a45a8ff 1190 /* just wait for hash computation */
bogdanm 0:9b334a45a8ff 1191 if(CRYP_WaitOnCCFlag(hcryp, CRYP_CCF_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1192 {
bogdanm 0:9b334a45a8ff 1193 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1194 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1195 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1196 }
bogdanm 0:9b334a45a8ff 1197
bogdanm 0:9b334a45a8ff 1198 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1199 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1200 /* Mark that the initialization phase is over */
bogdanm 0:9b334a45a8ff 1201 hcryp->Phase = HAL_CRYP_PHASE_INIT_OVER;
bogdanm 0:9b334a45a8ff 1202 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1203 }
bogdanm 0:9b334a45a8ff 1204 /*===============================*/
bogdanm 0:9b334a45a8ff 1205 /* GCM/GMAC or CMAC header phase */
bogdanm 0:9b334a45a8ff 1206 /*===============================*/
bogdanm 0:9b334a45a8ff 1207 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 1208 {
bogdanm 0:9b334a45a8ff 1209 /* Set header phase; for GCM or GMAC, set data-byte at this point */
bogdanm 0:9b334a45a8ff 1210 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 1211 {
bogdanm 0:9b334a45a8ff 1212 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH|AES_CR_DATATYPE, CRYP_GCMCMAC_HEADER_PHASE|hcryp->Init.DataType);
bogdanm 0:9b334a45a8ff 1213 }
bogdanm 0:9b334a45a8ff 1214 else
bogdanm 0:9b334a45a8ff 1215 {
bogdanm 0:9b334a45a8ff 1216 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_HEADER_PHASE);
bogdanm 0:9b334a45a8ff 1217 }
bogdanm 0:9b334a45a8ff 1218
bogdanm 0:9b334a45a8ff 1219 /* enter first B0 block in polling mode (no DMA transfer for B0) */
bogdanm 0:9b334a45a8ff 1220 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 1221 {
bogdanm 0:9b334a45a8ff 1222 /* Enable the CRYP peripheral */
bogdanm 0:9b334a45a8ff 1223 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 1224
bogdanm 0:9b334a45a8ff 1225 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 1226 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1227 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1228 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1229 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1230 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1231 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1232 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1233
bogdanm 0:9b334a45a8ff 1234 if(CRYP_WaitOnCCFlag(hcryp, CRYP_CCF_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1235 {
bogdanm 0:9b334a45a8ff 1236 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1237 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1238 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1239 }
bogdanm 0:9b334a45a8ff 1240 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1241 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1242 }
bogdanm 0:9b334a45a8ff 1243
bogdanm 0:9b334a45a8ff 1244
bogdanm 0:9b334a45a8ff 1245 inputaddr = (uint32_t)hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 1246 /* Set the input address and start DMA transfer */
bogdanm 0:9b334a45a8ff 1247 CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, hcryp->Init.HeaderSize, 0);
bogdanm 0:9b334a45a8ff 1248 }
bogdanm 0:9b334a45a8ff 1249 /*========================*/
bogdanm 0:9b334a45a8ff 1250 /* GCM/GMAC payload phase */
bogdanm 0:9b334a45a8ff 1251 /*========================*/
bogdanm 0:9b334a45a8ff 1252 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 1253 {
bogdanm 0:9b334a45a8ff 1254 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCM_PAYLOAD_PHASE);
bogdanm 0:9b334a45a8ff 1255
bogdanm 0:9b334a45a8ff 1256 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 1257 outputaddr = (uint32_t)pOutputData;
bogdanm 0:9b334a45a8ff 1258 /* Set the input and output addresses and start DMA transfer */
bogdanm 0:9b334a45a8ff 1259 CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
bogdanm 0:9b334a45a8ff 1260 }
bogdanm 0:9b334a45a8ff 1261 /*==============================*/
bogdanm 0:9b334a45a8ff 1262 /* GCM/GMAC or CMAC final phase */
bogdanm 0:9b334a45a8ff 1263 /*==============================*/
bogdanm 0:9b334a45a8ff 1264 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 1265 {
bogdanm 0:9b334a45a8ff 1266 tagaddr = (uint32_t)pOutputData;
bogdanm 0:9b334a45a8ff 1267
bogdanm 0:9b334a45a8ff 1268 MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_GCMCMAC_FINAL_PHASE);
bogdanm 0:9b334a45a8ff 1269
bogdanm 0:9b334a45a8ff 1270 /* if the header and payload phases have been bypassed, AES must be enabled again */
bogdanm 0:9b334a45a8ff 1271 if (hcryp->Phase == HAL_CRYP_PHASE_INIT_OVER)
bogdanm 0:9b334a45a8ff 1272 {
bogdanm 0:9b334a45a8ff 1273 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 1274 }
bogdanm 0:9b334a45a8ff 1275
bogdanm 0:9b334a45a8ff 1276 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC)
bogdanm 0:9b334a45a8ff 1277 {
bogdanm 0:9b334a45a8ff 1278 headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */
bogdanm 0:9b334a45a8ff 1279 inputlength = Size * 8; /* input length in bits */
bogdanm 0:9b334a45a8ff 1280 /* Write the number of bits in the header on 64 bits followed by the number
bogdanm 0:9b334a45a8ff 1281 of bits in the payload on 64 bits as well */
bogdanm 0:9b334a45a8ff 1282 if(hcryp->Init.DataType == CRYP_DATATYPE_1B)
bogdanm 0:9b334a45a8ff 1283 {
bogdanm 0:9b334a45a8ff 1284 hcryp->Instance->DINR = __RBIT((headerlength)>>32);
bogdanm 0:9b334a45a8ff 1285 hcryp->Instance->DINR = __RBIT(headerlength);
bogdanm 0:9b334a45a8ff 1286 hcryp->Instance->DINR = __RBIT((inputlength)>>32);
bogdanm 0:9b334a45a8ff 1287 hcryp->Instance->DINR = __RBIT(inputlength);
bogdanm 0:9b334a45a8ff 1288 }
bogdanm 0:9b334a45a8ff 1289 else if(hcryp->Init.DataType == CRYP_DATATYPE_8B)
bogdanm 0:9b334a45a8ff 1290 {
bogdanm 0:9b334a45a8ff 1291 hcryp->Instance->DINR = __REV((headerlength)>>32);
bogdanm 0:9b334a45a8ff 1292 hcryp->Instance->DINR = __REV(headerlength);
bogdanm 0:9b334a45a8ff 1293 hcryp->Instance->DINR = __REV((inputlength)>>32);
bogdanm 0:9b334a45a8ff 1294 hcryp->Instance->DINR = __REV(inputlength);
bogdanm 0:9b334a45a8ff 1295 }
bogdanm 0:9b334a45a8ff 1296 else if(hcryp->Init.DataType == CRYP_DATATYPE_16B)
bogdanm 0:9b334a45a8ff 1297 {
bogdanm 0:9b334a45a8ff 1298 hcryp->Instance->DINR = __ROR((headerlength)>>32, 16);
bogdanm 0:9b334a45a8ff 1299 hcryp->Instance->DINR = __ROR(headerlength, 16);
bogdanm 0:9b334a45a8ff 1300 hcryp->Instance->DINR = __ROR((inputlength)>>32, 16);
bogdanm 0:9b334a45a8ff 1301 hcryp->Instance->DINR = __ROR(inputlength, 16);
bogdanm 0:9b334a45a8ff 1302 }
bogdanm 0:9b334a45a8ff 1303 else if(hcryp->Init.DataType == CRYP_DATATYPE_32B)
bogdanm 0:9b334a45a8ff 1304 {
bogdanm 0:9b334a45a8ff 1305 hcryp->Instance->DINR = (uint32_t)(headerlength>>32);
bogdanm 0:9b334a45a8ff 1306 hcryp->Instance->DINR = (uint32_t)(headerlength);
bogdanm 0:9b334a45a8ff 1307 hcryp->Instance->DINR = (uint32_t)(inputlength>>32);
bogdanm 0:9b334a45a8ff 1308 hcryp->Instance->DINR = (uint32_t)(inputlength);
bogdanm 0:9b334a45a8ff 1309 }
bogdanm 0:9b334a45a8ff 1310 }
bogdanm 0:9b334a45a8ff 1311 else if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 1312 {
bogdanm 0:9b334a45a8ff 1313 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1314
bogdanm 0:9b334a45a8ff 1315 inputaddr = (uint32_t)pInputData;
bogdanm 0:9b334a45a8ff 1316 /* Enter the last block made of a 128-bit value formatted
bogdanm 0:9b334a45a8ff 1317 from the original B0 packet. */
bogdanm 0:9b334a45a8ff 1318 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1319 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1320 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1321 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1322 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1323 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1324 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1325 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1326 }
bogdanm 0:9b334a45a8ff 1327
bogdanm 0:9b334a45a8ff 1328 /* No DMA transfer is required at that point therefore, the software
bogdanm 0:9b334a45a8ff 1329 just waits for the CCF flag to be raised. */
bogdanm 0:9b334a45a8ff 1330 if(CRYP_WaitOnCCFlag(hcryp, CRYP_CCF_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1331 {
bogdanm 0:9b334a45a8ff 1332 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1333 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1334 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1335 }
bogdanm 0:9b334a45a8ff 1336 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1337 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1338 /* Read the Auth TAG in the IN FIFO */
bogdanm 0:9b334a45a8ff 1339 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1340 tagaddr+=4;
bogdanm 0:9b334a45a8ff 1341 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1342 tagaddr+=4;
bogdanm 0:9b334a45a8ff 1343 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1344 tagaddr+=4;
bogdanm 0:9b334a45a8ff 1345 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1346
bogdanm 0:9b334a45a8ff 1347 /* Mark that the final phase is over */
bogdanm 0:9b334a45a8ff 1348 hcryp->Phase = HAL_CRYP_PHASE_FINAL_OVER;
bogdanm 0:9b334a45a8ff 1349 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1350 /* Disable the Peripheral */
bogdanm 0:9b334a45a8ff 1351 __HAL_CRYP_DISABLE();
bogdanm 0:9b334a45a8ff 1352 }
bogdanm 0:9b334a45a8ff 1353 /*=================================================*/
bogdanm 0:9b334a45a8ff 1354 /* case incorrect hcryp->Init.GCMCMACPhase setting */
bogdanm 0:9b334a45a8ff 1355 /*=================================================*/
bogdanm 0:9b334a45a8ff 1356 else
bogdanm 0:9b334a45a8ff 1357 {
bogdanm 0:9b334a45a8ff 1358 hcryp->State = HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1359 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1360 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1361 }
bogdanm 0:9b334a45a8ff 1362
bogdanm 0:9b334a45a8ff 1363 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1364 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1365
bogdanm 0:9b334a45a8ff 1366 return HAL_OK;
bogdanm 0:9b334a45a8ff 1367 }
bogdanm 0:9b334a45a8ff 1368 else
bogdanm 0:9b334a45a8ff 1369 {
bogdanm 0:9b334a45a8ff 1370 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1371 }
bogdanm 0:9b334a45a8ff 1372 }
bogdanm 0:9b334a45a8ff 1373
bogdanm 0:9b334a45a8ff 1374 /**
bogdanm 0:9b334a45a8ff 1375 * @}
bogdanm 0:9b334a45a8ff 1376 */
bogdanm 0:9b334a45a8ff 1377
bogdanm 0:9b334a45a8ff 1378 /** @defgroup CRYPEx_Exported_Functions_Group3 AES suspension/resumption functions
bogdanm 0:9b334a45a8ff 1379 * @brief Extended processing functions.
bogdanm 0:9b334a45a8ff 1380 *
bogdanm 0:9b334a45a8ff 1381 @verbatim
bogdanm 0:9b334a45a8ff 1382 ==============================================================================
bogdanm 0:9b334a45a8ff 1383 ##### AES extended suspension and resumption functions #####
bogdanm 0:9b334a45a8ff 1384 ==============================================================================
bogdanm 0:9b334a45a8ff 1385 [..] This section provides functions allowing to:
bogdanm 0:9b334a45a8ff 1386 (+) save in memory the Initialization Vector, the Key registers, the Control register or
bogdanm 0:9b334a45a8ff 1387 the Suspend registers when a process is suspended by a higher priority message
bogdanm 0:9b334a45a8ff 1388 (+) write back in CRYP hardware block the saved values listed above when the suspended
bogdanm 0:9b334a45a8ff 1389 lower priority message processing is resumed.
bogdanm 0:9b334a45a8ff 1390
bogdanm 0:9b334a45a8ff 1391 @endverbatim
bogdanm 0:9b334a45a8ff 1392 * @{
bogdanm 0:9b334a45a8ff 1393 */
bogdanm 0:9b334a45a8ff 1394
bogdanm 0:9b334a45a8ff 1395
bogdanm 0:9b334a45a8ff 1396 /**
bogdanm 0:9b334a45a8ff 1397 * @brief In case of message processing suspension, read the Initialization Vector.
bogdanm 0:9b334a45a8ff 1398 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1399 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1400 * @param Output: Pointer to the buffer containing the saved Initialization Vector.
bogdanm 0:9b334a45a8ff 1401 * @note This value has to be stored for reuse by writing the AES_IVRx registers
bogdanm 0:9b334a45a8ff 1402 * as soon as the interrupted processing has to be resumed.
bogdanm 0:9b334a45a8ff 1403 * Applicable to all chaining modes.
bogdanm 0:9b334a45a8ff 1404 * @note AES must be disabled when reading or resetting the IV values.
bogdanm 0:9b334a45a8ff 1405 * @retval None
bogdanm 0:9b334a45a8ff 1406 */
bogdanm 0:9b334a45a8ff 1407 void HAL_CRYPEx_Read_IVRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output)
bogdanm 0:9b334a45a8ff 1408 {
bogdanm 0:9b334a45a8ff 1409 uint32_t outputaddr = (uint32_t)Output;
bogdanm 0:9b334a45a8ff 1410
bogdanm 0:9b334a45a8ff 1411 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR3);
bogdanm 0:9b334a45a8ff 1412 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1413 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR2);
bogdanm 0:9b334a45a8ff 1414 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1415 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR1);
bogdanm 0:9b334a45a8ff 1416 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1417 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR0);
bogdanm 0:9b334a45a8ff 1418 }
bogdanm 0:9b334a45a8ff 1419
bogdanm 0:9b334a45a8ff 1420 /**
bogdanm 0:9b334a45a8ff 1421 * @brief In case of message processing resumption, rewrite the Initialization
bogdanm 0:9b334a45a8ff 1422 * Vector in the AES_IVRx registers.
bogdanm 0:9b334a45a8ff 1423 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1424 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1425 * @param Input: Pointer to the buffer containing the saved Initialization Vector to
bogdanm 0:9b334a45a8ff 1426 * write back in the CRYP hardware block.
bogdanm 0:9b334a45a8ff 1427 * @note Applicable to all chaining modes.
bogdanm 0:9b334a45a8ff 1428 * @note AES must be disabled when reading or resetting the IV values.
bogdanm 0:9b334a45a8ff 1429 * @retval None
bogdanm 0:9b334a45a8ff 1430 */
bogdanm 0:9b334a45a8ff 1431 void HAL_CRYPEx_Write_IVRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input)
bogdanm 0:9b334a45a8ff 1432 {
bogdanm 0:9b334a45a8ff 1433 uint32_t ivaddr = (uint32_t)Input;
bogdanm 0:9b334a45a8ff 1434
bogdanm 0:9b334a45a8ff 1435 hcryp->Instance->IVR3 = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1436 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1437 hcryp->Instance->IVR2 = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1438 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1439 hcryp->Instance->IVR1 = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1440 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1441 hcryp->Instance->IVR0 = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1442 }
bogdanm 0:9b334a45a8ff 1443
bogdanm 0:9b334a45a8ff 1444
bogdanm 0:9b334a45a8ff 1445 /**
bogdanm 0:9b334a45a8ff 1446 * @brief In case of message GCM/GMAC or CMAC processing suspension, read the Suspend Registers.
bogdanm 0:9b334a45a8ff 1447 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1448 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1449 * @param Output: Pointer to the buffer containing the saved Suspend Registers.
bogdanm 0:9b334a45a8ff 1450 * @note These values have to be stored for reuse by writing back the AES_SUSPxR registers
bogdanm 0:9b334a45a8ff 1451 * as soon as the interrupted processing has to be resumed.
bogdanm 0:9b334a45a8ff 1452 * @retval None
bogdanm 0:9b334a45a8ff 1453 */
bogdanm 0:9b334a45a8ff 1454 void HAL_CRYPEx_Read_SuspendRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output)
bogdanm 0:9b334a45a8ff 1455 {
bogdanm 0:9b334a45a8ff 1456 uint32_t outputaddr = (uint32_t)Output;
bogdanm 0:9b334a45a8ff 1457
bogdanm 0:9b334a45a8ff 1458 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP7R);
bogdanm 0:9b334a45a8ff 1459 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1460 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP6R);
bogdanm 0:9b334a45a8ff 1461 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1462 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP5R);
bogdanm 0:9b334a45a8ff 1463 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1464 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP4R);
bogdanm 0:9b334a45a8ff 1465 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1466 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP3R);
bogdanm 0:9b334a45a8ff 1467 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1468 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP2R);
bogdanm 0:9b334a45a8ff 1469 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1470 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP1R);
bogdanm 0:9b334a45a8ff 1471 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1472 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP0R);
bogdanm 0:9b334a45a8ff 1473 }
bogdanm 0:9b334a45a8ff 1474
bogdanm 0:9b334a45a8ff 1475 /**
bogdanm 0:9b334a45a8ff 1476 * @brief In case of message GCM/GMAC or CMAC processing resumption, rewrite the Suspend
bogdanm 0:9b334a45a8ff 1477 * Registers in the AES_SUSPxR registers.
bogdanm 0:9b334a45a8ff 1478 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1479 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1480 * @param Input: Pointer to the buffer containing the saved suspend registers to
bogdanm 0:9b334a45a8ff 1481 * write back in the CRYP hardware block.
bogdanm 0:9b334a45a8ff 1482 * @retval None
bogdanm 0:9b334a45a8ff 1483 */
bogdanm 0:9b334a45a8ff 1484 void HAL_CRYPEx_Write_SuspendRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input)
bogdanm 0:9b334a45a8ff 1485 {
bogdanm 0:9b334a45a8ff 1486 uint32_t ivaddr = (uint32_t)Input;
bogdanm 0:9b334a45a8ff 1487
bogdanm 0:9b334a45a8ff 1488 hcryp->Instance->SUSP7R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1489 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1490 hcryp->Instance->SUSP6R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1491 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1492 hcryp->Instance->SUSP5R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1493 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1494 hcryp->Instance->SUSP4R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1495 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1496 hcryp->Instance->SUSP3R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1497 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1498 hcryp->Instance->SUSP2R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1499 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1500 hcryp->Instance->SUSP1R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1501 ivaddr+=4;
bogdanm 0:9b334a45a8ff 1502 hcryp->Instance->SUSP0R = __REV(*(uint32_t*)(ivaddr));
bogdanm 0:9b334a45a8ff 1503 }
bogdanm 0:9b334a45a8ff 1504
bogdanm 0:9b334a45a8ff 1505
bogdanm 0:9b334a45a8ff 1506 /**
bogdanm 0:9b334a45a8ff 1507 * @brief In case of message GCM/GMAC or CMAC processing suspension, read the Key Registers.
bogdanm 0:9b334a45a8ff 1508 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1509 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1510 * @param Output: Pointer to the buffer containing the saved Key Registers.
bogdanm 0:9b334a45a8ff 1511 * @param KeySize: Indicates the key size (128 or 256 bits).
bogdanm 0:9b334a45a8ff 1512 * @note These values have to be stored for reuse by writing back the AES_KEYRx registers
bogdanm 0:9b334a45a8ff 1513 * as soon as the interrupted processing has to be resumed.
bogdanm 0:9b334a45a8ff 1514 * @retval None
bogdanm 0:9b334a45a8ff 1515 */
bogdanm 0:9b334a45a8ff 1516 void HAL_CRYPEx_Read_KeyRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output, uint32_t KeySize)
bogdanm 0:9b334a45a8ff 1517 {
bogdanm 0:9b334a45a8ff 1518 uint32_t keyaddr = (uint32_t)Output;
bogdanm 0:9b334a45a8ff 1519
bogdanm 0:9b334a45a8ff 1520 if (KeySize == CRYP_KEYSIZE_256B)
bogdanm 0:9b334a45a8ff 1521 {
bogdanm 0:9b334a45a8ff 1522 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR7);
bogdanm 0:9b334a45a8ff 1523 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1524 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR6);
bogdanm 0:9b334a45a8ff 1525 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1526 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR5);
bogdanm 0:9b334a45a8ff 1527 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1528 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR4);
bogdanm 0:9b334a45a8ff 1529 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1530 }
bogdanm 0:9b334a45a8ff 1531
bogdanm 0:9b334a45a8ff 1532 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR3);
bogdanm 0:9b334a45a8ff 1533 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1534 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR2);
bogdanm 0:9b334a45a8ff 1535 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1536 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR1);
bogdanm 0:9b334a45a8ff 1537 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1538 *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR0);
bogdanm 0:9b334a45a8ff 1539 }
bogdanm 0:9b334a45a8ff 1540
bogdanm 0:9b334a45a8ff 1541 /**
bogdanm 0:9b334a45a8ff 1542 * @brief In case of message GCM/GMAC or CMAC processing resumption, rewrite the Key
bogdanm 0:9b334a45a8ff 1543 * Registers in the AES_KEYRx registers.
bogdanm 0:9b334a45a8ff 1544 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1545 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1546 * @param Input: Pointer to the buffer containing the saved key registers to
bogdanm 0:9b334a45a8ff 1547 * write back in the CRYP hardware block.
bogdanm 0:9b334a45a8ff 1548 * @param KeySize: Indicates the key size (128 or 256 bits)
bogdanm 0:9b334a45a8ff 1549 * @retval None
bogdanm 0:9b334a45a8ff 1550 */
bogdanm 0:9b334a45a8ff 1551 void HAL_CRYPEx_Write_KeyRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint32_t KeySize)
bogdanm 0:9b334a45a8ff 1552 {
bogdanm 0:9b334a45a8ff 1553 uint32_t keyaddr = (uint32_t)Input;
bogdanm 0:9b334a45a8ff 1554
bogdanm 0:9b334a45a8ff 1555 if (KeySize == CRYP_KEYSIZE_256B)
bogdanm 0:9b334a45a8ff 1556 {
bogdanm 0:9b334a45a8ff 1557 hcryp->Instance->KEYR7 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1558 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1559 hcryp->Instance->KEYR6 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1560 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1561 hcryp->Instance->KEYR5 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1562 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1563 hcryp->Instance->KEYR4 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1564 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1565 }
bogdanm 0:9b334a45a8ff 1566
bogdanm 0:9b334a45a8ff 1567 hcryp->Instance->KEYR3 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1568 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1569 hcryp->Instance->KEYR2 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1570 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1571 hcryp->Instance->KEYR1 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1572 keyaddr+=4;
bogdanm 0:9b334a45a8ff 1573 hcryp->Instance->KEYR0 = __REV(*(uint32_t*)(keyaddr));
bogdanm 0:9b334a45a8ff 1574 }
bogdanm 0:9b334a45a8ff 1575
bogdanm 0:9b334a45a8ff 1576
bogdanm 0:9b334a45a8ff 1577 /**
bogdanm 0:9b334a45a8ff 1578 * @brief In case of message GCM/GMAC or CMAC processing suspension, read the Control Register.
bogdanm 0:9b334a45a8ff 1579 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1580 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1581 * @param Output: Pointer to the buffer containing the saved Control Register.
bogdanm 0:9b334a45a8ff 1582 * @note This values has to be stored for reuse by writing back the AES_CR register
bogdanm 0:9b334a45a8ff 1583 * as soon as the interrupted processing has to be resumed.
bogdanm 0:9b334a45a8ff 1584 * @retval None
bogdanm 0:9b334a45a8ff 1585 */
bogdanm 0:9b334a45a8ff 1586 void HAL_CRYPEx_Read_ControlRegister(CRYP_HandleTypeDef *hcryp, uint8_t* Output)
bogdanm 0:9b334a45a8ff 1587 {
bogdanm 0:9b334a45a8ff 1588 *(uint32_t*)(Output) = hcryp->Instance->CR;
bogdanm 0:9b334a45a8ff 1589 }
bogdanm 0:9b334a45a8ff 1590
bogdanm 0:9b334a45a8ff 1591 /**
bogdanm 0:9b334a45a8ff 1592 * @brief In case of message GCM/GMAC or CMAC processing resumption, rewrite the Control
bogdanm 0:9b334a45a8ff 1593 * Registers in the AES_CR register.
bogdanm 0:9b334a45a8ff 1594 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1595 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1596 * @param Input: Pointer to the buffer containing the saved Control Register to
bogdanm 0:9b334a45a8ff 1597 * write back in the CRYP hardware block.
bogdanm 0:9b334a45a8ff 1598 * @retval None
bogdanm 0:9b334a45a8ff 1599 */
bogdanm 0:9b334a45a8ff 1600 void HAL_CRYPEx_Write_ControlRegister(CRYP_HandleTypeDef *hcryp, uint8_t* Input)
bogdanm 0:9b334a45a8ff 1601 {
bogdanm 0:9b334a45a8ff 1602 hcryp->Instance->CR = *(uint32_t*)(Input);
bogdanm 0:9b334a45a8ff 1603 }
bogdanm 0:9b334a45a8ff 1604
bogdanm 0:9b334a45a8ff 1605 /**
bogdanm 0:9b334a45a8ff 1606 * @}
bogdanm 0:9b334a45a8ff 1607 */
bogdanm 0:9b334a45a8ff 1608
bogdanm 0:9b334a45a8ff 1609 /**
bogdanm 0:9b334a45a8ff 1610 * @}
bogdanm 0:9b334a45a8ff 1611 */
bogdanm 0:9b334a45a8ff 1612
bogdanm 0:9b334a45a8ff 1613 /** @addtogroup CRYPEx_Private_Functions
bogdanm 0:9b334a45a8ff 1614 * @{
bogdanm 0:9b334a45a8ff 1615 */
bogdanm 0:9b334a45a8ff 1616
bogdanm 0:9b334a45a8ff 1617 /**
bogdanm 0:9b334a45a8ff 1618 * @brief DMA CRYP Input Data process complete callback
bogdanm 0:9b334a45a8ff 1619 * for GCM, GMAC or CMAC chainging modes.
bogdanm 0:9b334a45a8ff 1620 * @note Specific setting of hcryp fields are required only
bogdanm 0:9b334a45a8ff 1621 * in the case of header phase where no output data DMA
bogdanm 0:9b334a45a8ff 1622 * transfer is on-going (only input data transfer is enabled
bogdanm 0:9b334a45a8ff 1623 * in such a case).
bogdanm 0:9b334a45a8ff 1624 * @param hdma: DMA handle.
bogdanm 0:9b334a45a8ff 1625 * @retval None
bogdanm 0:9b334a45a8ff 1626 */
bogdanm 0:9b334a45a8ff 1627 static void CRYP_GCMCMAC_DMAInCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1628 {
bogdanm 0:9b334a45a8ff 1629 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1630
bogdanm 0:9b334a45a8ff 1631 /* Disable the DMA transfer for input request */
bogdanm 0:9b334a45a8ff 1632 CLEAR_BIT(hcryp->Instance->CR, AES_CR_DMAINEN);
bogdanm 0:9b334a45a8ff 1633
bogdanm 0:9b334a45a8ff 1634 if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 1635 {
bogdanm 0:9b334a45a8ff 1636 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1637 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1638 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1639 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1640
bogdanm 0:9b334a45a8ff 1641 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 1642 hcryp->Phase = HAL_CRYP_PHASE_HEADER_OVER;
bogdanm 0:9b334a45a8ff 1643 }
bogdanm 0:9b334a45a8ff 1644
bogdanm 0:9b334a45a8ff 1645 /* Call input data transfer complete callback */
bogdanm 0:9b334a45a8ff 1646 HAL_CRYP_InCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1647 }
bogdanm 0:9b334a45a8ff 1648
bogdanm 0:9b334a45a8ff 1649 /**
bogdanm 0:9b334a45a8ff 1650 * @brief DMA CRYP Output Data process complete callback
bogdanm 0:9b334a45a8ff 1651 * for GCM, GMAC or CMAC chainging modes.
bogdanm 0:9b334a45a8ff 1652 * @note This callback is called only in the payload phase.
bogdanm 0:9b334a45a8ff 1653 * @param hdma: DMA handle.
bogdanm 0:9b334a45a8ff 1654 * @retval None
bogdanm 0:9b334a45a8ff 1655 */
bogdanm 0:9b334a45a8ff 1656 static void CRYP_GCMCMAC_DMAOutCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1657 {
bogdanm 0:9b334a45a8ff 1658 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1659
bogdanm 0:9b334a45a8ff 1660 /* Disable the DMA transfer for output request */
bogdanm 0:9b334a45a8ff 1661 CLEAR_BIT(hcryp->Instance->CR, AES_CR_DMAOUTEN);
bogdanm 0:9b334a45a8ff 1662
bogdanm 0:9b334a45a8ff 1663 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1664 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 /* Change the CRYP state to ready */
bogdanm 0:9b334a45a8ff 1667 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1668 /* Mark that the payload phase is over */
bogdanm 0:9b334a45a8ff 1669 hcryp->Phase = HAL_CRYP_PHASE_PAYLOAD_OVER;
bogdanm 0:9b334a45a8ff 1670
bogdanm 0:9b334a45a8ff 1671 /* Call output data transfer complete callback */
bogdanm 0:9b334a45a8ff 1672 HAL_CRYP_OutCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1673 }
bogdanm 0:9b334a45a8ff 1674
bogdanm 0:9b334a45a8ff 1675 /**
bogdanm 0:9b334a45a8ff 1676 * @brief DMA CRYP communication error callback
bogdanm 0:9b334a45a8ff 1677 * for GCM, GMAC or CMAC chainging modes.
bogdanm 0:9b334a45a8ff 1678 * @param hdma: DMA handle
bogdanm 0:9b334a45a8ff 1679 * @retval None
bogdanm 0:9b334a45a8ff 1680 */
bogdanm 0:9b334a45a8ff 1681 static void CRYP_GCMCMAC_DMAError(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 1682 {
bogdanm 0:9b334a45a8ff 1683 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 1684
bogdanm 0:9b334a45a8ff 1685 hcryp->State= HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1686 hcryp->ErrorCode |= HAL_CRYP_DMA_ERROR;
bogdanm 0:9b334a45a8ff 1687 HAL_CRYP_ErrorCallback(hcryp);
bogdanm 0:9b334a45a8ff 1688 /* Clear Error Flag */
bogdanm 0:9b334a45a8ff 1689 __HAL_CRYP_CLEAR_FLAG(CRYP_ERR_CLEAR);
bogdanm 0:9b334a45a8ff 1690 }
bogdanm 0:9b334a45a8ff 1691
bogdanm 0:9b334a45a8ff 1692
bogdanm 0:9b334a45a8ff 1693
bogdanm 0:9b334a45a8ff 1694 /**
bogdanm 0:9b334a45a8ff 1695 * @brief Handle CRYP block input/output data handling under interruption
bogdanm 0:9b334a45a8ff 1696 * for GCM, GMAC or CMAC chainging modes.
bogdanm 0:9b334a45a8ff 1697 * @note The function is called under interruption only, once
bogdanm 0:9b334a45a8ff 1698 * interruptions have been enabled by HAL_CRYPEx_AES_Auth_IT().
bogdanm 0:9b334a45a8ff 1699 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1700 * the configuration information for CRYP module
bogdanm 0:9b334a45a8ff 1701 * @retval HAL status
bogdanm 0:9b334a45a8ff 1702 */
bogdanm 0:9b334a45a8ff 1703 HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp)
bogdanm 0:9b334a45a8ff 1704 {
bogdanm 0:9b334a45a8ff 1705 uint32_t inputaddr = 0x0;
bogdanm 0:9b334a45a8ff 1706 uint32_t outputaddr = 0x0;
bogdanm 0:9b334a45a8ff 1707
bogdanm 0:9b334a45a8ff 1708 if(hcryp->State == HAL_CRYP_STATE_BUSY)
bogdanm 0:9b334a45a8ff 1709 {
bogdanm 0:9b334a45a8ff 1710 /*=====================*/
bogdanm 0:9b334a45a8ff 1711 /* GCM/GMAC init phase */
bogdanm 0:9b334a45a8ff 1712 /*=====================*/
bogdanm 0:9b334a45a8ff 1713 if (hcryp->Init.GCMCMACPhase == CRYP_GCM_INIT_PHASE)
bogdanm 0:9b334a45a8ff 1714 {
bogdanm 0:9b334a45a8ff 1715 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1716 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1717 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1718 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1719 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1720 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1721
bogdanm 0:9b334a45a8ff 1722 /* Mark that the initialization phase is over */
bogdanm 0:9b334a45a8ff 1723 hcryp->Phase = HAL_CRYP_PHASE_INIT_OVER;
bogdanm 0:9b334a45a8ff 1724
bogdanm 0:9b334a45a8ff 1725 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1726 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1727 /* Call computation complete callback */
bogdanm 0:9b334a45a8ff 1728 HAL_CRYPEx_ComputationCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1729 return HAL_OK;
bogdanm 0:9b334a45a8ff 1730 }
bogdanm 0:9b334a45a8ff 1731 /*===============================*/
bogdanm 0:9b334a45a8ff 1732 /* GCM/GMAC or CMAC header phase */
bogdanm 0:9b334a45a8ff 1733 /*===============================*/
bogdanm 0:9b334a45a8ff 1734 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_HEADER_PHASE)
bogdanm 0:9b334a45a8ff 1735 {
bogdanm 0:9b334a45a8ff 1736 /* Check if all input header data have been entered */
bogdanm 0:9b334a45a8ff 1737 if (hcryp->CrypInCount == 0)
bogdanm 0:9b334a45a8ff 1738 {
bogdanm 0:9b334a45a8ff 1739 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1740 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1741 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1742 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1743 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1744 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1745 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 1746 hcryp->Phase = HAL_CRYP_PHASE_HEADER_OVER;
bogdanm 0:9b334a45a8ff 1747
bogdanm 0:9b334a45a8ff 1748 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1749 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1750
bogdanm 0:9b334a45a8ff 1751 /* Call computation complete callback */
bogdanm 0:9b334a45a8ff 1752 HAL_CRYPEx_ComputationCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1753
bogdanm 0:9b334a45a8ff 1754 return HAL_OK;
bogdanm 0:9b334a45a8ff 1755 }
bogdanm 0:9b334a45a8ff 1756 /* If suspension flag has been raised, suspend processing */
bogdanm 0:9b334a45a8ff 1757 else if (hcryp->SuspendRequest == HAL_CRYP_SUSPEND)
bogdanm 0:9b334a45a8ff 1758 {
bogdanm 0:9b334a45a8ff 1759 /* Ensure that CCF flag is set */
bogdanm 0:9b334a45a8ff 1760 if(CRYP_WaitOnCCFlag(hcryp, CRYP_CCF_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1761 {
bogdanm 0:9b334a45a8ff 1762 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1763 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1764 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1765 }
bogdanm 0:9b334a45a8ff 1766 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1767 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1768
bogdanm 0:9b334a45a8ff 1769 /* reset SuspendRequest */
bogdanm 0:9b334a45a8ff 1770 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 1771 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1772 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1773 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1774 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 1775 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 1776 hcryp->Phase = HAL_CRYP_PHASE_HEADER_SUSPENDED;
bogdanm 0:9b334a45a8ff 1777
bogdanm 0:9b334a45a8ff 1778 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1779 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1780
bogdanm 0:9b334a45a8ff 1781 return HAL_OK;
bogdanm 0:9b334a45a8ff 1782 }
bogdanm 0:9b334a45a8ff 1783 else /* Carry on feeding input data to the CRYP hardware block */
bogdanm 0:9b334a45a8ff 1784 {
bogdanm 0:9b334a45a8ff 1785 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1786 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1787 /* Get the last Input data address */
bogdanm 0:9b334a45a8ff 1788 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
bogdanm 0:9b334a45a8ff 1789
bogdanm 0:9b334a45a8ff 1790 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 1791 hcryp->pCrypInBuffPtr += 16;
bogdanm 0:9b334a45a8ff 1792 hcryp->CrypInCount -= 16;
bogdanm 0:9b334a45a8ff 1793
bogdanm 0:9b334a45a8ff 1794 if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC)
bogdanm 0:9b334a45a8ff 1795 {
bogdanm 0:9b334a45a8ff 1796 if (hcryp->CrypInCount == hcryp->Init.HeaderSize)
bogdanm 0:9b334a45a8ff 1797 {
bogdanm 0:9b334a45a8ff 1798 /* All B blocks will have been entered after the next
bogdanm 0:9b334a45a8ff 1799 four DINR writing, so point at header buffer for
bogdanm 0:9b334a45a8ff 1800 the next iteration */
bogdanm 0:9b334a45a8ff 1801 hcryp->pCrypInBuffPtr = hcryp->Init.Header;
bogdanm 0:9b334a45a8ff 1802 }
bogdanm 0:9b334a45a8ff 1803 }
bogdanm 0:9b334a45a8ff 1804
bogdanm 0:9b334a45a8ff 1805 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 1806 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1807 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1808 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1809 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1810 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1811 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1812 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1813
bogdanm 0:9b334a45a8ff 1814 return HAL_OK;
bogdanm 0:9b334a45a8ff 1815 }
bogdanm 0:9b334a45a8ff 1816 }
bogdanm 0:9b334a45a8ff 1817 /*========================*/
bogdanm 0:9b334a45a8ff 1818 /* GCM/GMAC payload phase */
bogdanm 0:9b334a45a8ff 1819 /*========================*/
bogdanm 0:9b334a45a8ff 1820 else if (hcryp->Init.GCMCMACPhase == CRYP_GCM_PAYLOAD_PHASE)
bogdanm 0:9b334a45a8ff 1821 {
bogdanm 0:9b334a45a8ff 1822 /* Get the last output data address */
bogdanm 0:9b334a45a8ff 1823 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
bogdanm 0:9b334a45a8ff 1824
bogdanm 0:9b334a45a8ff 1825 /* Retrieve the last block available from the CRYP hardware block:
bogdanm 0:9b334a45a8ff 1826 read the output block from the Data Output Register */
bogdanm 0:9b334a45a8ff 1827 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1828 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1829 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1830 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1831 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1832 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1833 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1834
bogdanm 0:9b334a45a8ff 1835 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 1836 hcryp->pCrypOutBuffPtr += 16;
bogdanm 0:9b334a45a8ff 1837 hcryp->CrypOutCount -= 16;
bogdanm 0:9b334a45a8ff 1838
bogdanm 0:9b334a45a8ff 1839 /* Check if all output text has been retrieved */
bogdanm 0:9b334a45a8ff 1840 if (hcryp->CrypOutCount == 0)
bogdanm 0:9b334a45a8ff 1841 {
bogdanm 0:9b334a45a8ff 1842 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1843 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1844 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1845 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1846 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1847 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1848 /* Mark that the payload phase is over */
bogdanm 0:9b334a45a8ff 1849 hcryp->Phase = HAL_CRYP_PHASE_PAYLOAD_OVER;
bogdanm 0:9b334a45a8ff 1850
bogdanm 0:9b334a45a8ff 1851 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1852 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1853
bogdanm 0:9b334a45a8ff 1854 /* Call computation complete callback */
bogdanm 0:9b334a45a8ff 1855 HAL_CRYPEx_ComputationCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1856
bogdanm 0:9b334a45a8ff 1857 return HAL_OK;
bogdanm 0:9b334a45a8ff 1858 }
bogdanm 0:9b334a45a8ff 1859 /* If suspension flag has been raised, suspend processing */
bogdanm 0:9b334a45a8ff 1860 else if (hcryp->SuspendRequest == HAL_CRYP_SUSPEND)
bogdanm 0:9b334a45a8ff 1861 {
bogdanm 0:9b334a45a8ff 1862 if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_ENCRYPT)
bogdanm 0:9b334a45a8ff 1863 {
bogdanm 0:9b334a45a8ff 1864 /* Ensure that Busy flag is reset */
bogdanm 0:9b334a45a8ff 1865 if(CRYP_WaitOnBusyFlagReset(hcryp, CRYP_BUSY_TIMEOUTVALUE) != HAL_OK)
bogdanm 0:9b334a45a8ff 1866 {
bogdanm 0:9b334a45a8ff 1867 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1868 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1869 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1870 }
bogdanm 0:9b334a45a8ff 1871 }
bogdanm 0:9b334a45a8ff 1872 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 1873 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1874
bogdanm 0:9b334a45a8ff 1875 /* reset SuspendRequest */
bogdanm 0:9b334a45a8ff 1876 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 1877 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1878 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1879 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1880 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 1881 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 1882 hcryp->Phase = HAL_CRYP_PHASE_HEADER_SUSPENDED;
bogdanm 0:9b334a45a8ff 1883
bogdanm 0:9b334a45a8ff 1884 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1885 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1886
bogdanm 0:9b334a45a8ff 1887 return HAL_OK;
bogdanm 0:9b334a45a8ff 1888 }
bogdanm 0:9b334a45a8ff 1889 else /* Output data are still expected, carry on feeding the CRYP
bogdanm 0:9b334a45a8ff 1890 hardware block with input data */
bogdanm 0:9b334a45a8ff 1891 {
bogdanm 0:9b334a45a8ff 1892 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1893 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1894 /* Get the last Input data address */
bogdanm 0:9b334a45a8ff 1895 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
bogdanm 0:9b334a45a8ff 1896
bogdanm 0:9b334a45a8ff 1897 /* Increment/decrement instance pointer/counter */
bogdanm 0:9b334a45a8ff 1898 hcryp->pCrypInBuffPtr += 16;
bogdanm 0:9b334a45a8ff 1899 hcryp->CrypInCount -= 16;
bogdanm 0:9b334a45a8ff 1900
bogdanm 0:9b334a45a8ff 1901 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 1902 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1903 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1904 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1905 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1906 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1907 inputaddr+=4;
bogdanm 0:9b334a45a8ff 1908 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 1909
bogdanm 0:9b334a45a8ff 1910 return HAL_OK;
bogdanm 0:9b334a45a8ff 1911 }
bogdanm 0:9b334a45a8ff 1912 }
bogdanm 0:9b334a45a8ff 1913 /*==============================*/
bogdanm 0:9b334a45a8ff 1914 /* GCM/GMAC or CMAC final phase */
bogdanm 0:9b334a45a8ff 1915 /*==============================*/
bogdanm 0:9b334a45a8ff 1916 else if (hcryp->Init.GCMCMACPhase == CRYP_GCMCMAC_FINAL_PHASE)
bogdanm 0:9b334a45a8ff 1917 {
bogdanm 0:9b334a45a8ff 1918 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1919 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1920
bogdanm 0:9b334a45a8ff 1921 /* Get the last output data address */
bogdanm 0:9b334a45a8ff 1922 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
bogdanm 0:9b334a45a8ff 1923
bogdanm 0:9b334a45a8ff 1924 /* Retrieve the last expected data from the CRYP hardware block:
bogdanm 0:9b334a45a8ff 1925 read the output block from the Data Output Register */
bogdanm 0:9b334a45a8ff 1926 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1927 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1928 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1929 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1930 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1931 outputaddr+=4;
bogdanm 0:9b334a45a8ff 1932 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 1933
bogdanm 0:9b334a45a8ff 1934 /* Disable Computation Complete Flag and Errors Interrupts */
bogdanm 0:9b334a45a8ff 1935 __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE);
bogdanm 0:9b334a45a8ff 1936 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 1937 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 1938 /* Mark that the header phase is over */
bogdanm 0:9b334a45a8ff 1939 hcryp->Phase = HAL_CRYP_PHASE_FINAL_OVER;
bogdanm 0:9b334a45a8ff 1940
bogdanm 0:9b334a45a8ff 1941 /* Disable the Peripheral */
bogdanm 0:9b334a45a8ff 1942 __HAL_CRYP_DISABLE();
bogdanm 0:9b334a45a8ff 1943 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1944 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1945
bogdanm 0:9b334a45a8ff 1946 /* Call computation complete callback */
bogdanm 0:9b334a45a8ff 1947 HAL_CRYPEx_ComputationCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 1948
bogdanm 0:9b334a45a8ff 1949 return HAL_OK;
bogdanm 0:9b334a45a8ff 1950 }
bogdanm 0:9b334a45a8ff 1951 else
bogdanm 0:9b334a45a8ff 1952 {
bogdanm 0:9b334a45a8ff 1953 /* Clear Computation Complete Flag */
bogdanm 0:9b334a45a8ff 1954 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 1955 hcryp->State = HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1956 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 1957 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1958 }
bogdanm 0:9b334a45a8ff 1959 }
bogdanm 0:9b334a45a8ff 1960 else
bogdanm 0:9b334a45a8ff 1961 {
bogdanm 0:9b334a45a8ff 1962 return HAL_BUSY;
bogdanm 0:9b334a45a8ff 1963 }
bogdanm 0:9b334a45a8ff 1964 }
bogdanm 0:9b334a45a8ff 1965
bogdanm 0:9b334a45a8ff 1966
bogdanm 0:9b334a45a8ff 1967
bogdanm 0:9b334a45a8ff 1968 /**
bogdanm 0:9b334a45a8ff 1969 * @brief Set the DMA configuration and start the DMA transfer
bogdanm 0:9b334a45a8ff 1970 * for GCM, GMAC or CMAC chainging modes.
bogdanm 0:9b334a45a8ff 1971 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1972 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 1973 * @param inputaddr: Address of the Input buffer.
bogdanm 0:9b334a45a8ff 1974 * @param Size: Size of the Input buffer un bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 1975 * @param outputaddr: Address of the Output buffer, null pointer when no output DMA stream
bogdanm 0:9b334a45a8ff 1976 * has to be configured.
bogdanm 0:9b334a45a8ff 1977 * @retval None
bogdanm 0:9b334a45a8ff 1978 */
bogdanm 0:9b334a45a8ff 1979 static void CRYP_GCMCMAC_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr)
bogdanm 0:9b334a45a8ff 1980 {
bogdanm 0:9b334a45a8ff 1981
bogdanm 0:9b334a45a8ff 1982 /* Set the input CRYP DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1983 hcryp->hdmain->XferCpltCallback = CRYP_GCMCMAC_DMAInCplt;
bogdanm 0:9b334a45a8ff 1984 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1985 hcryp->hdmain->XferErrorCallback = CRYP_GCMCMAC_DMAError;
bogdanm 0:9b334a45a8ff 1986
bogdanm 0:9b334a45a8ff 1987 if (outputaddr != 0)
bogdanm 0:9b334a45a8ff 1988 {
bogdanm 0:9b334a45a8ff 1989 /* Set the output CRYP DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 1990 hcryp->hdmaout->XferCpltCallback = CRYP_GCMCMAC_DMAOutCplt;
bogdanm 0:9b334a45a8ff 1991 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 1992 hcryp->hdmaout->XferErrorCallback = CRYP_GCMCMAC_DMAError;
bogdanm 0:9b334a45a8ff 1993 }
bogdanm 0:9b334a45a8ff 1994
bogdanm 0:9b334a45a8ff 1995 /* Enable the CRYP peripheral */
bogdanm 0:9b334a45a8ff 1996 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 1997
bogdanm 0:9b334a45a8ff 1998 /* Enable the DMA input stream */
bogdanm 0:9b334a45a8ff 1999 HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4);
bogdanm 0:9b334a45a8ff 2000
bogdanm 0:9b334a45a8ff 2001 /* Enable the DMA input request */
bogdanm 0:9b334a45a8ff 2002 SET_BIT(hcryp->Instance->CR, AES_CR_DMAINEN);
bogdanm 0:9b334a45a8ff 2003
bogdanm 0:9b334a45a8ff 2004
bogdanm 0:9b334a45a8ff 2005 if (outputaddr != 0)
bogdanm 0:9b334a45a8ff 2006 {
bogdanm 0:9b334a45a8ff 2007 /* Enable the DMA output stream */
bogdanm 0:9b334a45a8ff 2008 HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4);
bogdanm 0:9b334a45a8ff 2009
bogdanm 0:9b334a45a8ff 2010 /* Enable the DMA output request */
bogdanm 0:9b334a45a8ff 2011 SET_BIT(hcryp->Instance->CR, AES_CR_DMAOUTEN);
bogdanm 0:9b334a45a8ff 2012 }
bogdanm 0:9b334a45a8ff 2013 }
bogdanm 0:9b334a45a8ff 2014
bogdanm 0:9b334a45a8ff 2015
bogdanm 0:9b334a45a8ff 2016
bogdanm 0:9b334a45a8ff 2017 /**
bogdanm 0:9b334a45a8ff 2018 * @brief Write/read input/output data in polling mode.
bogdanm 0:9b334a45a8ff 2019 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2020 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 2021 * @param Input: Pointer to the Input buffer.
bogdanm 0:9b334a45a8ff 2022 * @param Ilength: Length of the Input buffer in bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 2023 * @param Output: Pointer to the returned buffer.
bogdanm 0:9b334a45a8ff 2024 * @param Timeout: Specify Timeout value.
bogdanm 0:9b334a45a8ff 2025 * @retval HAL status
bogdanm 0:9b334a45a8ff 2026 */
bogdanm 0:9b334a45a8ff 2027 static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2028 {
bogdanm 0:9b334a45a8ff 2029 uint32_t index = 0;
bogdanm 0:9b334a45a8ff 2030 uint32_t inputaddr = (uint32_t)Input;
bogdanm 0:9b334a45a8ff 2031 uint32_t outputaddr = (uint32_t)Output;
bogdanm 0:9b334a45a8ff 2032
bogdanm 0:9b334a45a8ff 2033
bogdanm 0:9b334a45a8ff 2034 for(index=0; (index < Ilength); index += 16)
bogdanm 0:9b334a45a8ff 2035 {
bogdanm 0:9b334a45a8ff 2036 /* Write the Input block in the Data Input register */
bogdanm 0:9b334a45a8ff 2037 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 2038 inputaddr+=4;
bogdanm 0:9b334a45a8ff 2039 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 2040 inputaddr+=4;
bogdanm 0:9b334a45a8ff 2041 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 2042 inputaddr+=4;
bogdanm 0:9b334a45a8ff 2043 hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
bogdanm 0:9b334a45a8ff 2044 inputaddr+=4;
bogdanm 0:9b334a45a8ff 2045
bogdanm 0:9b334a45a8ff 2046 /* Wait for CCF flag to be raised */
bogdanm 0:9b334a45a8ff 2047 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2048 {
bogdanm 0:9b334a45a8ff 2049 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 2050 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 2051 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2052 }
bogdanm 0:9b334a45a8ff 2053
bogdanm 0:9b334a45a8ff 2054 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 2055 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 2056
bogdanm 0:9b334a45a8ff 2057 /* Read the Output block from the Data Output Register */
bogdanm 0:9b334a45a8ff 2058 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 2059 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2060 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 2061 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2062 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 2063 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2064 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR;
bogdanm 0:9b334a45a8ff 2065 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2066
bogdanm 0:9b334a45a8ff 2067 /* If the suspension flag has been raised and if the processing is not about
bogdanm 0:9b334a45a8ff 2068 to end, suspend processing */
bogdanm 0:9b334a45a8ff 2069 if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < Ilength))
bogdanm 0:9b334a45a8ff 2070 {
bogdanm 0:9b334a45a8ff 2071 /* Reset SuspendRequest */
bogdanm 0:9b334a45a8ff 2072 hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE;
bogdanm 0:9b334a45a8ff 2073
bogdanm 0:9b334a45a8ff 2074 /* Save current reading and writing locations of Input and Output buffers */
bogdanm 0:9b334a45a8ff 2075 hcryp->pCrypOutBuffPtr = (uint8_t *)outputaddr;
bogdanm 0:9b334a45a8ff 2076 hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr;
bogdanm 0:9b334a45a8ff 2077 /* Save the number of bytes that remain to be processed at this point */
bogdanm 0:9b334a45a8ff 2078 hcryp->CrypInCount = Ilength - (index+16);
bogdanm 0:9b334a45a8ff 2079
bogdanm 0:9b334a45a8ff 2080 /* Change the CRYP state */
bogdanm 0:9b334a45a8ff 2081 hcryp->State = HAL_CRYP_STATE_SUSPENDED;
bogdanm 0:9b334a45a8ff 2082
bogdanm 0:9b334a45a8ff 2083 return HAL_OK;
bogdanm 0:9b334a45a8ff 2084 }
bogdanm 0:9b334a45a8ff 2085
bogdanm 0:9b334a45a8ff 2086
bogdanm 0:9b334a45a8ff 2087 }
bogdanm 0:9b334a45a8ff 2088 /* Return function status */
bogdanm 0:9b334a45a8ff 2089 return HAL_OK;
bogdanm 0:9b334a45a8ff 2090
bogdanm 0:9b334a45a8ff 2091 }
bogdanm 0:9b334a45a8ff 2092
bogdanm 0:9b334a45a8ff 2093
bogdanm 0:9b334a45a8ff 2094
bogdanm 0:9b334a45a8ff 2095
bogdanm 0:9b334a45a8ff 2096
bogdanm 0:9b334a45a8ff 2097 /**
bogdanm 0:9b334a45a8ff 2098 * @brief Read derivative key in polling mode when CRYP hardware block is set
bogdanm 0:9b334a45a8ff 2099 * in key derivation operating mode (mode 2).
bogdanm 0:9b334a45a8ff 2100 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2101 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 2102 * @param Output: Pointer to the returned buffer.
bogdanm 0:9b334a45a8ff 2103 * @param Timeout: Specify Timeout value.
bogdanm 0:9b334a45a8ff 2104 * @retval HAL status
bogdanm 0:9b334a45a8ff 2105 */
bogdanm 0:9b334a45a8ff 2106 static HAL_StatusTypeDef CRYP_ReadKey(CRYP_HandleTypeDef *hcryp, uint8_t* Output, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2107 {
bogdanm 0:9b334a45a8ff 2108 uint32_t outputaddr = (uint32_t)Output;
bogdanm 0:9b334a45a8ff 2109
bogdanm 0:9b334a45a8ff 2110 /* Wait for CCF flag to be raised */
bogdanm 0:9b334a45a8ff 2111 if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK)
bogdanm 0:9b334a45a8ff 2112 {
bogdanm 0:9b334a45a8ff 2113 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 2114 __HAL_UNLOCK(hcryp);
bogdanm 0:9b334a45a8ff 2115 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2116 }
bogdanm 0:9b334a45a8ff 2117 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 2118 __HAL_CRYP_CLEAR_FLAG( CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 2119
bogdanm 0:9b334a45a8ff 2120 /* Read the derivative key from the AES_KEYRx registers */
bogdanm 0:9b334a45a8ff 2121 if (hcryp->Init.KeySize == CRYP_KEYSIZE_256B)
bogdanm 0:9b334a45a8ff 2122 {
bogdanm 0:9b334a45a8ff 2123 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR7);
bogdanm 0:9b334a45a8ff 2124 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2125 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR6);
bogdanm 0:9b334a45a8ff 2126 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2127 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR5);
bogdanm 0:9b334a45a8ff 2128 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2129 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR4);
bogdanm 0:9b334a45a8ff 2130 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2131 }
bogdanm 0:9b334a45a8ff 2132
bogdanm 0:9b334a45a8ff 2133 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR3);
bogdanm 0:9b334a45a8ff 2134 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2135 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR2);
bogdanm 0:9b334a45a8ff 2136 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2137 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR1);
bogdanm 0:9b334a45a8ff 2138 outputaddr+=4;
bogdanm 0:9b334a45a8ff 2139 *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR0);
bogdanm 0:9b334a45a8ff 2140
bogdanm 0:9b334a45a8ff 2141
bogdanm 0:9b334a45a8ff 2142 /* Return function status */
bogdanm 0:9b334a45a8ff 2143 return HAL_OK;
bogdanm 0:9b334a45a8ff 2144 }
bogdanm 0:9b334a45a8ff 2145
bogdanm 0:9b334a45a8ff 2146 /**
bogdanm 0:9b334a45a8ff 2147 * @brief Set the DMA configuration and start the DMA transfer.
bogdanm 0:9b334a45a8ff 2148 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2149 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 2150 * @param inputaddr: Address of the Input buffer.
bogdanm 0:9b334a45a8ff 2151 * @param Size: Size of the Input buffer in bytes, must be a multiple of 16.
bogdanm 0:9b334a45a8ff 2152 * @param outputaddr: Address of the Output buffer.
bogdanm 0:9b334a45a8ff 2153 * @retval None
bogdanm 0:9b334a45a8ff 2154 */
bogdanm 0:9b334a45a8ff 2155 static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr)
bogdanm 0:9b334a45a8ff 2156 {
bogdanm 0:9b334a45a8ff 2157 /* Set the CRYP DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 2158 hcryp->hdmain->XferCpltCallback = CRYP_DMAInCplt;
bogdanm 0:9b334a45a8ff 2159 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 2160 hcryp->hdmain->XferErrorCallback = CRYP_DMAError;
bogdanm 0:9b334a45a8ff 2161
bogdanm 0:9b334a45a8ff 2162 /* Set the CRYP DMA transfer complete callback */
bogdanm 0:9b334a45a8ff 2163 hcryp->hdmaout->XferCpltCallback = CRYP_DMAOutCplt;
bogdanm 0:9b334a45a8ff 2164 /* Set the DMA error callback */
bogdanm 0:9b334a45a8ff 2165 hcryp->hdmaout->XferErrorCallback = CRYP_DMAError;
bogdanm 0:9b334a45a8ff 2166
bogdanm 0:9b334a45a8ff 2167 /* Enable the DMA input stream */
bogdanm 0:9b334a45a8ff 2168 HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4);
bogdanm 0:9b334a45a8ff 2169
bogdanm 0:9b334a45a8ff 2170 /* Enable the DMA output stream */
bogdanm 0:9b334a45a8ff 2171 HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4);
bogdanm 0:9b334a45a8ff 2172
bogdanm 0:9b334a45a8ff 2173 /* Enable In and Out DMA requests */
bogdanm 0:9b334a45a8ff 2174 SET_BIT(hcryp->Instance->CR, (AES_CR_DMAINEN | AES_CR_DMAOUTEN));
bogdanm 0:9b334a45a8ff 2175
bogdanm 0:9b334a45a8ff 2176 /* Enable the CRYP peripheral */
bogdanm 0:9b334a45a8ff 2177 __HAL_CRYP_ENABLE();
bogdanm 0:9b334a45a8ff 2178 }
bogdanm 0:9b334a45a8ff 2179
bogdanm 0:9b334a45a8ff 2180
bogdanm 0:9b334a45a8ff 2181 /**
bogdanm 0:9b334a45a8ff 2182 * @brief Handle CRYP hardware block Timeout when waiting for CCF flag to be raised.
bogdanm 0:9b334a45a8ff 2183 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2184 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 2185 * @param Timeout: Timeout duration.
bogdanm 0:9b334a45a8ff 2186 * @retval HAL status
bogdanm 0:9b334a45a8ff 2187 */
bogdanm 0:9b334a45a8ff 2188 static HAL_StatusTypeDef CRYP_WaitOnCCFlag(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2189 {
bogdanm 0:9b334a45a8ff 2190 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 2191
bogdanm 0:9b334a45a8ff 2192 /* Get timeout */
bogdanm 0:9b334a45a8ff 2193 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 2194
bogdanm 0:9b334a45a8ff 2195 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, AES_SR_CCF))
bogdanm 0:9b334a45a8ff 2196 {
bogdanm 0:9b334a45a8ff 2197 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 2198 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 2199 {
bogdanm 0:9b334a45a8ff 2200 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 2201 {
bogdanm 0:9b334a45a8ff 2202 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2203 }
bogdanm 0:9b334a45a8ff 2204 }
bogdanm 0:9b334a45a8ff 2205 }
bogdanm 0:9b334a45a8ff 2206 return HAL_OK;
bogdanm 0:9b334a45a8ff 2207 }
bogdanm 0:9b334a45a8ff 2208
bogdanm 0:9b334a45a8ff 2209 /**
bogdanm 0:9b334a45a8ff 2210 * @brief Wait for Busy Flag to be reset during a GCM payload encryption process suspension.
bogdanm 0:9b334a45a8ff 2211 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 2212 * the configuration information for CRYP module.
bogdanm 0:9b334a45a8ff 2213 * @param Timeout: Timeout duration.
bogdanm 0:9b334a45a8ff 2214 * @retval HAL status
bogdanm 0:9b334a45a8ff 2215 */
bogdanm 0:9b334a45a8ff 2216 static HAL_StatusTypeDef CRYP_WaitOnBusyFlagReset(CRYP_HandleTypeDef *hcryp, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 2217 {
bogdanm 0:9b334a45a8ff 2218 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 2219
bogdanm 0:9b334a45a8ff 2220 /* Get timeout */
bogdanm 0:9b334a45a8ff 2221 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 2222
bogdanm 0:9b334a45a8ff 2223 while(HAL_IS_BIT_SET(hcryp->Instance->SR, AES_SR_BUSY))
bogdanm 0:9b334a45a8ff 2224 {
bogdanm 0:9b334a45a8ff 2225 /* Check for the Timeout */
bogdanm 0:9b334a45a8ff 2226 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 2227 {
bogdanm 0:9b334a45a8ff 2228 if((HAL_GetTick() - tickstart ) > Timeout)
bogdanm 0:9b334a45a8ff 2229 {
bogdanm 0:9b334a45a8ff 2230 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 2231 }
bogdanm 0:9b334a45a8ff 2232 }
bogdanm 0:9b334a45a8ff 2233 }
bogdanm 0:9b334a45a8ff 2234 return HAL_OK;
bogdanm 0:9b334a45a8ff 2235 }
bogdanm 0:9b334a45a8ff 2236
bogdanm 0:9b334a45a8ff 2237
bogdanm 0:9b334a45a8ff 2238 /**
bogdanm 0:9b334a45a8ff 2239 * @brief DMA CRYP Input Data process complete callback.
bogdanm 0:9b334a45a8ff 2240 * @param hdma: DMA handle.
bogdanm 0:9b334a45a8ff 2241 * @retval None
bogdanm 0:9b334a45a8ff 2242 */
bogdanm 0:9b334a45a8ff 2243 static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 2244 {
bogdanm 0:9b334a45a8ff 2245 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 2246
bogdanm 0:9b334a45a8ff 2247 /* Disable the DMA transfer for input request */
bogdanm 0:9b334a45a8ff 2248 CLEAR_BIT(hcryp->Instance->CR, AES_CR_DMAINEN);
bogdanm 0:9b334a45a8ff 2249
bogdanm 0:9b334a45a8ff 2250 /* Call input data transfer complete callback */
bogdanm 0:9b334a45a8ff 2251 HAL_CRYP_InCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 2252 }
bogdanm 0:9b334a45a8ff 2253
bogdanm 0:9b334a45a8ff 2254 /**
bogdanm 0:9b334a45a8ff 2255 * @brief DMA CRYP Output Data process complete callback.
bogdanm 0:9b334a45a8ff 2256 * @param hdma: DMA handle.
bogdanm 0:9b334a45a8ff 2257 * @retval None
bogdanm 0:9b334a45a8ff 2258 */
bogdanm 0:9b334a45a8ff 2259 static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 2260 {
bogdanm 0:9b334a45a8ff 2261 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 2262
bogdanm 0:9b334a45a8ff 2263 /* Disable the DMA transfer for output request */
bogdanm 0:9b334a45a8ff 2264 CLEAR_BIT(hcryp->Instance->CR, AES_CR_DMAOUTEN);
bogdanm 0:9b334a45a8ff 2265
bogdanm 0:9b334a45a8ff 2266 /* Clear CCF Flag */
bogdanm 0:9b334a45a8ff 2267 __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR);
bogdanm 0:9b334a45a8ff 2268
bogdanm 0:9b334a45a8ff 2269 /* Disable CRYP */
bogdanm 0:9b334a45a8ff 2270 __HAL_CRYP_DISABLE();
bogdanm 0:9b334a45a8ff 2271
bogdanm 0:9b334a45a8ff 2272 /* Change the CRYP state to ready */
bogdanm 0:9b334a45a8ff 2273 hcryp->State = HAL_CRYP_STATE_READY;
bogdanm 0:9b334a45a8ff 2274
bogdanm 0:9b334a45a8ff 2275 /* Call output data transfer complete callback */
bogdanm 0:9b334a45a8ff 2276 HAL_CRYP_OutCpltCallback(hcryp);
bogdanm 0:9b334a45a8ff 2277 }
bogdanm 0:9b334a45a8ff 2278
bogdanm 0:9b334a45a8ff 2279 /**
bogdanm 0:9b334a45a8ff 2280 * @brief DMA CRYP communication error callback.
bogdanm 0:9b334a45a8ff 2281 * @param hdma: DMA handle.
bogdanm 0:9b334a45a8ff 2282 * @retval None
bogdanm 0:9b334a45a8ff 2283 */
bogdanm 0:9b334a45a8ff 2284 static void CRYP_DMAError(DMA_HandleTypeDef *hdma)
bogdanm 0:9b334a45a8ff 2285 {
bogdanm 0:9b334a45a8ff 2286 CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
bogdanm 0:9b334a45a8ff 2287
bogdanm 0:9b334a45a8ff 2288 hcryp->State= HAL_CRYP_STATE_ERROR;
bogdanm 0:9b334a45a8ff 2289 hcryp->ErrorCode |= HAL_CRYP_DMA_ERROR;
bogdanm 0:9b334a45a8ff 2290 HAL_CRYP_ErrorCallback(hcryp);
bogdanm 0:9b334a45a8ff 2291 /* Clear Error Flag */
bogdanm 0:9b334a45a8ff 2292 __HAL_CRYP_CLEAR_FLAG(CRYP_ERR_CLEAR);
bogdanm 0:9b334a45a8ff 2293 }
bogdanm 0:9b334a45a8ff 2294
bogdanm 0:9b334a45a8ff 2295
bogdanm 0:9b334a45a8ff 2296 /**
bogdanm 0:9b334a45a8ff 2297 * @}
bogdanm 0:9b334a45a8ff 2298 */
bogdanm 0:9b334a45a8ff 2299
bogdanm 0:9b334a45a8ff 2300 /**
bogdanm 0:9b334a45a8ff 2301 * @}
bogdanm 0:9b334a45a8ff 2302 */
bogdanm 0:9b334a45a8ff 2303
bogdanm 0:9b334a45a8ff 2304 /**
bogdanm 0:9b334a45a8ff 2305 * @}
bogdanm 0:9b334a45a8ff 2306 */
bogdanm 0:9b334a45a8ff 2307
bogdanm 0:9b334a45a8ff 2308 #endif /* defined(STM32L485xx) || defined(STM32L486xx) */
bogdanm 0:9b334a45a8ff 2309
bogdanm 0:9b334a45a8ff 2310 #endif /* HAL_CRYP_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 2311 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/