This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3235SF:CryptoCC32XX_encrypt 返回 NULL、因为不清除 g_bAESReadyFlag 标志

Guru**** 2763595 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1597750/cc3235sf-cryptocc32xx_encrypt-returns-null-because-g_baesreadyflag-flag-is-not-cleared

器件型号: CC3235SF

您好、

当我尝试使用 CryptoCC32XX_encrypt 进行加密时、在该函数内部会调用目录 (ti/drivers/crypto/CryptoCC32XX.c>中的 CryptoCC32XX_aesProcess 函数

int32_t CryptoCC32XX_aesProcess (uint32_t cryptoMode、
                uint32_t cryptoDirection、
                uint8_t *pInBuff、
                uint16_t inLen、
                uint8_t *pOutBuff、
                CryptoCC32XX_EncryptParams *pParams)

  int32_t 计数= CryptoCC32XX_Context_ready_MAX_COUNTER;
   /*清除标记。 */
  G_bAESReadyFlag = false;

  /*启用所有中断。 */
  MAP_AESIntEnable (AES_BASE、AES_INT_CONTENT_IN | AES_INT_CONTENT_OUT | AES_INT_DATA_IN | AES_INT_DATA_OUT);

  /*等待 context in flag、该标志将在中断处理程序中设置。 */
  while ((!g_bAESReadyFlag)&&(count > 0))
  {
    计数--;
  }
  如果(计数= 0)
  {
    返回 CryptoCC32XX_STATUS_ERROR;
  }
}
有时、这会返回加密 CryptoCC32XX_STATUS_ERROR、因为 g_bAESReadyFlag 不明确。
我甚至尝试了   
MAP_AESIntDisable (AES_BASE、AES_INT_CONTENT_IN | AES_INT_CONTENT_OUT | AES_INT_DATA_IN | AES_INT_DATA_OUT);
MAP_AESIntClear (AES_BASE、AES_INT_CONTENT_IN | AES_INT_CONTENT_OUT |
          AES_INT_DATA_IN | AES_INT_DATA_OUT);
如果加密失败、解决方法是什么? 这种情况是随机发生的、即使加密工作很长时间也是如此。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我不知道这个问题。

    让我看看它,一旦我有线索会回来.

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    静态 void 加密数据(无符号字符*inputBuf、char *outputBuf、const char *encryptionKey)

    int32_t =–1;

    aesCCMParams.AES.pkey =(const uint8_t*)(encryptionKey);
    解密参数= aesCCMParams;
    size_t padded_len = 0;
    size_t encryptedDataLength = 0;
    size_t decryptedDataLength = 0;

    PKCS7_PAD (inputBuf、strlen (inputBuf)、&fadded_len);


    RetVal = CryptoCC32XX_encrypt (cryptoHandle1、method、inputBuf、
    strlen (inputBuf)、outputBuf、
    &encryptedDataLength、&aesCCMParams);

    if (retval = 0)

    (void) CryptoCC32XX_Decrypt (cryptoHandle1、method、outputBuf、
    strlen (outputBuf)、&checkBuf、
    解密数据长度、&decryptParams);
    }
    }
    这就是我执行加密的方式、但我仍然可能遇到相同的问题  g_bAESReadyFlag 未被清除。 因此加密失败。 加密失败后、我调用 CryptoCC32XX_Close (cryptoHandle1);。 而且、我重试加密失败。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    尝试重现但没有运气。

    我正在运行 1000 次、没有崩溃。

    发生频率如何?

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、
    我提到了我用于加密和解密的代码。 这是正确的方法吗?

    Ks.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    请在下面查找我的代码。

    需要注意两点:

    • 尽管加密函数有参数、但它实际上并不返回输出长度
    • 为了使解密的缓冲区与原始明文缓冲区匹配、您需要在调用解密功能之前再次设置 IV

    /*
         * add implementation to test AES machine
         */
        static CryptoCC32XX_Handle handle = NULL;
        CryptoCC32XX_EncryptParams aesParamsEnc;
        CryptoCC32XX_EncryptParams aesParamsDec;
        int32_t status;
        static int init = 0;
        int counter = 0;
    
        while (counter < 1000)
        {
            if (0 == init++)
            {
                // Initialize the crypto-drivers
                CryptoCC32XX_init();
    
                handle = CryptoCC32XX_open(0, CryptoCC32XX_AES | CryptoCC32XX_DES | CryptoCC32XX_HMAC);
            }
    
            if (!handle) {
                UART_PRINT("CryptoCC32XX did not open\n\r");
            }
            else
            {
                //Space for input and data
                unsigned char   plainData[17]   = "whatsoever123456";
                unsigned int    plainDataLen    = 16;
                unsigned char   cipherData[17]  = {0};
                unsigned char   newData[17];
                unsigned int    cipherDataLen   = 0;
                unsigned int    newDataLen   = 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 nonceEnc[16] = {
                    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
                    0xF8, 0xF9, 0xFA, 0xFB, 0x00, 0x00, 0x00, 0x00,
                };
    
                uint8_t nonceDec[16] = {
                    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
                    0xF8, 0xF9, 0xFA, 0xFB, 0x00, 0x00, 0x00, 0x00,
                };
    
                aesParamsEnc.aes.keySize   = CryptoCC32XX_AES_KEY_SIZE_256BIT;
                aesParamsEnc.aes.pKey      = &key[0];
                aesParamsEnc.aes.pIV       = (void *)&nonceEnc[0];
    
                status = CryptoCC32XX_encrypt(handle, CryptoCC32XX_AES_CTR , plainData, plainDataLen, cipherData , &cipherDataLen , &aesParamsEnc);
                UART_PRINT("Encrypting Data: status = %d\n\r", status);
    
                aesParamsDec.aes.keySize   = CryptoCC32XX_AES_KEY_SIZE_256BIT;
                aesParamsDec.aes.pKey      = &key[0];
                aesParamsDec.aes.pIV       = (void *)&nonceDec[0];
    
                cipherDataLen = plainDataLen;
                status = CryptoCC32XX_decrypt(handle, CryptoCC32XX_AES_CTR , cipherData , cipherDataLen, newData, &newDataLen, &aesParamsDec);
                UART_PRINT("Decrypting Data: status = %d\n\r", status);
    
                if (memcmp(plainData, newData, plainDataLen) == 0)
                {
                    UART_PRINT("decrypted data matches the encrypted data");
                }
                else
                {
                    UART_PRINT("decrypted data does not match the encrypted data");
    
                    UART_PRINT("decrypted data: 0x%x, 0x%x, 0x%x, 0x%x", newData[0], newData[1], newData[2], newData[3]);
                    UART_PRINT("decrypted data: 0x%x, 0x%x, 0x%x, 0x%x", newData[4], newData[5], newData[6], newData[7]);
                    UART_PRINT("decrypted data: 0x%x, 0x%x, 0x%x, 0x%x", newData[8], newData[9], newData[10], newData[11]);
                    UART_PRINT("decrypted data: 0x%x, 0x%x, 0x%x, 0x%x", newData[12], newData[13], newData[14], newData[15]);
                }
            }
            counter++;
            sleep(1);
        }

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我正在使用 CryptoCC32XX_AES_ECB 方法、是否必须设置 aesParamsEnc.AES.PIV 和 aesParamsDec.AES.PIV ?

    Ks.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我没有尝试过欧洲央行、但你可以尝试一下。

    虽然,因为你提到它不是立即崩溃,我假设你验证了解密让你回到纯文本.

    如果没有、请检查。

    Shlomi