安全机制

概述

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

加密 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 便被打开。