318 lines
8.6 KiB
C
318 lines
8.6 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_std_aes.h
|
||
* @author MCU Ecosystem Development Team
|
||
* @brief AES STD库驱动头文件。
|
||
* 提供AES相关的STD库操作函数声明、数据类型以及常量的定义。
|
||
*
|
||
*
|
||
**************************************************************************************************
|
||
* @attention
|
||
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
||
*
|
||
**************************************************************************************************
|
||
*/
|
||
|
||
/* 避免头文件重复引用 */
|
||
#ifndef CIU32L051_STD_AES_H
|
||
#define CIU32L051_STD_AES_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup AES AES
|
||
* @brief 高级加密标准协处理器的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
#include "ciu32l051_std_common.h"
|
||
|
||
/*-----------------------------------------type define------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup AES_Types AES Types
|
||
* @brief AES数据类型定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief AES参数配置结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t mode; /**< 加解密模式选择
|
||
@arg AES_MODE_DEC... */
|
||
uint32_t swapped_data_type; /**< 数据交换类型,分别为无交换/16位/8位/1位交换
|
||
@arg AES_SWAPPED_DATA_NONE... */
|
||
} std_aes_init_t;
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*--------------------------------------------define--------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup AES_Constants AES Constants
|
||
* @brief AES常量定义及宏定义
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
/* 加解密模式定义 */
|
||
#define AES_MODE_ENC AES_CR_MOD_SEL_ENC /**< 加密模式 */
|
||
#define AES_MODE_DEC AES_CR_MOD_SEL_DEC /**< 解密模式 */
|
||
|
||
/* 数据交换类型 */
|
||
#define AES_SWAPPED_DATA_NONE AES_CR_DATA_TYPE_NONE /**< 无交换类型,数据不做交换 */
|
||
#define AES_SWAPPED_DATA_16BIT AES_CR_DATA_TYPE_16BIT /**< 16位交换类型,数据按半字交换 */
|
||
#define AES_SWAPPED_DATA_8BIT AES_CR_DATA_TYPE_8BIT /**< 8位交换类型,数据按字节交换 */
|
||
#define AES_SWAPPED_DATA_1BIT AES_CR_DATA_TYPE_BIT /**< 1位交换类型,数据按位交换 */
|
||
|
||
/* 中断源定义 */
|
||
#define AES_INTERRUPT_COMPLETE AES_CSR_CCIE /**< 加解密完成中断使能 */
|
||
|
||
/* 状态标志 */
|
||
#define AES_FLAG_COMPLETE AES_CSR_DONE /**< 加解密完成标志 */
|
||
#define AES_FLAG_BUSY AES_CSR_BUSY /**< 运算过程标志 */
|
||
|
||
/* 清除标志 */
|
||
#define AES_CLEAR_FLAG_COMPLETE AES_CSR_CCFC /**< 加解密完成清除标志 */
|
||
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup AES_External_Functions AES External Functions
|
||
* @brief AES对外函数
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief 设置加解密模式
|
||
* @param mode 加解密模式
|
||
* @arg AES_MODE_ENC:加密模式
|
||
* @arg AES_MODE_DEC:解密模式
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_set_cryption_mode(uint32_t mode)
|
||
{
|
||
MODIFY_REG(AES->CR, AES_CR_MOD_SEL, mode);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取加解密模式设置
|
||
* @retval uint32_t 返回加解密模式设置
|
||
* @arg AES_MODE_ENC:设置为加密模式
|
||
* @arg AES_MODE_DEC:设置为解密模式
|
||
*/
|
||
__STATIC_INLINE uint32_t std_aes_get_cryption_mode(void)
|
||
{
|
||
return (AES->CR & AES_CR_MOD_SEL);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置数据交换类型
|
||
* @param data_type 数据交换类型
|
||
* @arg AES_SWAPPED_DATA_NONE:无交换类型,数据不做交换
|
||
* @arg AES_SWAPPED_DATA_16BIT:16位交换类型,数据按半字交换
|
||
* @arg AES_SWAPPED_DATA_8BIT: 8位交换类型,数据按字节交换
|
||
* @arg AES_SWAPPED_DATA_1BIT: 1位交换类型,数据按位交换
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_set_data_type(uint32_t data_type)
|
||
{
|
||
MODIFY_REG(AES->CR, AES_CR_DATA_TYPE, data_type);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取数据交换类型
|
||
* @retval uint32_t 数据交换类型
|
||
* @arg AES_SWAPPED_DATA_NONE:无交换类型,数据不做交换
|
||
* @arg AES_SWAPPED_DATA_16BIT: 16位交换类型,数据按半字交换
|
||
* @arg AES_SWAPPED_DATA_8BIT: 8位交换类型,数据按字节交换
|
||
* @arg AES_SWAPPED_DATA_1BIT: 1位交换类型,数据按位交换
|
||
*/
|
||
__STATIC_INLINE uint32_t std_aes_get_data_type(void)
|
||
{
|
||
return (AES->CR & AES_CR_DATA_TYPE);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取AES标志的状态
|
||
* @param flag 待获取状态的标志
|
||
* @arg AES_FLAG_COMPLETE:运算完成标志
|
||
* @arg AES_FLAG_BUSY:运算状态标志
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true: 查询标志置位
|
||
* @arg false:查询标志未置位
|
||
*/
|
||
__STATIC_INLINE bool std_aes_get_flag(uint32_t flag)
|
||
{
|
||
return ((AES->CSR & (flag)) == (flag));
|
||
}
|
||
|
||
/**
|
||
* @brief 清除AES状态标志位
|
||
* @param flag 待清除的标志
|
||
* @arg AES_CLEAR_FLAG_COMPLETE:清除计算完成标志
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_clear_flag(uint32_t flag)
|
||
{
|
||
MODIFY_REG(AES->CSR, AES_CSR_CCFC, flag);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能DMA数据输入
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_dmain_enable(void)
|
||
{
|
||
AES->CSR |= AES_CSR_DMAIN_EN;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止DMA数据输入
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_dmain_disable(void)
|
||
{
|
||
AES->CSR &= (~AES_CSR_DMAIN_EN);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能DMA数据输出
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_dmaout_enable(void)
|
||
{
|
||
AES->CSR |= AES_CSR_DMAOUT_EN;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止DMA数据输出
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_dmaout_disable(void)
|
||
{
|
||
AES->CSR &= (~AES_CSR_DMAOUT_EN);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能AES中断
|
||
* @param interrupt AES中断源
|
||
* @arg AES_INTERRUPT_COMPLETE: 计算完成中断使能
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_enable_interrupt(uint32_t interrupt)
|
||
{
|
||
AES->CSR |= (interrupt);
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止AES中断
|
||
* @param interrupt AES中断源
|
||
* @arg AES_INTERRUPT_COMPLETE: 计算完成中断
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_disable_interrupt(uint32_t interrupt)
|
||
{
|
||
AES->CSR &= (~(interrupt));
|
||
}
|
||
|
||
/**
|
||
* @brief 获取算法中断使能的状态
|
||
* @param interrupt AES中断源
|
||
* @arg AES_INTERRUPT_COMPLETE: 计算完成中断
|
||
* @retval bool 返回逻辑表达式的判断结果
|
||
* @arg true:使能中断
|
||
* @arg false:未使能中断
|
||
*/
|
||
__STATIC_INLINE bool std_aes_get_interrupt_enable(uint32_t interrupt)
|
||
{
|
||
return ((AES->CSR & (interrupt)) == (interrupt));
|
||
}
|
||
|
||
/**
|
||
* @brief 写入密钥
|
||
* @param p_key 指向密钥的指针
|
||
* @note 密钥长度为4个字
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_write_key(uint32_t *p_key)
|
||
{
|
||
AES->KEYR[3] = p_key[0];
|
||
AES->KEYR[2] = p_key[1];
|
||
AES->KEYR[1] = p_key[2];
|
||
AES->KEYR[0] = p_key[3];
|
||
}
|
||
|
||
/**
|
||
* @brief 写入数据
|
||
* @param p_data 指向数据的指针
|
||
* @note 数据长度为4个字
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_write_data(uint32_t *p_data)
|
||
{
|
||
AES->DR = p_data[0];
|
||
AES->DR = p_data[1];
|
||
AES->DR = p_data[2];
|
||
AES->DR = p_data[3];
|
||
}
|
||
|
||
/**
|
||
* @brief 读取数据
|
||
* @param p_data 指向数据的指针
|
||
* @note 数据长度为4个字
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_aes_read_data(uint32_t *p_data)
|
||
{
|
||
p_data[0] = AES->DR;
|
||
p_data[1] = AES->DR;
|
||
p_data[2] = AES->DR;
|
||
p_data[3] = AES->DR;
|
||
}
|
||
|
||
void std_aes_init(std_aes_init_t *aes_init_param);
|
||
void std_aes_deinit(void);
|
||
void std_aes_struct_init(std_aes_init_t *aes_init_struct);
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* CIU32L051_STD_AES_H */
|