/**
|
******************************************************************************
|
* @file fm33a0xxev_aes.c
|
* @author FM33A0XXEV Application Team
|
* @version V1.0.0
|
* @date 16-April-2020
|
* @brief This file provides firmware functions to manage the following
|
* functionalities of....:
|
*
|
*/
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "fm33a0xxev_aes.h"
|
|
/** @addtogroup fm33a0xxev_StdPeriph_Driver
|
* @{
|
*/
|
|
/** @defgroup AES
|
* @brief AES driver modules
|
* @{
|
*/
|
|
/* AES¼ÓÃÜÃÜÔ¿³¤¶È£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
|
(Key Length)
|
00£º128bit
|
01£º192bit
|
10£º256bit
|
11£º±£Áô Ïà¹Øº¯Êý */
|
void AES_CR_KEYLEN_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = AES->CR;
|
tmpreg &= ~(AES_CR_KEYLEN_Msk);
|
tmpreg |= (SetValue & AES_CR_KEYLEN_Msk);
|
AES->CR = tmpreg;
|
}
|
|
uint32_t AES_CR_KEYLEN_Get(void)
|
{
|
return (AES->CR & AES_CR_KEYLEN_Msk);
|
}
|
|
/* DMAÊý¾Ý×Ô¶¯¶Á³öʹÄÜ
|
(DMA output enable)
|
0£º²»¿ªÆô
|
1£º¿ªÆô
|
¸ÃλÖÃλºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÏÂAESÄ£¿é»á×Ô¶¯²úÉúAES->RAMµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ Ïà¹Øº¯Êý */
|
void AES_CR_DMAOEN_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->CR |= (AES_CR_DMAOEN_Msk);
|
}
|
else
|
{
|
AES->CR &= ~(AES_CR_DMAOEN_Msk);
|
}
|
|
}
|
|
FunState AES_CR_DMAOEN_Getable(void)
|
{
|
if (AES->CR & (AES_CR_DMAOEN_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* ¿ªÆôDMAÊý¾Ý×Ô¶¯Ð´ÈëʹÄÜ
|
(DMA input enable)
|
0£º²»¿ªÆô
|
1£º¿ªÆô
|
¸ÃλÉèÖÃΪ1ºóÔÚģʽ1£¬Ä£Ê½3ºÍģʽ4ÒÔ¼°MultHģʽÏÂAESÄ£¿é»á×Ô¶¯²úÉúRAM->AESµÄ´«ÊäÇëÇó¡£Ä£Ê½2ϲ»»á²úÉú¡£ Ïà¹Øº¯Êý */
|
/* AESʹÄÜ (AES enable)
|
0£º²»Ê¹ÄÜ
|
1£ºÊ¹ÄÜ
|
ÔÚÈκÎʱºòÇå³ýAESENλ¶¼Äܹ»¸´Î»AESÄ£¿é
|
ÔÚģʽ2ϸÃλ»áÔÚÒ»´Î¼ÆËãÍê³ÉºóÓ²¼þ×Ô¶¯Çå0 Ïà¹Øº¯Êý */
|
|
void AES_CR_DMAIEN_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->CR |= (AES_CR_DMAIEN_Msk);
|
}
|
else
|
{
|
AES->CR &= ~(AES_CR_DMAIEN_Msk);
|
}
|
}
|
|
FunState AES_CR_DMAIEN_Getable(void)
|
{
|
if (AES->CR & (AES_CR_DMAIEN_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* AESÊý¾ÝÁ÷´¦Àíģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
|
(Cipher Mode)
|
00£ºECB
|
01£ºCBC
|
10£ºCTR
|
11£ºÊ¹ÓÃMultHÄ£¿é Ïà¹Øº¯Êý */
|
void AES_CR_CHMOD_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = AES->CR;
|
tmpreg &= ~(AES_CR_CHMOD_Msk);
|
tmpreg |= (SetValue & AES_CR_CHMOD_Msk);
|
AES->CR = tmpreg;
|
}
|
|
uint32_t AES_CR_CHMOD_Get(void)
|
{
|
return (AES->CR & AES_CR_CHMOD_Msk);
|
}
|
|
/* AES¹¤×÷ģʽ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£
|
(operation MODE)
|
00£ºÄ£Ê½1£º¼ÓÃÜ
|
01£ºÄ£Ê½2£ºÃÜÔ¿À©Õ¹
|
10£ºÄ£Ê½3£º½âÃÜ
|
11£ºÄ£Ê½4£ºÃÜÔ¿À©Õ¹+½âÃÜ
|
CTRģʽÏÂÅäÖóÉģʽ4½«×Ô¶¯½øÈëCTRµÄ½âÃÜģʽ¡£¼´ÔÚCHMOD=2¡¯b10ʱÅäÖÃMODE=2¡¯b11£¬AES½«°´ÕÕMODE=2¡¯b10µÄÇéÐÎÖ´ÐС£ Ïà¹Øº¯Êý */
|
void AES_CR_MODE_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = AES->CR;
|
tmpreg &= ~(AES_CR_MODE_Msk);
|
tmpreg |= (SetValue & AES_CR_MODE_Msk);
|
AES->CR = tmpreg;
|
}
|
|
uint32_t AES_CR_MODE_Get(void)
|
{
|
return (AES->CR & AES_CR_MODE_Msk);
|
}
|
|
/* Ñ¡ÔñÊý¾ÝÀàÐÍ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£¾ßÌå½»»»¹æÔò¿É²Î¿¼AESÊý¾ÝÀàÐÍÕ½ڡ£
|
(Data type)
|
00£º32bitÊý¾Ý²»½»»»
|
01£º16bitÊý¾Ý°ë×Ö½»»»
|
10£º8bitÊý¾Ý×Ö½Ú½»»»
|
11£º1bitÊý¾Ý±ÈÌØ½»»» Ïà¹Øº¯Êý */
|
void AES_CR_DATATYP_Set(uint32_t SetValue)
|
{
|
uint32_t tmpreg;
|
tmpreg = AES->CR;
|
tmpreg &= ~(AES_CR_DATATYP_Msk);
|
tmpreg |= (SetValue & AES_CR_DATATYP_Msk);
|
AES->CR = tmpreg;
|
}
|
|
uint32_t AES_CR_DATATYP_Get(void)
|
{
|
return (AES->CR & AES_CR_DATATYP_Msk);
|
}
|
|
/* AESʹÄÜ (AES enable)
|
0£º²»Ê¹ÄÜ
|
1£ºÊ¹ÄÜ
|
ÔÚÈκÎʱºòÇå³ýAESENλ¶¼Äܹ»¸´Î»AESÄ£¿é
|
ÔÚģʽ2ϸÃλ»áÔÚÒ»´Î¼ÆËãÍê³ÉºóÓ²¼þ×Ô¶¯Çå0 Ïà¹Øº¯Êý */
|
void AES_CR_EN_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->CR |= (AES_CR_EN_Msk);
|
}
|
else
|
{
|
AES->CR &= ~(AES_CR_EN_Msk);
|
}
|
}
|
|
FunState AES_CR_EN_Getable(void)
|
{
|
if (AES->CR & (AES_CR_EN_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* д´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Write Error interrupt enable) Ïà¹Øº¯Êý */
|
void AES_IER_WRERR_IE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->IER |= (AES_IER_WRERR_IE_Msk);
|
}
|
else
|
{
|
AES->IER &= ~(AES_IER_WRERR_IE_Msk);
|
}
|
}
|
|
FunState AES_IER_WRERR_IE_Getable(void)
|
{
|
if (AES->IER & (AES_IER_WRERR_IE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* ¶Á´íÎóÖжÏʹÄÜ£¬1ÓÐЧ¡£(Read Error interrupt enable) Ïà¹Øº¯Êý */
|
void AES_IER_RDERR_IE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->IER |= (AES_IER_RDERR_IE_Msk);
|
}
|
else
|
{
|
AES->IER &= ~(AES_IER_RDERR_IE_Msk);
|
}
|
}
|
|
FunState AES_IER_RDERR_IE_Getable(void)
|
{
|
if (AES->IER & (AES_IER_RDERR_IE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* AES¼ÆËãÍê³ÉÖжÏʹÄÜ£¬1ÓÐЧ¡£(Cipher Complete Interrupt enable) Ïà¹Øº¯Êý */
|
void AES_IER_CCF_IE_Setable(FunState NewState)
|
{
|
if (NewState == ENABLE)
|
{
|
AES->IER |= (AES_IER_CCF_IE_Msk);
|
}
|
else
|
{
|
AES->IER &= ~(AES_IER_CCF_IE_Msk);
|
}
|
}
|
|
FunState AES_IER_CCF_IE_Getable(void)
|
{
|
if (AES->IER & (AES_IER_CCF_IE_Msk))
|
{
|
return ENABLE;
|
}
|
else
|
{
|
return DISABLE;
|
}
|
}
|
|
/* Êý¾ÝÊäÈë¼Ä´æÆ÷£¬µ±AESÐèÒªÊäÈë¼Ó½âÃÜÊý¾Ýʱ£¬Ó¦¸ÃÍù¸Ã¼Ä´æÆ÷Á¬ÐøÐ´4´Î¡£(AES Data Input)
|
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
|
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÈë¼Ä´æÆ÷
|
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´ÎдÈë¡£
|
MultHģʽ£º°Ñ³ËÊýA»òC´ÓMSBµ½LSB·Ö4´ÎдÈë¡£ Ïà¹Øº¯Êý */
|
void AES_DIR_Write(uint32_t SetValue)
|
{
|
AES->DIR = (SetValue);
|
}
|
|
uint32_t AES_DIR_Read(void)
|
{
|
return (AES->DIR);
|
}
|
|
/* Êý¾ÝÊä³ö¼Ä´æÆ÷£¬µ±AES¼ÆËãÍê³Éºó£¬¿ÉÒÔ·ÖËĴζÁ³ö¼Ó½âÃܵĽá¹û¡£(AES Data Output)
|
ģʽ1£¨¼ÓÃÜ£©£º°ÑÃÜÎÄ´ÓMSBµ½LSB·Ö4´Î¶Á³ö¡£
|
ģʽ2£¨ÃÜÔ¿À©Õ¹£©£ºÎÞÐèʹÓÃÊý¾ÝÊäÊä³ö¼Ä´æÆ÷
|
ģʽ3ºÍģʽ4£¨½âÃÜ£©£º°ÑÃ÷ÎÄ´ÓMSBµ½LSB·Ö4´ÎÊä³ö¡£
|
MultHģʽ£ºÔËËã½á¹û´æ´¢ÔÚIVR¼Ä´æÆ÷ÖУ¬ÎÞÐè¶ÁÈ¡AES_DOUTR¼Ä´æÆ÷¡£ Ïà¹Øº¯Êý */
|
uint32_t AES_DOR_Read(void)
|
{
|
return (AES->DOR);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY0_Write(uint32_t SetValue)
|
{
|
AES->KEY0 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY1_Write(uint32_t SetValue)
|
{
|
AES->KEY1 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY2_Write(uint32_t SetValue)
|
{
|
AES->KEY2 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY3_Write(uint32_t SetValue)
|
{
|
AES->KEY3 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY4_Write(uint32_t SetValue)
|
{
|
AES->KEY4 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY5_Write(uint32_t SetValue)
|
{
|
AES->KEY5 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY6_Write(uint32_t SetValue)
|
{
|
AES->KEY6 = (SetValue);
|
}
|
|
/* AESÔËËãÃØÔ¿£¬×256bit£¬AESKEY0´æ·ÅÃØÔ¿×îµÍ32bit£¬AESLKEY7´æ·ÅÃØÔ¿×î¸ß32bit¡£(AES Key)
|
×¢Ò⣺´Ë¼Ä´æÆ÷Èí¼þÖ»¿Éд£¬²»¿É¶Á£»´Ë¼Ä´æÆ÷ÄÚÈݲ»ÊÜWWDT¸´Î»Ó°Ïì Ïà¹Øº¯Êý */
|
void AES_KEY7_Write(uint32_t SetValue)
|
{
|
AES->KEY7 = (SetValue);
|
}
|
|
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
|
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
|
void AES_IVR0_Write(uint32_t SetValue)
|
{
|
AES->IVR0 = (SetValue);
|
}
|
|
uint32_t AES_IVR0_Read(void)
|
{
|
return (AES->IVR0);
|
}
|
|
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
|
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
|
void AES_IVR1_Write(uint32_t SetValue)
|
{
|
AES->IVR1 = (SetValue);
|
}
|
|
uint32_t AES_IVR1_Read(void)
|
{
|
return (AES->IVR1);
|
}
|
|
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
|
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
|
void AES_IVR2_Write(uint32_t SetValue)
|
{
|
AES->IVR2 = (SetValue);
|
}
|
|
uint32_t AES_IVR2_Read(void)
|
{
|
return (AES->IVR2);
|
}
|
|
/* AESÔËËã128bit³õʼÏòÁ¿£¬ÔÚMultHģʽϱ£´æÔËËã½á¹û¡£
|
(AES Initial Vector Registers) Ïà¹Øº¯Êý */
|
void AES_IVR3_Write(uint32_t SetValue)
|
{
|
AES->IVR3 = (SetValue);
|
}
|
|
uint32_t AES_IVR3_Read(void)
|
{
|
return (AES->IVR3);
|
}
|
|
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
|
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
|
void AES_H0_Write(uint32_t SetValue)
|
{
|
AES->H0 = (SetValue);
|
}
|
|
uint32_t AES_H0_Read(void)
|
{
|
return (AES->H0);
|
}
|
|
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
|
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
|
void AES_H1_Write(uint32_t SetValue)
|
{
|
AES->H1 = (SetValue);
|
}
|
|
uint32_t AES_H1_Read(void)
|
{
|
return (AES->H1);
|
}
|
|
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
|
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
|
void AES_H2_Write(uint32_t SetValue)
|
{
|
AES->H2 = (SetValue);
|
}
|
|
uint32_t AES_H2_Read(void)
|
{
|
return (AES->H2);
|
}
|
|
/* MultHÔËËã128bitÊäÈëH²ÎÊý (H Parameter)
|
H0±£´æH[31:0]£¬H3±£´æH[127:96] Ïà¹Øº¯Êý */
|
void AES_H3_Write(uint32_t SetValue)
|
{
|
AES->H3 = (SetValue);
|
}
|
|
uint32_t AES_H3_Read(void)
|
{
|
return (AES->H3);
|
}
|
|
|
/* д´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊä³ö½×¶Î·¢Éúд²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */
|
void AES_ISR_WRERR_Clr(void)
|
{
|
AES->ISR = AES_ISR_WRERR_Msk;
|
}
|
|
FlagStatus AES_ISR_WRERR_Chk(void)
|
{
|
if (AES->ISR & AES_ISR_WRERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* ¶Á´íÎó±êÖ¾£ºÔÚ¼ÆËã»òÊäÈë½×¶Î·¢Éú¶Á²Ù×÷ʱÖÃ룬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */
|
void AES_ISR_RDERR_Clr(void)
|
{
|
AES->ISR = AES_ISR_RDERR_Msk;
|
}
|
|
FlagStatus AES_ISR_RDERR_Chk(void)
|
{
|
if (AES->ISR & AES_ISR_RDERR_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
/* AES¼ÆËãÍê³É±êÖ¾£¬Èí¼þд1ÇåÁã
|
1£º¼ÆËãÍê³É
|
0£º¼ÆËãûÓÐÍê³É Ïà¹Øº¯Êý */
|
void AES_ISR_CCF_Clr(void)
|
{
|
AES->ISR = AES_ISR_CCF_Msk;
|
}
|
|
FlagStatus AES_ISR_CCF_Chk(void)
|
{
|
if (AES->ISR & AES_ISR_CCF_Msk)
|
{
|
return SET;
|
}
|
else
|
{
|
return RESET;
|
}
|
}
|
|
void AES_Deinit(void)
|
{
|
//AES->CR = 0x00000000;
|
//AES->IER = 0x00000000;
|
//AES->DIR = 0x00000000;
|
//AES->DOR = 0x00000000;
|
//AES->KEY0 = 0x00000000;
|
//AES->KEY1 = 0x00000000;
|
//AES->KEY2 = 0x00000000;
|
//AES->KEY3 = 0x00000000;
|
//AES->KEY4 = 0x00000000;
|
//AES->KEY5 = 0x00000000;
|
//AES->KEY6 = 0x00000000;
|
//AES->KEY7 = 0x00000000;
|
//AES->IVR0 = 0x00000000;
|
//AES->IVR1 = 0x00000000;
|
//AES->IVR2 = 0x00000000;
|
//AES->IVR3 = 0x00000000;
|
//AES->H0 = 0x00000000;
|
//AES->H1 = 0x00000000;
|
//AES->H2 = 0x00000000;
|
//AES->H3 = 0x00000000;
|
}
|
//Code_End
|
|
/********************************
|
AES ¹¦ÄÜ¿ØÖƺ¯Êý
|
¹¦ÄÜ: ¼Ó½âÃÜÃÜÔ¿ÊäÈë(key0´æ·ÅÃÜÔ¿×îµÍ32bit)
|
ÊäÈ룺ÃÜÔ¿ 16/24/32×Ö½Ú³¤¶ÈµÄÃÜÔ¿
|
³¤¶È 16/24/32
|
Êä³ö: ÎÞ
|
********************************/
|
void AES_KEY_WriteEx(uint8_t *KeyIn, uint8_t Len)
|
{
|
uint8_t i;
|
__IO uint32_t *PointKeyReg;
|
__IO uint32_t Temp32;
|
|
if( (Len != 16) && (Len != 24) && (Len != 32) ) return;
|
if(KeyIn == NULL) return;
|
|
PointKeyReg = (&AES->KEY0);
|
for(i=0; i<Len; i=i+4)
|
{
|
Temp32 = (KeyIn[0+i]<<24)|(KeyIn[1+i]<<16)|(KeyIn[2+i]<<8)|(KeyIn[3+i]<<0);
|
PointKeyReg[(Len-i)/4-1] = Temp32;
|
}
|
}
|
|
|
|
/*³õʼÏòÁ¿ÊäÈë */
|
void AES_IVR_WriteEx(uint8_t *IVRIn)
|
{
|
uint8_t i;
|
__IO uint32_t *PointIvrReg;
|
__IO uint32_t Temp32;
|
if(IVRIn == NULL) return;
|
|
PointIvrReg = (&AES->IVR0);
|
for(i=0; i<4*4; i=i+4)
|
{
|
Temp32 = (IVRIn[0+i]<<24)|(IVRIn[1+i]<<16)|(IVRIn[2+i]<<8)|(IVRIn[3+i]<<0);
|
PointIvrReg[(16-i)/4-1] = Temp32;
|
}
|
}
|
|
/*³õʼÏòÁ¿¶ÁÈ¡ */
|
void AES_IVR_ReadEx(uint8_t *IVROut)
|
{
|
uint8_t i;
|
__IO uint32_t *PointIvrReg;
|
__IO uint32_t Temp32;
|
|
if(IVROut == NULL) return;
|
|
PointIvrReg = (&AES->IVR0);
|
for(i=0; i<4*4; i=i+4)
|
{
|
Temp32 = PointIvrReg[(4*4-i)/4-1];
|
IVROut[0+i] = Temp32>>24;
|
IVROut[1+i] = Temp32>>16;
|
IVROut[2+i] = Temp32>>8;
|
IVROut[3+i] = Temp32>>0;
|
}
|
}
|
|
|
/*¼Ó½âÃÜÊý¾ÝÊäÈ룬16×Ö½Ú£¨128bit£©·Ö×éÊý¾ÝÊäÈë */
|
void AES_DIN_GroupWrite_128BIT(uint8_t *DataIn)
|
{
|
uint8_t i;
|
__IO uint32_t Temp32;
|
|
if(DataIn == NULL) return;
|
|
for(i=0; i<16; i=i+4)
|
{
|
Temp32 = (DataIn[0+i]<<24)|(DataIn[1+i]<<16)|(DataIn[2+i]<<8)|(DataIn[3+i]<<0);
|
AES->DIR = Temp32;
|
}
|
}
|
|
/*¼Ó½âÃÜÊý¾ÝÊä³ö£¬16×Ö½Ú£¨128bit£©·Ö×éÊý¾ÝÊä³ö */
|
void AES_DOUT_GroupRead_128BIT(uint8_t *DataOut)
|
{
|
uint8_t i;
|
__IO uint32_t Temp32;
|
|
if(DataOut == NULL) return;
|
|
for(i=0; i<16; i=i+4)
|
{
|
Temp32 = AES->DOR;
|
DataOut[0+i] = Temp32>>24;
|
DataOut[1+i] = Temp32>>16;
|
DataOut[2+i] = Temp32>>8;
|
DataOut[3+i] = Temp32>>0;
|
}
|
}
|
|
|
uint8_t AES_GroupWriteAndRead_128BIT(uint8_t *DataIn, uint8_t *DataOut)
|
{
|
uint16_t i;
|
|
if((DataIn == NULL) || (DataOut == NULL)) return 1;
|
|
//ÊäÈë¼Ó½âÃÜÊý¾Ý
|
AES_DIN_GroupWrite_128BIT(DataIn);
|
|
//µÈ´ýCCF±êÖ¾ÖÃÆð,Íê³É¼ÆËã´óÔ¼ÐèÒª100¸öʱÖÓÖÜÆÚ
|
for(i=0;i<500;i++)
|
{
|
if(SET == AES_ISR_CCF_Chk() ) break;
|
}
|
//ÇåCCF±êÖ¾
|
//¶Áȡǰ±ØÐëÇå³ý
|
AES_ISR_CCF_Clr();
|
|
//¶ÁÈ¡½á¹û
|
AES_DOUT_GroupRead_128BIT(DataOut);
|
|
if(i==500) return 1;
|
else return 0;
|
}
|
|
|
uint8_t AES_GroupWriteAndRead_128BIT_IVR(uint8_t *DataIn, uint8_t *DataOut)
|
{
|
uint16_t i;
|
|
if((DataIn == NULL) || (DataOut == NULL)) return 1;
|
|
//ÊäÈë¼Ó½âÃÜÊý¾Ý
|
AES_DIN_GroupWrite_128BIT(DataIn);
|
|
//µÈ´ýCCF±êÖ¾ÖÃÆð,Íê³É¼ÆËã´óÔ¼ÐèÒª100¸öʱÖÓÖÜÆÚ
|
for(i=0;i<500;i++)
|
{
|
if(SET == AES_ISR_CCF_Chk() ) break;
|
}
|
//ÇåCCF±êÖ¾
|
//¶Áȡǰ±ØÐëÇå³ý
|
AES_ISR_CCF_Clr();
|
|
//¶ÁÈ¡½á¹û
|
AES_IVR_ReadEx(DataOut);
|
|
if(i==500) return 1;
|
else return 0;
|
}
|
|
/********************************
|
AES ¹¦ÄÜ¿ØÖƺ¯Êý
|
¹¦ÄÜ: MultH²ÎÊý¼Ä´æÆ÷ÊäÈë(h0´æ·ÅÃÜÔ¿×îµÍ32bit)
|
ÊäÈ룺MultHÔËËã128bitÊäÈëH²ÎÊý
|
Êä³ö: ÎÞ
|
********************************/
|
void AES_Hx_WriteEx(uint8_t *HxIn, uint8_t Len)
|
{
|
uint8_t i;
|
__IO uint32_t *PointHxReg;
|
__IO uint32_t Temp32;
|
|
if(Len != 16) return;
|
|
if(HxIn == NULL) return;
|
|
PointHxReg = (&AES->H0);
|
for(i=0; i<Len; i=i+4)
|
{
|
Temp32 = (HxIn[0+i]<<24)|(HxIn[1+i]<<16)|(HxIn[2+i]<<8)|(HxIn[3+i]<<0);
|
PointHxReg[(Len-i)/4-1] = Temp32;
|
}
|
}
|
|
|
/********************************
|
Hx ²ÎÊý¶ÁÈ¡
|
¹¦ÄÜ: MultH²ÎÊý¼Ä´æÆ÷ÊäÈë(h0´æ·ÅÃÜÔ¿×îµÍ32bit)
|
ÊäÈ룺H²ÎÊý³¤¶È
|
Êä³ö£ºMultHÔËËã128bitÊäÈëH²ÎÊý
|
·µ»Ø£ºÎÞ
|
********************************/
|
void AES_Hx_ReadEx(uint8_t *HxOut, uint8_t Len)
|
{
|
uint8_t i;
|
__IO uint32_t *PointKeyReg;
|
__IO uint32_t Temp32;
|
|
if(Len != 16) return;
|
|
if(HxOut == NULL)return;
|
|
PointKeyReg = (&AES->H0);
|
for(i=0; i<Len; i=i+4)
|
{
|
Temp32 = PointKeyReg[(Len-i)/4-1];
|
HxOut[0+i] = Temp32>>24;
|
HxOut[1+i] = Temp32>>16;
|
HxOut[2+i] = Temp32>>8;
|
HxOut[3+i] = Temp32>>0;
|
}
|
}
|
/* AESÄ£¿é³õʼ»¯º¯Êý */
|
void AES_Init(AES_InitTypeDef* para)
|
{
|
AES_CR_KEYLEN_Set(para->KEYLEN); //AES¼ÓÃÜÃÜÔ¿³¤¶È£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
|
AES_CR_CHMOD_Set(para->CHMOD); //AESÊý¾ÝÁ÷´¦Àíģʽ£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
|
AES_CR_MODE_Set(para->MODE); //AES¹¤×÷ģʽ£¬AESEN=1ʱ²»¿ÉÐÞ¸Ä
|
AES_CR_DATATYP_Set(para->DATATYP); //Ñ¡ÔñÊý¾ÝÀàÐÍ£¬AESEN=1ʱ²»¿ÉÐ޸ġ£¾ßÌå½»»»¹æÔò¿É²Î¿¼AESÊý¾ÝÀàÐÍÕ½Ú
|
AES_CR_DMAOEN_Setable(para->DMAOEN); //DMAÊý¾Ý×Ô¶¯¶Á³öʹÄÜ
|
AES_CR_DMAIEN_Setable(para->DMAIEN); //DMAÊý¾Ý×Ô¶¯Ð´ÈëʹÄÜ
|
AES_IER_WRERR_IE_Setable(para->WERRIE); //´íÎó±êÖ¾£¨WRERR£©ÖжÏʹÄÜ
|
AES_IER_RDERR_IE_Setable(para->RERRIE); //´íÎó±êÖ¾£¨RDERR£©ÖжÏʹÄÜ
|
AES_IER_CCF_IE_Setable(para->CCFIE); //CCF±êÖ¾ÖжÏʹÄÜ
|
AES_CR_EN_Setable(para->AESEN); //AESʹÄÜ
|
}
|
|
/******END OF FILE****/
|