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.

[参考译文] LAUNCHXL-CC26X2R1:LAUNCHXL-CC26X2R1

Guru**** 2465890 points
Other Parts Discussed in Thread: CC2652R

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469106/launchxl-cc26x2r1-launchxl-cc26x2r1

器件型号:LAUNCHXL-CC26X2R1
Thread 中讨论的其他器件:CC2652R

工具与软件:

您好!

我想添加安全区域的密钥。 我将使用 "12.9.1 Crypto 寄存器"完成此任务。 然后、我查阅了参考手册文档、并多亏了"12.7.4.2.1从外部存储器中加载密钥"、才编写了代码。 但是、我得到了一个错误。 我使用一些可读且可写类型的寄存器、但我无法读取这些寄存器。 因为这些寄存器是加密寄存器、我只能看到"?" 在调试期间通过存储器浏览器将该地址中的任何内容存储起来。
我的电路板是 cc26x2

12.7.4.2.1从外部存储器中加载密钥
伪代码中的以下软件示例介绍了主机软件通常为将一个或多个密钥加载到密钥存储模块中而执行的操作。
//配置主控制模块
写入 ALGSEL 0x0000_0001 //启用到密钥存储模块的 DMA 路径
写入 IRQCLR 0x0000_0001 //清除任何未处理的事件
//配置密钥存储模块(区域、大小)
写入密钥大小0x0000_0001 // 128位密钥大小
写入 KEYWRITEAREA 0x0000_0001 //启用密钥进行写入(例如密钥0)
//配置 DMAC
写入 DMACH0CTL 0x0000_00001 //启用 DMA 通道0
在外部存储器中写入 DMACH0EXTADDR //密钥的基地址
写入 DMACH0LEN //密钥总长度(以字节为单位)(例如、16表示1个128位密钥)
//等待完成
等待 IRQSTAT[0]='1'//等待操作完成
检查 IRQSTAT[31:30]=‘00'//检查 DMA 和密钥存储中是否没有错误
写入 IRQCLR 0x0000_0001 //确认中断
写入 ALGSEL 0x0000_0000 //禁用主控制/DMA 时钟
//检查状态
检查 KEYWRITTENAREA 0x0000_00001 //检查是否写入了密钥0
//算法结束

在下面伪代码中、我需要始终检查寄存器中的值是否正确。 此外、我在 while 和 if (等待和检查)块中遇到错误。 因为我无法读取地址中的值。 是否有任何可能的方法来读取加密寄存器中的值? 您可以在下面看到我的代码。


