#include "crypto.h" #include "rng.h" #include #include #include "inc/hw_types.h" #include "inc/hw_aes.h" #include "inc/hw_memmap.h" #include "driverlib/aes.h" #include "driverlib/rom_map.h" #include "driverlib/prcm.h" static volatile bool g_bContextInIntFlag; static volatile bool g_bDataInIntFlag; static volatile bool g_bContextOutIntFlag; static volatile bool g_bDataOutIntFlag; static uint32_t aes_mode=AES_CFG_MODE_CBC, aes_key_size, aes_blocksize; static uint8_t *aes_key; void AESCrypt(uint32_t dir, uint8_t *iv, uint8_t *data, uint8_t *result, uint32_t dataLength) { // Step1: Enable Interrupts // Step2: Wait for Context Ready Interrupt // Step3: Set the Configuration Parameters (Direction,AES Mode and Key Size) // Step4: Set the Initialisation Vector // Step5: Write Key // Step6: Start the crypt process // Clear the flags. g_bContextInIntFlag = false; g_bDataInIntFlag = false; g_bContextOutIntFlag = false; g_bDataOutIntFlag = false; // Enable all interrupts. MAP_AESIntEnable(AES_BASE, AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | AES_INT_DATA_IN | AES_INT_DATA_OUT); // Wait for the context in flag, the flag will be set in the Interrupt handler. while(!g_bContextInIntFlag) {} MAP_AESConfigSet(AES_BASE, dir | aes_mode | aes_key_size); MAP_AESIVSet(AES_BASE, iv); MAP_AESKey1Set(AES_BASE, aes_key, aes_key_size); MAP_AESDataProcess(AES_BASE, (unsigned char *) data, (unsigned char *) result, dataLength); } uint8_t * AESEncrypt(uint8_t *message, uint32_t messageLength) { uint32_t msgLen = messageLength + aes_blocksize; uint32_t ivblocks = aes_blocksize/4; uint8_t *result = (uint8_t *) malloc(msgLen); uint32_t *IVrand = (uint32_t *) result; uint8_t *data = &result[aes_blocksize]; int i; for(i=0;i