安全机制

本文介绍RTL87x2G芯片的安全机制以及使用方法,主要包括以下几部分:

  • 安全启动:用于验证引导加载程序和固件的真实性和完整性,防止未经授权或恶意代码的执行。

  • Image加密:用于对固件进行加密,确保固件的机密性和完整性,防止未经授权的访问和篡改。

  • Factory data加密:用于对存储在设备内存中的敏感数据进行加密,如加密密钥或用户特定信息,从而减少数据泄露的风险。

  • eFuse烧录:用于将关键信息,如密码或加密密钥,安全存储在硬件eFuse内存中,防止数据被提取或篡改,增强设备的安全性。

  • 调试端口控制:限制对SWD接口的访问,通过密码机制只允许授权人员进行调试,防止未经授权的调试和潜在的漏洞。

总之,RTL87x2G芯片的安全机制提供了综合和可靠的方法,以保护设备及其处理的数据的完整性、机密性和可靠性。

概述

主要从以下几个方面展开介绍:安全启动加密image加密Factory Datakey安全存储SWD接口控制Password调试

安全启动

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

安全启动用于确保Image的完整性和真实性,SHA256用于完整性校验,ECDSA用于真实性校验。如果任何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的解密失败。

加密Factory Data

在生产设备的过程中,可能会生成一些与生产相关的信息,这些信息被称为factory data(出厂数据)。其中一些factory data可能是具有安全敏感性的,比如用于设备认证的密钥对,即私钥和公钥。对于私钥等信息的保护至关重要。

因此,RTL87x2G提供了一种保护factory data的机制,它会对这些数据进行加密并保存到flash中,并且根据设备上的差异化信息产生加解密密钥。在设备启动时,密钥会被安全执行环境加载到AES引擎中,使得应用程序能够在不直接接触密钥的情况下解密flash存储器上的factory data。

Key安全存储

加密和解密用的是同一个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才能打开该功能。

安全级别

RTL87x2G提供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的宏

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

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

after_build_common.bat修改

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

加密Factory Data

(会很快在下个版本中更新)

烧录eFuse

备注

RTL87x2G烧录eFuse时已取消2.5V ± 10%限制,只要芯片正常供电即可烧写eFuse。

  1. 首先确保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便被打开。