void loadKeys (uint32_t keyIndex、uint32_t * extMemoryAddr、uint32_t keyLength){
ALGSEL = 0x00000001; //启用 DMA 到密钥存储模块
IRQCLR = 0x00000001; //清除任何未完成的事件
KEYSIZE = 0x00000001; // 128位密钥大小
KEYWRITEAREA =(1 << keyIndex); //选择键槽(例如键0)
DMACH0CTL = 0x00000001; //启用 DMA 通道0
DMACH0EXTADDR =(uint32_t) extMemoryAddr; //设置外部存储器地址(存储密钥的位置)
DMACH0LEN =密钥长度; //设置密钥长度(例如、128位密钥为16个字节)
while ((IRQSTAT & 0x01)=0); //等待操作完成(IRQSTAT[0]被置位)
//检查操作是否成功(DMA 或密钥存储区中没有错误)
如果((IRQSTAT & 0xC0000000)=0){
//操作成功完成
IRQCLR = 0x00000001;//清除中断标志
其他{
//处理错误(DMA 或密钥存储区写入错误)
}
//验证密钥是否写入了正确的区域
如果(KEYWRITTENAREA &(1 << keyIndex)){
//密钥已成功写入密钥存储区
其他{
//处理失败(未写入密钥)
}
//禁用到密钥存储模块的 DMA 路径
ALGSEL = 0x00000000;//禁用 DMA 路径
}

谢谢

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

    Cetin、您好!

    以下是 TRM加密寄存器TI 驱动程序 API 、供深入了解。

    您必须启用该模块才能从其寄存器中读取数据。  如果未正确配置加密引擎和 DMA、则无法读取寄存器。  

    您是否会考虑使用 TI Crypto 驱动程序以便在不使用寄存器级访问权限的情况下生成密钥?  以下是 您可以参考的 aesKeyAgreement 示例。

    此致、
    Ryan

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

    Ryan、您好!

    据我所知、我使用以下代码块配置了 DMA 和加密引擎。 此外、我并不清楚如何使用 TI 加密驱动程序、我 查阅了 aesKeyAgreement、但我对这一点没有明确的理解。 是否有任何功能用于配置加密引擎和 DMA 或读取加密寄存器而不是使用寄存器级访问?

    ALGSEL = 0x00000001; //启用 DMA 到密钥存储模块
    IRQCLR = 0x00000001; //清除任何未完成的事件
    KEYSIZE = 0x00000001; // 128位密钥大小
    KEYWRITEAREA =(1 << keyIndex); //选择键槽(例如键0)
    DMACH0CTL = 0x00000001; //启用 DMA 通道0
    DMACH0EXTADDR =(uint32_t) extMemoryAddr; //设置外部存储器地址(存储密钥的位置)
    DMACH0LEN =密钥长度; //设置密钥长度(例如、128位密钥为16个字节)

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

    到目前为止、我对困惑表示歉意。  目前、我们假设调试期间主内核未使用加密寄存器。  在数据表中:   

    CC2652R 器件附带广泛的与加密相关的现代硬件加速器、显著降低了加密操作的代码占用空间和执行时间。 由于加密操作在后台硬件线程中运行、因此还具有功耗较低的优点、并提高了可用性和系统响应能力。

    您能否进一步解释您要实现的目标?  您提到"我想将密钥添加到安全区"、但 TRM 正在讨论加密硬件加速器模块中的密钥存储、您在提供密钥材料后不需要访问该模块。  TI 驱动程序提供 AES 模块、可简化加密/解密过程。  那么、您最终需要实现什么目标呢?

    此致、
    Ryan

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

    我也很抱歉没有清楚地解释。 我尝试 在 TRM 文档12.5.6中提到的安全区域中编写和存储密钥。 关键区域寄存器。 我只是尝试在调试模式下读取。 这不是我的主要目的。 我的主要目的是编写密钥并将其存储在安全区域(据我所知、该安全区域的存储空间可能为1KB)中、然后将这些密钥用于 AES 和 ECDSA 加密操作。 下面是 TRM 对此进行的简短说明。

    "本地密钥存储模块直接连接到1 KB 的内存。 该模块最多可存储八个 AES 密钥并有八个128位条目。 密钥大小在密钥存储模块中编程。 通过 AHB 主接口和从接口的读取操作无法访问密钥存储中的密钥材料。 只能通过 DMA 将密钥写入密钥存储区。 一旦针对密钥读取的 DMA 操作开始、所有接收到的数据都被写入密钥存储模块。 存储在密钥存储区存储器中的密钥只能传输给 AES 密钥寄存器、无法用于任何其他目的。"

    在这种情况下、我需要帮助才能实现这一点。

    此致、
    Cetin




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

    AES 型号(例如 AESCBC.h)和 ECDSA.h TI 驱动程序 API 以及文档中包含的详细示例应自动满足这一要求、而无需用户进一步干预。  您能否说明这些问题中遗漏了哪些内容、需要您进行更多调查?

    此致、
    Ryan

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

    我对迟交的答复深表遗憾。 我当时在尝试使用这些库(AESCBC.h 和 ECDSA.h)完成我的任务 、 成功完成了。 但是、 此时我不确定安全性。 因为我要将这些密钥添加到安全区域、而且还希望除我之外的任何人都不能访问这些密钥。 这些库可以为我提供此功能? 我可以从该区域读取密钥、感觉不安全。 此方法与直接写入闪存之间有什么区别?

    此致、
    Cetin

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

    其他人将如何访问您设备上的密钥?

    此致、
    Ryan