启动流程详解

理解系统启动流程有助于掌握 RDP 的工作原理和关键配置点:

RDP 使能后,Flash 加密区域存储加密的 TrustZone 安全固件,Image Header 中的地址字段指定需加载的安全地址。 系统从安全 ROM 启动后,后续启动流程都运行在 TrustZone 安全世界中。 启动流程中使用的关键外设(OTP、解密引擎、DMA 等)和内存均通过 MPC、PPC 实现安全隔离,确保固件加载流程的安全性。

各芯片的启动流程如下:

RTL8721Dx:

不支持 Flash 地址安全隔离,加密固件使用对称硬件加密引擎进行解密。系统启动时,固件被完整解密并加载至安全 RAM,再由 CPU 执行。 RDP 流程详解:

  1. 密钥加载:OTP 中的 RDP 密钥由硬件自动加载至对称硬件加密引擎。

  2. 固件读取:内部安全 DMA 分块读取外部 Flash 中的加密固件。

  3. 硬件解密:对称硬件加密引擎执行解密操作,并通过安全 DMA 传输至受保护的安全 RAM 区域。

  4. 执行:CPU 跳转至安全 RAM 开始执行安全固件。

../../_images/rdp_diagram.svg

OTP 配置说明

OTP(One Time Programmable)用于存储 RDP 密钥和使能控制位,是 RDP 功能的硬件基础。 启动时 Bootloader 检查 OTP 中的使能位来决定是否使能 RDP。

OTP 只能写入一次,配置前需仔细核对地址和数据。配置顺序:先烧写密钥,再烧写使能位。

RTL8721Dx:

使用 IPSEC-S 硬件引擎配合 OTP 密钥解密安全固件。RDP 相关 OTP 配置如下:

名称

OTP 地址

大小(比特)

描述

RDP_EN_PHY

物理地址 0x368[5]

1

永久使能位。烧写后 RDP 功能即被启用,不可撤销。量产阶段使用。

RDP_EN_LOG

逻辑地址 0x3[4]

1

可撤销使能位。烧写后 RDP 功能即被启用,后续可被禁用。开发调试阶段使用。

S_IPSEC_Key1 (RDP)

物理地址 0x200 ~ 0x21F

256

存储 RDP 密钥。

S_IPSEC_Key1_R_Protection_EN

物理地址 0x365[3]

1

读保护使能。烧写后 CPU 将无法读取密钥,防止密钥被读取。

S_IPSEC_Key1_W_Forbidden_EN

物理地址 0x365[4]

1

写保护使能。烧写后密钥将无法被修改,防止密钥被篡改。

备注

RDP OTP 密钥的最高有效字节存储在最高地址。 例如 Manifest.json5 中的密钥字符串为 otp_key_0x200: c9a8b1f4e7d293b6a5d8f009be6c3d21e4a7b8f5d3b901a984087844c2f7b6e0 ,值 0xc9 需烧写至 eFuse 0x200,0xa8 至 0x201,依此类推。

使能方法

RDP 使能分为三个阶段,请按顺序执行:

  • 开发阶段:SDK 配置和固件编译

  • 生产阶段:OTP 烧写和固件烧录

  • 产线验证阶段:检查 RDP 功能是否正常使能

开发阶段

步骤 1:启用 TrustZone

ameba.py menuconfig > CONFIG TrustZone > Enable TrustZone

RAM 安全区域大小由 SDK 默认配置。用户可根据固件大小通过修改工程目录下链接脚本 ameba_layout.ld 中的 TZ_S_SIZE 宏定义来调整区域大小。

步骤 2:配置安全固件加密参数

配置安全固件的 Manifest 文件以指定加密参数,配置文件为 <SDK>\component\soc\amebadxxx\project\manifest.json5

RTL8721Dx:

后处理脚本将根据配置文件中的密钥生成 AES-CBC 加密的 RDP 固件。

