SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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