ZHCAAD3A September   2020  – June 2026 F29H850DM , F29H850TU , F29H859TU-Q1 , F29P329SM-Q1 , F29P589DM-Q1 , F29P589DU-Q1 , TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F28384D , TMS320F28384D-Q1 , TMS320F28384S , TMS320F28384S-Q1 , TMS320F28386D , TMS320F28386D-Q1 , TMS320F28386S , TMS320F28386S-Q1 , TMS320F28388D , TMS320F28388S , TMS320F28P550SG , TMS320F28P550SJ , TMS320F28P559SG-Q1 , TMS320F28P559SJ-Q1 , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1 简介
  5. 2 安全闪存启动概述
  6. 3 CMAC 身份验证
  7. 4 安全闪存启动选项
  8. 5 安全闪存启动流程
  9. 6 C2000Ware 示例详细信息
  10. 7 对超过 16KB 的闪存代码进行身份验证
  11. 8 调试资源
  12. 9 其他信息和注意事项
  13. 10C2000 CMAC 算法与 OpenSSL 的对齐
    1. 10.1 C28x 存储器和二进制文件字节顺序
    2. 10.2 闪存二进制字节顺序
    3. 10.3 CMAC 密钥字节顺序
    4. 10.4 CMAC 输出对齐流程
    5. 10.5 工作示例
    6. 10.6 差异总结
  14. 11参考文献
  15. 12修订历史记录

对超过 16KB 的闪存代码进行身份验证

“安全闪存启动”仅对从入口地址开始的前 16KB 闪存扇区 进行身份验证。为了对闪存的其他扇区进行身份验证,用户应用程序必须直接调用安全闪存启动 CMAC API。

通过使用十六进制实用程序,它支持为四个闪存入口地址中的每一个 + 16KB 和 1 个定制闪存范围生成黄金 CMAC 标签。定制闪存范围可配置为能够在定制地址范围内进行 CMAC 身份验证。如有需要,此范围可以是所有闪存扇区的长度。

用于定制闪存范围身份验证的 CPU1/CPU2 应用程序 CMAC 结构

struct CMAC_TAG
{
   char tag[8];
   uint32_t start;
   uint32_t end;
}

用于完整闪存范围身份验证的 CPU1/CPU2 黄金 CMAC 标签存储器分配

#pragma RETAIN(cmac_all)
#pragma LOCATION (cmac_all, 0x087002)
const struct OMAC_TAG cmac_all = {{0}, 0x0, 0x0};

用于定制闪存范围身份验证的 CM 应用程序 CMAC 结构

struct CMAC_TAG
{
   uint8_t tag[16];
   uint32_t start;
   uint32_t end;
}

用于完整闪存范围身份验证的 CM 黄金 CMAC 标签存储器分配

#pragma RETAIN(cmac_all)
#pragma LOCATION (cmac_all, 0x00204004)
const struct OMAC_TAG cmac_all = {{0}, 0x0, 0x0};

创建一个名为“cmac_all”的结构,用于创建定制 CMAC 身份验证范围。

  • 使用 LOCATION pragma 为 CMAC 黄金标签指定预期身份验证范围内的任何地址。(CMAC 黄金标签越接近身份验证起始地址,CMAC 算法的执行速度越快)。
  • 让“tag”结构元素始终初始化为零。
  • 初始化“start”和“end”结构元素以设置定制范围。如果两者都为零,则器件内核闪存的全部长度都将接受身份验证,包括“主要安全启动”的 16KB 存储器范围。
  • 更多有关应用程序 CMAC 变量/结构的详细信息,请参阅 [3] 和 [4]。

CPU1 安全闪存 CMAC 身份验证 API

applicationCMACStatus = CPU1BROM_calculateCMAC (CMAC_AUTH_START_ADDRESS,
                                                CMAC_AUTH_END_ADDRESS,
						                        CMAC_AUTH_TAG_ADDRESS);

在应用程序中,将 F2838x 安全区域代码符号库包含到工程中(位于 C2000Ware [2] 中的 <C2000Ware_安装目录>/libraries/boot_rom/f2838x 位置),并调用相应内核的安全闪存启动 CMAC API。以上示例显示了在 CPU1 上进行的示例 API 调用。

  • CMAC_AUTH_TAG_ADDRESS 应该与提供给 LOCATION pragma 的内容匹配
  • CMAC_AUTH_START_ADDRESS 和 CMAC_AUTH_END_ADDRESS 应该与提供给“cmac_all”结构的内容匹配。此外,需要注意起始地址和结束地址应对齐到 128 位,这很重要。
  • 例如,用于对 F2838x CPU1 闪存全部长度进行身份验证的起始地址和结束地址为:
    • 起始:0x00080000
    • 结束:0x000C0000
  • 然后应在用户应用程序中相应地检查和处理从安全闪存启动 CMAC API 返回的状态。
  • 更多有关安全闪存 CMAC 身份验证 API 的详细信息,请参阅 [1] 中的 ROM 代码和外设启动 一章 。
注: 即使以上示例中的结束地址实际为 0x000BFFFF,也必须提供 0x000C0000,以便结束地址对齐到 128 位。