配置项说明

  • rdp_enable:启用 RDP 加密功能

  • rdp_iv:AES-CBC 加密的初始化向量

  • otp_key_0x200:RDP 密钥,需与 OTP 中烧写的密钥保持一致

配置步骤

  1. 将 image3 中 rdp_enable 设为 1,启用 RDP 加密功能。

  2. 填写 rdp_iv,长度必须为 8 字节(AES-CBC 需要 16 字节 IV,另外 8 字节复用 image2 的 rsip_iv)。

  3. 填写 otp_key_0x200,长度必须为 32 字节,且需与生产阶段烧写的 OTP 密钥保持一致。

{
   ...
   image2: {
      rsip_iv: "213253647586a7b8",
   },

   image3: {
      rdp_enable: 1,
      rdp_iv: "0123456789abcdef",
      rdp_key: "otp_key_0x200",
   },

   /* =================================== OTP key value =================================== */
   ...
   otp_key_0x200: "c9a8b1f4e7d293b6a5d8f009be6c3d21e4a7b8f5d3b901a984087844c2f7b6e0",
   ...
}

步骤 3:编译固件

重新编译工程,后处理脚本会根据配置文件中的密钥自动生成加密的安全固件。加密后的安全固件会被自动集成在 app.bin 的末尾部分。

完成开发阶段配置后,固件已准备就绪。接下来进入生产阶段,进行 OTP 烧写和固件烧录操作。

生产阶段

备注

使用 AT+SEC 命令前需在 menuconfig 中使能 CONFIG_ATCMD_SECURE ,路径: CONFIG SHELL Enable ATCMD SECURE (默认关闭)。

RDP 量产需要使用量产工具固件执行 OTP 烧录动作。这是因为加密的应用固件必须依赖 OTP 中正确配置的密钥才能启动,在 OTP 配置完成之前,加密的应用固件无法正常运行。 RDP 量产流程与 RSIP 类似,详细流程请参考 应用手册的 Flash XIP 解密 (RSIP) 量产指导章节

步骤 4:烧写 RDP 密钥

RDP 密钥用于加密安全固件,硬件在启动时使用该密钥解密固件。

RTL8721Dx:

设备进入量产阶段时必须烧写 RDP 密钥。

备注

使用 AT+SEC 命令前需在 menuconfig 中使能 CONFIG_ATCMD_SECURE ,路径: CONFIG SHELL Enable ATCMD SECURE (默认关闭)。

使用以下命令烧写 RDP 密钥:

AT+SEC=RDP_KEY,c9a8b1f4e7d293b6a5d8f009be6c3d21e4a7b8f5d3b901a984087844c2f7b6e0

RDP 密钥长度必须为 32 字节。上述为示例值,请随机生成其他密钥。写入后命令会自动回读 OTP 并校验,若校验失败会返回错误信息。

确认密钥烧写正确后,置位密钥读保护与写保护比特:

AT+SEC=RDP_PROT,rw

此操作将同时置位 S_IPSEC_Key1_R_Protection_EN (防止密钥被读取)和 S_IPSEC_Key1_W_Forbidden_EN (防止密钥被篡改)。

步骤 5:烧写 RDP 使能位

RDP 使能位用于启用 RDP 功能,根据设备所处阶段选择合适的使能方式:

开发阶段:

设备处于开发阶段时,建议使用临时使能(后续可关闭):

AT+SEC=RDP_EN,temp

关闭上述临时使能(若已通过 perm 永久使能,则此命令无效):

AT+SEC=RDP_EN,temp_off

步骤 6:烧写固件

将开发阶段编译生成的 boot.bin 和 app.bin 烧录至 Flash。

产线验证

完成上述所有配置后,复位开发板进行验证。若 RDP 功能正常使能,启动日志中会显示 RDP EN 打印。

小心

RDP 功能不会验证固件的合法性。为防止固件被篡改,需与安全启动配合使用。详情请参考 安全启动章节