Skip to main content

X2600 提前初始化屏幕显示logo功能的安全启动

一 安全启动说明

  • CPU 启动时验证 SPL 的的签名,保证代码没有更改过。 利⽤ RSA 的⾮对称加解特性, 私钥加密, 只有公钥可以解密. 把 SPL 的 HASH 值加密, 在启动的时候验通过公钥解密,检校 HASH 是否正确. 这样只有有私钥的才能使⽤, 防⽌代码发⽣变化.
  • CPU启动时使⽤ USERKEY 解密(可选) 代码段可以通过 AES 加密. 启动过程中⽤ AES 解密, 保证⽤⼾的代码是加密的, 防⽌泄露. AES 的秘钥要与 CPU 内部烧录的秘钥相同.
  • CPU 启动时候使⽤ CHIPKEY 解密(可选) 代码是通过 CPU 的⾃⾝的 CHIPKEY 解密的, 每个CPU的 CHIPKEY 是不同的, ⽽通过这个 KEY 加密的 Firmware 也是不同的, 保证了 FLASH ⾥⾯的代码是⽆法 COPY 的

CPU 内部保存了3个 KEY:

  • RSA的公钥签名, 保证公钥是和⽤⼾的私钥对应.
  • USERKEY, 保证⽤⼾使⽤ OTA 时代码是加密的.
  • CHIPKEY, 保证每个 CPU 的KEY是不同的.

这三个 KEY 是保存 CPU 内部 EFUSE 中, 在⾮安全核不可读取, 对外不开放. 在使⽤安全 BOOT 前需要烧录, 并打开security功能的BIT位.

具体加密流程如下:

1

对于 rootfs,采用只签名,不加密的方式

二 软硬件环境说明

2.1 硬件环境说明

本文以 PD_X2600E_VAST_V2.0 开发板为例进行说明rtos提前显示logo的安全启动功能。

X2600系列芯片不同于x1600e及x2000系列, efuse可以长供电,不需要外接io控制, 本开发板电路

2

2.2 软件环境说明

SPL(core0) 加载引导 RTOS(core0), RTOS(core0)同时进行加载kernel镜像和显示logo 任务, 二者均完成后返回SPL(core0), SPL(core0) 引导 kernel(core0),全过程安全启动。

使用rtos显示logo的功能,需要根据实际情况使用IConfigTool工具配置屏幕, linux和rtos的屏幕相关配置必须保持一致 (lcd设备、背光设备、fb驱动、供电)

配置详情请参考文档:linux\doc\FAE文档\X2600E_VAST\x2600e_vast_提前初始化屏幕显示logo.pdf

本文用到linux和rtos代码,所以需要同时下载两份代码。

本文以linux系统x2600e_nand_5.10_defconfig为例。

本文以rtos系统x2600e_nand_defconfig为例。

三 linux系统配置

本文以linux系统x2600e_nand_5.10_defconfig为例。

配置详情请参考文档:linux\doc\FAE文档\X2600E_VAST\x2600e_vast_提前初始化屏幕显示logo.pdf

3.1 uboot配置

在对应 UBOOT 板极配置中添加参数 "SHARE_MEM_MB=16,RTOS_SIZE_MB=32,RMEM_MB=8,QUICK_START,JZ_SCBOOT,JZ_SECURE_ROOTFS"

xy@vb:~/job/linux/testcode$ cat build/configs/x2600e_nand_5.10_defconfig |grep uboot
APP_uboot_toolchain_dir=../tools/toolchains/mips-xburst2-gcc1210-glibc238
APP_uboot_dir=../bootloader/uboot-x2000 # spl的编译目录
APP_uboot_config=x2600e_base_xImage_sfc_nand # spl的编译配置

查找/Linux工程目录/bootloader/uboot-x2000/boards.cfg内的x2600e_base_xImage_sfc_nand并添加上述参数:SHARE_MEM_MB=16,RTOS_SIZE_MB=32,RMEM_MB=8,QUICK_START,JZ_SCBOOT,JZ_SECURE_ROOTFS

