安全机制

概述

本文介绍 RTL8752H 芯片的安全机制以及使用方法,主要从以下几个方面展开介绍:安全启动加密 ImageKey 安全存储SWD 接口控制Password 调试

安全启动

对于安全设备来说,执行固件的真实性校验,以保护设备免受恶意软件的攻击是至关重要的。安全启动嵌入在 RTL8752H 系列的 ROM 中,并在默认情况下禁用。要启用它,需要通过 MP Tool 烧录相关的 eFuse。

安全启动用于确保 Image 的完整性和真实性,SHA256 用于完整性校验,RSA 用于真实性校验。如果任何 Image 的验证失败,芯片将重启,不会跳转到未经验证的 Image。

加密 Image

加密 Image 的方案是基于 Flash Security 开发的。APP Image 可以根据需求选择加密与否。

Flash Security (简称 Flash-Sec),又称作 Flash on-the-fly,是一种能让 CPU 直接访问加密 flash 数据的技术。其原理为,CPU 在访问 Flash-Sec 加密过的数据时,会先通过 Flash-Sec 硬件模块解密该数据,再实际访问解密后的数据。

Flash-Sec 使用的是 AES 对称加密算法,加密模式为 CTR Mode,加密 key 的长度为 128 bit。Flash-Sec 至多支持配置 8 个 Flash-Sec Region。其中,Patch image 默认使用 Region #0,App image 默认使用 Region 1。

备注

需要注意的是,每个 Region 的首地址必须 4KB 对齐。

在 IC 启动过程中,会对加密过的 image 进行 Flash-Sec 初始化(做 region 配置,key 设定等操作)。如果 key 没有烧录或者烧录的 key 和加密的 key 不匹配,都会导致 Flash-Sec 的解密失败。

Key 安全存储

对于 AES 对称加密算法,加密和解密用的是同一把 key,长度为 128bit,所以需要特殊的机制来保护加密 key 不被泄露。加密 key 经过加密 Tool 加密一次得到 key’key’ 再发布给工厂烧录到 IC Flash 中。

烧录的过程中,烧录 Tool 会对 key’ 解密得到原始的 key,同时会读取 IC 的 UUID 和 key 组合成 key’’ 并写入,以保证每块 IC 中烧录的 key(key’’)值都是不同的。这有助于增强加密过程的安全性并减小密钥泄漏的风险。

SWD 接口控制

SWD 接口作为重要的调试接口,对调试程序起了很大的作用。但是同样也会增加暴露程序数据和代码的风险。

所以安全机制提供了控制 SWD 接口的方法。有 3 种控制方式:开,关和 Password 控制。其中 Password 控制表示需要通过 HCI UART 输入正确的 Password 才能打开,否则是关闭状态。

Password 调试

Password 和加密 key 类似,也是烧录在 IC 的 eFuse 中。如果某个功能是设定成 Password 控制,就需要通过 HCI UART 输入正确的 Password,然后 IC 会自动重启并检查 Password 是否正确,如果正确则打开该功能。每次 IC 重启都需要重新输入 Password 才能打开该功能。

安全级别

RTL8752H 提供 3 种 安全级别 :0,1 和 2。数字越高安全级别越高,越高的安全级别可能会对调试或者重烧 eFuse 有影响。以下是不同的安全级别下各个模块的功能开关控制。量产建议设定为 2 级。

安全级别

Security Level

SWD Control

eFuse Read

eFuse Write

0

Enable

Enable

Enable

1

Enable by password

Enable by password

Enable

2

Enable by password

Enable by password

Enable by password

使用示例

配置加密 Key

编辑 tools\keys\key.json 文件,配置 OCEK 和 PASSWORD。该文件里的 OCEK 和 PASSWORD 是明文,需要注意保护该文件。在请 Realtek 做 IC 不良分析时,需要提供此处的明文 PASSWORD。

{
    "OCEK": "a1a2a3a4a5a6a7a8a9aaabacadaeafb0",
    "PASSWORD": "00112233445566778899aabbccddeeff"
}

生成加密 APP Image

要生成 Flash-Sec 加密的 APP image,需要做以下修改。

  1. 打开 Flash-Sec 加密 APP 的宏,将宏 FEATURE_FLASH_SEC 设定为 1。默认设定是 0,表示非加密。

    ../../../_images/enable_app_encryption_by_flash-sec.png

    打开 Flash-Sec 加密 APP 的宏

  2. Keil 工程:修改 after_build_common.bat 文件,确保将 --aesmode CTR 加在 prepend_header 命令的末尾。

    ../../../_images/modification_of_after_build_common_bat.png

    after_build_common.bat 修改

  3. GCC 工程:修改 Makefile 文件,确保将 --aesmode CTR 加在 prepend_header 命令的末尾。

烧录 eFuse

危险

RTL8752H 烧录 eFuse 时必须供给 2.5V(±10%)的电压,以避免 eFuse 损坏。

  1. RD 端配置 生成用于烧录的 eFuse 文件

    首先确保 MP Tool 处于调试模式:可通过 MP Tool 选择 类型 ‣ 调试 进入。

    ../../../_images/generate_the_file_to_program_efuse.png

    生成用于烧录的 eFuse 文件

    1. RD Setting 页面,点击 Browse 按钮导入 key.json 文件。

    2. 选择项使用的 Security Level

    3. 点击 Confirm 按钮,生成 EfuseWrite.json,该文件可以提供给工厂烧录。

  2. 工厂端烧录 eFuse。

    首先确保 MP Tool 处于量产模式:可通过 MP Tool 选择 类型 ‣ 量产 进入。

    ../../../_images/select_the_file_to_be_programmed_in_efuse.png

    选择 eFuse 烧录文件

    1. MP Setting 页面勾选 Efuse,并 选择 eFuse 烧录文件

    2. 点击 MP Download ‣ 下载 进行烧录。

通过 Password 调试

为了安全起见,当安全级别设置为 1 或 2 时,SWD 接口会被禁用。然而,开发人员可以使用密码调试功能重新激活 SWD 接口。这允许授权的开发人员在保持系统整体安全性的同时,重新获取对 SWD 接口的访问权限,以进行调试目的。

../../../_images/use_password_to_unlock_swd.png

使用 Password 解锁 SWD

步骤如下:

  1. 在调试模式 RD Download 界面打开串口。

  2. 选择 Password

  3. 输入 key.json 文件中的原始明文 PASSWORD。

  4. 点击 Unlock 按钮。

  5. 之后 IC 会重启。

  6. 重启之后 SWD 便被打开。