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.

[参考译文] CC2340R5:用于安全数据传输的 AES-CCM 实现

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2340R5, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1213512/cc2340r5-aes-ccm-implementation-for-secure-data-transmission

主题中讨论的其他器件:CC2340R5SysConfig

尊敬的团队:

大家好!

我正在致力于 AES-CCM 实现以实现安全的数据传输。 我参考了所提供的示例代码并复制了中的 AES-CCM 代码片段 empty_LP_EM_CC2340R5_freertos_ticlang 默认项目。

这是我的测试函数:

空隙 testEncCCM ()

AESCM_Handle 句柄;
CryptoKey cryptoKey;
INT_fast16_t encryptionResult;
uint8_t nonce[]="Thissansonce";
uint8_t aad[]="此字符串将经过身份验证但未加密。";
uint8_t 明文[]="此字符串将经过加密和身份验证。";
uint8_t mac[16]={0};
uint8_t 密文[sizeof (明文)]={0};
uint8_t keyingMaterial[32]={0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、
0x08、0x09、0x0A、0x0B、0x0C、 0x0D、0x0E、0x0F、
0x10、0x11、0x12、0x13、0x14、 0x15、0x16、0x17、
0x18、0x19、0x1A、0x1B、0x1C、 0x1D、0x1E、0x1F};

aesccm_init();

句柄= AESCCM_OPEN (0、NULL);
if (handle == NULL){
//处理错误
}
CryptoKeyPlaintext_initKey (&cryptoKey、keyingMaterial、sizeof (keyingMaterial));
AESCM_OneStepOperation 操作;
AESCM_OneStepOperation_init (&operation);
operation.key = cryptoKey (&C);
operation.aad = aad;
operation.aadLength = sizeof (aad);
operation.input =纯文本;
operation.output =加密文本;
operation.inputLength = sizeof (纯文本);
operation.nonce =一次性;
operation.nonceLength = sizeof (nonce);
operation.mac = mac;
operation.macLength = sizeof (mac);
encryptionResult = AESCM_oneStepEncrypt (handle、&operation);
if (encryptionResult != AESCM_STATUS_SUCCESS ){
//处理错误
}
AESCM_CLOSE (句柄);
}

我想讨论两件事

1. 如何验证加密的输出(即 Cypher Text 和 MAC) :是否有任何工具或计算机程序可以验证用于加密和描述的输出。

2. 与实施相关-我只想使用 AES-CCM 来确保传输数据的安全 :  目前我正在发送 UART 接收的数据(*reff. 至 AS 明文 )对中央设备透明。 我需要发送吗 明文  Data to Encryption (数据到加密)功能首先将加密数据存储到另一个缓冲区中、然后传输数据或以其他方式传输数据。

如果您需要更多信息,请告诉我

谢谢。此致、