x2600e_base_xImage_sfc_nand		mips        xburst2     x2600_base            ingenic        x2600         x2600_base:SPL_SFC_NAND,MTD_SFCNAND,SPL_OS_BOOT,SPL_PARAMS_FIXER,X2600E_DDR,SHARE_MEM_MB=16,RTOS_SIZE_MB=32,RMEM_MB=8,QUICK_START,JZ_SCBOOT,JZ_SECURE_ROOTFS

3.2 IConfigTool配置

需配置lcd模块驱动的reset,供电等gpio控制,确保背光被正确配置并默认使能,fb设置为接管rtos的配置、rmem设置会回收rtos_mem到rmem中,确保可以实现rtos提前显示logo的功能。

具体配置请参照:linux\doc\FAE文档\X2600E_VAST\x2600e_vast_提前初始化屏幕显示logo.pdf

四 rtos系统配置

本文以rtos系统x2600e_nand_defconfig为例。

rtos和linux的屏幕相关配置必须保持一致(lcd设备、背光设备、fb驱动)

需配置rtos的固件加载地址和内存大小,屏驱动、背光、供电、fb设置、linux启动后接管rtos内的fb配置及内存、jpeg第三方库、图像格式转换等,确保可以实现rtos提前显示logo的功能。并在/freertos/vendor/vendor.c中,修改代码如下:

#include <stdio.h>
#include "../example/driver/quick_boot_logo_and_load_kernel_example.c"

void vendor_init(void *arg)
{
printf("vendor init...\n");
quick_boot_logo_and_load_kernel(arg);
}

具体配置和代码实现请参照:linux\doc\FAE文档\X2600E_VAST\x2600e_vast_提前初始化屏幕显示logo.pdf

五 扩大spl代码容量限制

spl中添加了安全启动的参数之后,可能会出现编译时提示代码越界问题。

3

此时需要扩大spl的代码限制容量,从24K扩大到112K。

烧录工具在烧录时会在flash的x5800位置写入烧录工具设置的分区表,为了防止spl扩容后代码覆盖烧录工具写入的分区表,需将分区表的写入位置从0x5800改成0x19000。

4

在kernel对应的代码中也要修改分区表的读取位置:

5

在rtos对应的代码中也要修改分区表的读取位置:

6

烧录工具中要将分区表写入位置设置为0x19000:

7

传输大小设置为128kB:

8

五 签名和加密

注:本文档描述的功能只适用于 cloner-2.5.40-ubuntu_alpha/windows_alpha 以上的烧录工具版本。

x1600、x2000、x2600使用的key生成工具和加密工具都一样,都在烧录工具securitytool/x2000目录下。

5.1 生成秘钥

x1600、x2000、x2600使用的key生成工具和加密工具都一样,都在烧录工具securitytool/x2000/keytool/目录下:

9

其中 keygen-64是64bit pc的图形界面生成key的工具,keytool_cli是linux系统64bit pc下的命令行生成key的工具。本文以图形界面工具为例。

运行:./keygen-64。点击 Generate Key 后就会在当前路径下生成秘钥,也可以点击 Path 选择生成的路径。

10

如下会生成 key.bin,pri_key.pem ,user_key.bin

11

将秘钥拷贝到烧录工具的对应位置:

  • 将 key.bin 拷贝到烧录工具 security/x2000/下:12

  • 将 pri_key.pem 和 user_key.bin 拷贝到烧录工具的 securitytool/x2000/sigtool/security_key下:13

5.2 签名和加密的工具

签名工具在烧录工具目录的 securitytool/x2000/sigtool/ 下:

14

其中 sigtool-32、sigtool-64、sigtool.exe 为对应 pc 下使用的工具。

在64bit ubuntu pc上运行:./sigtool-64

15

其中 AES 选上为启用加密功能,不选为只签名。

5.3 签名和加密

