Skip to main content

x2600_mmc_spl+kernel+rootfs+other安全启动

一 硬件平台介绍

开发板halley7:

X2600H + mmc0

串口:uart0_PE(9,10)

编译配置文件:x2600h_mmc0_5.10_defconfig

二 原理介绍

为了保护客户厂商的软件程序不被其对手复制,可以使用AES、2Key-3DES加密对代码进行加密,密码可以是用户提供的User-Key0、User-Key1或芯片内部的Chip-Key(随机数密码)。

而sc通过调用SC-ROM接口使用密码进行解密操作,软件不直接访问密码本身,防止密码泄露。

三 软件实现过程

3.1 uboot 的修改

启用安全启动功能需要修改UBOOT板级配置文件,路径如下:

zxy@vb:~/x2600_sz/build$ cat configs/x2600h_mmc0_5.10_defconfig | grep uboot
APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc720-glibc229
APP_uboot_dir=../bootloader/uboot-x2000
APP_uboot_config=x2600h_base_xImage_msc0

可知当前uboot编译配置文件和路径。 下一步打开uboot配置文件进行修改:

zxy@vb:~/x2600_sz/build$ cd ../bootloader/uboot-x2000/
zxy@vb:~/x2600_sz/bootloader/uboot-x2000$ vim include/configs/x2600_base.h

2024-08-14_16-54

其中:

#define CONFIG_JZ_SCBOOT  : 控制spl和kernel的解密和验签
#define CONFIG_JZ_SECURE_ROOTFS : 控制rootfs的验签
#define CONFIG_STORAGE_REDUCE_SD : 解决mmc spl代码编译越界的问题

3.2 kernel相关驱动的配置

​ 进入对应linux工程目录下kernel/kernel/路径下:

zxy@vb:~/x2600_sz/build$ cat configs/x2600h_mmc0_5.10_defconfig | grep kernel
APP_kernel_dir=../kernel/kernel
APP_kernel_config=x2600_module_base_linux_mmc0_defconfig

敲make menuconfig并回车,进入Ingenic device-drivers Configurations选项,取消选中Ingenic Security support,完成后保存配置(使用模块驱动的安全启动驱动)。

2

备注:

由于整体编译配置make x2600h_mmc0_5.10_defconfig会覆盖掉kernel的当前配置,所以修改完kernel配置以后,需要手动拷贝一份.config到其实际的kernel配置:

zxy@vb:~/x2600_sz/kernel/kernel$ cp .config arch/mips/configs/x2600_module_base_linux_mmc0_defconfig

3.3 iConfigTool的工具的配置

打开iConfigTool工具

3

勾选sc命令,一般默认勾选

4

5

修改完成配置后Ctrl + S保存到build/configs/x2600h_mmc0_5.10_defconfig。

3.4 编译系统

zxy@vb:~/x2600_sz/build$ make x2600h_mmc0_5.10_defconfig
zxy@vb:~/x2600_sz/build$ make

四 相关签名工具使用

4.1 key生成工具

Key 生成工具,用于生成 RAS-Key、User-Key0 和 User-Key1,提供给签名工具和烧录工具使用。

ubuntu下运行命令如下:

zxy@vb:~/cloner-2.5.47-windows_alpha/securitytool/x2000/keytool$ sudo ./keygen-64

8

点击 Generate Key 按钮生成签名需要的文件

8

生成文件路径为:

zxy@vb:~/cloner-2.5.47-windows_alpha/securitytool/x2000/keytool$ ls -lh
总用量 37M
-rw-r--r-- 1 root root 588 79 20:08 key.bin
-rwxrw-r-- 1 zxy zxy 22M 429 09:55 keygen-32
-rwxrwxr-x 1 zxy zxy 16M 429 09:54 keygen-64
-rw-r--r-- 1 root root 1.7K 79 20:08 pri_key.pem
-rw-rw-r-- 1 zxy zxy 536 428 17:28 qm_cn.qm
-rw-r--r-- 1 root root 64 79 20:08 user_key.bin

生成 Key 后需要把 key.bin 复制到烧录工具的 security 目录下:

zxy@vb:~/cloner-2.5.47-windows_alpha/securitytool/x2000/keytool$ cp key.bin ../../../security/x2000/key.bin

