主题: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