added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
83:a036322b8637
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32f7xx_hal_cryp_ex.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @version V1.1.0
<> 144:ef7eb2e8f9f7 6 * @date 22-April-2016
<> 144:ef7eb2e8f9f7 7 * @brief Extended CRYP HAL module driver
<> 144:ef7eb2e8f9f7 8 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 9 * functionalities of CRYP extension peripheral:
<> 144:ef7eb2e8f9f7 10 * + Extended AES processing functions
<> 144:ef7eb2e8f9f7 11 *
<> 144:ef7eb2e8f9f7 12 @verbatim
<> 144:ef7eb2e8f9f7 13 ==============================================================================
<> 144:ef7eb2e8f9f7 14 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 15 ==============================================================================
<> 144:ef7eb2e8f9f7 16 [..]
<> 144:ef7eb2e8f9f7 17 The CRYP Extension HAL driver can be used as follows:
<> 144:ef7eb2e8f9f7 18 (#)Initialize the CRYP low level resources by implementing the HAL_CRYP_MspInit():
<> 144:ef7eb2e8f9f7 19 (##) Enable the CRYP interface clock using __HAL_RCC_CRYP_CLK_ENABLE()
<> 144:ef7eb2e8f9f7 20 (##) In case of using interrupts (e.g. HAL_CRYPEx_AESGCM_Encrypt_IT())
<> 144:ef7eb2e8f9f7 21 (+++) Configure the CRYP interrupt priority using HAL_NVIC_SetPriority()
<> 144:ef7eb2e8f9f7 22 (+++) Enable the CRYP IRQ handler using HAL_NVIC_EnableIRQ()
<> 144:ef7eb2e8f9f7 23 (+++) In CRYP IRQ handler, call HAL_CRYP_IRQHandler()
<> 144:ef7eb2e8f9f7 24 (##) In case of using DMA to control data transfer (e.g. HAL_AES_ECB_Encrypt_DMA())
<> 144:ef7eb2e8f9f7 25 (+++) Enable the DMAx interface clock using __DMAx_CLK_ENABLE()
<> 144:ef7eb2e8f9f7 26 (+++) Configure and enable two DMA streams one for managing data transfer from
<> 144:ef7eb2e8f9f7 27 memory to peripheral (input stream) and another stream for managing data
<> 144:ef7eb2e8f9f7 28 transfer from peripheral to memory (output stream)
<> 144:ef7eb2e8f9f7 29 (+++) Associate the initialized DMA handle to the CRYP DMA handle
<> 144:ef7eb2e8f9f7 30 using __HAL_LINKDMA()
<> 144:ef7eb2e8f9f7 31 (+++) Configure the priority and enable the NVIC for the transfer complete
<> 144:ef7eb2e8f9f7 32 interrupt on the two DMA Streams. The output stream should have higher
<> 144:ef7eb2e8f9f7 33 priority than the input stream HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ()
<> 144:ef7eb2e8f9f7 34 (#)Initialize the CRYP HAL using HAL_CRYP_Init(). This function configures mainly:
<> 144:ef7eb2e8f9f7 35 (##) The data type: 1-bit, 8-bit, 16-bit and 32-bit
<> 144:ef7eb2e8f9f7 36 (##) The key size: 128, 192 and 256. This parameter is relevant only for AES
<> 144:ef7eb2e8f9f7 37 (##) The encryption/decryption key. Its size depends on the algorithm
<> 144:ef7eb2e8f9f7 38 used for encryption/decryption
<> 144:ef7eb2e8f9f7 39 (##) The initialization vector (counter). It is not used ECB mode.
<> 144:ef7eb2e8f9f7 40 (#)Three processing (encryption/decryption) functions are available:
<> 144:ef7eb2e8f9f7 41 (##) Polling mode: encryption and decryption APIs are blocking functions
<> 144:ef7eb2e8f9f7 42 i.e. they process the data and wait till the processing is finished
<> 144:ef7eb2e8f9f7 43 e.g. HAL_CRYPEx_AESGCM_Encrypt()
<> 144:ef7eb2e8f9f7 44 (##) Interrupt mode: encryption and decryption APIs are not blocking functions
<> 144:ef7eb2e8f9f7 45 i.e. they process the data under interrupt
<> 144:ef7eb2e8f9f7 46 e.g. HAL_CRYPEx_AESGCM_Encrypt_IT()
<> 144:ef7eb2e8f9f7 47 (##) DMA mode: encryption and decryption APIs are not blocking functions
<> 144:ef7eb2e8f9f7 48 i.e. the data transfer is ensured by DMA
<> 144:ef7eb2e8f9f7 49 e.g. HAL_CRYPEx_AESGCM_Encrypt_DMA()
<> 144:ef7eb2e8f9f7 50 (#)When the processing function is called at first time after HAL_CRYP_Init()
<> 144:ef7eb2e8f9f7 51 the CRYP peripheral is initialized and processes the buffer in input.
<> 144:ef7eb2e8f9f7 52 At second call, the processing function performs an append of the already
<> 144:ef7eb2e8f9f7 53 processed buffer.
<> 144:ef7eb2e8f9f7 54 When a new data block is to be processed, call HAL_CRYP_Init() then the
<> 144:ef7eb2e8f9f7 55 processing function.
<> 144:ef7eb2e8f9f7 56 (#)In AES-GCM and AES-CCM modes are an authenticated encryption algorithms
<> 144:ef7eb2e8f9f7 57 which provide authentication messages.
<> 144:ef7eb2e8f9f7 58 HAL_AES_GCM_Finish() and HAL_AES_CCM_Finish() are used to provide those
<> 144:ef7eb2e8f9f7 59 authentication messages.
<> 144:ef7eb2e8f9f7 60 Call those functions after the processing ones (polling, interrupt or DMA).
<> 144:ef7eb2e8f9f7 61 e.g. in AES-CCM mode call HAL_CRYPEx_AESCCM_Encrypt() to encrypt the plain data
<> 144:ef7eb2e8f9f7 62 then call HAL_CRYPEx_AESCCM_Finish() to get the authentication message
<> 144:ef7eb2e8f9f7 63 -@- For CCM Encrypt/Decrypt API's, only DataType = 8-bit is supported by this version.
<> 144:ef7eb2e8f9f7 64 -@- The HAL_CRYPEx_AESGCM_xxxx() implementation is limited to 32bits inputs data length
<> 144:ef7eb2e8f9f7 65 (Plain/Cyphertext, Header) compared with GCM standards specifications (800-38D).
<> 144:ef7eb2e8f9f7 66 (#)Call HAL_CRYP_DeInit() to deinitialize the CRYP peripheral.
<> 144:ef7eb2e8f9f7 67
<> 144:ef7eb2e8f9f7 68 @endverbatim
<> 144:ef7eb2e8f9f7 69 ******************************************************************************
<> 144:ef7eb2e8f9f7 70 * @attention
<> 144:ef7eb2e8f9f7 71 *
<> 144:ef7eb2e8f9f7 72 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 73 *
<> 144:ef7eb2e8f9f7 74 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 75 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 76 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 77 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 78 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 79 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 80 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 81 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 82 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 83 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 84 *
<> 144:ef7eb2e8f9f7 85 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 86 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 87 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 88 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 89 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 90 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 91 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 92 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 93 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 94 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 95 *
<> 144:ef7eb2e8f9f7 96 ******************************************************************************
<> 144:ef7eb2e8f9f7 97 */
<> 144:ef7eb2e8f9f7 98
<> 144:ef7eb2e8f9f7 99 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 100 #include "stm32f7xx_hal.h"
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 /** @addtogroup STM32F7xx_HAL_Driver
<> 144:ef7eb2e8f9f7 103 * @{
<> 144:ef7eb2e8f9f7 104 */
<> 144:ef7eb2e8f9f7 105 #if defined (STM32F756xx) || defined (STM32F777xx) || defined (STM32F779xx)
<> 144:ef7eb2e8f9f7 106 /** @defgroup CRYPEx CRYPEx
<> 144:ef7eb2e8f9f7 107 * @brief CRYP Extension HAL module driver.
<> 144:ef7eb2e8f9f7 108 * @{
<> 144:ef7eb2e8f9f7 109 */
<> 144:ef7eb2e8f9f7 110
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 #ifdef HAL_CRYP_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 113
<> 144:ef7eb2e8f9f7 114 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 115 /* Private define ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 116 /** @addtogroup CRYPEx_Private_define
<> 144:ef7eb2e8f9f7 117 * @{
<> 144:ef7eb2e8f9f7 118 */
<> 144:ef7eb2e8f9f7 119 #define CRYPEx_TIMEOUT_VALUE 1
<> 144:ef7eb2e8f9f7 120 /**
<> 144:ef7eb2e8f9f7 121 * @}
<> 144:ef7eb2e8f9f7 122 */
<> 144:ef7eb2e8f9f7 123
<> 144:ef7eb2e8f9f7 124 /* Private macro -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 125 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 126 /* Private function prototypes -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 127 /** @defgroup CRYPEx_Private_Functions_prototypes CRYP Private Functions Prototypes
<> 144:ef7eb2e8f9f7 128 * @{
<> 144:ef7eb2e8f9f7 129 */
<> 144:ef7eb2e8f9f7 130 static void CRYPEx_GCMCCM_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector);
<> 144:ef7eb2e8f9f7 131 static void CRYPEx_GCMCCM_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize);
<> 144:ef7eb2e8f9f7 132 static HAL_StatusTypeDef CRYPEx_GCMCCM_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t *Input, uint16_t Ilength, uint8_t *Output, uint32_t Timeout);
<> 144:ef7eb2e8f9f7 133 static HAL_StatusTypeDef CRYPEx_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint32_t Timeout);
<> 144:ef7eb2e8f9f7 134 static void CRYPEx_GCMCCM_DMAInCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 135 static void CRYPEx_GCMCCM_DMAOutCplt(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 136 static void CRYPEx_GCMCCM_DMAError(DMA_HandleTypeDef *hdma);
<> 144:ef7eb2e8f9f7 137 static void CRYPEx_GCMCCM_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr);
<> 144:ef7eb2e8f9f7 138 /**
<> 144:ef7eb2e8f9f7 139 * @}
<> 144:ef7eb2e8f9f7 140 */
<> 144:ef7eb2e8f9f7 141
<> 144:ef7eb2e8f9f7 142 /* Private functions ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 143 /** @addtogroup CRYPEx_Private_Functions
<> 144:ef7eb2e8f9f7 144 * @{
<> 144:ef7eb2e8f9f7 145 */
<> 144:ef7eb2e8f9f7 146
<> 144:ef7eb2e8f9f7 147 /**
<> 144:ef7eb2e8f9f7 148 * @brief DMA CRYP Input Data process complete callback.
<> 144:ef7eb2e8f9f7 149 * @param hdma: DMA handle
<> 144:ef7eb2e8f9f7 150 * @retval None
<> 144:ef7eb2e8f9f7 151 */
<> 144:ef7eb2e8f9f7 152 static void CRYPEx_GCMCCM_DMAInCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 153 {
<> 144:ef7eb2e8f9f7 154 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 155
<> 144:ef7eb2e8f9f7 156 /* Disable the DMA transfer for input Fifo request by resetting the DIEN bit
<> 144:ef7eb2e8f9f7 157 in the DMACR register */
<> 144:ef7eb2e8f9f7 158 hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DIEN);
<> 144:ef7eb2e8f9f7 159
<> 144:ef7eb2e8f9f7 160 /* Call input data transfer complete callback */
<> 144:ef7eb2e8f9f7 161 HAL_CRYP_InCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 162 }
<> 144:ef7eb2e8f9f7 163
<> 144:ef7eb2e8f9f7 164 /**
<> 144:ef7eb2e8f9f7 165 * @brief DMA CRYP Output Data process complete callback.
<> 144:ef7eb2e8f9f7 166 * @param hdma: DMA handle
<> 144:ef7eb2e8f9f7 167 * @retval None
<> 144:ef7eb2e8f9f7 168 */
<> 144:ef7eb2e8f9f7 169 static void CRYPEx_GCMCCM_DMAOutCplt(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 170 {
<> 144:ef7eb2e8f9f7 171 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 172
<> 144:ef7eb2e8f9f7 173 /* Disable the DMA transfer for output Fifo request by resetting the DOEN bit
<> 144:ef7eb2e8f9f7 174 in the DMACR register */
<> 144:ef7eb2e8f9f7 175 hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DOEN);
<> 144:ef7eb2e8f9f7 176
<> 144:ef7eb2e8f9f7 177 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 178 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 179
<> 144:ef7eb2e8f9f7 180 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 181 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 182
<> 144:ef7eb2e8f9f7 183 /* Call output data transfer complete callback */
<> 144:ef7eb2e8f9f7 184 HAL_CRYP_OutCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 185 }
<> 144:ef7eb2e8f9f7 186
<> 144:ef7eb2e8f9f7 187 /**
<> 144:ef7eb2e8f9f7 188 * @brief DMA CRYP communication error callback.
<> 144:ef7eb2e8f9f7 189 * @param hdma: DMA handle
<> 144:ef7eb2e8f9f7 190 * @retval None
<> 144:ef7eb2e8f9f7 191 */
<> 144:ef7eb2e8f9f7 192 static void CRYPEx_GCMCCM_DMAError(DMA_HandleTypeDef *hdma)
<> 144:ef7eb2e8f9f7 193 {
<> 144:ef7eb2e8f9f7 194 CRYP_HandleTypeDef* hcryp = ( CRYP_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
<> 144:ef7eb2e8f9f7 195 hcryp->State= HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 196 HAL_CRYP_ErrorCallback(hcryp);
<> 144:ef7eb2e8f9f7 197 }
<> 144:ef7eb2e8f9f7 198
<> 144:ef7eb2e8f9f7 199 /**
<> 144:ef7eb2e8f9f7 200 * @brief Writes the Key in Key registers.
<> 144:ef7eb2e8f9f7 201 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 202 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 203 * @param Key: Pointer to Key buffer
<> 144:ef7eb2e8f9f7 204 * @param KeySize: Size of Key
<> 144:ef7eb2e8f9f7 205 * @retval None
<> 144:ef7eb2e8f9f7 206 */
<> 144:ef7eb2e8f9f7 207 static void CRYPEx_GCMCCM_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize)
<> 144:ef7eb2e8f9f7 208 {
<> 144:ef7eb2e8f9f7 209 uint32_t keyaddr = (uint32_t)Key;
<> 144:ef7eb2e8f9f7 210
<> 144:ef7eb2e8f9f7 211 switch(KeySize)
<> 144:ef7eb2e8f9f7 212 {
<> 144:ef7eb2e8f9f7 213 case CRYP_KEYSIZE_256B:
<> 144:ef7eb2e8f9f7 214 /* Key Initialisation */
<> 144:ef7eb2e8f9f7 215 hcryp->Instance->K0LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 216 keyaddr+=4;
<> 144:ef7eb2e8f9f7 217 hcryp->Instance->K0RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 218 keyaddr+=4;
<> 144:ef7eb2e8f9f7 219 hcryp->Instance->K1LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 220 keyaddr+=4;
<> 144:ef7eb2e8f9f7 221 hcryp->Instance->K1RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 222 keyaddr+=4;
<> 144:ef7eb2e8f9f7 223 hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 224 keyaddr+=4;
<> 144:ef7eb2e8f9f7 225 hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 226 keyaddr+=4;
<> 144:ef7eb2e8f9f7 227 hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 228 keyaddr+=4;
<> 144:ef7eb2e8f9f7 229 hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 230 break;
<> 144:ef7eb2e8f9f7 231 case CRYP_KEYSIZE_192B:
<> 144:ef7eb2e8f9f7 232 hcryp->Instance->K1LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 233 keyaddr+=4;
<> 144:ef7eb2e8f9f7 234 hcryp->Instance->K1RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 235 keyaddr+=4;
<> 144:ef7eb2e8f9f7 236 hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 237 keyaddr+=4;
<> 144:ef7eb2e8f9f7 238 hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 239 keyaddr+=4;
<> 144:ef7eb2e8f9f7 240 hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 241 keyaddr+=4;
<> 144:ef7eb2e8f9f7 242 hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 243 break;
<> 144:ef7eb2e8f9f7 244 case CRYP_KEYSIZE_128B:
<> 144:ef7eb2e8f9f7 245 hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 246 keyaddr+=4;
<> 144:ef7eb2e8f9f7 247 hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 248 keyaddr+=4;
<> 144:ef7eb2e8f9f7 249 hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 250 keyaddr+=4;
<> 144:ef7eb2e8f9f7 251 hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr));
<> 144:ef7eb2e8f9f7 252 break;
<> 144:ef7eb2e8f9f7 253 default:
<> 144:ef7eb2e8f9f7 254 break;
<> 144:ef7eb2e8f9f7 255 }
<> 144:ef7eb2e8f9f7 256 }
<> 144:ef7eb2e8f9f7 257
<> 144:ef7eb2e8f9f7 258 /**
<> 144:ef7eb2e8f9f7 259 * @brief Writes the InitVector/InitCounter in IV registers.
<> 144:ef7eb2e8f9f7 260 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 261 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 262 * @param InitVector: Pointer to InitVector/InitCounter buffer
<> 144:ef7eb2e8f9f7 263 * @retval None
<> 144:ef7eb2e8f9f7 264 */
<> 144:ef7eb2e8f9f7 265 static void CRYPEx_GCMCCM_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector)
<> 144:ef7eb2e8f9f7 266 {
<> 144:ef7eb2e8f9f7 267 uint32_t ivaddr = (uint32_t)InitVector;
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 hcryp->Instance->IV0LR = __REV(*(uint32_t*)(ivaddr));
<> 144:ef7eb2e8f9f7 270 ivaddr+=4;
<> 144:ef7eb2e8f9f7 271 hcryp->Instance->IV0RR = __REV(*(uint32_t*)(ivaddr));
<> 144:ef7eb2e8f9f7 272 ivaddr+=4;
<> 144:ef7eb2e8f9f7 273 hcryp->Instance->IV1LR = __REV(*(uint32_t*)(ivaddr));
<> 144:ef7eb2e8f9f7 274 ivaddr+=4;
<> 144:ef7eb2e8f9f7 275 hcryp->Instance->IV1RR = __REV(*(uint32_t*)(ivaddr));
<> 144:ef7eb2e8f9f7 276 }
<> 144:ef7eb2e8f9f7 277
<> 144:ef7eb2e8f9f7 278 /**
<> 144:ef7eb2e8f9f7 279 * @brief Process Data: Writes Input data in polling mode and read the Output data.
<> 144:ef7eb2e8f9f7 280 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 281 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 282 * @param Input: Pointer to the Input buffer.
<> 144:ef7eb2e8f9f7 283 * @param Ilength: Length of the Input buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 284 * @param Output: Pointer to the returned buffer
<> 144:ef7eb2e8f9f7 285 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 286 * @retval None
<> 144:ef7eb2e8f9f7 287 */
<> 144:ef7eb2e8f9f7 288 static HAL_StatusTypeDef CRYPEx_GCMCCM_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t *Input, uint16_t Ilength, uint8_t *Output, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 289 {
<> 144:ef7eb2e8f9f7 290 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 291 uint32_t i = 0;
<> 144:ef7eb2e8f9f7 292 uint32_t inputaddr = (uint32_t)Input;
<> 144:ef7eb2e8f9f7 293 uint32_t outputaddr = (uint32_t)Output;
<> 144:ef7eb2e8f9f7 294
<> 144:ef7eb2e8f9f7 295 for(i=0; (i < Ilength); i+=16)
<> 144:ef7eb2e8f9f7 296 {
<> 144:ef7eb2e8f9f7 297 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 298 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 299 inputaddr+=4;
<> 144:ef7eb2e8f9f7 300 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 301 inputaddr+=4;
<> 144:ef7eb2e8f9f7 302 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 303 inputaddr+=4;
<> 144:ef7eb2e8f9f7 304 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 305 inputaddr+=4;
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 /* Get tick */
<> 144:ef7eb2e8f9f7 308 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 309
<> 144:ef7eb2e8f9f7 310 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE))
<> 144:ef7eb2e8f9f7 311 {
<> 144:ef7eb2e8f9f7 312 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 313 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 314 {
<> 144:ef7eb2e8f9f7 315 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 316 {
<> 144:ef7eb2e8f9f7 317 /* Change state */
<> 144:ef7eb2e8f9f7 318 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 319
<> 144:ef7eb2e8f9f7 320 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 321 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 322
<> 144:ef7eb2e8f9f7 323 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 324 }
<> 144:ef7eb2e8f9f7 325 }
<> 144:ef7eb2e8f9f7 326 }
<> 144:ef7eb2e8f9f7 327 /* Read the Output block from the OUT FIFO */
<> 144:ef7eb2e8f9f7 328 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 329 outputaddr+=4;
<> 144:ef7eb2e8f9f7 330 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 331 outputaddr+=4;
<> 144:ef7eb2e8f9f7 332 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 333 outputaddr+=4;
<> 144:ef7eb2e8f9f7 334 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 335 outputaddr+=4;
<> 144:ef7eb2e8f9f7 336 }
<> 144:ef7eb2e8f9f7 337 /* Return function status */
<> 144:ef7eb2e8f9f7 338 return HAL_OK;
<> 144:ef7eb2e8f9f7 339 }
<> 144:ef7eb2e8f9f7 340
<> 144:ef7eb2e8f9f7 341 /**
<> 144:ef7eb2e8f9f7 342 * @brief Sets the header phase
<> 144:ef7eb2e8f9f7 343 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 344 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 345 * @param Input: Pointer to the Input buffer.
<> 144:ef7eb2e8f9f7 346 * @param Ilength: Length of the Input buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 347 * @param Timeout: Timeout value
<> 144:ef7eb2e8f9f7 348 * @retval None
<> 144:ef7eb2e8f9f7 349 */
<> 144:ef7eb2e8f9f7 350 static HAL_StatusTypeDef CRYPEx_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 351 {
<> 144:ef7eb2e8f9f7 352 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 353 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 354 uint32_t headeraddr = (uint32_t)Input;
<> 144:ef7eb2e8f9f7 355
<> 144:ef7eb2e8f9f7 356 /***************************** Header phase *********************************/
<> 144:ef7eb2e8f9f7 357 if(hcryp->Init.HeaderSize != 0)
<> 144:ef7eb2e8f9f7 358 {
<> 144:ef7eb2e8f9f7 359 /* Select header phase */
<> 144:ef7eb2e8f9f7 360 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 361 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 362 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 363
<> 144:ef7eb2e8f9f7 364 for(loopcounter = 0; (loopcounter < hcryp->Init.HeaderSize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 365 {
<> 144:ef7eb2e8f9f7 366 /* Get tick */
<> 144:ef7eb2e8f9f7 367 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 368
<> 144:ef7eb2e8f9f7 369 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 370 {
<> 144:ef7eb2e8f9f7 371 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 372 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 373 {
<> 144:ef7eb2e8f9f7 374 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 375 {
<> 144:ef7eb2e8f9f7 376 /* Change state */
<> 144:ef7eb2e8f9f7 377 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 378
<> 144:ef7eb2e8f9f7 379 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 380 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 381
<> 144:ef7eb2e8f9f7 382 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 383 }
<> 144:ef7eb2e8f9f7 384 }
<> 144:ef7eb2e8f9f7 385 }
<> 144:ef7eb2e8f9f7 386 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 387 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 388 headeraddr+=4;
<> 144:ef7eb2e8f9f7 389 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 390 headeraddr+=4;
<> 144:ef7eb2e8f9f7 391 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 392 headeraddr+=4;
<> 144:ef7eb2e8f9f7 393 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 394 headeraddr+=4;
<> 144:ef7eb2e8f9f7 395 }
<> 144:ef7eb2e8f9f7 396
<> 144:ef7eb2e8f9f7 397 /* Wait until the complete message has been processed */
<> 144:ef7eb2e8f9f7 398
<> 144:ef7eb2e8f9f7 399 /* Get tick */
<> 144:ef7eb2e8f9f7 400 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 401
<> 144:ef7eb2e8f9f7 402 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 403 {
<> 144:ef7eb2e8f9f7 404 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 405 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 406 {
<> 144:ef7eb2e8f9f7 407 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 408 {
<> 144:ef7eb2e8f9f7 409 /* Change state */
<> 144:ef7eb2e8f9f7 410 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 411
<> 144:ef7eb2e8f9f7 412 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 413 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 414
<> 144:ef7eb2e8f9f7 415 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 416 }
<> 144:ef7eb2e8f9f7 417 }
<> 144:ef7eb2e8f9f7 418 }
<> 144:ef7eb2e8f9f7 419 }
<> 144:ef7eb2e8f9f7 420 /* Return function status */
<> 144:ef7eb2e8f9f7 421 return HAL_OK;
<> 144:ef7eb2e8f9f7 422 }
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 /**
<> 144:ef7eb2e8f9f7 425 * @brief Sets the DMA configuration and start the DMA transfer.
<> 144:ef7eb2e8f9f7 426 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 427 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 428 * @param inputaddr: Address of the Input buffer
<> 144:ef7eb2e8f9f7 429 * @param Size: Size of the Input buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 430 * @param outputaddr: Address of the Output buffer
<> 144:ef7eb2e8f9f7 431 * @retval None
<> 144:ef7eb2e8f9f7 432 */
<> 144:ef7eb2e8f9f7 433 static void CRYPEx_GCMCCM_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr)
<> 144:ef7eb2e8f9f7 434 {
<> 144:ef7eb2e8f9f7 435 /* Set the CRYP DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 436 hcryp->hdmain->XferCpltCallback = CRYPEx_GCMCCM_DMAInCplt;
<> 144:ef7eb2e8f9f7 437 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 438 hcryp->hdmain->XferErrorCallback = CRYPEx_GCMCCM_DMAError;
<> 144:ef7eb2e8f9f7 439
<> 144:ef7eb2e8f9f7 440 /* Set the CRYP DMA transfer complete callback */
<> 144:ef7eb2e8f9f7 441 hcryp->hdmaout->XferCpltCallback = CRYPEx_GCMCCM_DMAOutCplt;
<> 144:ef7eb2e8f9f7 442 /* Set the DMA error callback */
<> 144:ef7eb2e8f9f7 443 hcryp->hdmaout->XferErrorCallback = CRYPEx_GCMCCM_DMAError;
<> 144:ef7eb2e8f9f7 444
<> 144:ef7eb2e8f9f7 445 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 446 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 447
<> 144:ef7eb2e8f9f7 448 /* Enable the DMA In DMA Stream */
<> 144:ef7eb2e8f9f7 449 HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DR, Size/4);
<> 144:ef7eb2e8f9f7 450
<> 144:ef7eb2e8f9f7 451 /* Enable In DMA request */
<> 144:ef7eb2e8f9f7 452 hcryp->Instance->DMACR = CRYP_DMACR_DIEN;
<> 144:ef7eb2e8f9f7 453
<> 144:ef7eb2e8f9f7 454 /* Enable the DMA Out DMA Stream */
<> 144:ef7eb2e8f9f7 455 HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUT, outputaddr, Size/4);
<> 144:ef7eb2e8f9f7 456
<> 144:ef7eb2e8f9f7 457 /* Enable Out DMA request */
<> 144:ef7eb2e8f9f7 458 hcryp->Instance->DMACR |= CRYP_DMACR_DOEN;
<> 144:ef7eb2e8f9f7 459 }
<> 144:ef7eb2e8f9f7 460
<> 144:ef7eb2e8f9f7 461 /**
<> 144:ef7eb2e8f9f7 462 * @}
<> 144:ef7eb2e8f9f7 463 */
<> 144:ef7eb2e8f9f7 464
<> 144:ef7eb2e8f9f7 465 /* Exported functions---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 466 /** @addtogroup CRYPEx_Exported_Functions
<> 144:ef7eb2e8f9f7 467 * @{
<> 144:ef7eb2e8f9f7 468 */
<> 144:ef7eb2e8f9f7 469
<> 144:ef7eb2e8f9f7 470 /** @defgroup CRYPEx_Exported_Functions_Group1 Extended AES processing functions
<> 144:ef7eb2e8f9f7 471 * @brief Extended processing functions.
<> 144:ef7eb2e8f9f7 472 *
<> 144:ef7eb2e8f9f7 473 @verbatim
<> 144:ef7eb2e8f9f7 474 ==============================================================================
<> 144:ef7eb2e8f9f7 475 ##### Extended AES processing functions #####
<> 144:ef7eb2e8f9f7 476 ==============================================================================
<> 144:ef7eb2e8f9f7 477 [..] This section provides functions allowing to:
<> 144:ef7eb2e8f9f7 478 (+) Encrypt plaintext using AES-128/192/256 using GCM and CCM chaining modes
<> 144:ef7eb2e8f9f7 479 (+) Decrypt cyphertext using AES-128/192/256 using GCM and CCM chaining modes
<> 144:ef7eb2e8f9f7 480 (+) Finish the processing. This function is available only for GCM and CCM
<> 144:ef7eb2e8f9f7 481 [..] Three processing methods are available:
<> 144:ef7eb2e8f9f7 482 (+) Polling mode
<> 144:ef7eb2e8f9f7 483 (+) Interrupt mode
<> 144:ef7eb2e8f9f7 484 (+) DMA mode
<> 144:ef7eb2e8f9f7 485
<> 144:ef7eb2e8f9f7 486 @endverbatim
<> 144:ef7eb2e8f9f7 487 * @{
<> 144:ef7eb2e8f9f7 488 */
<> 144:ef7eb2e8f9f7 489
<> 144:ef7eb2e8f9f7 490
<> 144:ef7eb2e8f9f7 491 /**
<> 144:ef7eb2e8f9f7 492 * @brief Initializes the CRYP peripheral in AES CCM encryption mode then
<> 144:ef7eb2e8f9f7 493 * encrypt pPlainData. The cypher data are available in pCypherData.
<> 144:ef7eb2e8f9f7 494 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 495 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 496 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 497 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 498 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 499 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 500 * @retval HAL status
<> 144:ef7eb2e8f9f7 501 */
<> 144:ef7eb2e8f9f7 502 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 503 {
<> 144:ef7eb2e8f9f7 504 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 505 uint32_t headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 506 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 507 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 508 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 509 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 510 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 511 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 512
<> 144:ef7eb2e8f9f7 513 /* Process Locked */
<> 144:ef7eb2e8f9f7 514 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 515
<> 144:ef7eb2e8f9f7 516 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 517 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 518
<> 144:ef7eb2e8f9f7 519 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 520 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 521 {
<> 144:ef7eb2e8f9f7 522 /************************ Formatting the header block *********************/
<> 144:ef7eb2e8f9f7 523 if(headersize != 0)
<> 144:ef7eb2e8f9f7 524 {
<> 144:ef7eb2e8f9f7 525 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 526 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 527 {
<> 144:ef7eb2e8f9f7 528 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF);
<> 144:ef7eb2e8f9f7 529 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF);
<> 144:ef7eb2e8f9f7 530 headersize += 2;
<> 144:ef7eb2e8f9f7 531 }
<> 144:ef7eb2e8f9f7 532 else
<> 144:ef7eb2e8f9f7 533 {
<> 144:ef7eb2e8f9f7 534 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 535 hcryp->Init.pScratch[bufferidx++] = 0xFF;
<> 144:ef7eb2e8f9f7 536 hcryp->Init.pScratch[bufferidx++] = 0xFE;
<> 144:ef7eb2e8f9f7 537 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 538 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 539 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 540 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 541 headersize += 6;
<> 144:ef7eb2e8f9f7 542 }
<> 144:ef7eb2e8f9f7 543 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 544 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 545 {
<> 144:ef7eb2e8f9f7 546 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 547 }
<> 144:ef7eb2e8f9f7 548 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 549 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 550 {
<> 144:ef7eb2e8f9f7 551 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 552 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 553 {
<> 144:ef7eb2e8f9f7 554 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 555 }
<> 144:ef7eb2e8f9f7 556 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 557 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 558 }
<> 144:ef7eb2e8f9f7 559 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 560 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 561 }
<> 144:ef7eb2e8f9f7 562 /*********************** Formatting the block B0 **************************/
<> 144:ef7eb2e8f9f7 563 if(headersize != 0)
<> 144:ef7eb2e8f9f7 564 {
<> 144:ef7eb2e8f9f7 565 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 566 }
<> 144:ef7eb2e8f9f7 567 /* Flags byte */
<> 144:ef7eb2e8f9f7 568 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 569 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 570 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 571
<> 144:ef7eb2e8f9f7 572 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 573 {
<> 144:ef7eb2e8f9f7 574 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 575 }
<> 144:ef7eb2e8f9f7 576 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 577 {
<> 144:ef7eb2e8f9f7 578 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 579 }
<> 144:ef7eb2e8f9f7 580
<> 144:ef7eb2e8f9f7 581 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 582 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 583
<> 144:ef7eb2e8f9f7 584 /************************* Formatting the initial counter *****************/
<> 144:ef7eb2e8f9f7 585 /* Byte 0:
<> 144:ef7eb2e8f9f7 586 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 587 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter blocks
<> 144:ef7eb2e8f9f7 588 are distinct from B0
<> 144:ef7eb2e8f9f7 589 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 590 */
<> 144:ef7eb2e8f9f7 591 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 592 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 593 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 594 {
<> 144:ef7eb2e8f9f7 595 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 596 }
<> 144:ef7eb2e8f9f7 597 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 598 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 599
<> 144:ef7eb2e8f9f7 600 /* Set the key */
<> 144:ef7eb2e8f9f7 601 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 602
<> 144:ef7eb2e8f9f7 603 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 604 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 605
<> 144:ef7eb2e8f9f7 606 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 607 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 608
<> 144:ef7eb2e8f9f7 609 /* Select init phase */
<> 144:ef7eb2e8f9f7 610 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 611
<> 144:ef7eb2e8f9f7 612 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 613 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 614 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 615 b0addr+=4;
<> 144:ef7eb2e8f9f7 616 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 617 b0addr+=4;
<> 144:ef7eb2e8f9f7 618 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 619 b0addr+=4;
<> 144:ef7eb2e8f9f7 620 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 621
<> 144:ef7eb2e8f9f7 622 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 623 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 624
<> 144:ef7eb2e8f9f7 625 /* Get tick */
<> 144:ef7eb2e8f9f7 626 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 627
<> 144:ef7eb2e8f9f7 628 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 629 {
<> 144:ef7eb2e8f9f7 630 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 631 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 632 {
<> 144:ef7eb2e8f9f7 633 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 634 {
<> 144:ef7eb2e8f9f7 635 /* Change state */
<> 144:ef7eb2e8f9f7 636 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 637
<> 144:ef7eb2e8f9f7 638 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 639 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 640
<> 144:ef7eb2e8f9f7 641 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 642 }
<> 144:ef7eb2e8f9f7 643 }
<> 144:ef7eb2e8f9f7 644 }
<> 144:ef7eb2e8f9f7 645 /***************************** Header phase *******************************/
<> 144:ef7eb2e8f9f7 646 if(headersize != 0)
<> 144:ef7eb2e8f9f7 647 {
<> 144:ef7eb2e8f9f7 648 /* Select header phase */
<> 144:ef7eb2e8f9f7 649 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 650
<> 144:ef7eb2e8f9f7 651 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 652 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 653
<> 144:ef7eb2e8f9f7 654 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 655 {
<> 144:ef7eb2e8f9f7 656 /* Get tick */
<> 144:ef7eb2e8f9f7 657 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 658
<> 144:ef7eb2e8f9f7 659 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 660 {
<> 144:ef7eb2e8f9f7 661 {
<> 144:ef7eb2e8f9f7 662 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 663 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 664 {
<> 144:ef7eb2e8f9f7 665 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 666 {
<> 144:ef7eb2e8f9f7 667 /* Change state */
<> 144:ef7eb2e8f9f7 668 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 669
<> 144:ef7eb2e8f9f7 670 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 671 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 672
<> 144:ef7eb2e8f9f7 673 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 674 }
<> 144:ef7eb2e8f9f7 675 }
<> 144:ef7eb2e8f9f7 676 }
<> 144:ef7eb2e8f9f7 677 }
<> 144:ef7eb2e8f9f7 678 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 679 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 680 headeraddr+=4;
<> 144:ef7eb2e8f9f7 681 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 682 headeraddr+=4;
<> 144:ef7eb2e8f9f7 683 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 684 headeraddr+=4;
<> 144:ef7eb2e8f9f7 685 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 686 headeraddr+=4;
<> 144:ef7eb2e8f9f7 687 }
<> 144:ef7eb2e8f9f7 688
<> 144:ef7eb2e8f9f7 689 /* Get tick */
<> 144:ef7eb2e8f9f7 690 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 691
<> 144:ef7eb2e8f9f7 692 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 693 {
<> 144:ef7eb2e8f9f7 694 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 695 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 696 {
<> 144:ef7eb2e8f9f7 697 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 698 {
<> 144:ef7eb2e8f9f7 699 /* Change state */
<> 144:ef7eb2e8f9f7 700 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 701
<> 144:ef7eb2e8f9f7 702 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 703 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 704
<> 144:ef7eb2e8f9f7 705 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 706 }
<> 144:ef7eb2e8f9f7 707 }
<> 144:ef7eb2e8f9f7 708 }
<> 144:ef7eb2e8f9f7 709 }
<> 144:ef7eb2e8f9f7 710 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 711 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 712 {
<> 144:ef7eb2e8f9f7 713 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 714 }
<> 144:ef7eb2e8f9f7 715 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 716 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 717
<> 144:ef7eb2e8f9f7 718 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 719 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 720
<> 144:ef7eb2e8f9f7 721 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 722 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 723
<> 144:ef7eb2e8f9f7 724 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 725 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 726
<> 144:ef7eb2e8f9f7 727 /* Set the phase */
<> 144:ef7eb2e8f9f7 728 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 729 }
<> 144:ef7eb2e8f9f7 730
<> 144:ef7eb2e8f9f7 731 /* Write Plain Data and Get Cypher Data */
<> 144:ef7eb2e8f9f7 732 if(CRYPEx_GCMCCM_ProcessData(hcryp,pPlainData, Size, pCypherData, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 733 {
<> 144:ef7eb2e8f9f7 734 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 735 }
<> 144:ef7eb2e8f9f7 736
<> 144:ef7eb2e8f9f7 737 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 738 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 739
<> 144:ef7eb2e8f9f7 740 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 741 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 742
<> 144:ef7eb2e8f9f7 743 /* Return function status */
<> 144:ef7eb2e8f9f7 744 return HAL_OK;
<> 144:ef7eb2e8f9f7 745 }
<> 144:ef7eb2e8f9f7 746
<> 144:ef7eb2e8f9f7 747 /**
<> 144:ef7eb2e8f9f7 748 * @brief Initializes the CRYP peripheral in AES GCM encryption mode then
<> 144:ef7eb2e8f9f7 749 * encrypt pPlainData. The cypher data are available in pCypherData.
<> 144:ef7eb2e8f9f7 750 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 751 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 752 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 753 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 754 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 755 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 756 * @retval HAL status
<> 144:ef7eb2e8f9f7 757 */
<> 144:ef7eb2e8f9f7 758 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 759 {
<> 144:ef7eb2e8f9f7 760 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 761
<> 144:ef7eb2e8f9f7 762 /* Process Locked */
<> 144:ef7eb2e8f9f7 763 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 764
<> 144:ef7eb2e8f9f7 765 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 766 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 767
<> 144:ef7eb2e8f9f7 768 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 769 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 770 {
<> 144:ef7eb2e8f9f7 771 /* Set the key */
<> 144:ef7eb2e8f9f7 772 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 773
<> 144:ef7eb2e8f9f7 774 /* Set the CRYP peripheral in AES GCM mode */
<> 144:ef7eb2e8f9f7 775 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 776
<> 144:ef7eb2e8f9f7 777 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 778 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 779
<> 144:ef7eb2e8f9f7 780 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 781 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 782
<> 144:ef7eb2e8f9f7 783 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 784 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 785
<> 144:ef7eb2e8f9f7 786 /* Get tick */
<> 144:ef7eb2e8f9f7 787 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 788
<> 144:ef7eb2e8f9f7 789 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 790 {
<> 144:ef7eb2e8f9f7 791 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 792 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 793 {
<> 144:ef7eb2e8f9f7 794 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 795 {
<> 144:ef7eb2e8f9f7 796 /* Change state */
<> 144:ef7eb2e8f9f7 797 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 798
<> 144:ef7eb2e8f9f7 799 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 800 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 801
<> 144:ef7eb2e8f9f7 802 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 803 }
<> 144:ef7eb2e8f9f7 804 }
<> 144:ef7eb2e8f9f7 805 }
<> 144:ef7eb2e8f9f7 806
<> 144:ef7eb2e8f9f7 807 /* Set the header phase */
<> 144:ef7eb2e8f9f7 808 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 809 {
<> 144:ef7eb2e8f9f7 810 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 811 }
<> 144:ef7eb2e8f9f7 812
<> 144:ef7eb2e8f9f7 813 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 814 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 815
<> 144:ef7eb2e8f9f7 816 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 817 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 818
<> 144:ef7eb2e8f9f7 819 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 820 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 821
<> 144:ef7eb2e8f9f7 822 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 823 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 824
<> 144:ef7eb2e8f9f7 825 /* Set the phase */
<> 144:ef7eb2e8f9f7 826 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 827 }
<> 144:ef7eb2e8f9f7 828
<> 144:ef7eb2e8f9f7 829 /* Write Plain Data and Get Cypher Data */
<> 144:ef7eb2e8f9f7 830 if(CRYPEx_GCMCCM_ProcessData(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 831 {
<> 144:ef7eb2e8f9f7 832 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 833 }
<> 144:ef7eb2e8f9f7 834
<> 144:ef7eb2e8f9f7 835 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 836 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 837
<> 144:ef7eb2e8f9f7 838 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 839 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 840
<> 144:ef7eb2e8f9f7 841 /* Return function status */
<> 144:ef7eb2e8f9f7 842 return HAL_OK;
<> 144:ef7eb2e8f9f7 843 }
<> 144:ef7eb2e8f9f7 844
<> 144:ef7eb2e8f9f7 845 /**
<> 144:ef7eb2e8f9f7 846 * @brief Initializes the CRYP peripheral in AES GCM decryption mode then
<> 144:ef7eb2e8f9f7 847 * decrypted pCypherData. The cypher data are available in pPlainData.
<> 144:ef7eb2e8f9f7 848 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 849 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 850 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 851 * @param Size: Length of the cyphertext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 852 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 853 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 854 * @retval HAL status
<> 144:ef7eb2e8f9f7 855 */
<> 144:ef7eb2e8f9f7 856 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 857 {
<> 144:ef7eb2e8f9f7 858 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 859
<> 144:ef7eb2e8f9f7 860 /* Process Locked */
<> 144:ef7eb2e8f9f7 861 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 862
<> 144:ef7eb2e8f9f7 863 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 864 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 865
<> 144:ef7eb2e8f9f7 866 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 867 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 868 {
<> 144:ef7eb2e8f9f7 869 /* Set the key */
<> 144:ef7eb2e8f9f7 870 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 871
<> 144:ef7eb2e8f9f7 872 /* Set the CRYP peripheral in AES GCM decryption mode */
<> 144:ef7eb2e8f9f7 873 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
<> 144:ef7eb2e8f9f7 874
<> 144:ef7eb2e8f9f7 875 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 876 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 877
<> 144:ef7eb2e8f9f7 878 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 879 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 880
<> 144:ef7eb2e8f9f7 881 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 882 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 883
<> 144:ef7eb2e8f9f7 884 /* Get tick */
<> 144:ef7eb2e8f9f7 885 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 886
<> 144:ef7eb2e8f9f7 887 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 888 {
<> 144:ef7eb2e8f9f7 889 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 890 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 891 {
<> 144:ef7eb2e8f9f7 892 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 893 {
<> 144:ef7eb2e8f9f7 894 /* Change state */
<> 144:ef7eb2e8f9f7 895 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 896
<> 144:ef7eb2e8f9f7 897 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 898 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 899
<> 144:ef7eb2e8f9f7 900 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 901 }
<> 144:ef7eb2e8f9f7 902 }
<> 144:ef7eb2e8f9f7 903 }
<> 144:ef7eb2e8f9f7 904
<> 144:ef7eb2e8f9f7 905 /* Set the header phase */
<> 144:ef7eb2e8f9f7 906 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 907 {
<> 144:ef7eb2e8f9f7 908 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 909 }
<> 144:ef7eb2e8f9f7 910 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 911 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 912
<> 144:ef7eb2e8f9f7 913 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 914 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 915
<> 144:ef7eb2e8f9f7 916 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 917 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 918
<> 144:ef7eb2e8f9f7 919 /* Set the phase */
<> 144:ef7eb2e8f9f7 920 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 921 }
<> 144:ef7eb2e8f9f7 922
<> 144:ef7eb2e8f9f7 923 /* Write Plain Data and Get Cypher Data */
<> 144:ef7eb2e8f9f7 924 if(CRYPEx_GCMCCM_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 925 {
<> 144:ef7eb2e8f9f7 926 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 927 }
<> 144:ef7eb2e8f9f7 928
<> 144:ef7eb2e8f9f7 929 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 930 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 931
<> 144:ef7eb2e8f9f7 932 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 933 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 934
<> 144:ef7eb2e8f9f7 935 /* Return function status */
<> 144:ef7eb2e8f9f7 936 return HAL_OK;
<> 144:ef7eb2e8f9f7 937 }
<> 144:ef7eb2e8f9f7 938
<> 144:ef7eb2e8f9f7 939 /**
<> 144:ef7eb2e8f9f7 940 * @brief Computes the authentication TAG.
<> 144:ef7eb2e8f9f7 941 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 942 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 943 * @param Size: Total length of the plain/cyphertext buffer
<> 144:ef7eb2e8f9f7 944 * @param AuthTag: Pointer to the authentication buffer
<> 144:ef7eb2e8f9f7 945 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 946 * @retval HAL status
<> 144:ef7eb2e8f9f7 947 */
<> 144:ef7eb2e8f9f7 948 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Finish(CRYP_HandleTypeDef *hcryp, uint32_t Size, uint8_t *AuthTag, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 949 {
<> 144:ef7eb2e8f9f7 950 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 951 uint64_t headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */
<> 144:ef7eb2e8f9f7 952 uint64_t inputlength = Size * 8; /* input length in bits */
<> 144:ef7eb2e8f9f7 953 uint32_t tagaddr = (uint32_t)AuthTag;
<> 144:ef7eb2e8f9f7 954
<> 144:ef7eb2e8f9f7 955 /* Process Locked */
<> 144:ef7eb2e8f9f7 956 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 957
<> 144:ef7eb2e8f9f7 958 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 959 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 960
<> 144:ef7eb2e8f9f7 961 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 962 if(hcryp->Phase == HAL_CRYP_PHASE_PROCESS)
<> 144:ef7eb2e8f9f7 963 {
<> 144:ef7eb2e8f9f7 964 /* Change the CRYP phase */
<> 144:ef7eb2e8f9f7 965 hcryp->Phase = HAL_CRYP_PHASE_FINAL;
<> 144:ef7eb2e8f9f7 966
<> 144:ef7eb2e8f9f7 967 /* Disable CRYP to start the final phase */
<> 144:ef7eb2e8f9f7 968 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 969
<> 144:ef7eb2e8f9f7 970 /* Select final phase */
<> 144:ef7eb2e8f9f7 971 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_FINAL);
<> 144:ef7eb2e8f9f7 972
<> 144:ef7eb2e8f9f7 973 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 974 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 975
<> 144:ef7eb2e8f9f7 976 /* Write the number of bits in header (64 bits) followed by the number of bits
<> 144:ef7eb2e8f9f7 977 in the payload */
<> 144:ef7eb2e8f9f7 978 if(hcryp->Init.DataType == CRYP_DATATYPE_1B)
<> 144:ef7eb2e8f9f7 979 {
<> 144:ef7eb2e8f9f7 980 hcryp->Instance->DR = __RBIT(headerlength >> 32);
<> 144:ef7eb2e8f9f7 981 hcryp->Instance->DR = __RBIT(headerlength);
<> 144:ef7eb2e8f9f7 982 hcryp->Instance->DR = __RBIT(inputlength >> 32);
<> 144:ef7eb2e8f9f7 983 hcryp->Instance->DR = __RBIT(inputlength);
<> 144:ef7eb2e8f9f7 984 }
<> 144:ef7eb2e8f9f7 985 else if(hcryp->Init.DataType == CRYP_DATATYPE_8B)
<> 144:ef7eb2e8f9f7 986 {
<> 144:ef7eb2e8f9f7 987 hcryp->Instance->DR = __REV(headerlength >> 32);
<> 144:ef7eb2e8f9f7 988 hcryp->Instance->DR = __REV(headerlength);
<> 144:ef7eb2e8f9f7 989 hcryp->Instance->DR = __REV(inputlength >> 32);
<> 144:ef7eb2e8f9f7 990 hcryp->Instance->DR = __REV(inputlength);
<> 144:ef7eb2e8f9f7 991 }
<> 144:ef7eb2e8f9f7 992 else if(hcryp->Init.DataType == CRYP_DATATYPE_16B)
<> 144:ef7eb2e8f9f7 993 {
<> 144:ef7eb2e8f9f7 994 hcryp->Instance->DR = __ROR((uint32_t)(headerlength >> 32), 16);
<> 144:ef7eb2e8f9f7 995 hcryp->Instance->DR = __ROR((uint32_t)headerlength, 16);
<> 144:ef7eb2e8f9f7 996 hcryp->Instance->DR = __ROR((uint32_t)(inputlength >> 32), 16);
<> 144:ef7eb2e8f9f7 997 hcryp->Instance->DR = __ROR((uint32_t)inputlength, 16);
<> 144:ef7eb2e8f9f7 998 }
<> 144:ef7eb2e8f9f7 999 else if(hcryp->Init.DataType == CRYP_DATATYPE_32B)
<> 144:ef7eb2e8f9f7 1000 {
<> 144:ef7eb2e8f9f7 1001 hcryp->Instance->DR = (uint32_t)(headerlength >> 32);
<> 144:ef7eb2e8f9f7 1002 hcryp->Instance->DR = (uint32_t)(headerlength);
<> 144:ef7eb2e8f9f7 1003 hcryp->Instance->DR = (uint32_t)(inputlength >> 32);
<> 144:ef7eb2e8f9f7 1004 hcryp->Instance->DR = (uint32_t)(inputlength);
<> 144:ef7eb2e8f9f7 1005 }
<> 144:ef7eb2e8f9f7 1006 /* Get tick */
<> 144:ef7eb2e8f9f7 1007 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1008
<> 144:ef7eb2e8f9f7 1009 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE))
<> 144:ef7eb2e8f9f7 1010 {
<> 144:ef7eb2e8f9f7 1011 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1012 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1013 {
<> 144:ef7eb2e8f9f7 1014 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1015 {
<> 144:ef7eb2e8f9f7 1016 /* Change state */
<> 144:ef7eb2e8f9f7 1017 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1018
<> 144:ef7eb2e8f9f7 1019 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1020 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1021
<> 144:ef7eb2e8f9f7 1022 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1023 }
<> 144:ef7eb2e8f9f7 1024 }
<> 144:ef7eb2e8f9f7 1025 }
<> 144:ef7eb2e8f9f7 1026
<> 144:ef7eb2e8f9f7 1027 /* Read the Auth TAG in the IN FIFO */
<> 144:ef7eb2e8f9f7 1028 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1029 tagaddr+=4;
<> 144:ef7eb2e8f9f7 1030 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1031 tagaddr+=4;
<> 144:ef7eb2e8f9f7 1032 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1033 tagaddr+=4;
<> 144:ef7eb2e8f9f7 1034 *(uint32_t*)(tagaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1035 }
<> 144:ef7eb2e8f9f7 1036
<> 144:ef7eb2e8f9f7 1037 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1038 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1039
<> 144:ef7eb2e8f9f7 1040 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1041 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1042
<> 144:ef7eb2e8f9f7 1043 /* Return function status */
<> 144:ef7eb2e8f9f7 1044 return HAL_OK;
<> 144:ef7eb2e8f9f7 1045 }
<> 144:ef7eb2e8f9f7 1046
<> 144:ef7eb2e8f9f7 1047 /**
<> 144:ef7eb2e8f9f7 1048 * @brief Computes the authentication TAG for AES CCM mode.
<> 144:ef7eb2e8f9f7 1049 * @note This API is called after HAL_AES_CCM_Encrypt()/HAL_AES_CCM_Decrypt()
<> 144:ef7eb2e8f9f7 1050 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1051 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1052 * @param AuthTag: Pointer to the authentication buffer
<> 144:ef7eb2e8f9f7 1053 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 1054 * @retval HAL status
<> 144:ef7eb2e8f9f7 1055 */
<> 144:ef7eb2e8f9f7 1056 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Finish(CRYP_HandleTypeDef *hcryp, uint8_t *AuthTag, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 1057 {
<> 144:ef7eb2e8f9f7 1058 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1059 uint32_t tagaddr = (uint32_t)AuthTag;
<> 144:ef7eb2e8f9f7 1060 uint32_t ctraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 1061 uint32_t temptag[4] = {0}; /* Temporary TAG (MAC) */
<> 144:ef7eb2e8f9f7 1062 uint32_t loopcounter;
<> 144:ef7eb2e8f9f7 1063
<> 144:ef7eb2e8f9f7 1064 /* Process Locked */
<> 144:ef7eb2e8f9f7 1065 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 1066
<> 144:ef7eb2e8f9f7 1067 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1068 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1069
<> 144:ef7eb2e8f9f7 1070 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1071 if(hcryp->Phase == HAL_CRYP_PHASE_PROCESS)
<> 144:ef7eb2e8f9f7 1072 {
<> 144:ef7eb2e8f9f7 1073 /* Change the CRYP phase */
<> 144:ef7eb2e8f9f7 1074 hcryp->Phase = HAL_CRYP_PHASE_FINAL;
<> 144:ef7eb2e8f9f7 1075
<> 144:ef7eb2e8f9f7 1076 /* Disable CRYP to start the final phase */
<> 144:ef7eb2e8f9f7 1077 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 1078
<> 144:ef7eb2e8f9f7 1079 /* Select final phase */
<> 144:ef7eb2e8f9f7 1080 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_FINAL);
<> 144:ef7eb2e8f9f7 1081
<> 144:ef7eb2e8f9f7 1082 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1083 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1084
<> 144:ef7eb2e8f9f7 1085 /* Write the counter block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1086 hcryp->Instance->DR = *(uint32_t*)ctraddr;
<> 144:ef7eb2e8f9f7 1087 ctraddr+=4;
<> 144:ef7eb2e8f9f7 1088 hcryp->Instance->DR = *(uint32_t*)ctraddr;
<> 144:ef7eb2e8f9f7 1089 ctraddr+=4;
<> 144:ef7eb2e8f9f7 1090 hcryp->Instance->DR = *(uint32_t*)ctraddr;
<> 144:ef7eb2e8f9f7 1091 ctraddr+=4;
<> 144:ef7eb2e8f9f7 1092 hcryp->Instance->DR = *(uint32_t*)ctraddr;
<> 144:ef7eb2e8f9f7 1093
<> 144:ef7eb2e8f9f7 1094 /* Get tick */
<> 144:ef7eb2e8f9f7 1095 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1096
<> 144:ef7eb2e8f9f7 1097 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE))
<> 144:ef7eb2e8f9f7 1098 {
<> 144:ef7eb2e8f9f7 1099 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1100 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1101 {
<> 144:ef7eb2e8f9f7 1102 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1103 {
<> 144:ef7eb2e8f9f7 1104 /* Change state */
<> 144:ef7eb2e8f9f7 1105 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1106
<> 144:ef7eb2e8f9f7 1107 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1108 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1109
<> 144:ef7eb2e8f9f7 1110 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1111 }
<> 144:ef7eb2e8f9f7 1112 }
<> 144:ef7eb2e8f9f7 1113 }
<> 144:ef7eb2e8f9f7 1114
<> 144:ef7eb2e8f9f7 1115 /* Read the Auth TAG in the IN FIFO */
<> 144:ef7eb2e8f9f7 1116 temptag[0] = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1117 temptag[1] = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1118 temptag[2] = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1119 temptag[3] = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1120 }
<> 144:ef7eb2e8f9f7 1121
<> 144:ef7eb2e8f9f7 1122 /* Copy temporary authentication TAG in user TAG buffer */
<> 144:ef7eb2e8f9f7 1123 for(loopcounter = 0; loopcounter < hcryp->Init.TagSize ; loopcounter++)
<> 144:ef7eb2e8f9f7 1124 {
<> 144:ef7eb2e8f9f7 1125 /* Set the authentication TAG buffer */
<> 144:ef7eb2e8f9f7 1126 *((uint8_t*)tagaddr+loopcounter) = *((uint8_t*)temptag+loopcounter);
<> 144:ef7eb2e8f9f7 1127 }
<> 144:ef7eb2e8f9f7 1128
<> 144:ef7eb2e8f9f7 1129 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1130 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1131
<> 144:ef7eb2e8f9f7 1132 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1133 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1134
<> 144:ef7eb2e8f9f7 1135 /* Return function status */
<> 144:ef7eb2e8f9f7 1136 return HAL_OK;
<> 144:ef7eb2e8f9f7 1137 }
<> 144:ef7eb2e8f9f7 1138
<> 144:ef7eb2e8f9f7 1139 /**
<> 144:ef7eb2e8f9f7 1140 * @brief Initializes the CRYP peripheral in AES CCM decryption mode then
<> 144:ef7eb2e8f9f7 1141 * decrypted pCypherData. The cypher data are available in pPlainData.
<> 144:ef7eb2e8f9f7 1142 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1143 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1144 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 1145 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 1146 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 1147 * @param Timeout: Timeout duration
<> 144:ef7eb2e8f9f7 1148 * @retval HAL status
<> 144:ef7eb2e8f9f7 1149 */
<> 144:ef7eb2e8f9f7 1150 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout)
<> 144:ef7eb2e8f9f7 1151 {
<> 144:ef7eb2e8f9f7 1152 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1153 uint32_t headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 1154 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 1155 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 1156 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 1157 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 1158 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 1159 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 1160
<> 144:ef7eb2e8f9f7 1161 /* Process Locked */
<> 144:ef7eb2e8f9f7 1162 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 1163
<> 144:ef7eb2e8f9f7 1164 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1165 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1166
<> 144:ef7eb2e8f9f7 1167 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1168 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 1169 {
<> 144:ef7eb2e8f9f7 1170 /************************ Formatting the header block *********************/
<> 144:ef7eb2e8f9f7 1171 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1172 {
<> 144:ef7eb2e8f9f7 1173 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 1174 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 1175 {
<> 144:ef7eb2e8f9f7 1176 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
<> 144:ef7eb2e8f9f7 1177 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
<> 144:ef7eb2e8f9f7 1178 headersize += 2;
<> 144:ef7eb2e8f9f7 1179 }
<> 144:ef7eb2e8f9f7 1180 else
<> 144:ef7eb2e8f9f7 1181 {
<> 144:ef7eb2e8f9f7 1182 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 1183 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
<> 144:ef7eb2e8f9f7 1184 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
<> 144:ef7eb2e8f9f7 1185 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 1186 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 1187 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 1188 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 1189 headersize += 6;
<> 144:ef7eb2e8f9f7 1190 }
<> 144:ef7eb2e8f9f7 1191 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 1192 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 1193 {
<> 144:ef7eb2e8f9f7 1194 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 1195 }
<> 144:ef7eb2e8f9f7 1196 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 1197 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 1198 {
<> 144:ef7eb2e8f9f7 1199 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 1200 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 1201 {
<> 144:ef7eb2e8f9f7 1202 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 1203 }
<> 144:ef7eb2e8f9f7 1204 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 1205 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 1206 }
<> 144:ef7eb2e8f9f7 1207 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 1208 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 1209 }
<> 144:ef7eb2e8f9f7 1210 /*********************** Formatting the block B0 **************************/
<> 144:ef7eb2e8f9f7 1211 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1212 {
<> 144:ef7eb2e8f9f7 1213 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 1214 }
<> 144:ef7eb2e8f9f7 1215 /* Flags byte */
<> 144:ef7eb2e8f9f7 1216 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 1217 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 1218 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 1219
<> 144:ef7eb2e8f9f7 1220 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 1221 {
<> 144:ef7eb2e8f9f7 1222 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 1223 }
<> 144:ef7eb2e8f9f7 1224 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 1225 {
<> 144:ef7eb2e8f9f7 1226 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 1227 }
<> 144:ef7eb2e8f9f7 1228
<> 144:ef7eb2e8f9f7 1229 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 1230 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 1231
<> 144:ef7eb2e8f9f7 1232 /************************* Formatting the initial counter *****************/
<> 144:ef7eb2e8f9f7 1233 /* Byte 0:
<> 144:ef7eb2e8f9f7 1234 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 1235 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter
<> 144:ef7eb2e8f9f7 1236 blocks are distinct from B0
<> 144:ef7eb2e8f9f7 1237 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 1238 */
<> 144:ef7eb2e8f9f7 1239 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 1240 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 1241 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 1242 {
<> 144:ef7eb2e8f9f7 1243 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 1244 }
<> 144:ef7eb2e8f9f7 1245 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 1246 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 1247
<> 144:ef7eb2e8f9f7 1248 /* Set the key */
<> 144:ef7eb2e8f9f7 1249 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 1250
<> 144:ef7eb2e8f9f7 1251 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 1252 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
<> 144:ef7eb2e8f9f7 1253
<> 144:ef7eb2e8f9f7 1254 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 1255 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 1256
<> 144:ef7eb2e8f9f7 1257 /* Select init phase */
<> 144:ef7eb2e8f9f7 1258 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 1259
<> 144:ef7eb2e8f9f7 1260 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 1261 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1262 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1263 b0addr+=4;
<> 144:ef7eb2e8f9f7 1264 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1265 b0addr+=4;
<> 144:ef7eb2e8f9f7 1266 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1267 b0addr+=4;
<> 144:ef7eb2e8f9f7 1268 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1269
<> 144:ef7eb2e8f9f7 1270 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1271 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1272
<> 144:ef7eb2e8f9f7 1273 /* Get tick */
<> 144:ef7eb2e8f9f7 1274 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1275
<> 144:ef7eb2e8f9f7 1276 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 1277 {
<> 144:ef7eb2e8f9f7 1278 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1279 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1280 {
<> 144:ef7eb2e8f9f7 1281 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1282 {
<> 144:ef7eb2e8f9f7 1283 /* Change state */
<> 144:ef7eb2e8f9f7 1284 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1285
<> 144:ef7eb2e8f9f7 1286 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1287 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1288
<> 144:ef7eb2e8f9f7 1289 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1290 }
<> 144:ef7eb2e8f9f7 1291 }
<> 144:ef7eb2e8f9f7 1292 }
<> 144:ef7eb2e8f9f7 1293 /***************************** Header phase *******************************/
<> 144:ef7eb2e8f9f7 1294 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1295 {
<> 144:ef7eb2e8f9f7 1296 /* Select header phase */
<> 144:ef7eb2e8f9f7 1297 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 1298
<> 144:ef7eb2e8f9f7 1299 /* Enable Crypto processor */
<> 144:ef7eb2e8f9f7 1300 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1301
<> 144:ef7eb2e8f9f7 1302 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 1303 {
<> 144:ef7eb2e8f9f7 1304 /* Get tick */
<> 144:ef7eb2e8f9f7 1305 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1306
<> 144:ef7eb2e8f9f7 1307 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 1308 {
<> 144:ef7eb2e8f9f7 1309 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1310 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1311 {
<> 144:ef7eb2e8f9f7 1312 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1313 {
<> 144:ef7eb2e8f9f7 1314 /* Change state */
<> 144:ef7eb2e8f9f7 1315 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1316
<> 144:ef7eb2e8f9f7 1317 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1318 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1319
<> 144:ef7eb2e8f9f7 1320 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1321 }
<> 144:ef7eb2e8f9f7 1322 }
<> 144:ef7eb2e8f9f7 1323 }
<> 144:ef7eb2e8f9f7 1324 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1325 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1326 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1327 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1328 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1329 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1330 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1331 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1332 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1333 }
<> 144:ef7eb2e8f9f7 1334
<> 144:ef7eb2e8f9f7 1335 /* Get tick */
<> 144:ef7eb2e8f9f7 1336 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1337
<> 144:ef7eb2e8f9f7 1338 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 1339 {
<> 144:ef7eb2e8f9f7 1340 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1341 if(Timeout != HAL_MAX_DELAY)
<> 144:ef7eb2e8f9f7 1342 {
<> 144:ef7eb2e8f9f7 1343 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
<> 144:ef7eb2e8f9f7 1344 {
<> 144:ef7eb2e8f9f7 1345 /* Change state */
<> 144:ef7eb2e8f9f7 1346 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1347
<> 144:ef7eb2e8f9f7 1348 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1349 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1350
<> 144:ef7eb2e8f9f7 1351 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1352 }
<> 144:ef7eb2e8f9f7 1353 }
<> 144:ef7eb2e8f9f7 1354 }
<> 144:ef7eb2e8f9f7 1355 }
<> 144:ef7eb2e8f9f7 1356 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 1357 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 1358 {
<> 144:ef7eb2e8f9f7 1359 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 1360 }
<> 144:ef7eb2e8f9f7 1361 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 1362 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 1363 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 1364 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 1365
<> 144:ef7eb2e8f9f7 1366 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1367 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 1368
<> 144:ef7eb2e8f9f7 1369 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1370 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1371
<> 144:ef7eb2e8f9f7 1372 /* Set the phase */
<> 144:ef7eb2e8f9f7 1373 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1374 }
<> 144:ef7eb2e8f9f7 1375
<> 144:ef7eb2e8f9f7 1376 /* Write Plain Data and Get Cypher Data */
<> 144:ef7eb2e8f9f7 1377 if(CRYPEx_GCMCCM_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK)
<> 144:ef7eb2e8f9f7 1378 {
<> 144:ef7eb2e8f9f7 1379 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1380 }
<> 144:ef7eb2e8f9f7 1381
<> 144:ef7eb2e8f9f7 1382 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1383 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1384
<> 144:ef7eb2e8f9f7 1385 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1386 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1387
<> 144:ef7eb2e8f9f7 1388 /* Return function status */
<> 144:ef7eb2e8f9f7 1389 return HAL_OK;
<> 144:ef7eb2e8f9f7 1390 }
<> 144:ef7eb2e8f9f7 1391
<> 144:ef7eb2e8f9f7 1392 /**
<> 144:ef7eb2e8f9f7 1393 * @brief Initializes the CRYP peripheral in AES GCM encryption mode using IT.
<> 144:ef7eb2e8f9f7 1394 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1395 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1396 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 1397 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 1398 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 1399 * @retval HAL status
<> 144:ef7eb2e8f9f7 1400 */
<> 144:ef7eb2e8f9f7 1401 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
<> 144:ef7eb2e8f9f7 1402 {
<> 144:ef7eb2e8f9f7 1403 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1404 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1405 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 1406
<> 144:ef7eb2e8f9f7 1407 if(hcryp->State == HAL_CRYP_STATE_READY)
<> 144:ef7eb2e8f9f7 1408 {
<> 144:ef7eb2e8f9f7 1409 /* Process Locked */
<> 144:ef7eb2e8f9f7 1410 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 1411
<> 144:ef7eb2e8f9f7 1412 /* Get the buffer addresses and sizes */
<> 144:ef7eb2e8f9f7 1413 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 1414 hcryp->pCrypInBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 1415 hcryp->pCrypOutBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 1416 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 1417
<> 144:ef7eb2e8f9f7 1418 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1419 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1420
<> 144:ef7eb2e8f9f7 1421 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1422 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 1423 {
<> 144:ef7eb2e8f9f7 1424 /* Set the key */
<> 144:ef7eb2e8f9f7 1425 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 1426
<> 144:ef7eb2e8f9f7 1427 /* Set the CRYP peripheral in AES GCM mode */
<> 144:ef7eb2e8f9f7 1428 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 1429
<> 144:ef7eb2e8f9f7 1430 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 1431 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 1432
<> 144:ef7eb2e8f9f7 1433 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1434 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 1435
<> 144:ef7eb2e8f9f7 1436 /* Enable CRYP to start the init phase */
<> 144:ef7eb2e8f9f7 1437 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1438
<> 144:ef7eb2e8f9f7 1439 /* Get tick */
<> 144:ef7eb2e8f9f7 1440 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1441
<> 144:ef7eb2e8f9f7 1442 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 1443 {
<> 144:ef7eb2e8f9f7 1444 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1445
<> 144:ef7eb2e8f9f7 1446 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 1447 {
<> 144:ef7eb2e8f9f7 1448 /* Change state */
<> 144:ef7eb2e8f9f7 1449 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1450
<> 144:ef7eb2e8f9f7 1451 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1452 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1453
<> 144:ef7eb2e8f9f7 1454 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1455
<> 144:ef7eb2e8f9f7 1456 }
<> 144:ef7eb2e8f9f7 1457 }
<> 144:ef7eb2e8f9f7 1458
<> 144:ef7eb2e8f9f7 1459 /* Set the header phase */
<> 144:ef7eb2e8f9f7 1460 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) != HAL_OK)
<> 144:ef7eb2e8f9f7 1461 {
<> 144:ef7eb2e8f9f7 1462 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1463 }
<> 144:ef7eb2e8f9f7 1464 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1465 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 1466
<> 144:ef7eb2e8f9f7 1467 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 1468 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 1469
<> 144:ef7eb2e8f9f7 1470 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1471 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 1472
<> 144:ef7eb2e8f9f7 1473 /* Set the phase */
<> 144:ef7eb2e8f9f7 1474 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1475 }
<> 144:ef7eb2e8f9f7 1476
<> 144:ef7eb2e8f9f7 1477 if(Size != 0)
<> 144:ef7eb2e8f9f7 1478 {
<> 144:ef7eb2e8f9f7 1479 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 1480 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1481 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1482 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1483 }
<> 144:ef7eb2e8f9f7 1484 else
<> 144:ef7eb2e8f9f7 1485 {
<> 144:ef7eb2e8f9f7 1486 /* Process Locked */
<> 144:ef7eb2e8f9f7 1487 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1488 /* Change the CRYP state and phase */
<> 144:ef7eb2e8f9f7 1489 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1490 }
<> 144:ef7eb2e8f9f7 1491 /* Return function status */
<> 144:ef7eb2e8f9f7 1492 return HAL_OK;
<> 144:ef7eb2e8f9f7 1493 }
<> 144:ef7eb2e8f9f7 1494 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
<> 144:ef7eb2e8f9f7 1495 {
<> 144:ef7eb2e8f9f7 1496 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
<> 144:ef7eb2e8f9f7 1497 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1498 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1499 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1500 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1501 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1502 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1503 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1504 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1505 hcryp->pCrypInBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1506 hcryp->CrypInCount -= 16;
<> 144:ef7eb2e8f9f7 1507 if(hcryp->CrypInCount == 0)
<> 144:ef7eb2e8f9f7 1508 {
<> 144:ef7eb2e8f9f7 1509 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
<> 144:ef7eb2e8f9f7 1510 /* Call the Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 1511 HAL_CRYP_InCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1512 }
<> 144:ef7eb2e8f9f7 1513 }
<> 144:ef7eb2e8f9f7 1514 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
<> 144:ef7eb2e8f9f7 1515 {
<> 144:ef7eb2e8f9f7 1516 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
<> 144:ef7eb2e8f9f7 1517 /* Read the Output block from the Output FIFO */
<> 144:ef7eb2e8f9f7 1518 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1519 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1520 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1521 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1522 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1523 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1524 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1525 hcryp->pCrypOutBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1526 hcryp->CrypOutCount -= 16;
<> 144:ef7eb2e8f9f7 1527 if(hcryp->CrypOutCount == 0)
<> 144:ef7eb2e8f9f7 1528 {
<> 144:ef7eb2e8f9f7 1529 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1530 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1531 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1532 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1533 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1534 /* Call Input transfer complete callback */
<> 144:ef7eb2e8f9f7 1535 HAL_CRYP_OutCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1536 }
<> 144:ef7eb2e8f9f7 1537 }
<> 144:ef7eb2e8f9f7 1538
<> 144:ef7eb2e8f9f7 1539 /* Return function status */
<> 144:ef7eb2e8f9f7 1540 return HAL_OK;
<> 144:ef7eb2e8f9f7 1541 }
<> 144:ef7eb2e8f9f7 1542
<> 144:ef7eb2e8f9f7 1543 /**
<> 144:ef7eb2e8f9f7 1544 * @brief Initializes the CRYP peripheral in AES CCM encryption mode using interrupt.
<> 144:ef7eb2e8f9f7 1545 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1546 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1547 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 1548 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 1549 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 1550 * @retval HAL status
<> 144:ef7eb2e8f9f7 1551 */
<> 144:ef7eb2e8f9f7 1552 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
<> 144:ef7eb2e8f9f7 1553 {
<> 144:ef7eb2e8f9f7 1554 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1555 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1556 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 1557
<> 144:ef7eb2e8f9f7 1558 uint32_t headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 1559 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 1560 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 1561 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 1562 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 1563 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 1564 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 1565
<> 144:ef7eb2e8f9f7 1566 if(hcryp->State == HAL_CRYP_STATE_READY)
<> 144:ef7eb2e8f9f7 1567 {
<> 144:ef7eb2e8f9f7 1568 /* Process Locked */
<> 144:ef7eb2e8f9f7 1569 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 1570
<> 144:ef7eb2e8f9f7 1571 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 1572 hcryp->pCrypInBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 1573 hcryp->pCrypOutBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 1574 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 1575
<> 144:ef7eb2e8f9f7 1576 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1577 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1578
<> 144:ef7eb2e8f9f7 1579 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1580 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 1581 {
<> 144:ef7eb2e8f9f7 1582 /************************ Formatting the header block *******************/
<> 144:ef7eb2e8f9f7 1583 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1584 {
<> 144:ef7eb2e8f9f7 1585 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 1586 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 1587 {
<> 144:ef7eb2e8f9f7 1588 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
<> 144:ef7eb2e8f9f7 1589 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
<> 144:ef7eb2e8f9f7 1590 headersize += 2;
<> 144:ef7eb2e8f9f7 1591 }
<> 144:ef7eb2e8f9f7 1592 else
<> 144:ef7eb2e8f9f7 1593 {
<> 144:ef7eb2e8f9f7 1594 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 1595 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
<> 144:ef7eb2e8f9f7 1596 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
<> 144:ef7eb2e8f9f7 1597 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 1598 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 1599 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 1600 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 1601 headersize += 6;
<> 144:ef7eb2e8f9f7 1602 }
<> 144:ef7eb2e8f9f7 1603 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 1604 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 1605 {
<> 144:ef7eb2e8f9f7 1606 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 1607 }
<> 144:ef7eb2e8f9f7 1608 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 1609 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 1610 {
<> 144:ef7eb2e8f9f7 1611 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 1612 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 1613 {
<> 144:ef7eb2e8f9f7 1614 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 1615 }
<> 144:ef7eb2e8f9f7 1616 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 1617 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 1618 }
<> 144:ef7eb2e8f9f7 1619 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 1620 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 1621 }
<> 144:ef7eb2e8f9f7 1622 /*********************** Formatting the block B0 ************************/
<> 144:ef7eb2e8f9f7 1623 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1624 {
<> 144:ef7eb2e8f9f7 1625 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 1626 }
<> 144:ef7eb2e8f9f7 1627 /* Flags byte */
<> 144:ef7eb2e8f9f7 1628 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 1629 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 1630 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 1631
<> 144:ef7eb2e8f9f7 1632 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 1633 {
<> 144:ef7eb2e8f9f7 1634 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 1635 }
<> 144:ef7eb2e8f9f7 1636 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 1637 {
<> 144:ef7eb2e8f9f7 1638 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 1639 }
<> 144:ef7eb2e8f9f7 1640
<> 144:ef7eb2e8f9f7 1641 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 1642 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 1643
<> 144:ef7eb2e8f9f7 1644 /************************* Formatting the initial counter ***************/
<> 144:ef7eb2e8f9f7 1645 /* Byte 0:
<> 144:ef7eb2e8f9f7 1646 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 1647 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter
<> 144:ef7eb2e8f9f7 1648 blocks are distinct from B0
<> 144:ef7eb2e8f9f7 1649 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 1650 */
<> 144:ef7eb2e8f9f7 1651 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 1652 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 1653 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 1654 {
<> 144:ef7eb2e8f9f7 1655 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 1656 }
<> 144:ef7eb2e8f9f7 1657 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 1658 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 1659
<> 144:ef7eb2e8f9f7 1660 /* Set the key */
<> 144:ef7eb2e8f9f7 1661 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 1662
<> 144:ef7eb2e8f9f7 1663 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 1664 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 1665
<> 144:ef7eb2e8f9f7 1666 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 1667 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 1668
<> 144:ef7eb2e8f9f7 1669 /* Select init phase */
<> 144:ef7eb2e8f9f7 1670 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 1671
<> 144:ef7eb2e8f9f7 1672 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 1673 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1674 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1675 b0addr+=4;
<> 144:ef7eb2e8f9f7 1676 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1677 b0addr+=4;
<> 144:ef7eb2e8f9f7 1678 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1679 b0addr+=4;
<> 144:ef7eb2e8f9f7 1680 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 1681
<> 144:ef7eb2e8f9f7 1682 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1683 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1684
<> 144:ef7eb2e8f9f7 1685 /* Get tick */
<> 144:ef7eb2e8f9f7 1686 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1687
<> 144:ef7eb2e8f9f7 1688 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 1689 {
<> 144:ef7eb2e8f9f7 1690 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1691 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 1692 {
<> 144:ef7eb2e8f9f7 1693 /* Change state */
<> 144:ef7eb2e8f9f7 1694 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1695
<> 144:ef7eb2e8f9f7 1696 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1697 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1698
<> 144:ef7eb2e8f9f7 1699 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1700 }
<> 144:ef7eb2e8f9f7 1701 }
<> 144:ef7eb2e8f9f7 1702 /***************************** Header phase *****************************/
<> 144:ef7eb2e8f9f7 1703 if(headersize != 0)
<> 144:ef7eb2e8f9f7 1704 {
<> 144:ef7eb2e8f9f7 1705 /* Select header phase */
<> 144:ef7eb2e8f9f7 1706 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 1707
<> 144:ef7eb2e8f9f7 1708 /* Enable Crypto processor */
<> 144:ef7eb2e8f9f7 1709 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1710
<> 144:ef7eb2e8f9f7 1711 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 1712 {
<> 144:ef7eb2e8f9f7 1713 /* Get tick */
<> 144:ef7eb2e8f9f7 1714 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1715
<> 144:ef7eb2e8f9f7 1716 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 1717 {
<> 144:ef7eb2e8f9f7 1718 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1719 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 1720 {
<> 144:ef7eb2e8f9f7 1721 /* Change state */
<> 144:ef7eb2e8f9f7 1722 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1723
<> 144:ef7eb2e8f9f7 1724 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1725 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1726
<> 144:ef7eb2e8f9f7 1727 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1728 }
<> 144:ef7eb2e8f9f7 1729 }
<> 144:ef7eb2e8f9f7 1730 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1731 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1732 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1733 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1734 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1735 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1736 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1737 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 1738 headeraddr+=4;
<> 144:ef7eb2e8f9f7 1739 }
<> 144:ef7eb2e8f9f7 1740
<> 144:ef7eb2e8f9f7 1741 /* Get tick */
<> 144:ef7eb2e8f9f7 1742 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1743
<> 144:ef7eb2e8f9f7 1744 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 1745 {
<> 144:ef7eb2e8f9f7 1746 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1747 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 1748 {
<> 144:ef7eb2e8f9f7 1749 /* Change state */
<> 144:ef7eb2e8f9f7 1750 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1751
<> 144:ef7eb2e8f9f7 1752 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1753 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1754
<> 144:ef7eb2e8f9f7 1755 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1756 }
<> 144:ef7eb2e8f9f7 1757 }
<> 144:ef7eb2e8f9f7 1758 }
<> 144:ef7eb2e8f9f7 1759 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 1760 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 1761 {
<> 144:ef7eb2e8f9f7 1762 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 1763 }
<> 144:ef7eb2e8f9f7 1764 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 1765 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 1766
<> 144:ef7eb2e8f9f7 1767 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 1768 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 1769
<> 144:ef7eb2e8f9f7 1770 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1771 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 1772
<> 144:ef7eb2e8f9f7 1773 /* Set the phase */
<> 144:ef7eb2e8f9f7 1774 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1775 }
<> 144:ef7eb2e8f9f7 1776
<> 144:ef7eb2e8f9f7 1777 if(Size != 0)
<> 144:ef7eb2e8f9f7 1778 {
<> 144:ef7eb2e8f9f7 1779 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 1780 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1781 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1782 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1783 }
<> 144:ef7eb2e8f9f7 1784 else
<> 144:ef7eb2e8f9f7 1785 {
<> 144:ef7eb2e8f9f7 1786 /* Change the CRYP state and phase */
<> 144:ef7eb2e8f9f7 1787 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1788 }
<> 144:ef7eb2e8f9f7 1789
<> 144:ef7eb2e8f9f7 1790 /* Return function status */
<> 144:ef7eb2e8f9f7 1791 return HAL_OK;
<> 144:ef7eb2e8f9f7 1792 }
<> 144:ef7eb2e8f9f7 1793 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
<> 144:ef7eb2e8f9f7 1794 {
<> 144:ef7eb2e8f9f7 1795 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
<> 144:ef7eb2e8f9f7 1796 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1797 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1798 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1799 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1800 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1801 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1802 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1803 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1804 hcryp->pCrypInBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1805 hcryp->CrypInCount -= 16;
<> 144:ef7eb2e8f9f7 1806 if(hcryp->CrypInCount == 0)
<> 144:ef7eb2e8f9f7 1807 {
<> 144:ef7eb2e8f9f7 1808 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
<> 144:ef7eb2e8f9f7 1809 /* Call Input transfer complete callback */
<> 144:ef7eb2e8f9f7 1810 HAL_CRYP_InCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1811 }
<> 144:ef7eb2e8f9f7 1812 }
<> 144:ef7eb2e8f9f7 1813 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
<> 144:ef7eb2e8f9f7 1814 {
<> 144:ef7eb2e8f9f7 1815 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
<> 144:ef7eb2e8f9f7 1816 /* Read the Output block from the Output FIFO */
<> 144:ef7eb2e8f9f7 1817 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1818 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1819 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1820 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1821 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1822 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1823 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1824 hcryp->pCrypOutBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1825 hcryp->CrypOutCount -= 16;
<> 144:ef7eb2e8f9f7 1826 if(hcryp->CrypOutCount == 0)
<> 144:ef7eb2e8f9f7 1827 {
<> 144:ef7eb2e8f9f7 1828 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1829 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1830 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1831 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1832 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1833 /* Call Input transfer complete callback */
<> 144:ef7eb2e8f9f7 1834 HAL_CRYP_OutCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1835 }
<> 144:ef7eb2e8f9f7 1836 }
<> 144:ef7eb2e8f9f7 1837
<> 144:ef7eb2e8f9f7 1838 /* Return function status */
<> 144:ef7eb2e8f9f7 1839 return HAL_OK;
<> 144:ef7eb2e8f9f7 1840 }
<> 144:ef7eb2e8f9f7 1841
<> 144:ef7eb2e8f9f7 1842 /**
<> 144:ef7eb2e8f9f7 1843 * @brief Initializes the CRYP peripheral in AES GCM decryption mode using IT.
<> 144:ef7eb2e8f9f7 1844 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1845 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1846 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 1847 * @param Size: Length of the cyphertext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 1848 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 1849 * @retval HAL status
<> 144:ef7eb2e8f9f7 1850 */
<> 144:ef7eb2e8f9f7 1851 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
<> 144:ef7eb2e8f9f7 1852 {
<> 144:ef7eb2e8f9f7 1853 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 1854 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 1855 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 1856
<> 144:ef7eb2e8f9f7 1857 if(hcryp->State == HAL_CRYP_STATE_READY)
<> 144:ef7eb2e8f9f7 1858 {
<> 144:ef7eb2e8f9f7 1859 /* Process Locked */
<> 144:ef7eb2e8f9f7 1860 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 1861
<> 144:ef7eb2e8f9f7 1862 /* Get the buffer addresses and sizes */
<> 144:ef7eb2e8f9f7 1863 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 1864 hcryp->pCrypInBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 1865 hcryp->pCrypOutBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 1866 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 1867
<> 144:ef7eb2e8f9f7 1868 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1869 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 1870
<> 144:ef7eb2e8f9f7 1871 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 1872 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 1873 {
<> 144:ef7eb2e8f9f7 1874 /* Set the key */
<> 144:ef7eb2e8f9f7 1875 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 1876
<> 144:ef7eb2e8f9f7 1877 /* Set the CRYP peripheral in AES GCM decryption mode */
<> 144:ef7eb2e8f9f7 1878 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
<> 144:ef7eb2e8f9f7 1879
<> 144:ef7eb2e8f9f7 1880 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 1881 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 1882
<> 144:ef7eb2e8f9f7 1883 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1884 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 1885
<> 144:ef7eb2e8f9f7 1886 /* Enable CRYP to start the init phase */
<> 144:ef7eb2e8f9f7 1887 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1888
<> 144:ef7eb2e8f9f7 1889 /* Get tick */
<> 144:ef7eb2e8f9f7 1890 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 1891
<> 144:ef7eb2e8f9f7 1892 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 1893 {
<> 144:ef7eb2e8f9f7 1894 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 1895 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 1896 {
<> 144:ef7eb2e8f9f7 1897 /* Change state */
<> 144:ef7eb2e8f9f7 1898 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 1899
<> 144:ef7eb2e8f9f7 1900 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1901 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1902
<> 144:ef7eb2e8f9f7 1903 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1904 }
<> 144:ef7eb2e8f9f7 1905 }
<> 144:ef7eb2e8f9f7 1906
<> 144:ef7eb2e8f9f7 1907 /* Set the header phase */
<> 144:ef7eb2e8f9f7 1908 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) != HAL_OK)
<> 144:ef7eb2e8f9f7 1909 {
<> 144:ef7eb2e8f9f7 1910 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 1911 }
<> 144:ef7eb2e8f9f7 1912 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1913 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 1914
<> 144:ef7eb2e8f9f7 1915 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 1916 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 1917
<> 144:ef7eb2e8f9f7 1918 /* Set the phase */
<> 144:ef7eb2e8f9f7 1919 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 1920 }
<> 144:ef7eb2e8f9f7 1921
<> 144:ef7eb2e8f9f7 1922 if(Size != 0)
<> 144:ef7eb2e8f9f7 1923 {
<> 144:ef7eb2e8f9f7 1924 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 1925 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1926 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 1927 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 1928 }
<> 144:ef7eb2e8f9f7 1929 else
<> 144:ef7eb2e8f9f7 1930 {
<> 144:ef7eb2e8f9f7 1931 /* Process Locked */
<> 144:ef7eb2e8f9f7 1932 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1933 /* Change the CRYP state and phase */
<> 144:ef7eb2e8f9f7 1934 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1935 }
<> 144:ef7eb2e8f9f7 1936
<> 144:ef7eb2e8f9f7 1937 /* Return function status */
<> 144:ef7eb2e8f9f7 1938 return HAL_OK;
<> 144:ef7eb2e8f9f7 1939 }
<> 144:ef7eb2e8f9f7 1940 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
<> 144:ef7eb2e8f9f7 1941 {
<> 144:ef7eb2e8f9f7 1942 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
<> 144:ef7eb2e8f9f7 1943 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 1944 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1945 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1946 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1947 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1948 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1949 inputaddr+=4;
<> 144:ef7eb2e8f9f7 1950 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 1951 hcryp->pCrypInBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1952 hcryp->CrypInCount -= 16;
<> 144:ef7eb2e8f9f7 1953 if(hcryp->CrypInCount == 0)
<> 144:ef7eb2e8f9f7 1954 {
<> 144:ef7eb2e8f9f7 1955 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
<> 144:ef7eb2e8f9f7 1956 /* Call the Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 1957 HAL_CRYP_InCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1958 }
<> 144:ef7eb2e8f9f7 1959 }
<> 144:ef7eb2e8f9f7 1960 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
<> 144:ef7eb2e8f9f7 1961 {
<> 144:ef7eb2e8f9f7 1962 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
<> 144:ef7eb2e8f9f7 1963 /* Read the Output block from the Output FIFO */
<> 144:ef7eb2e8f9f7 1964 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1965 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1966 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1967 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1968 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1969 outputaddr+=4;
<> 144:ef7eb2e8f9f7 1970 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 1971 hcryp->pCrypOutBuffPtr += 16;
<> 144:ef7eb2e8f9f7 1972 hcryp->CrypOutCount -= 16;
<> 144:ef7eb2e8f9f7 1973 if(hcryp->CrypOutCount == 0)
<> 144:ef7eb2e8f9f7 1974 {
<> 144:ef7eb2e8f9f7 1975 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 1976 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 1977 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 1978 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 1979 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 1980 /* Call Input transfer complete callback */
<> 144:ef7eb2e8f9f7 1981 HAL_CRYP_OutCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 1982 }
<> 144:ef7eb2e8f9f7 1983 }
<> 144:ef7eb2e8f9f7 1984
<> 144:ef7eb2e8f9f7 1985 /* Return function status */
<> 144:ef7eb2e8f9f7 1986 return HAL_OK;
<> 144:ef7eb2e8f9f7 1987 }
<> 144:ef7eb2e8f9f7 1988
<> 144:ef7eb2e8f9f7 1989 /**
<> 144:ef7eb2e8f9f7 1990 * @brief Initializes the CRYP peripheral in AES CCM decryption mode using interrupt
<> 144:ef7eb2e8f9f7 1991 * then decrypted pCypherData. The cypher data are available in pPlainData.
<> 144:ef7eb2e8f9f7 1992 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1993 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 1994 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 1995 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 1996 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 1997 * @retval HAL status
<> 144:ef7eb2e8f9f7 1998 */
<> 144:ef7eb2e8f9f7 1999 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
<> 144:ef7eb2e8f9f7 2000 {
<> 144:ef7eb2e8f9f7 2001 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 2002 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 2003 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 2004 uint32_t headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 2005 uint32_t headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 2006 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 2007 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 2008 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 2009 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 2010 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2011
<> 144:ef7eb2e8f9f7 2012 if(hcryp->State == HAL_CRYP_STATE_READY)
<> 144:ef7eb2e8f9f7 2013 {
<> 144:ef7eb2e8f9f7 2014 /* Process Locked */
<> 144:ef7eb2e8f9f7 2015 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 2016
<> 144:ef7eb2e8f9f7 2017 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 2018 hcryp->pCrypInBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 2019 hcryp->pCrypOutBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 2020 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 2021
<> 144:ef7eb2e8f9f7 2022 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2023 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 2024
<> 144:ef7eb2e8f9f7 2025 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 2026 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 2027 {
<> 144:ef7eb2e8f9f7 2028 /************************ Formatting the header block *******************/
<> 144:ef7eb2e8f9f7 2029 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2030 {
<> 144:ef7eb2e8f9f7 2031 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 2032 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 2033 {
<> 144:ef7eb2e8f9f7 2034 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
<> 144:ef7eb2e8f9f7 2035 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
<> 144:ef7eb2e8f9f7 2036 headersize += 2;
<> 144:ef7eb2e8f9f7 2037 }
<> 144:ef7eb2e8f9f7 2038 else
<> 144:ef7eb2e8f9f7 2039 {
<> 144:ef7eb2e8f9f7 2040 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 2041 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
<> 144:ef7eb2e8f9f7 2042 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
<> 144:ef7eb2e8f9f7 2043 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 2044 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 2045 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 2046 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 2047 headersize += 6;
<> 144:ef7eb2e8f9f7 2048 }
<> 144:ef7eb2e8f9f7 2049 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 2050 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 2051 {
<> 144:ef7eb2e8f9f7 2052 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 2053 }
<> 144:ef7eb2e8f9f7 2054 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 2055 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 2056 {
<> 144:ef7eb2e8f9f7 2057 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 2058 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 2059 {
<> 144:ef7eb2e8f9f7 2060 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 2061 }
<> 144:ef7eb2e8f9f7 2062 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 2063 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 2064 }
<> 144:ef7eb2e8f9f7 2065 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 2066 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 2067 }
<> 144:ef7eb2e8f9f7 2068 /*********************** Formatting the block B0 ************************/
<> 144:ef7eb2e8f9f7 2069 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2070 {
<> 144:ef7eb2e8f9f7 2071 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 2072 }
<> 144:ef7eb2e8f9f7 2073 /* Flags byte */
<> 144:ef7eb2e8f9f7 2074 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 2075 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 2076 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 2077
<> 144:ef7eb2e8f9f7 2078 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 2079 {
<> 144:ef7eb2e8f9f7 2080 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 2081 }
<> 144:ef7eb2e8f9f7 2082 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 2083 {
<> 144:ef7eb2e8f9f7 2084 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 2085 }
<> 144:ef7eb2e8f9f7 2086
<> 144:ef7eb2e8f9f7 2087 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 2088 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 2089
<> 144:ef7eb2e8f9f7 2090 /************************* Formatting the initial counter ***************/
<> 144:ef7eb2e8f9f7 2091 /* Byte 0:
<> 144:ef7eb2e8f9f7 2092 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 2093 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter
<> 144:ef7eb2e8f9f7 2094 blocks are distinct from B0
<> 144:ef7eb2e8f9f7 2095 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 2096 */
<> 144:ef7eb2e8f9f7 2097 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 2098 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 2099 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 2100 {
<> 144:ef7eb2e8f9f7 2101 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 2102 }
<> 144:ef7eb2e8f9f7 2103 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 2104 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 2105
<> 144:ef7eb2e8f9f7 2106 /* Set the key */
<> 144:ef7eb2e8f9f7 2107 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 2108
<> 144:ef7eb2e8f9f7 2109 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 2110 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
<> 144:ef7eb2e8f9f7 2111
<> 144:ef7eb2e8f9f7 2112 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 2113 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 2114
<> 144:ef7eb2e8f9f7 2115 /* Select init phase */
<> 144:ef7eb2e8f9f7 2116 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 2117
<> 144:ef7eb2e8f9f7 2118 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2119 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2120 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2121 b0addr+=4;
<> 144:ef7eb2e8f9f7 2122 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2123 b0addr+=4;
<> 144:ef7eb2e8f9f7 2124 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2125 b0addr+=4;
<> 144:ef7eb2e8f9f7 2126 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2127
<> 144:ef7eb2e8f9f7 2128 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2129 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2130
<> 144:ef7eb2e8f9f7 2131 /* Get tick */
<> 144:ef7eb2e8f9f7 2132 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2133
<> 144:ef7eb2e8f9f7 2134 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 2135 {
<> 144:ef7eb2e8f9f7 2136 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2137 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2138 {
<> 144:ef7eb2e8f9f7 2139 /* Change state */
<> 144:ef7eb2e8f9f7 2140 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2141
<> 144:ef7eb2e8f9f7 2142 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2143 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2144
<> 144:ef7eb2e8f9f7 2145 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2146 }
<> 144:ef7eb2e8f9f7 2147 }
<> 144:ef7eb2e8f9f7 2148 /***************************** Header phase *****************************/
<> 144:ef7eb2e8f9f7 2149 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2150 {
<> 144:ef7eb2e8f9f7 2151 /* Select header phase */
<> 144:ef7eb2e8f9f7 2152 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 2153
<> 144:ef7eb2e8f9f7 2154 /* Enable Crypto processor */
<> 144:ef7eb2e8f9f7 2155 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2156
<> 144:ef7eb2e8f9f7 2157 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 2158 {
<> 144:ef7eb2e8f9f7 2159 /* Get tick */
<> 144:ef7eb2e8f9f7 2160 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2161
<> 144:ef7eb2e8f9f7 2162 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 2163 {
<> 144:ef7eb2e8f9f7 2164 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2165 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2166 {
<> 144:ef7eb2e8f9f7 2167 /* Change state */
<> 144:ef7eb2e8f9f7 2168 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2169
<> 144:ef7eb2e8f9f7 2170 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2171 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2172
<> 144:ef7eb2e8f9f7 2173 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2174 }
<> 144:ef7eb2e8f9f7 2175 }
<> 144:ef7eb2e8f9f7 2176 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2177 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2178 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2179 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2180 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2181 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2182 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2183 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2184 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2185 }
<> 144:ef7eb2e8f9f7 2186
<> 144:ef7eb2e8f9f7 2187 /* Get tick */
<> 144:ef7eb2e8f9f7 2188 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2189
<> 144:ef7eb2e8f9f7 2190 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 2191 {
<> 144:ef7eb2e8f9f7 2192 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2193 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2194 {
<> 144:ef7eb2e8f9f7 2195 /* Change state */
<> 144:ef7eb2e8f9f7 2196 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2197
<> 144:ef7eb2e8f9f7 2198 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2199 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2200
<> 144:ef7eb2e8f9f7 2201 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2202 }
<> 144:ef7eb2e8f9f7 2203 }
<> 144:ef7eb2e8f9f7 2204 }
<> 144:ef7eb2e8f9f7 2205 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 2206 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 2207 {
<> 144:ef7eb2e8f9f7 2208 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 2209 }
<> 144:ef7eb2e8f9f7 2210 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 2211 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 2212 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 2213 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 2214
<> 144:ef7eb2e8f9f7 2215 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2216 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2217
<> 144:ef7eb2e8f9f7 2218 /* Set the phase */
<> 144:ef7eb2e8f9f7 2219 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 2220 }
<> 144:ef7eb2e8f9f7 2221
<> 144:ef7eb2e8f9f7 2222 /* Enable Interrupts */
<> 144:ef7eb2e8f9f7 2223 __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 2224
<> 144:ef7eb2e8f9f7 2225 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2226 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2227
<> 144:ef7eb2e8f9f7 2228 /* Return function status */
<> 144:ef7eb2e8f9f7 2229 return HAL_OK;
<> 144:ef7eb2e8f9f7 2230 }
<> 144:ef7eb2e8f9f7 2231 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI))
<> 144:ef7eb2e8f9f7 2232 {
<> 144:ef7eb2e8f9f7 2233 inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
<> 144:ef7eb2e8f9f7 2234 /* Write the Input block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2235 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 2236 inputaddr+=4;
<> 144:ef7eb2e8f9f7 2237 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 2238 inputaddr+=4;
<> 144:ef7eb2e8f9f7 2239 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 2240 inputaddr+=4;
<> 144:ef7eb2e8f9f7 2241 hcryp->Instance->DR = *(uint32_t*)(inputaddr);
<> 144:ef7eb2e8f9f7 2242 hcryp->pCrypInBuffPtr += 16;
<> 144:ef7eb2e8f9f7 2243 hcryp->CrypInCount -= 16;
<> 144:ef7eb2e8f9f7 2244 if(hcryp->CrypInCount == 0)
<> 144:ef7eb2e8f9f7 2245 {
<> 144:ef7eb2e8f9f7 2246 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI);
<> 144:ef7eb2e8f9f7 2247 /* Call the Input data transfer complete callback */
<> 144:ef7eb2e8f9f7 2248 HAL_CRYP_InCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 2249 }
<> 144:ef7eb2e8f9f7 2250 }
<> 144:ef7eb2e8f9f7 2251 else if (__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI))
<> 144:ef7eb2e8f9f7 2252 {
<> 144:ef7eb2e8f9f7 2253 outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr;
<> 144:ef7eb2e8f9f7 2254 /* Read the Output block from the Output FIFO */
<> 144:ef7eb2e8f9f7 2255 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 2256 outputaddr+=4;
<> 144:ef7eb2e8f9f7 2257 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 2258 outputaddr+=4;
<> 144:ef7eb2e8f9f7 2259 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 2260 outputaddr+=4;
<> 144:ef7eb2e8f9f7 2261 *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT;
<> 144:ef7eb2e8f9f7 2262 hcryp->pCrypOutBuffPtr += 16;
<> 144:ef7eb2e8f9f7 2263 hcryp->CrypOutCount -= 16;
<> 144:ef7eb2e8f9f7 2264 if(hcryp->CrypOutCount == 0)
<> 144:ef7eb2e8f9f7 2265 {
<> 144:ef7eb2e8f9f7 2266 __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI);
<> 144:ef7eb2e8f9f7 2267 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2268 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2269 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2270 hcryp->State = HAL_CRYP_STATE_READY;
<> 144:ef7eb2e8f9f7 2271 /* Call Input transfer complete callback */
<> 144:ef7eb2e8f9f7 2272 HAL_CRYP_OutCpltCallback(hcryp);
<> 144:ef7eb2e8f9f7 2273 }
<> 144:ef7eb2e8f9f7 2274 }
<> 144:ef7eb2e8f9f7 2275
<> 144:ef7eb2e8f9f7 2276 /* Return function status */
<> 144:ef7eb2e8f9f7 2277 return HAL_OK;
<> 144:ef7eb2e8f9f7 2278 }
<> 144:ef7eb2e8f9f7 2279
<> 144:ef7eb2e8f9f7 2280 /**
<> 144:ef7eb2e8f9f7 2281 * @brief Initializes the CRYP peripheral in AES GCM encryption mode using DMA.
<> 144:ef7eb2e8f9f7 2282 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2283 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 2284 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 2285 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 2286 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 2287 * @retval HAL status
<> 144:ef7eb2e8f9f7 2288 */
<> 144:ef7eb2e8f9f7 2289 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
<> 144:ef7eb2e8f9f7 2290 {
<> 144:ef7eb2e8f9f7 2291 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 2292 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 2293 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 2294
<> 144:ef7eb2e8f9f7 2295 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
<> 144:ef7eb2e8f9f7 2296 {
<> 144:ef7eb2e8f9f7 2297 /* Process Locked */
<> 144:ef7eb2e8f9f7 2298 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 2299
<> 144:ef7eb2e8f9f7 2300 inputaddr = (uint32_t)pPlainData;
<> 144:ef7eb2e8f9f7 2301 outputaddr = (uint32_t)pCypherData;
<> 144:ef7eb2e8f9f7 2302
<> 144:ef7eb2e8f9f7 2303 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2304 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 2305
<> 144:ef7eb2e8f9f7 2306 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 2307 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 2308 {
<> 144:ef7eb2e8f9f7 2309 /* Set the key */
<> 144:ef7eb2e8f9f7 2310 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 2311
<> 144:ef7eb2e8f9f7 2312 /* Set the CRYP peripheral in AES GCM mode */
<> 144:ef7eb2e8f9f7 2313 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 2314
<> 144:ef7eb2e8f9f7 2315 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 2316 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 2317
<> 144:ef7eb2e8f9f7 2318 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2319 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2320
<> 144:ef7eb2e8f9f7 2321 /* Enable CRYP to start the init phase */
<> 144:ef7eb2e8f9f7 2322 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2323
<> 144:ef7eb2e8f9f7 2324 /* Get tick */
<> 144:ef7eb2e8f9f7 2325 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2326
<> 144:ef7eb2e8f9f7 2327 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 2328 {
<> 144:ef7eb2e8f9f7 2329 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2330 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2331 {
<> 144:ef7eb2e8f9f7 2332 /* Change state */
<> 144:ef7eb2e8f9f7 2333 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2334
<> 144:ef7eb2e8f9f7 2335 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2336 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2337
<> 144:ef7eb2e8f9f7 2338 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2339 }
<> 144:ef7eb2e8f9f7 2340 }
<> 144:ef7eb2e8f9f7 2341 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2342 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2343
<> 144:ef7eb2e8f9f7 2344 /* Set the header phase */
<> 144:ef7eb2e8f9f7 2345 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) != HAL_OK)
<> 144:ef7eb2e8f9f7 2346 {
<> 144:ef7eb2e8f9f7 2347 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2348 }
<> 144:ef7eb2e8f9f7 2349 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2350 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 2351
<> 144:ef7eb2e8f9f7 2352 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 2353 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 2354
<> 144:ef7eb2e8f9f7 2355 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2356 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2357
<> 144:ef7eb2e8f9f7 2358 /* Set the phase */
<> 144:ef7eb2e8f9f7 2359 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 2360 }
<> 144:ef7eb2e8f9f7 2361
<> 144:ef7eb2e8f9f7 2362 /* Set the input and output addresses and start DMA transfer */
<> 144:ef7eb2e8f9f7 2363 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
<> 144:ef7eb2e8f9f7 2364
<> 144:ef7eb2e8f9f7 2365 /* Unlock process */
<> 144:ef7eb2e8f9f7 2366 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2367
<> 144:ef7eb2e8f9f7 2368 /* Return function status */
<> 144:ef7eb2e8f9f7 2369 return HAL_OK;
<> 144:ef7eb2e8f9f7 2370 }
<> 144:ef7eb2e8f9f7 2371 else
<> 144:ef7eb2e8f9f7 2372 {
<> 144:ef7eb2e8f9f7 2373 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2374 }
<> 144:ef7eb2e8f9f7 2375 }
<> 144:ef7eb2e8f9f7 2376
<> 144:ef7eb2e8f9f7 2377 /**
<> 144:ef7eb2e8f9f7 2378 * @brief Initializes the CRYP peripheral in AES CCM encryption mode using interrupt.
<> 144:ef7eb2e8f9f7 2379 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2380 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 2381 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 2382 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 2383 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 2384 * @retval HAL status
<> 144:ef7eb2e8f9f7 2385 */
<> 144:ef7eb2e8f9f7 2386 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData)
<> 144:ef7eb2e8f9f7 2387 {
<> 144:ef7eb2e8f9f7 2388 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 2389 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 2390 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 2391 uint32_t headersize;
<> 144:ef7eb2e8f9f7 2392 uint32_t headeraddr;
<> 144:ef7eb2e8f9f7 2393 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 2394 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 2395 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 2396 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 2397 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2398
<> 144:ef7eb2e8f9f7 2399 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
<> 144:ef7eb2e8f9f7 2400 {
<> 144:ef7eb2e8f9f7 2401 /* Process Locked */
<> 144:ef7eb2e8f9f7 2402 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 2403
<> 144:ef7eb2e8f9f7 2404 inputaddr = (uint32_t)pPlainData;
<> 144:ef7eb2e8f9f7 2405 outputaddr = (uint32_t)pCypherData;
<> 144:ef7eb2e8f9f7 2406
<> 144:ef7eb2e8f9f7 2407 headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 2408 headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 2409
<> 144:ef7eb2e8f9f7 2410 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 2411 hcryp->pCrypInBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 2412 hcryp->pCrypOutBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 2413 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 2414
<> 144:ef7eb2e8f9f7 2415 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2416 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 2417
<> 144:ef7eb2e8f9f7 2418 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 2419 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 2420 {
<> 144:ef7eb2e8f9f7 2421 /************************ Formatting the header block *******************/
<> 144:ef7eb2e8f9f7 2422 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2423 {
<> 144:ef7eb2e8f9f7 2424 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 2425 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 2426 {
<> 144:ef7eb2e8f9f7 2427 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
<> 144:ef7eb2e8f9f7 2428 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
<> 144:ef7eb2e8f9f7 2429 headersize += 2;
<> 144:ef7eb2e8f9f7 2430 }
<> 144:ef7eb2e8f9f7 2431 else
<> 144:ef7eb2e8f9f7 2432 {
<> 144:ef7eb2e8f9f7 2433 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 2434 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
<> 144:ef7eb2e8f9f7 2435 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
<> 144:ef7eb2e8f9f7 2436 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 2437 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 2438 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 2439 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 2440 headersize += 6;
<> 144:ef7eb2e8f9f7 2441 }
<> 144:ef7eb2e8f9f7 2442 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 2443 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 2444 {
<> 144:ef7eb2e8f9f7 2445 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 2446 }
<> 144:ef7eb2e8f9f7 2447 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 2448 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 2449 {
<> 144:ef7eb2e8f9f7 2450 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 2451 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 2452 {
<> 144:ef7eb2e8f9f7 2453 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 2454 }
<> 144:ef7eb2e8f9f7 2455 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 2456 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 2457 }
<> 144:ef7eb2e8f9f7 2458 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 2459 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 2460 }
<> 144:ef7eb2e8f9f7 2461 /*********************** Formatting the block B0 ************************/
<> 144:ef7eb2e8f9f7 2462 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2463 {
<> 144:ef7eb2e8f9f7 2464 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 2465 }
<> 144:ef7eb2e8f9f7 2466 /* Flags byte */
<> 144:ef7eb2e8f9f7 2467 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 2468 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 2469 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 2470
<> 144:ef7eb2e8f9f7 2471 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 2472 {
<> 144:ef7eb2e8f9f7 2473 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 2474 }
<> 144:ef7eb2e8f9f7 2475 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 2476 {
<> 144:ef7eb2e8f9f7 2477 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 2478 }
<> 144:ef7eb2e8f9f7 2479
<> 144:ef7eb2e8f9f7 2480 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 2481 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 2482
<> 144:ef7eb2e8f9f7 2483 /************************* Formatting the initial counter ***************/
<> 144:ef7eb2e8f9f7 2484 /* Byte 0:
<> 144:ef7eb2e8f9f7 2485 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 2486 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter
<> 144:ef7eb2e8f9f7 2487 blocks are distinct from B0
<> 144:ef7eb2e8f9f7 2488 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 2489 */
<> 144:ef7eb2e8f9f7 2490 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 2491 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 2492 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 2493 {
<> 144:ef7eb2e8f9f7 2494 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 2495 }
<> 144:ef7eb2e8f9f7 2496 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 2497 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 2498
<> 144:ef7eb2e8f9f7 2499 /* Set the key */
<> 144:ef7eb2e8f9f7 2500 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 2501
<> 144:ef7eb2e8f9f7 2502 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 2503 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT);
<> 144:ef7eb2e8f9f7 2504
<> 144:ef7eb2e8f9f7 2505 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 2506 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 2507
<> 144:ef7eb2e8f9f7 2508 /* Select init phase */
<> 144:ef7eb2e8f9f7 2509 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 2510
<> 144:ef7eb2e8f9f7 2511 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2512 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2513 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2514 b0addr+=4;
<> 144:ef7eb2e8f9f7 2515 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2516 b0addr+=4;
<> 144:ef7eb2e8f9f7 2517 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2518 b0addr+=4;
<> 144:ef7eb2e8f9f7 2519 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2520
<> 144:ef7eb2e8f9f7 2521 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2522 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2523
<> 144:ef7eb2e8f9f7 2524 /* Get tick */
<> 144:ef7eb2e8f9f7 2525 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2526
<> 144:ef7eb2e8f9f7 2527 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 2528 {
<> 144:ef7eb2e8f9f7 2529 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2530 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2531 {
<> 144:ef7eb2e8f9f7 2532 /* Change state */
<> 144:ef7eb2e8f9f7 2533 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2534
<> 144:ef7eb2e8f9f7 2535 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2536 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2537
<> 144:ef7eb2e8f9f7 2538 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2539 }
<> 144:ef7eb2e8f9f7 2540 }
<> 144:ef7eb2e8f9f7 2541 /***************************** Header phase *****************************/
<> 144:ef7eb2e8f9f7 2542 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2543 {
<> 144:ef7eb2e8f9f7 2544 /* Select header phase */
<> 144:ef7eb2e8f9f7 2545 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 2546
<> 144:ef7eb2e8f9f7 2547 /* Enable Crypto processor */
<> 144:ef7eb2e8f9f7 2548 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2549
<> 144:ef7eb2e8f9f7 2550 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 2551 {
<> 144:ef7eb2e8f9f7 2552 /* Get tick */
<> 144:ef7eb2e8f9f7 2553 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2554
<> 144:ef7eb2e8f9f7 2555 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 2556 {
<> 144:ef7eb2e8f9f7 2557 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2558 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2559 {
<> 144:ef7eb2e8f9f7 2560 /* Change state */
<> 144:ef7eb2e8f9f7 2561 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2562
<> 144:ef7eb2e8f9f7 2563 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2564 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2565
<> 144:ef7eb2e8f9f7 2566 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2567 }
<> 144:ef7eb2e8f9f7 2568 }
<> 144:ef7eb2e8f9f7 2569 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2570 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2571 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2572 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2573 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2574 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2575 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2576 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2577 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2578 }
<> 144:ef7eb2e8f9f7 2579
<> 144:ef7eb2e8f9f7 2580 /* Get tick */
<> 144:ef7eb2e8f9f7 2581 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2582
<> 144:ef7eb2e8f9f7 2583 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 2584 {
<> 144:ef7eb2e8f9f7 2585 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2586 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2587 {
<> 144:ef7eb2e8f9f7 2588 /* Change state */
<> 144:ef7eb2e8f9f7 2589 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2590
<> 144:ef7eb2e8f9f7 2591 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2592 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2593
<> 144:ef7eb2e8f9f7 2594 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2595 }
<> 144:ef7eb2e8f9f7 2596 }
<> 144:ef7eb2e8f9f7 2597 }
<> 144:ef7eb2e8f9f7 2598 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 2599 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 2600 {
<> 144:ef7eb2e8f9f7 2601 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 2602 }
<> 144:ef7eb2e8f9f7 2603 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 2604 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 2605
<> 144:ef7eb2e8f9f7 2606 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 2607 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 2608
<> 144:ef7eb2e8f9f7 2609 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2610 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2611
<> 144:ef7eb2e8f9f7 2612 /* Set the phase */
<> 144:ef7eb2e8f9f7 2613 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 2614 }
<> 144:ef7eb2e8f9f7 2615
<> 144:ef7eb2e8f9f7 2616 /* Set the input and output addresses and start DMA transfer */
<> 144:ef7eb2e8f9f7 2617 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
<> 144:ef7eb2e8f9f7 2618
<> 144:ef7eb2e8f9f7 2619 /* Unlock process */
<> 144:ef7eb2e8f9f7 2620 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2621
<> 144:ef7eb2e8f9f7 2622 /* Return function status */
<> 144:ef7eb2e8f9f7 2623 return HAL_OK;
<> 144:ef7eb2e8f9f7 2624 }
<> 144:ef7eb2e8f9f7 2625 else
<> 144:ef7eb2e8f9f7 2626 {
<> 144:ef7eb2e8f9f7 2627 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2628 }
<> 144:ef7eb2e8f9f7 2629 }
<> 144:ef7eb2e8f9f7 2630
<> 144:ef7eb2e8f9f7 2631 /**
<> 144:ef7eb2e8f9f7 2632 * @brief Initializes the CRYP peripheral in AES GCM decryption mode using DMA.
<> 144:ef7eb2e8f9f7 2633 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2634 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 2635 * @param pCypherData: Pointer to the cyphertext buffer.
<> 144:ef7eb2e8f9f7 2636 * @param Size: Length of the cyphertext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 2637 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 2638 * @retval HAL status
<> 144:ef7eb2e8f9f7 2639 */
<> 144:ef7eb2e8f9f7 2640 HAL_StatusTypeDef HAL_CRYPEx_AESGCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
<> 144:ef7eb2e8f9f7 2641 {
<> 144:ef7eb2e8f9f7 2642 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 2643 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 2644 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 2645
<> 144:ef7eb2e8f9f7 2646 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
<> 144:ef7eb2e8f9f7 2647 {
<> 144:ef7eb2e8f9f7 2648 /* Process Locked */
<> 144:ef7eb2e8f9f7 2649 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 2650
<> 144:ef7eb2e8f9f7 2651 inputaddr = (uint32_t)pCypherData;
<> 144:ef7eb2e8f9f7 2652 outputaddr = (uint32_t)pPlainData;
<> 144:ef7eb2e8f9f7 2653
<> 144:ef7eb2e8f9f7 2654 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2655 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 2656
<> 144:ef7eb2e8f9f7 2657 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 2658 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 2659 {
<> 144:ef7eb2e8f9f7 2660 /* Set the key */
<> 144:ef7eb2e8f9f7 2661 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 2662
<> 144:ef7eb2e8f9f7 2663 /* Set the CRYP peripheral in AES GCM decryption mode */
<> 144:ef7eb2e8f9f7 2664 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_GCM_DECRYPT);
<> 144:ef7eb2e8f9f7 2665
<> 144:ef7eb2e8f9f7 2666 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 2667 CRYPEx_GCMCCM_SetInitVector(hcryp, hcryp->Init.pInitVect);
<> 144:ef7eb2e8f9f7 2668
<> 144:ef7eb2e8f9f7 2669 /* Enable CRYP to start the init phase */
<> 144:ef7eb2e8f9f7 2670 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2671
<> 144:ef7eb2e8f9f7 2672 /* Get tick */
<> 144:ef7eb2e8f9f7 2673 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2674
<> 144:ef7eb2e8f9f7 2675 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 2676 {
<> 144:ef7eb2e8f9f7 2677 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2678 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2679 {
<> 144:ef7eb2e8f9f7 2680 /* Change state */
<> 144:ef7eb2e8f9f7 2681 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2682
<> 144:ef7eb2e8f9f7 2683 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2684 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2685
<> 144:ef7eb2e8f9f7 2686 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2687 }
<> 144:ef7eb2e8f9f7 2688 }
<> 144:ef7eb2e8f9f7 2689
<> 144:ef7eb2e8f9f7 2690 /* Set the header phase */
<> 144:ef7eb2e8f9f7 2691 if(CRYPEx_GCMCCM_SetHeaderPhase(hcryp, hcryp->Init.Header, hcryp->Init.HeaderSize, 1) != HAL_OK)
<> 144:ef7eb2e8f9f7 2692 {
<> 144:ef7eb2e8f9f7 2693 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2694 }
<> 144:ef7eb2e8f9f7 2695 /* Disable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2696 __HAL_CRYP_DISABLE(hcryp);
<> 144:ef7eb2e8f9f7 2697
<> 144:ef7eb2e8f9f7 2698 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 2699 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 2700
<> 144:ef7eb2e8f9f7 2701 /* Set the phase */
<> 144:ef7eb2e8f9f7 2702 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 2703 }
<> 144:ef7eb2e8f9f7 2704
<> 144:ef7eb2e8f9f7 2705 /* Set the input and output addresses and start DMA transfer */
<> 144:ef7eb2e8f9f7 2706 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
<> 144:ef7eb2e8f9f7 2707
<> 144:ef7eb2e8f9f7 2708 /* Unlock process */
<> 144:ef7eb2e8f9f7 2709 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2710
<> 144:ef7eb2e8f9f7 2711 /* Return function status */
<> 144:ef7eb2e8f9f7 2712 return HAL_OK;
<> 144:ef7eb2e8f9f7 2713 }
<> 144:ef7eb2e8f9f7 2714 else
<> 144:ef7eb2e8f9f7 2715 {
<> 144:ef7eb2e8f9f7 2716 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2717 }
<> 144:ef7eb2e8f9f7 2718 }
<> 144:ef7eb2e8f9f7 2719
<> 144:ef7eb2e8f9f7 2720 /**
<> 144:ef7eb2e8f9f7 2721 * @brief Initializes the CRYP peripheral in AES CCM decryption mode using DMA
<> 144:ef7eb2e8f9f7 2722 * then decrypted pCypherData. The cypher data are available in pPlainData.
<> 144:ef7eb2e8f9f7 2723 * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2724 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 2725 * @param pCypherData: Pointer to the cyphertext buffer
<> 144:ef7eb2e8f9f7 2726 * @param Size: Length of the plaintext buffer, must be a multiple of 16
<> 144:ef7eb2e8f9f7 2727 * @param pPlainData: Pointer to the plaintext buffer
<> 144:ef7eb2e8f9f7 2728 * @retval HAL status
<> 144:ef7eb2e8f9f7 2729 */
<> 144:ef7eb2e8f9f7 2730 HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData)
<> 144:ef7eb2e8f9f7 2731 {
<> 144:ef7eb2e8f9f7 2732 uint32_t tickstart = 0;
<> 144:ef7eb2e8f9f7 2733 uint32_t inputaddr;
<> 144:ef7eb2e8f9f7 2734 uint32_t outputaddr;
<> 144:ef7eb2e8f9f7 2735 uint32_t headersize;
<> 144:ef7eb2e8f9f7 2736 uint32_t headeraddr;
<> 144:ef7eb2e8f9f7 2737 uint32_t loopcounter = 0;
<> 144:ef7eb2e8f9f7 2738 uint32_t bufferidx = 0;
<> 144:ef7eb2e8f9f7 2739 uint8_t blockb0[16] = {0};/* Block B0 */
<> 144:ef7eb2e8f9f7 2740 uint8_t ctr[16] = {0}; /* Counter */
<> 144:ef7eb2e8f9f7 2741 uint32_t b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2742
<> 144:ef7eb2e8f9f7 2743 if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS))
<> 144:ef7eb2e8f9f7 2744 {
<> 144:ef7eb2e8f9f7 2745 /* Process Locked */
<> 144:ef7eb2e8f9f7 2746 __HAL_LOCK(hcryp);
<> 144:ef7eb2e8f9f7 2747
<> 144:ef7eb2e8f9f7 2748 inputaddr = (uint32_t)pCypherData;
<> 144:ef7eb2e8f9f7 2749 outputaddr = (uint32_t)pPlainData;
<> 144:ef7eb2e8f9f7 2750
<> 144:ef7eb2e8f9f7 2751 headersize = hcryp->Init.HeaderSize;
<> 144:ef7eb2e8f9f7 2752 headeraddr = (uint32_t)hcryp->Init.Header;
<> 144:ef7eb2e8f9f7 2753
<> 144:ef7eb2e8f9f7 2754 hcryp->CrypInCount = Size;
<> 144:ef7eb2e8f9f7 2755 hcryp->pCrypInBuffPtr = pCypherData;
<> 144:ef7eb2e8f9f7 2756 hcryp->pCrypOutBuffPtr = pPlainData;
<> 144:ef7eb2e8f9f7 2757 hcryp->CrypOutCount = Size;
<> 144:ef7eb2e8f9f7 2758
<> 144:ef7eb2e8f9f7 2759 /* Change the CRYP peripheral state */
<> 144:ef7eb2e8f9f7 2760 hcryp->State = HAL_CRYP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 2761
<> 144:ef7eb2e8f9f7 2762 /* Check if initialization phase has already been performed */
<> 144:ef7eb2e8f9f7 2763 if(hcryp->Phase == HAL_CRYP_PHASE_READY)
<> 144:ef7eb2e8f9f7 2764 {
<> 144:ef7eb2e8f9f7 2765 /************************ Formatting the header block *******************/
<> 144:ef7eb2e8f9f7 2766 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2767 {
<> 144:ef7eb2e8f9f7 2768 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */
<> 144:ef7eb2e8f9f7 2769 if(headersize < 65280)
<> 144:ef7eb2e8f9f7 2770 {
<> 144:ef7eb2e8f9f7 2771 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFFU);
<> 144:ef7eb2e8f9f7 2772 hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU);
<> 144:ef7eb2e8f9f7 2773 headersize += 2;
<> 144:ef7eb2e8f9f7 2774 }
<> 144:ef7eb2e8f9f7 2775 else
<> 144:ef7eb2e8f9f7 2776 {
<> 144:ef7eb2e8f9f7 2777 /* Header is encoded as 0xff || 0xfe || [headersize]32, i.e., six octets */
<> 144:ef7eb2e8f9f7 2778 hcryp->Init.pScratch[bufferidx++] = 0xFFU;
<> 144:ef7eb2e8f9f7 2779 hcryp->Init.pScratch[bufferidx++] = 0xFEU;
<> 144:ef7eb2e8f9f7 2780 hcryp->Init.pScratch[bufferidx++] = headersize & 0xff000000U;
<> 144:ef7eb2e8f9f7 2781 hcryp->Init.pScratch[bufferidx++] = headersize & 0x00ff0000U;
<> 144:ef7eb2e8f9f7 2782 hcryp->Init.pScratch[bufferidx++] = headersize & 0x0000ff00U;
<> 144:ef7eb2e8f9f7 2783 hcryp->Init.pScratch[bufferidx++] = headersize & 0x000000ffU;
<> 144:ef7eb2e8f9f7 2784 headersize += 6;
<> 144:ef7eb2e8f9f7 2785 }
<> 144:ef7eb2e8f9f7 2786 /* Copy the header buffer in internal buffer "hcryp->Init.pScratch" */
<> 144:ef7eb2e8f9f7 2787 for(loopcounter = 0; loopcounter < headersize; loopcounter++)
<> 144:ef7eb2e8f9f7 2788 {
<> 144:ef7eb2e8f9f7 2789 hcryp->Init.pScratch[bufferidx++] = hcryp->Init.Header[loopcounter];
<> 144:ef7eb2e8f9f7 2790 }
<> 144:ef7eb2e8f9f7 2791 /* Check if the header size is modulo 16 */
<> 144:ef7eb2e8f9f7 2792 if ((headersize % 16) != 0)
<> 144:ef7eb2e8f9f7 2793 {
<> 144:ef7eb2e8f9f7 2794 /* Padd the header buffer with 0s till the hcryp->Init.pScratch length is modulo 16 */
<> 144:ef7eb2e8f9f7 2795 for(loopcounter = headersize; loopcounter <= ((headersize/16) + 1) * 16; loopcounter++)
<> 144:ef7eb2e8f9f7 2796 {
<> 144:ef7eb2e8f9f7 2797 hcryp->Init.pScratch[loopcounter] = 0;
<> 144:ef7eb2e8f9f7 2798 }
<> 144:ef7eb2e8f9f7 2799 /* Set the header size to modulo 16 */
<> 144:ef7eb2e8f9f7 2800 headersize = ((headersize/16) + 1) * 16;
<> 144:ef7eb2e8f9f7 2801 }
<> 144:ef7eb2e8f9f7 2802 /* Set the pointer headeraddr to hcryp->Init.pScratch */
<> 144:ef7eb2e8f9f7 2803 headeraddr = (uint32_t)hcryp->Init.pScratch;
<> 144:ef7eb2e8f9f7 2804 }
<> 144:ef7eb2e8f9f7 2805 /*********************** Formatting the block B0 ************************/
<> 144:ef7eb2e8f9f7 2806 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2807 {
<> 144:ef7eb2e8f9f7 2808 blockb0[0] = 0x40;
<> 144:ef7eb2e8f9f7 2809 }
<> 144:ef7eb2e8f9f7 2810 /* Flags byte */
<> 144:ef7eb2e8f9f7 2811 /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07) */
<> 144:ef7eb2e8f9f7 2812 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07 ) << 3);
<> 144:ef7eb2e8f9f7 2813 blockb0[0] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07);
<> 144:ef7eb2e8f9f7 2814
<> 144:ef7eb2e8f9f7 2815 for (loopcounter = 0; loopcounter < hcryp->Init.IVSize; loopcounter++)
<> 144:ef7eb2e8f9f7 2816 {
<> 144:ef7eb2e8f9f7 2817 blockb0[loopcounter+1] = hcryp->Init.pInitVect[loopcounter];
<> 144:ef7eb2e8f9f7 2818 }
<> 144:ef7eb2e8f9f7 2819 for ( ; loopcounter < 13; loopcounter++)
<> 144:ef7eb2e8f9f7 2820 {
<> 144:ef7eb2e8f9f7 2821 blockb0[loopcounter+1] = 0;
<> 144:ef7eb2e8f9f7 2822 }
<> 144:ef7eb2e8f9f7 2823
<> 144:ef7eb2e8f9f7 2824 blockb0[14] = (Size >> 8);
<> 144:ef7eb2e8f9f7 2825 blockb0[15] = (Size & 0xFF);
<> 144:ef7eb2e8f9f7 2826
<> 144:ef7eb2e8f9f7 2827 /************************* Formatting the initial counter ***************/
<> 144:ef7eb2e8f9f7 2828 /* Byte 0:
<> 144:ef7eb2e8f9f7 2829 Bits 7 and 6 are reserved and shall be set to 0
<> 144:ef7eb2e8f9f7 2830 Bits 3, 4, and 5 shall also be set to 0, to ensure that all the counter
<> 144:ef7eb2e8f9f7 2831 blocks are distinct from B0
<> 144:ef7eb2e8f9f7 2832 Bits 0, 1, and 2 contain the same encoding of q as in B0
<> 144:ef7eb2e8f9f7 2833 */
<> 144:ef7eb2e8f9f7 2834 ctr[0] = blockb0[0] & 0x07;
<> 144:ef7eb2e8f9f7 2835 /* byte 1 to NonceSize is the IV (Nonce) */
<> 144:ef7eb2e8f9f7 2836 for(loopcounter = 1; loopcounter < hcryp->Init.IVSize + 1; loopcounter++)
<> 144:ef7eb2e8f9f7 2837 {
<> 144:ef7eb2e8f9f7 2838 ctr[loopcounter] = blockb0[loopcounter];
<> 144:ef7eb2e8f9f7 2839 }
<> 144:ef7eb2e8f9f7 2840 /* Set the LSB to 1 */
<> 144:ef7eb2e8f9f7 2841 ctr[15] |= 0x01;
<> 144:ef7eb2e8f9f7 2842
<> 144:ef7eb2e8f9f7 2843 /* Set the key */
<> 144:ef7eb2e8f9f7 2844 CRYPEx_GCMCCM_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize);
<> 144:ef7eb2e8f9f7 2845
<> 144:ef7eb2e8f9f7 2846 /* Set the CRYP peripheral in AES CCM mode */
<> 144:ef7eb2e8f9f7 2847 __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CCM_DECRYPT);
<> 144:ef7eb2e8f9f7 2848
<> 144:ef7eb2e8f9f7 2849 /* Set the Initialization Vector */
<> 144:ef7eb2e8f9f7 2850 CRYPEx_GCMCCM_SetInitVector(hcryp, ctr);
<> 144:ef7eb2e8f9f7 2851
<> 144:ef7eb2e8f9f7 2852 /* Select init phase */
<> 144:ef7eb2e8f9f7 2853 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_INIT);
<> 144:ef7eb2e8f9f7 2854
<> 144:ef7eb2e8f9f7 2855 b0addr = (uint32_t)blockb0;
<> 144:ef7eb2e8f9f7 2856 /* Write the blockb0 block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2857 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2858 b0addr+=4;
<> 144:ef7eb2e8f9f7 2859 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2860 b0addr+=4;
<> 144:ef7eb2e8f9f7 2861 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2862 b0addr+=4;
<> 144:ef7eb2e8f9f7 2863 hcryp->Instance->DR = *(uint32_t*)(b0addr);
<> 144:ef7eb2e8f9f7 2864
<> 144:ef7eb2e8f9f7 2865 /* Enable the CRYP peripheral */
<> 144:ef7eb2e8f9f7 2866 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2867
<> 144:ef7eb2e8f9f7 2868 /* Get tick */
<> 144:ef7eb2e8f9f7 2869 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2870
<> 144:ef7eb2e8f9f7 2871 while((CRYP->CR & CRYP_CR_CRYPEN) == CRYP_CR_CRYPEN)
<> 144:ef7eb2e8f9f7 2872 {
<> 144:ef7eb2e8f9f7 2873 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2874
<> 144:ef7eb2e8f9f7 2875 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2876 {
<> 144:ef7eb2e8f9f7 2877 /* Change state */
<> 144:ef7eb2e8f9f7 2878 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2879
<> 144:ef7eb2e8f9f7 2880 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2881 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2882
<> 144:ef7eb2e8f9f7 2883 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2884
<> 144:ef7eb2e8f9f7 2885 }
<> 144:ef7eb2e8f9f7 2886 }
<> 144:ef7eb2e8f9f7 2887 /***************************** Header phase *****************************/
<> 144:ef7eb2e8f9f7 2888 if(headersize != 0)
<> 144:ef7eb2e8f9f7 2889 {
<> 144:ef7eb2e8f9f7 2890 /* Select header phase */
<> 144:ef7eb2e8f9f7 2891 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_HEADER);
<> 144:ef7eb2e8f9f7 2892
<> 144:ef7eb2e8f9f7 2893 /* Enable Crypto processor */
<> 144:ef7eb2e8f9f7 2894 __HAL_CRYP_ENABLE(hcryp);
<> 144:ef7eb2e8f9f7 2895
<> 144:ef7eb2e8f9f7 2896 for(loopcounter = 0; (loopcounter < headersize); loopcounter+=16)
<> 144:ef7eb2e8f9f7 2897 {
<> 144:ef7eb2e8f9f7 2898 /* Get tick */
<> 144:ef7eb2e8f9f7 2899 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2900
<> 144:ef7eb2e8f9f7 2901 while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_IFEM))
<> 144:ef7eb2e8f9f7 2902 {
<> 144:ef7eb2e8f9f7 2903 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2904 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2905 {
<> 144:ef7eb2e8f9f7 2906 /* Change state */
<> 144:ef7eb2e8f9f7 2907 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2908
<> 144:ef7eb2e8f9f7 2909 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2910 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2911
<> 144:ef7eb2e8f9f7 2912 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2913 }
<> 144:ef7eb2e8f9f7 2914 }
<> 144:ef7eb2e8f9f7 2915 /* Write the header block in the IN FIFO */
<> 144:ef7eb2e8f9f7 2916 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2917 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2918 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2919 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2920 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2921 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2922 hcryp->Instance->DR = *(uint32_t*)(headeraddr);
<> 144:ef7eb2e8f9f7 2923 headeraddr+=4;
<> 144:ef7eb2e8f9f7 2924 }
<> 144:ef7eb2e8f9f7 2925
<> 144:ef7eb2e8f9f7 2926 /* Get tick */
<> 144:ef7eb2e8f9f7 2927 tickstart = HAL_GetTick();
<> 144:ef7eb2e8f9f7 2928
<> 144:ef7eb2e8f9f7 2929 while((hcryp->Instance->SR & CRYP_FLAG_BUSY) == CRYP_FLAG_BUSY)
<> 144:ef7eb2e8f9f7 2930 {
<> 144:ef7eb2e8f9f7 2931 /* Check for the Timeout */
<> 144:ef7eb2e8f9f7 2932 if((HAL_GetTick() - tickstart ) > CRYPEx_TIMEOUT_VALUE)
<> 144:ef7eb2e8f9f7 2933 {
<> 144:ef7eb2e8f9f7 2934 /* Change state */
<> 144:ef7eb2e8f9f7 2935 hcryp->State = HAL_CRYP_STATE_TIMEOUT;
<> 144:ef7eb2e8f9f7 2936
<> 144:ef7eb2e8f9f7 2937 /* Process Unlocked */
<> 144:ef7eb2e8f9f7 2938 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2939
<> 144:ef7eb2e8f9f7 2940 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2941 }
<> 144:ef7eb2e8f9f7 2942 }
<> 144:ef7eb2e8f9f7 2943 }
<> 144:ef7eb2e8f9f7 2944 /* Save formatted counter into the scratch buffer pScratch */
<> 144:ef7eb2e8f9f7 2945 for(loopcounter = 0; (loopcounter < 16); loopcounter++)
<> 144:ef7eb2e8f9f7 2946 {
<> 144:ef7eb2e8f9f7 2947 hcryp->Init.pScratch[loopcounter] = ctr[loopcounter];
<> 144:ef7eb2e8f9f7 2948 }
<> 144:ef7eb2e8f9f7 2949 /* Reset bit 0 */
<> 144:ef7eb2e8f9f7 2950 hcryp->Init.pScratch[15] &= 0xfe;
<> 144:ef7eb2e8f9f7 2951 /* Select payload phase once the header phase is performed */
<> 144:ef7eb2e8f9f7 2952 __HAL_CRYP_SET_PHASE(hcryp, CRYP_PHASE_PAYLOAD);
<> 144:ef7eb2e8f9f7 2953
<> 144:ef7eb2e8f9f7 2954 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 2955 __HAL_CRYP_FIFO_FLUSH(hcryp);
<> 144:ef7eb2e8f9f7 2956
<> 144:ef7eb2e8f9f7 2957 /* Set the phase */
<> 144:ef7eb2e8f9f7 2958 hcryp->Phase = HAL_CRYP_PHASE_PROCESS;
<> 144:ef7eb2e8f9f7 2959 }
<> 144:ef7eb2e8f9f7 2960 /* Set the input and output addresses and start DMA transfer */
<> 144:ef7eb2e8f9f7 2961 CRYPEx_GCMCCM_SetDMAConfig(hcryp, inputaddr, Size, outputaddr);
<> 144:ef7eb2e8f9f7 2962
<> 144:ef7eb2e8f9f7 2963 /* Unlock process */
<> 144:ef7eb2e8f9f7 2964 __HAL_UNLOCK(hcryp);
<> 144:ef7eb2e8f9f7 2965
<> 144:ef7eb2e8f9f7 2966 /* Return function status */
<> 144:ef7eb2e8f9f7 2967 return HAL_OK;
<> 144:ef7eb2e8f9f7 2968 }
<> 144:ef7eb2e8f9f7 2969 else
<> 144:ef7eb2e8f9f7 2970 {
<> 144:ef7eb2e8f9f7 2971 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 2972 }
<> 144:ef7eb2e8f9f7 2973 }
<> 144:ef7eb2e8f9f7 2974
<> 144:ef7eb2e8f9f7 2975 /**
<> 144:ef7eb2e8f9f7 2976 * @}
<> 144:ef7eb2e8f9f7 2977 */
<> 144:ef7eb2e8f9f7 2978
<> 144:ef7eb2e8f9f7 2979 /** @defgroup CRYPEx_Exported_Functions_Group2 CRYPEx IRQ handler management
<> 144:ef7eb2e8f9f7 2980 * @brief CRYPEx IRQ handler.
<> 144:ef7eb2e8f9f7 2981 *
<> 144:ef7eb2e8f9f7 2982 @verbatim
<> 144:ef7eb2e8f9f7 2983 ==============================================================================
<> 144:ef7eb2e8f9f7 2984 ##### CRYPEx IRQ handler management #####
<> 144:ef7eb2e8f9f7 2985 ==============================================================================
<> 144:ef7eb2e8f9f7 2986 [..] This section provides CRYPEx IRQ handler function.
<> 144:ef7eb2e8f9f7 2987
<> 144:ef7eb2e8f9f7 2988 @endverbatim
<> 144:ef7eb2e8f9f7 2989 * @{
<> 144:ef7eb2e8f9f7 2990 */
<> 144:ef7eb2e8f9f7 2991
<> 144:ef7eb2e8f9f7 2992 /**
<> 144:ef7eb2e8f9f7 2993 * @brief This function handles CRYPEx interrupt request.
<> 144:ef7eb2e8f9f7 2994 * @param hcryp: pointer to a CRYPEx_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 2995 * the configuration information for CRYP module
<> 144:ef7eb2e8f9f7 2996 * @retval None
<> 144:ef7eb2e8f9f7 2997 */
<> 144:ef7eb2e8f9f7 2998 void HAL_CRYPEx_GCMCCM_IRQHandler(CRYP_HandleTypeDef *hcryp)
<> 144:ef7eb2e8f9f7 2999 {
<> 144:ef7eb2e8f9f7 3000 switch(CRYP->CR & CRYP_CR_ALGOMODE_DIRECTION)
<> 144:ef7eb2e8f9f7 3001 {
<> 144:ef7eb2e8f9f7 3002 case CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT:
<> 144:ef7eb2e8f9f7 3003 HAL_CRYPEx_AESGCM_Encrypt_IT(hcryp, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 3004 break;
<> 144:ef7eb2e8f9f7 3005
<> 144:ef7eb2e8f9f7 3006 case CRYP_CR_ALGOMODE_AES_GCM_DECRYPT:
<> 144:ef7eb2e8f9f7 3007 HAL_CRYPEx_AESGCM_Decrypt_IT(hcryp, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 3008 break;
<> 144:ef7eb2e8f9f7 3009
<> 144:ef7eb2e8f9f7 3010 case CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT:
<> 144:ef7eb2e8f9f7 3011 HAL_CRYPEx_AESCCM_Encrypt_IT(hcryp, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 3012 break;
<> 144:ef7eb2e8f9f7 3013
<> 144:ef7eb2e8f9f7 3014 case CRYP_CR_ALGOMODE_AES_CCM_DECRYPT:
<> 144:ef7eb2e8f9f7 3015 HAL_CRYPEx_AESCCM_Decrypt_IT(hcryp, NULL, 0, NULL);
<> 144:ef7eb2e8f9f7 3016 break;
<> 144:ef7eb2e8f9f7 3017
<> 144:ef7eb2e8f9f7 3018 default:
<> 144:ef7eb2e8f9f7 3019 break;
<> 144:ef7eb2e8f9f7 3020 }
<> 144:ef7eb2e8f9f7 3021 }
<> 144:ef7eb2e8f9f7 3022
<> 144:ef7eb2e8f9f7 3023 /**
<> 144:ef7eb2e8f9f7 3024 * @}
<> 144:ef7eb2e8f9f7 3025 */
<> 144:ef7eb2e8f9f7 3026
<> 144:ef7eb2e8f9f7 3027 /**
<> 144:ef7eb2e8f9f7 3028 * @}
<> 144:ef7eb2e8f9f7 3029 */
<> 144:ef7eb2e8f9f7 3030 #endif /* HAL_CRYP_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 3031
<> 144:ef7eb2e8f9f7 3032 /**
<> 144:ef7eb2e8f9f7 3033 * @}
<> 144:ef7eb2e8f9f7 3034 */
<> 144:ef7eb2e8f9f7 3035 #endif /* STM32F756xx || STM32F777xx || STM32F779xx */
<> 144:ef7eb2e8f9f7 3036 /**
<> 144:ef7eb2e8f9f7 3037 * @}
<> 144:ef7eb2e8f9f7 3038 */
<> 144:ef7eb2e8f9f7 3039
<> 144:ef7eb2e8f9f7 3040 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/