注意:生成的下面三个签名文件,需要保存好,同一个板子一旦签名了,再次烧录需要用同一个签名文件的固件,不然烧录会不成功。

key.bin
pri_key.pem
user_key.bin

4.2 签名工具

签名工具用于签名、加密客户的固件、应用程序、配置文件,以便保护用户核心数据。

打开签名工具之前,需要先在securitytool/x2000/sigtool/下创建⽂件settings.ini , 写⼊内容:

[debug]
value=1

8

签名工具路径,运行签名工具如下:

9

10

4.2.1 签名burner bin

首先签名burner bin,该签名文件用于烧录工具第一阶段及第二阶段的固件加密。

11

点击 sign 签名成功以后,会在源文件的路径下生成 uboot_sec.bin 和 spl_sec.bin 加密后固件。 烧录固件签名完成后在烧录工具的固件路径下文件结构:

8

zxy@vb:~/cloner-2.5.47-windows_alpha/firmwares/x2600$ ls -l
总用量 784
-rw-rw-r-- 1 zxy zxy 1420 520 18:20 config.cfg
-rwxr-xr-x 1 zxy zxy 7960 624 15:35 spl.bin
-rwxr--r-- 1 zxy zxy 9504 79 21:17 spl_sec.bin
-rwxr-xr-x 1 zxy zxy 386452 624 15:35 uboot.bin
-rwxr--r-- 1 zxy zxy 388512 79 21:17 uboot_sec.bin

4.2.2 签名u-boot-spl-pad.bin

13

点击 sign 按钮进行签名,签名成功会提示: Successful signature! 表示签名成功,成功以后会在目录下生成 u-boot-spl-pad-dst.bin 文件,路径为:

build/output/u-boot-with-spl-mbr-gpt-dst.bin

4.2.3 签名kernel

14

点击 sign 按钮进行签名,签名成功会提示: Successful signature! 表示签名成功,成功以后会在目录下生成 xImage-dst.bin 文件,路径为:

x2600_sz/build/output/xImage-dst.bin

注意:此处生成的文件并不是最终要烧录的kernel分区加密文件。最终烧录的kernel加密文件需加上rootfs的签名部分内容。

4.2.4 签名rootfs

15

根⽂件系统只计算镜像的hash值,不加密镜像,因此不选择"AES"单选框。 签名成功后,会在rootfs的镜像的同级⽬录下⽣成签名后的rootfs的镜像,如下:

16

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

zxy@vb:~/x2600_sz/build/output$ dd if=rootfs-dst.squashfs of=signature bs=2048 count=1

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

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

4.2.5 签名other.bin

做测试程序test.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
while(1)
{
printf("@@@@@@\n");
sleep(5);
}
}

编译:

CC=/home/xy/job/linux/x2600_sz/buildroot/buildroot/output/host/usr/bin/mips-linux-gnu-gcc
$CC test.c -lhardware2 -o test

文件加密前手动添加一个2KB大小的零填充数据头:

dd if=/dev/zero bs=2k count=1 | cat - test > test_2k

加密添加头数据之后的文件:

17

生成加密后的文件:test_2k-dst.bin

adb push 到开发板:

adb push test_2k-dst.bin /usr/data/

开发板解密:

cmd_sc src=/usr/data/test_2k-dst.bin
src_file : /usr/data/test_2k-dst.bin
dst_file : /usr/data/test_2k-dst.bin_dst

将解密后的文件2k头数据删除:

dd if=test_2k-dst.bin_dst of=test_dc bs=512 skip=4

测试解密后是否相同:

8

注意:

因为当前签名工具会对other.bin签名时按照16byte对齐,不足的部分会自动补0,所以解密后的文件的md5值可能跟源文件的md5值有所不同,但是不影响使用。

五 烧录工具配置

安全烧录具体操作方法请参考《X2000_SecurityBoot操作指南.pdf》,板极选择x2600_sfc_nand_ddr3_linux.cfg。

烧录工具的版本: cloner-2.5.46-ubuntu_alpha

烧录工具的配置如下:

19

20

注意,POLICY中的分区信息要与spl中分区表信息一致,不然系统不能正常启动:

zxy@vb:~/x2600_sz/bootloader/uboot-x2000$ vim board/ingenic/x2600_base/partitions.tab

21

22

六 验证sc加密和解密

详见4.2.5章节。