Harinder Singh

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

    您好 Harinder、

    1.虽然不是由 TI 提供、但有在线工具可对   NIST SP 800-38C 定义的 AES-CCM 128进行加密/解密。  您也可以参考 aesKeyAgreement 示例。

    2.您的描述似乎是正确的。  您需要将公钥和2个签名发送到中央设备以便能够解密数据包、这可以在 aesKeyAgreement 示例的 rxTask 中得到表示。

    此致、
    Ryan

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

    尊敬的先生:

    我正在尝试 具有名称的示例代码(Link: here )" ###多步 CCM 加密+身份验证、采用明文 CryptoKey 阻止返回模式#" ,使用最新的6.41_eng SDK,但未按照给定示例获得正确的加密输出。 连接  加密文本 缓冲器输出。

    示例中的预期输出

    *。SYSCFG 配置详细信息:

    加密功能:

    int testEncCCM_2 ()

    AESCM_Handle 句柄;
    CryptoKey cryptoKey;
    INT_fast16_t encryptionResult;
    //下面的测试向量是来自 IETF 的 RFC 3610的数据包向量1。
    uint8_t keyingMaterial[16]={0xC0、0xC1、0xC2、0xC3、0xC4、 0xC5、0xC6、0xC7、
    0xC8、0xC9、0xCA、0xCB、0xCC、 0xCD、0xCE、0xCF};
    uint8_t aad[8]={0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07};
    uint8_t plain text[23]={0x08、0x09、0x0A、0x0B、0x0C、 0x0D、0x0E、0x0F、
    0x10、0x11、0x12、0x13、0x14、 0x15、0x16、0x17、
    0x18、0x19、0x1A、0x1B、0x1C、 0x1D、0x1E};
    uint8_t nonce [13]={0x00、0x00、0x00、0x03、0x02、 0x01、0x00、0xA0、
    0xA1、0xA2、0xA3、0xA4、0xA5};
    uint8_t mac[8]={0};
    uint8_t 密文[sizeof (明文)]={0};
    //加密操作后的加密文本应如下所示:
    //{0x58、0x8C、0x97、0x9A、0x61、 0xC6、0x63、0xD2、
    // 0xF0、0x66、0xD0、0xC2、0xC0、 0xF9、0x89、0x80、
    // 0x6D、0x5F、0x6B、0x61、0xDA、 0xC3、0x84}
    aesccm_init();
    句柄= AESCCM_OPEN (0、NULL);
    if (handle == NULL){
    //处理错误
    返回0;
    }
    CryptoKeyPlaintext_initKey (&cryptoKey、keyingMaterial、sizeof (keyingMaterial));
    encryptionResult = AESCM_setupEncrypt (handle、&cryptoKey、sizeof (aad)、sizeof (明文)、sizeof (mac));
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    encryptionResult = AESCM_setNonce (handle、nonce、sizeof (nonce));
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    AESCM_SegmentedAADOperation 分段 AADOperation;
    AESCM_SegmentedAADOperation_init (&segmenedAADOperation);
    segmentedAADOperation.aad = aad;
    segmentedAADOperation.aadLength = sizeof (aad);
    encryptionResult = AESCM_addAAD (handle、&segmentedAADOperation);
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    AESCM_SegmentedDataOperation segmentedDataOperation;
    AESCM_SegmentedDataOperation_init (&segmenedDataOperation);
    segmentedDataOperation.input =纯文本;
    segmentedDataOperation.output =加密文本;
    //应该传入块大小为多个长度的数据
    //直到传入数据的最后一个段。
    //在这种情况下,输入长度只需要为非零值。
    segmentedDataOperation.inputLength = AES_BLOCK_SIZE;
    encryptionResult = AESCM_addData (handle、&segmentedDataOperation);
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    segmentedDataOperation.input =纯文本+ AES_BLOCK_SIZE;
    segmentedDataOperation.output =加密文本+ AES_BLOCK_SIZE;
    segmentedDataOperation.inputLength = sizeof (纯文本)- AES_BLOCK_SIZE;
    encryptionResult = AESCM_addData (handle、&segmentedDataOperation);
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    AESCM_SegmentedFinalizeOperation 段已定义 FinalizeOperation;
    AESCM_SegmentedFinalizeOperation_init (&segmentedFinalizeOperation);
    segmentedFinalizeOperation.input =纯文本;
    segmentedFinalizeOperation.output =加密文本;
    //您可以在没有新数据的情况下完成
    segmentedFinalizeOperation.inputLength = 0;
    segmentedFinalizeOperation.mac = mac;
    segmentedFinalizeOperation.macLength = sizeof (mac);
    encryptionResult = AESCM_finalizeEncrypt (handle、&segmentedFinalizeOperation);
    if (encryptionResult != AESCM_STATUS_SUCCESS ){
    //处理错误
    返回0;
    }
    AESCM_CLOSE (句柄);
    }

    根据我的理解、AES CCM 加密需要以下输入:

    • 密钥
    • 一次性(IV)
    • 明文(*原始数据缓冲区)
    • AAD  

    如果输入相同、加密数据应该是相同的输出-正确吗?

    主席先生,问题可能是什么,我不能理解。 我还需要重新配置吗?或者我的操作方式有误。

    请为该电路提供一些解决方案。

    谢谢。此致、

    Harinder Singh

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

    感谢您提供这些详细信息。  我知道 CC23XX 器件的加密引擎操作与 CC13XX/CC26XX 组件的操作不同、因此要求经验更丰富的团队成员对您观察到的结果进一步发表评论。  请耐心等待、因为上周末对于大多数员工来说、这是一个延长假期。

    此致、
    Ryan

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

    Harinder、您好。

    正如 Ryan 所说、感谢您提供更多详细信息。 我们将对此进行研究、并会尽快与您联系。

    此致、

    1月

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

    Harinder、您好。

    感谢您的耐心。

    Unknown 说:
    1. 如何验证加密的输出(即 Cypher Text 和 MAC) :是否有任何工具或计算机程序可以验证用于加密和描述的输出。

    请访问 https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38c.pdf。附录 C 包含测试向量。

    Unknown 说:
    2. 与实施相关-我只想使用 AES-CCM 来确保传输数据的安全 :  目前我正在发送 UART 接收的数据(*reff. 至 AS 明文 )对中央设备透明。 我需要发送吗 明文  首先向加密功能传输数据,然后将加密数据存储到另一个缓冲区,传输数据或以其他方式传输数据。

    如何使用支持到低功耗蓝牙的加密机制呢? 配对过程定义了以一种安全的方式交换和存储加密/解密密钥的方法。 假设您正确设置了 GATT 表(即仅允许通过加密进行读取/写入)、堆栈可为您处理配对过程。

    我希望这将有所帮助、

    此致、

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

    尊敬的先生:

    感谢您的有效建议!

    我能够理解的是、BLE 堆栈足以单独处理 AES-CCM 加密相关的事情、我只需要针对需要加密的特定特性修改 GATT 属性表属性。 绑定后建立加密连接后、传输的负载也将被加密。   

    可用属性权限:

     如果我的理解是正确的、那么我有以下问题:

    1. 我是否需要更改中的任何内容 SysConfig .(*特定于 AES-CCM)
    2. 如何处理回调以及要参考的任何示例 (*特定于 AES-CCM)

    主席先生,请让我知道 我的理解是否错误。

    谢谢。此致、

    Harinder Singh

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

    您好!

    使用 BLEStack 提供的蓝牙加密机制的优势在于、所有 AES-CCM 配置和连接都由该堆栈处理。

    也就是说、

    是否需要更改中的任何内容 SysConfig .(*特定于 AES-CCM)

    based_ble 示例已经为 AES-CCM 配置了用于蓝牙加密的配置。

    如何处理回调和要参考的任何示例 (*特定于 AES-CCM)

    蓝牙堆栈定义的句柄和回调由堆栈处理、您无需处理它们。 换句话说、您可以将纯数据输入到堆栈、堆栈将处理请求的步骤以对流量进行加密。

    我希望这将有所帮助、

    此致、

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

    尊敬的先生:

    根据您的建议、我已选中 Basic_ble 的设计流程 添加了示例。 (* SDK 6.41_eng/CCS12.2)

    在 Attribute 表中、特征编号 5、如所示  GATT_PERIP_AUTHEN_READ 这意味着它已启用加密、但问题是我通过移动应用程序单击 Read Value (读取值)。 特性编号 5 移动应用程序挂起。 我已附上屏幕截图。

    UART 日志:

    移动应用程序:

    *。sysconfig:

    我有以下疑问:

    1. 如何使用  特性编号 5与 AES-CCM 关联:  因为有更多模式、但我没有找到用于定义这些模式的链接  GATT_PERIP_AUTHEN_READ   默认情况下、它是自动与 AES-CCM 模式关联、还是有一些机制。 将来、如果我想把它更改为其他一些像 AES-CBC 或 AES-ECB 的 AES 模式、如何配置它呢?

    2. 为什么选择移动应用程序 按下"Read the Characteristic No"的值时崩溃 5.  它发生在随机的基础上&它感觉像在 Android 手机(Mi 注8)它是常见的 问题,但在 iPhone 13它是罕见的。 是否需要在移动平台或 BLE 堆栈中配置某种功能以处理此类现实问题。 因为用户将使用不同的移动平台。

    谢谢。此致、

    Harinder Singh

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

    您好!

    1. 如何使用  特性编号 5与 AES-CCM 关联:  因为有更多模式、但我没有找到用于定义这些模式的链接  GATT_PERIP_AUTHEN_READ   默认情况下、它是自动与 AES-CCM 模式关联、还是有一些机制。 将来如果我想把它更改为其他一些像 AES-CBC 或 AES-ECB 的 AES 模式,如何配置它?

    蓝牙堆栈始终使用蓝牙规范中描述的加密。 您无法更改它。

    2. 为什么选择移动应用程序 按下"Read the Characteristic No"的值时崩溃 5.  它发生在随机的基础上&它感觉像在 Android 手机(Mi 注8)它是常见的 问题,但在 iPhone 13它是罕见的。 是否需要在移动平台或 BLE 堆栈中配置某种功能以处理此类现实问题。 因为用户将使用不同的移动平台。

    这可能是因为嵌入式软件处于预发布状态。 我们正在进行可解决许多稳定性问题的更新。 请耐心等待。

    此致、