fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
19:112740acecfa
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

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