在对镜像进⾏加密之前, 先不加密烧录⼀次未加密过的镜像, 待spl能加载rtos显示logo,rtos可以加载kernel, kernel挂载⽂件系统, ⽂件系统起来后,确定镜像可⽤即可在spl代码中加入参数JZ_SCBOOT,JZ_SECURE_SUPPORT,JZ_SECURE_ROOTFS来实现安全启动功能,进而对镜像签名和加密以实现安全烧录和安全启动。

5.3.1 burn bin

对烧录工具的固件进行加密。

注意:

x1600系列的主控芯片的烧录工具固件路径:burntool\firmwares\x1600\spl.bin、uboot.bin

x2000系列的主控芯片的烧录工具固件路径:burntool\firmwares\x2000\spl.bin、uboot.bin

x2600系列的主控芯片的烧录工具固件路径:burntool\firmwares\x2600\spl.bin、uboot.bin

操作如图:

16

选择好后点击 sign,就会在烧录工具目录下的 firmwares/x2600/目录下生成spl_sec.bin 和 uboot_sec.bin

5.3.2 spl bin

对编译出来的spl镜像进行加密。操作如图:

17

选择好后点击 sign,就会在所选的spl镜像的同级目录下生成加密后的文件,对于上面的文件就会生成 u-boot-spl-pad-dst.bin,等会烧录 spl 时要选择这个文件。

5.3.3 kernel bin

对编译出来的kernel镜像进行加密。操作如图:

18

选择好后点击 sign,就会在所选的kernel镜像的同级目录下生成加密后的文件,对于上面的文件就会生成 xImage-dst.bin,等会烧录 kernel 时要选择这个文件。

5.3.4 rootfs

对于 rootfs ,采用不加密,只签名。具体操作如下:

19

选择好后点击 sign,就会在c生成加密后的文件,对于上面的文件就会生成 rootfs-dst.squashfs

将⽣成的rootfs-dst.squashfs的签名信息分离到signature⽂件:

dd if=rootfs-dst.squashfs of=signature bs=2048 count=1

将rootfs的signature添加入kernel加密后的文件,产生kernel分区的最终烧录文件

cat xImage-dst.bin signature > xImage-dst_sig.bin

最终生成加密后的烧录文件:

20

5.3.5 rtos bin

对编译出来的rtos镜像进行加密。操作如下:

21

选择好后点击 sign,就会在所选的kernel镜像的同级目录下生成加密后的文件,对于上面的文件就会生成 zero-dst.bin,等会烧录 rtos 时要选择这个文件。

六 烧录

本文档使用 cloner-2.5.59-ubuntu_alpha 烧录工具:运行cloner工具。

22

6.1 选择配置文件

点击右上角的配置按钮进入配置界面。

23

6.2 分区配置

24

6.3 用安全烧录

25

6.4 选择烧录文件

26

七 问题汇总

1. 烧录到boot 40%变红

可能是cpu烧坏了, 需要重新更换cpu.

efuse烧录有严格的供电要求, 写⼊efuse时, 给efuse的供电时间不能超过200ms, ⼀旦超过200ms就会烧坏efuse, 导致整个芯⽚不能正常使⽤, 此时就需要更换主控芯⽚了。

2 烧录到boot 90% SEND KU ERR 变红

直接表现是烧录⼯具烧录之前解码固件失败, 根本原因应该是efuse因为某些原因没有写⼊成功.

此时应当检查efuse的供电及使能电平, 确保硬件设计和烧录⼯具设置的⼀致. 排除此处原因后, 重新烧录可以成功的.

3 换其他烧录⼯具烧录后系统⽆法启动

由于efuse中数据位跳变是不可逆的, 所以⼀定要保证⽤此加密烧录后的系统再次更新还是使⽤同样的烧录⼯具和密钥来完成的. 如果使⽤新的烧录⼯具烧录了其他的密钥, 那么再⽤原先的烧录⼯具也⽆法再次烧录正确的密钥了, 引起系统可能再也启动不了了. 到此步, 只能更换主控芯⽚才能再次使⽤了.

八 系统解密流程

27