339 lines
12 KiB
C
339 lines
12 KiB
C
/**
|
|
******************************************************************************
|
|
* @file stm32f4xx_cryp.h
|
|
* @author MCD Application Team
|
|
* @version V1.0.0
|
|
* @date 30-September-2011
|
|
* @brief This file contains all the functions prototypes for the Cryptographic
|
|
* processor(CRYP) firmware library.
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
*
|
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
#ifndef __STM32F4xx_CRYP_H
|
|
#define __STM32F4xx_CRYP_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "stm32f4xx.h"
|
|
|
|
/** @addtogroup STM32F4xx_StdPeriph_Driver
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup CRYP
|
|
* @{
|
|
*/
|
|
|
|
/* Exported types ------------------------------------------------------------*/
|
|
|
|
/**
|
|
* @brief CRYP Init structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint16_t CRYP_AlgoDir; /*!< Encrypt or Decrypt. This parameter can be a
|
|
value of @ref CRYP_Algorithm_Direction */
|
|
uint16_t CRYP_AlgoMode; /*!< TDES-ECB, TDES-CBC, DES-ECB, DES-CBC, AES-ECB,
|
|
AES-CBC, AES-CTR, AES-Key. This parameter can be
|
|
a value of @ref CRYP_Algorithm_Mode */
|
|
uint16_t CRYP_DataType; /*!< 32-bit data, 16-bit data, bit data or bit-string.
|
|
This parameter can be a value of @ref CRYP_Data_Type */
|
|
uint16_t CRYP_KeySize; /*!< Used only in AES mode only : 128, 192 or 256 bit
|
|
key length. This parameter can be a value of
|
|
@ref CRYP_Key_Size_for_AES_only */
|
|
}CRYP_InitTypeDef;
|
|
|
|
/**
|
|
* @brief CRYP Key(s) structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t CRYP_Key0Left; /*!< Key 0 Left */
|
|
uint32_t CRYP_Key0Right; /*!< Key 0 Right */
|
|
uint32_t CRYP_Key1Left; /*!< Key 1 left */
|
|
uint32_t CRYP_Key1Right; /*!< Key 1 Right */
|
|
uint32_t CRYP_Key2Left; /*!< Key 2 left */
|
|
uint32_t CRYP_Key2Right; /*!< Key 2 Right */
|
|
uint32_t CRYP_Key3Left; /*!< Key 3 left */
|
|
uint32_t CRYP_Key3Right; /*!< Key 3 Right */
|
|
}CRYP_KeyInitTypeDef;
|
|
/**
|
|
* @brief CRYP Initialization Vectors (IV) structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t CRYP_IV0Left; /*!< Init Vector 0 Left */
|
|
uint32_t CRYP_IV0Right; /*!< Init Vector 0 Right */
|
|
uint32_t CRYP_IV1Left; /*!< Init Vector 1 left */
|
|
uint32_t CRYP_IV1Right; /*!< Init Vector 1 Right */
|
|
}CRYP_IVInitTypeDef;
|
|
|
|
/**
|
|
* @brief CRYP context swapping structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
/*!< Configuration */
|
|
uint32_t CR_bits9to2;
|
|
/*!< KEY */
|
|
uint32_t CRYP_IV0LR;
|
|
uint32_t CRYP_IV0RR;
|
|
uint32_t CRYP_IV1LR;
|
|
uint32_t CRYP_IV1RR;
|
|
/*!< IV */
|
|
uint32_t CRYP_K0LR;
|
|
uint32_t CRYP_K0RR;
|
|
uint32_t CRYP_K1LR;
|
|
uint32_t CRYP_K1RR;
|
|
uint32_t CRYP_K2LR;
|
|
uint32_t CRYP_K2RR;
|
|
uint32_t CRYP_K3LR;
|
|
uint32_t CRYP_K3RR;
|
|
}CRYP_Context;
|
|
|
|
|
|
/* Exported constants --------------------------------------------------------*/
|
|
|
|
/** @defgroup CRYP_Exported_Constants
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup CRYP_Algorithm_Direction
|
|
* @{
|
|
*/
|
|
#define CRYP_AlgoDir_Encrypt ((uint16_t)0x0000)
|
|
#define CRYP_AlgoDir_Decrypt ((uint16_t)0x0004)
|
|
#define IS_CRYP_ALGODIR(ALGODIR) (((ALGODIR) == CRYP_AlgoDir_Encrypt) || \
|
|
((ALGODIR) == CRYP_AlgoDir_Decrypt))
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_Algorithm_Mode
|
|
* @{
|
|
*/
|
|
|
|
/*!< TDES Modes */
|
|
#define CRYP_AlgoMode_TDES_ECB ((uint16_t)0x0000)
|
|
#define CRYP_AlgoMode_TDES_CBC ((uint16_t)0x0008)
|
|
|
|
/*!< DES Modes */
|
|
#define CRYP_AlgoMode_DES_ECB ((uint16_t)0x0010)
|
|
#define CRYP_AlgoMode_DES_CBC ((uint16_t)0x0018)
|
|
|
|
/*!< AES Modes */
|
|
#define CRYP_AlgoMode_AES_ECB ((uint16_t)0x0020)
|
|
#define CRYP_AlgoMode_AES_CBC ((uint16_t)0x0028)
|
|
#define CRYP_AlgoMode_AES_CTR ((uint16_t)0x0030)
|
|
#define CRYP_AlgoMode_AES_Key ((uint16_t)0x0038)
|
|
|
|
#define IS_CRYP_ALGOMODE(ALGOMODE) (((ALGOMODE) == CRYP_AlgoMode_TDES_ECB) || \
|
|
((ALGOMODE) == CRYP_AlgoMode_TDES_CBC)|| \
|
|
((ALGOMODE) == CRYP_AlgoMode_DES_ECB)|| \
|
|
((ALGOMODE) == CRYP_AlgoMode_DES_CBC) || \
|
|
((ALGOMODE) == CRYP_AlgoMode_AES_ECB) || \
|
|
((ALGOMODE) == CRYP_AlgoMode_AES_CBC) || \
|
|
((ALGOMODE) == CRYP_AlgoMode_AES_CTR) || \
|
|
((ALGOMODE) == CRYP_AlgoMode_AES_Key))
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_Data_Type
|
|
* @{
|
|
*/
|
|
#define CRYP_DataType_32b ((uint16_t)0x0000)
|
|
#define CRYP_DataType_16b ((uint16_t)0x0040)
|
|
#define CRYP_DataType_8b ((uint16_t)0x0080)
|
|
#define CRYP_DataType_1b ((uint16_t)0x00C0)
|
|
#define IS_CRYP_DATATYPE(DATATYPE) (((DATATYPE) == CRYP_DataType_32b) || \
|
|
((DATATYPE) == CRYP_DataType_16b)|| \
|
|
((DATATYPE) == CRYP_DataType_8b)|| \
|
|
((DATATYPE) == CRYP_DataType_1b))
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_Key_Size_for_AES_only
|
|
* @{
|
|
*/
|
|
#define CRYP_KeySize_128b ((uint16_t)0x0000)
|
|
#define CRYP_KeySize_192b ((uint16_t)0x0100)
|
|
#define CRYP_KeySize_256b ((uint16_t)0x0200)
|
|
#define IS_CRYP_KEYSIZE(KEYSIZE) (((KEYSIZE) == CRYP_KeySize_128b)|| \
|
|
((KEYSIZE) == CRYP_KeySize_192b)|| \
|
|
((KEYSIZE) == CRYP_KeySize_256b))
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_flags_definition
|
|
* @{
|
|
*/
|
|
#define CRYP_FLAG_BUSY ((uint8_t)0x10) /*!< The CRYP core is currently
|
|
processing a block of data
|
|
or a key preparation (for
|
|
AES decryption). */
|
|
#define CRYP_FLAG_IFEM ((uint8_t)0x01) /*!< Input Fifo Empty */
|
|
#define CRYP_FLAG_IFNF ((uint8_t)0x02) /*!< Input Fifo is Not Full */
|
|
#define CRYP_FLAG_INRIS ((uint8_t)0x22) /*!< Raw interrupt pending */
|
|
#define CRYP_FLAG_OFNE ((uint8_t)0x04) /*!< Input Fifo service raw
|
|
interrupt status */
|
|
#define CRYP_FLAG_OFFU ((uint8_t)0x08) /*!< Output Fifo is Full */
|
|
#define CRYP_FLAG_OUTRIS ((uint8_t)0x21) /*!< Output Fifo service raw
|
|
interrupt status */
|
|
|
|
#define IS_CRYP_GET_FLAG(FLAG) (((FLAG) == CRYP_FLAG_IFEM) || \
|
|
((FLAG) == CRYP_FLAG_IFNF) || \
|
|
((FLAG) == CRYP_FLAG_OFNE) || \
|
|
((FLAG) == CRYP_FLAG_OFFU) || \
|
|
((FLAG) == CRYP_FLAG_BUSY) || \
|
|
((FLAG) == CRYP_FLAG_OUTRIS)|| \
|
|
((FLAG) == CRYP_FLAG_INRIS))
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_interrupts_definition
|
|
* @{
|
|
*/
|
|
#define CRYP_IT_INI ((uint8_t)0x01) /*!< IN Fifo Interrupt */
|
|
#define CRYP_IT_OUTI ((uint8_t)0x02) /*!< OUT Fifo Interrupt */
|
|
#define IS_CRYP_CONFIG_IT(IT) ((((IT) & (uint8_t)0xFC) == 0x00) && ((IT) != 0x00))
|
|
#define IS_CRYP_GET_IT(IT) (((IT) == CRYP_IT_INI) || ((IT) == CRYP_IT_OUTI))
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_Encryption_Decryption_modes_definition
|
|
* @{
|
|
*/
|
|
#define MODE_ENCRYPT ((uint8_t)0x01)
|
|
#define MODE_DECRYPT ((uint8_t)0x00)
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup CRYP_DMA_transfer_requests
|
|
* @{
|
|
*/
|
|
#define CRYP_DMAReq_DataIN ((uint8_t)0x01)
|
|
#define CRYP_DMAReq_DataOUT ((uint8_t)0x02)
|
|
#define IS_CRYP_DMAREQ(DMAREQ) ((((DMAREQ) & (uint8_t)0xFC) == 0x00) && ((DMAREQ) != 0x00))
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/* Exported macro ------------------------------------------------------------*/
|
|
/* Exported functions --------------------------------------------------------*/
|
|
|
|
/* Function used to set the CRYP configuration to the default reset state ****/
|
|
void CRYP_DeInit(void);
|
|
|
|
/* CRYP Initialization and Configuration functions ****************************/
|
|
void CRYP_Init(CRYP_InitTypeDef* CRYP_InitStruct);
|
|
void CRYP_StructInit(CRYP_InitTypeDef* CRYP_InitStruct);
|
|
void CRYP_KeyInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct);
|
|
void CRYP_KeyStructInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct);
|
|
void CRYP_IVInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct);
|
|
void CRYP_IVStructInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct);
|
|
void CRYP_Cmd(FunctionalState NewState);
|
|
|
|
/* CRYP Data processing functions *********************************************/
|
|
void CRYP_DataIn(uint32_t Data);
|
|
uint32_t CRYP_DataOut(void);
|
|
void CRYP_FIFOFlush(void);
|
|
|
|
/* CRYP Context swapping functions ********************************************/
|
|
ErrorStatus CRYP_SaveContext(CRYP_Context* CRYP_ContextSave,
|
|
CRYP_KeyInitTypeDef* CRYP_KeyInitStruct);
|
|
void CRYP_RestoreContext(CRYP_Context* CRYP_ContextRestore);
|
|
|
|
/* CRYP's DMA interface function **********************************************/
|
|
void CRYP_DMACmd(uint8_t CRYP_DMAReq, FunctionalState NewState);
|
|
|
|
/* Interrupts and flags management functions **********************************/
|
|
void CRYP_ITConfig(uint8_t CRYP_IT, FunctionalState NewState);
|
|
ITStatus CRYP_GetITStatus(uint8_t CRYP_IT);
|
|
FlagStatus CRYP_GetFlagStatus(uint8_t CRYP_FLAG);
|
|
|
|
/* High Level AES functions **************************************************/
|
|
ErrorStatus CRYP_AES_ECB(uint8_t Mode,
|
|
uint8_t *Key, uint16_t Keysize,
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
ErrorStatus CRYP_AES_CBC(uint8_t Mode,
|
|
uint8_t InitVectors[16],
|
|
uint8_t *Key, uint16_t Keysize,
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
ErrorStatus CRYP_AES_CTR(uint8_t Mode,
|
|
uint8_t InitVectors[16],
|
|
uint8_t *Key, uint16_t Keysize,
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
/* High Level TDES functions **************************************************/
|
|
ErrorStatus CRYP_TDES_ECB(uint8_t Mode,
|
|
uint8_t Key[24],
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
ErrorStatus CRYP_TDES_CBC(uint8_t Mode,
|
|
uint8_t Key[24],
|
|
uint8_t InitVectors[8],
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
/* High Level DES functions **************************************************/
|
|
ErrorStatus CRYP_DES_ECB(uint8_t Mode,
|
|
uint8_t Key[8],
|
|
uint8_t *Input, uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
ErrorStatus CRYP_DES_CBC(uint8_t Mode,
|
|
uint8_t Key[8],
|
|
uint8_t InitVectors[8],
|
|
uint8_t *Input,uint32_t Ilength,
|
|
uint8_t *Output);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*__STM32F4xx_CRYP_H */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|