SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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