安全启动应用指南
简介
本应用说明阐述了TLSR952x/922x系列芯片中支持的安全机制,包括安全启动(Secure Boot)、固件加密(Firmware Encryption)和安全调试(Secure Debug)。
安全启动(Secure Boot)通过检查被启动的固件是否有签名来保护设备不运行任何未经授权的代码。在TLSR9系列芯片中,安全启动通过运行Boot-ROM代码来验证闪存(Flash)内的代码来实现,该代码可能包括额外的引导程序(bootloader)和应用代码,可以进一步进行连锁验证。
固件加密(Firmware Encryption)允许对存储在片上闪存(Flash)或外部闪存(Flash)的固件进行加密,以防止克隆等攻击。
安全调试(Secure Debug)允许所有的调试接口,如SWS、JTAG、UART被锁定,这样黑客就不能从这些调试接口获取任何片上信息。请注意,即使安全调试被启用,诸如UART等接口的正常功能仍将正常工作。
eFuse和Flash分布
eFuse
芯片的非易失性eFuse有1024比特的信息,定义如下。
比特 | 名称 | 默认 | 描述 |
---|---|---|---|
[1023:960] | Reserved | - | 保留给未来使用 |
[959:896] | MAC_ADDR | 64'd0 | 64 bits泰凌分配的MAC地址(包括给蓝牙的48位MAC地址或给802.15.4的64位MAC地址) |
[895:832] | Reserved | - | 保留给泰凌内部使用 |
[831:800] | Security_Feature | 32'd0 | [31] 启用Flash加密 [30] 签名验证, 1: 启用 0: 禁用 [29] 安全启动模式, 1: 安全启动模式, 0: 正常模式 [28:20] 泰凌内部使用 [19:0] 代码描述模块地址 |
[799:544] | pub_key_hash | 256'd0 | 哈希公钥,不可更改 |
[543:416] | Reserved | 128'd0 | 保留 |
[415:288] | chip_id | 128'd0 | 芯片id,不可更改 |
[287:160] | Reserved | 128'd0 | 保留 |
[159:32] | root_key | 128'd0 | 根密钥 |
[31:0] | Interface functions | 32'd0 | [31:17] 保留 [16] if_spi_slv_disable: 禁用SPI slave功能。1'b1: 禁用; 1'b0: 启用. [15] if_sws_disable: 禁用SWS功能。1'b1: 禁用; 1'b0: 启用. [14] if_jtag_disable: 禁用JTAG功能。1'b1: 禁用; 1'b0: 启用. [13] if_usb_dbg_disable: 禁用USB调试功能。1'b1: 禁用; 1'b0: 启用. [12:0] 保留 |
安全启动模式下的闪存空间
闪存(Flash)可能包含几个数据段,包括代码0和1,以及它们相应的代码描述0和1。在分配闪存时,每个段的区域不应重叠,建议每个段地址的第一个地址与闪存的最小擦除单元对齐。只有在启用了带有固件签名验证的安全启动时才会出现代码描述。
该代码的固定起始地址为0,是要执行的固件代码。如果没有启用固件加密功能,它是明文;如果启用了固件加密功能,代码就以密文(加密的固件)的形式存储。该代码在上电后自动加载,用户应留下相应大小的闪存空间。
代码描述块提供了关于相应的固件代码的信息。
- Telink Mark存储0x544c4e4b值。Bootloader只执行具有有效Telink Mark的相应代码。
- For code 0, set mspi_multiboot_set to 0; for code 1, set mspi_multiboot_set to 1. 对于代码0,设置mspi_multiboot_set为0;对于代码1,设置mspi_multiboot_set为1。
- 公钥用于验证代码签名。
- 代码签名是在运行的代码上计算出来的签名。
- 代码地址是运行代码的地址。
- 代码大小是代码字段的长度,以字节为单位。
- 看门狗目标值是看门狗捕获值。这个值应该按照泰凌的建议设置得足够大,以便在看门狗复位前完成固件签名验证过程。
- mspi_data_lane_set是设置MSPI接口的宽度,建议使用泰凌提供的默认值。
安全启动(Secure Boot)
安全启动介绍
我们实现了一个基于公钥/私钥(ECDH)的安全启动验证方案。公钥存储在芯片的Flash中,公钥哈希存储在芯片的eFuse中。相应的私钥被保存在一个秘密的地方,永远不会被芯片或任何中间过程访问。在制造过程中,只有一个公钥可以被生成并存储在芯片中。
安全启动过程包括以下步骤:
在上电过程中,Boot-ROM在Flash中加载固件,它可以是第二阶段的引导程序(bootloader)或应用代码。对固件的ECC签名进行验证。如果验证成功,固件将被执行。
大多数情况下,为了简单起见,固件可以直接是应用代码。
请注意,在某些情况下,用户可能还希望在控制应用程序代码方面有更大的灵活性,因此更愿意使用链式安全启动验证。在这种情况下,Boot-ROM会验证上述固件,这是一个第二阶段的引导程序(bootloader)。第二阶段引导程序(bootloader)被验证和执行后,当它加载一个特定的应用程序图像时,应用程序的签名被验证。如果验证成功,应用固件就会被执行。第二阶段bootloader可以使用与默认方法不同的公钥/私钥机制。
安全启动使用一个专门的控制块对固件进行验证,如安全启动模式下的闪存空间中所述,公钥和签名都存储在这里。
安全启动过程遵循以下步骤:
启动时,Boot-ROM代码检查eFuse中的安全启动位。如果安全启动被禁用,将执行正常启动。如果安全启动被启用,启动将按照以下步骤进行。
Boot-ROM代码会验证固件的签名。如果失败,启动过程将被中止。Boot-ROM代码使用原始数据、其相应的签名和eFuse(验证公钥哈希值)来验证固件。
如何启用安全启动
TBD: 说明应该烧录哪些信息,例如eFuse Bit,Public Key Hash等,这个要看我们是否后续提供一个工具,只要用户属于Public Key,并选择Secure Boot,我们就可以自动烧录相关信息
TBD:说明一些客户怎么生成Public、PrivateKey Pair
注意:
- 启用安全启动后的限制。
- 任何更新的固件都需要用与已经存储在eFuse中的公钥哈希相匹配的密钥进行签名。
- 在一个具有高质量熵源的系统上生成签名密钥。
- 在任何时候都要保持签署密钥的私密性。该密钥的泄漏将危及安全启动系统。
固件加密(Firmware Encryption)
固件加密介绍
TBD: 添加固件加密描述
如何启用固件加密
TBD: 说明应该烧录哪些信息,例如Root Key, Debug Plaintext
安全调试(Secure Debug)
安全调试介绍
加上Secure debug的描述。
如何启用安全调试
TBD: 加上步骤
不同用法选项
在TLSR9系列芯片上,不同的安全机制:安全启动、固件加密和安全调试可以分别启用,从而允许许多不同的组合。然而在实践中,我们建议使用以下组合:
- 选项 0: 安全调试
- 选项 1: 固件加密 + 安全调试
- 选项 2: 安全启动
- 选项 3: 安全启动 + 固件加密 + 安全调试
请注意,只要使用了固件加密,就必须启用安全调试,以避免与Flash加密密钥有关的信息被暴露。
选项 0
参见 如何启用安全调试
选项 1
TBD: 描述一下步骤
选项 2
参见 如何启用安全启动
选项 3
TBD: 描述一下步骤