主题:SysConfig 中讨论的其他器件
工具/软件:
您好!
我正在尝试使用加密模块对数据进行加密、下面是我用于测试的一个简单示例。
// Initialize the crypto-drivers
CryptoCC32XX_init();
CryptoCC32XX_Handle handle = NULL;
handle = CryptoCC32XX_open(0, CryptoCC32XX_AES | CryptoCC32XX_DES | CryptoCC32XX_HMAC);
if (!handle) {
Display_printf(dispHandle, 0, 0, "CryptoCC32XX did not open");
}
else
{
//Space for input and data
unsigned char plainData[16] = "whatsoever123456";
unsigned int plainDataLen = sizeof(plainData);
unsigned char cipherData[16] = {0};
unsigned int cipherDataLen = 0;
// 32 byte key (256bits)
uint8_t key[32] = {
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
};
//12 byte nonce + 4 bytes counter (for AES_CTR)
uint8_t nonce[16] = {
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
0xF8, 0xF9, 0xFA, 0xFB, 0x00, 0x00, 0x00, 0x00,
};
CryptoCC32XX_EncryptParams aesParams;
aesParams.aes.keySize = CryptoCC32XX_AES_KEY_SIZE_256BIT;
aesParams.aes.pKey = &key[0];
aesParams.aes.pIV = (void *)&nonce[0];
int32_t status = CryptoCC32XX_encrypt(handle, CryptoCC32XX_AES_CTR , plainData, plainDataLen, cipherData , &cipherDataLen , &aesParams);
Display_printf(dispHandle, 0, 0, "Encrypting Data: status = %d", status);
}
"CryptoCC32XX_encrypt ()"返回-1、当我进入函数时、它会正确调用"CryptoCC32XX_aesProcess ()"。
但随后会到达这一部分
int32_t count = CryptoCC32XX_CONTEXT_READY_MAX_COUNTER;
/*
Step1: Enable Interrupts
Step2: Wait for Context Ready Interrupt
Step3: Set the Configuration Parameters (Direction,AES Mode and Key Size)
Step4: Set the Initialization Vector
Step5: Write Key
Step6: Start the Crypt Process
*/
/* Clear the flag. */
g_bAESReadyFlag = 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_bAESReadyFlag) && (count > 0))
{
count --;
}
if (count == 0)
{
return CryptoCC32XX_STATUS_ERROR;
}其中计数器始终变为0、这将返回"CryptoCC32XX_STATUS_ERROR"(-1值)。
因此、在1000次尝试中、"g_bAESReadyFlag"绝不会设置为 true。
它看起来应该在这里的"CryptoCC32XX_aesIntHandler ()"中设置
void CryptoCC32XX_aesIntHandler(void)
{
uint32_t uiIntStatus;
/* Read the AES masked interrupt status. */
uiIntStatus = MAP_AESIntStatus(AES_BASE, true);
/* Set Different flags depending on the interrupt source. */
if(uiIntStatus & AES_INT_CONTEXT_IN)
{
MAP_AESIntDisable(AES_BASE, AES_INT_CONTEXT_IN);
g_bAESReadyFlag = true;
}
if(uiIntStatus & AES_INT_DATA_IN)
{
MAP_AESIntDisable(AES_BASE, AES_INT_DATA_IN);
}
if(uiIntStatus & AES_INT_CONTEXT_OUT)
{
MAP_AESIntDisable(AES_BASE, AES_INT_CONTEXT_OUT);
}
if(uiIntStatus & AES_INT_DATA_OUT)
{
MAP_AESIntDisable(AES_BASE, AES_INT_DATA_OUT);
}
}如果设置了"AES_INT_CONTENT_IN"标志、 (尽管看起来它会禁用标志、其中"g_bAESReadyFlag"设置为 true。)
从这里开始有点难跟随,但我最好的猜测是这样
//This is a macro
MAP_AESIntEnable(AES_BASE, AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | AES_INT_DATA_IN | AES_INT_DATA_OUT);
//... which expands to
AESIntEnable(AES_BASE, AES_INT_CONTEXT_IN | AES_INT_CONTEXT_OUT | AES_INT_DATA_IN | AES_INT_DATA_OUT);
//The function looks for these flags and sets them (using some magic) if the type is AES.
AES_INT_CONTEXT_IN
AES_INT_CONTEXT_OUT
AES_INT_DATA_IN
AES_INT_DATA_OUT
AES_INT_DMA_CONTEXT_IN
AES_INT_DMA_CONTEXT_OUT
AES_INT_DMA_DATA_IN
AES_INT_DMA_DATA_OUT所以,从我所能看到的。 它应该真的起作用。 如果我遗漏了一些东西、或者我误解了一些东西、请告诉我。
提前感谢您的帮助!
此致
David