安全机制
本文介绍RTL87x2G芯片的安全机制以及使用方法,主要包括以下几部分:
安全启动:用于验证引导加载程序和固件的真实性和完整性,防止未经授权或恶意代码的执行。
Image加密:用于对固件进行加密,确保固件的机密性和完整性,防止未经授权的访问和篡改。
Factory data加密:用于对存储在设备内存中的敏感数据进行加密,如加密密钥或用户特定信息,从而减少数据泄露的风险。
eFuse烧录:用于将关键信息,如密码或加密密钥,安全存储在硬件eFuse内存中,防止数据被提取或篡改,增强设备的安全性。
调试端口控制:限制对SWD接口的访问,通过密码机制只允许授权人员进行调试,防止未经授权的调试和潜在的漏洞。
总之,RTL87x2G芯片的安全机制提供了综合和可靠的方法,以保护设备及其处理的数据的完整性、机密性和可靠性。
概述
主要从以下几个方面展开介绍:安全启动、加密image、加密Factory Data、key安全存储、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,需要做以下修改。
打开Flash-Sec加密APP的宏,将宏
FEATURE_FLASH_SEC
设定为1。默认设定是0,表示非加密。
Keil工程:修改
after_build_common.bat
文件,确保将--aesmode CTR
加在prepend_header
命令的末尾。
GCC工程:修改
Makefile
文件,确保将--aesmode CTR
加在prepend_header
命令的末尾。
加密Factory Data
(会很快在下个版本中更新)
烧录eFuse
备注
RTL87x2G烧录eFuse时已取消2.5V ± 10%限制,只要芯片正常供电即可烧写eFuse。
- RD端配置生成用于烧录的eFuse文件。首先确保MP Tool处于调试模式:可通过MP Tool选择进入。
在 RD Setting 页面,点击 Browse 按钮导入
key.json
文件。选择项使用的 Security Level。
点击 Confirm 按钮,生成
EfuseWrite.json
,该文件可以提供给工厂烧录。
- 工厂端烧录eFuse首先确保MP Tool处于量产模式:可通过MP Tool选择进入。
在 MP Setting 页面勾选 Efuse,并选择eFuse烧录文件。
点击
进行烧录。
通过Password调试
为了安全起见,当安全级别设置为1或2时,SWD接口会被禁用。然而,开发人员可以使用密码调试功能重新激活SWD接口。这允许授权的开发人员在保持系统整体安全性的同时,重新获取对SWD接口的访问权限,以进行调试目的。
步骤如下:
在调试模式 RD Download 界面打开串口。
选择 Password 。
输入
key.json
文件中的原始明文PASSWORD。点击 Unlock 按钮。
之后IC会重启。
重启之后SWD便被打开。