Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

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