/** ****************************************************************************** * @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; iIVR0); 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; iH0); for(i=0; i>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****/