ZHCU875Z August 2001 – October 2023 SM320F28335-EP
十六进制转换实用程序支持 TMS320F2838x 器件提供的安全闪存引导功能,该器件同时具有 C28 和 ARM 内核。安全闪存引导功能应用基于密码的消息身份验证协议 (CMAC) 算法,用于验证所分配存储器区域的 CMAC 标签。
安全闪存引导功能与常规闪存引导模式类似的方面是,引导流程会分支到闪存中配置的存储器地址。区别在于,只有在闪存存储器内容经过身份验证后才能进行分支。闪存身份验证使用 CMAC 验证 16KB 的闪存。CMAC 计算需要您定义的 128 位密钥。此外,您还必须根据 16KB 的闪存存储器范围计算黄金 CMAC 标签,并将其与应用代码一同存储于闪存中的硬编码地址。在安全闪存引导期间,计算得出的 CMAC 标签会与闪存中的黄金 CMAC 标签进行比较,以确定 CMAC 身份验证的通过/失败状态。如果通过了身份验证,引导流程会继续,并分支到闪存中以开始执行应用。请参阅 TMS320F2838x 微控制器技术参考手册 (SPRUII0),进一步了解有关安全闪存引导功能和 CMAC 算法的详细信息。
按如下方式使用十六进制转换实用程序,将 CMAC 算法应用于所分配存储器中的区域:
0x7c0b7db9
、key1= 0x811f10d0
、key2= 0x0e476c7a
以及 key3= 0x0d92f6e0
。 0x7c0b7db9811f10d00e476c7a0d92f6e0
CMAC 功能使用四个安全闪存引导存储器区域,它们针对开始/结束/标签地址进行硬编码,还有一个灵活的 CMAC 区域。灵活区域可包含分配的整个区域作为 HEX 指令中的输入,或作为 C 代码中定义的由用户指定的开始/结束地址。
若要为 CMAC 标签符号保留空间,需要与以下代码类似的 C 代码定义。
struct CMAC_TAG
{ char tag[8];
uint32_t start;
uint32_t end;
};
#pragma RETAIN(cmac_sb_1)
#pragma LOCATION(cmac_sb_1, 0x080002)
const char cmac_sb_1[8] = { 0 };
#pragma RETAIN(cmac_sb_2)
#pragma LOCATION(cmac_sb_2, 0x088002)
const char cmac_sb_2[8] = { 0 };
#pragma RETAIN(cmac_sb_3)
#pragma LOCATION(cmac_sb_3, 0x0a8002)
const char cmac_sb_3[8] = { 0 };
#pragma RETAIN(cmac_sb_4)
#pragma LOCATION(cmac_sb_4, 0x0be002)
const char cmac_sb_4[8] = { 0 };
#pragma RETAIN(cmac_all)
#pragma LOCATION(cmac_all, 0x087002)
const struct CMAC_TAG cmac_all = { 0 }, 0x0, 0x0};
四个安全闪存引导区域 CMAC 标签存储在 cmac_sb_1
到 cmac_sb_4
符号中。cmac_all
符号存储用户指定的灵活区域的 CMAC 标签。对于 cmac_all
:
start
和 end
CMAC_TAG 结构成员为零,则 CMAC 算法会针对 HEX 指令中指定的整个存储器区域运行。十六进制转换实用程序会用 HEX 指令条目中的地址输入填充存储器开始和结束位置。start
和 end
成员不为零,则 CMAC 算法只会应用于指定地址范围。如果在应用代码中未访问这些符号,那么 RETAIN pragma 在 C 代码中是必需的。
若要将符号放置在要求的存储器位置,LOCATION pragma 是必需的。cmac_sb_1
到 cmac_sb_4
的 LOCATION 条目位于固定地址。cmac_all
的 LOCATION 地址可由用户指定。但它一定不能位于任何安全闪存引导区域中,因为器件的 ROM CMAC 实现方式不支持。
CMAC 算法在十六进制转换之前应用。原始输入 ELF 可执行文件没有改动。
十六进制转换实用程序仅针对定义了全局符号的 CMAC 区域应用 CMAC 算法。如果 ELF 可执行文件只定义了 cmac_sb_1
和 cmac_all
,则只会生成这两个 CMAC 标签,并填充到生成的十六进制输出文件中。