demo工程暂存 优化菜单界面UI和功能
This commit is contained in:
179
MCU/components/drivers/peripheral/Src/driver_aes.c
Normal file
179
MCU/components/drivers/peripheral/Src/driver_aes.c
Normal file
@ -0,0 +1,179 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file driver_aes.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2022
|
||||
* @brief IIR module driver.
|
||||
* This file provides firmware functions to manage the
|
||||
* SEC AES peripheral
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2022 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "fr30xx.h"
|
||||
|
||||
/*********************************************************************
|
||||
* @fn aes_config
|
||||
*
|
||||
* @brief config the aes mode and Endia.
|
||||
*
|
||||
* @param fe_Mode : select AES mode.
|
||||
* @param fe_Endian: select AES Endian.
|
||||
*/
|
||||
void aes_config(enum_AES_MODE_t fe_Mode, enum_ENDIAN_t fe_Endian)
|
||||
{
|
||||
/* AES Endian */
|
||||
SEC_AES->AES_CTRL.Bits.ENDIAN_SEL = fe_Endian;
|
||||
/* AES Mode */
|
||||
if (fe_Mode >= AES_CBC_128){
|
||||
SEC_AES->AES_CTRL.Bits.CBC = AES_CBC_MODE_ENABLE;
|
||||
SEC_AES->AES_CTRL.Bits.KEY_LEN = fe_Mode - AES_CBC_128;
|
||||
}
|
||||
else{
|
||||
SEC_AES->AES_CTRL.Bits.CBC = AES_CBC_MODE_DISABLE;
|
||||
SEC_AES->AES_CTRL.Bits.KEY_LEN = fe_Mode;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn aes_set_encrypt_key
|
||||
*
|
||||
* @brief Set AES encryption key.
|
||||
*
|
||||
* @param key : points to the AES key.
|
||||
*/
|
||||
void aes_set_encrypt_key(uint8_t *key)
|
||||
{
|
||||
uint32_t *lp_Key = (uint32_t *)key;
|
||||
|
||||
SEC_AES->KEY_0 = lp_Key[0];
|
||||
SEC_AES->KEY_1 = lp_Key[1];
|
||||
SEC_AES->KEY_2 = lp_Key[2];
|
||||
SEC_AES->KEY_3 = lp_Key[3];
|
||||
|
||||
switch(SEC_AES->AES_CTRL.Bits.KEY_LEN)
|
||||
{
|
||||
case AES_ECB_192:{
|
||||
SEC_AES->KEY_4 = lp_Key[4];
|
||||
SEC_AES->KEY_5 = lp_Key[5];
|
||||
}break;
|
||||
|
||||
case AES_ECB_256:{
|
||||
SEC_AES->KEY_4 = lp_Key[4];
|
||||
SEC_AES->KEY_5 = lp_Key[5];
|
||||
SEC_AES->KEY_6 = lp_Key[6];
|
||||
SEC_AES->KEY_7 = lp_Key[7];
|
||||
}break;
|
||||
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn aes_set_encrypt_iv
|
||||
*
|
||||
* @brief Set IV for the encrypt/decrypt.
|
||||
*
|
||||
* @param key : points to the AES key.
|
||||
*/
|
||||
void aes_set_encrypt_iv(uint8_t *iv)
|
||||
{
|
||||
uint32_t *lp_IV = (uint32_t *)iv;
|
||||
|
||||
SEC_AES->IV_0 = lp_IV[0];
|
||||
SEC_AES->IV_1 = lp_IV[1];
|
||||
SEC_AES->IV_2 = lp_IV[2];
|
||||
SEC_AES->IV_3 = lp_IV[3];
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn aes_encrypt
|
||||
*
|
||||
* @brief aes encrypt.
|
||||
*
|
||||
* @param fp_Data_In: the pointer of data which is to encrypt.
|
||||
* @param fu32_Size: encrypt size.
|
||||
* @param fp_Data_Out: the pointer of data which saves the encryption data.
|
||||
*/
|
||||
void aes_encrypt(uint8_t *fp_Data_In, uint32_t fu32_Size, uint8_t *fp_Data_Out)
|
||||
{
|
||||
uint32_t *DataIN = (uint32_t *)fp_Data_In;
|
||||
uint32_t *DataOUT = (uint32_t *)fp_Data_Out;
|
||||
|
||||
uint32_t InIndex = 0;
|
||||
uint32_t lu32_size;
|
||||
|
||||
lu32_size = fu32_Size/16;
|
||||
if (fu32_Size % 16)
|
||||
lu32_size++;
|
||||
|
||||
/* Block 16 byte */
|
||||
while(InIndex < lu32_size)
|
||||
{
|
||||
SEC_AES->DATAIN_0 = *DataIN++;
|
||||
SEC_AES->DATAIN_1 = *DataIN++;
|
||||
SEC_AES->DATAIN_2 = *DataIN++;
|
||||
SEC_AES->DATAIN_3 = *DataIN++;
|
||||
|
||||
__AES_SET_OPCODE(AES_OPCODE_ENCRYPT);
|
||||
__AES_WORK_START();
|
||||
|
||||
while(__AES_IS_BUSY());
|
||||
|
||||
*DataOUT++ = SEC_AES->DATAOUT_0;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_1;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_2;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_3;
|
||||
|
||||
InIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn aes_decrypt
|
||||
*
|
||||
* @brief aes decrypt
|
||||
*
|
||||
* @param fp_Data_In: the pointer of data which is to decrypt.
|
||||
* @param fu32_Size: decrypt size.
|
||||
* @param fp_Data_Out: the pointer of data which saves the decryption data.
|
||||
*/
|
||||
void aes_decrypt(uint8_t *fp_Data_In, uint32_t fu32_Size, uint8_t *fp_Data_Out)
|
||||
{
|
||||
uint32_t *DataIN = (uint32_t *)fp_Data_In;
|
||||
uint32_t *DataOUT = (uint32_t *)fp_Data_Out;
|
||||
|
||||
uint32_t InIndex = 0;
|
||||
uint32_t lu32_size;
|
||||
|
||||
lu32_size = fu32_Size/16;
|
||||
if (fu32_Size % 16)
|
||||
lu32_size++;
|
||||
|
||||
while (InIndex < lu32_size)
|
||||
{
|
||||
SEC_AES->DATAIN_0 = *DataIN++;
|
||||
SEC_AES->DATAIN_1 = *DataIN++;
|
||||
SEC_AES->DATAIN_2 = *DataIN++;
|
||||
SEC_AES->DATAIN_3 = *DataIN++;
|
||||
|
||||
__AES_SET_OPCODE(AES_OPCODE_KEY_EXPAND);
|
||||
__AES_WORK_START();
|
||||
while(__AES_IS_BUSY());
|
||||
|
||||
__AES_SET_OPCODE(AES_OPCODE_DECRYPT);
|
||||
__AES_WORK_START();
|
||||
while(__AES_IS_BUSY());
|
||||
|
||||
*DataOUT++ = SEC_AES->DATAOUT_0;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_1;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_2;
|
||||
*DataOUT++ = SEC_AES->DATAOUT_3;
|
||||
|
||||
InIndex++;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user