Skip to main content

x2600h_emmc_spl+kernel+rootfs+other安全启动_ota

一 硬件平台介绍

开发板halley7:

X2600H + mmc0

串口:uart0_PE(9,10)

编译配置文件:x2600h_mmc0_5.10_defconfig

二 软件实现

建议准备两份代码,对应AB分区的源码:

job/linux/x2600作为当前系统的编译源码(简称A系统,使用以太网MAC连网下载,ip:10.4.3.2),ota_version = 0

job/linux/testcode/build 作为待升级的系统的编译源码(简称B系统,,使用以太网MAC连网下载,ip:10.4.3.2),ota_version = 1

window11 安装的虚拟机virtualbox ubuntu18.04 64bit(ip:10.4.3.4)作为服务器

2.1 A系统配置

2.1.1 修改uboot

2.1.1.1 boards.cfg

在uboot对应的编译配置boards.cfg中删除SPL_OS_BOOT,同时添加 SPL_OS_OTA_BOOT

在uboot对应的编译配置boards.cfg中删除LPJ="11935744",BOOT_FAST_FIXED

x2600h_base_xImage_msc0     mips        xburst2     x2600_base            ingenic        x2600         x2600_base:SPL_JZMMC_SUPPORT,ENV_IS_IN_MMC,GPT_CREATOR,JZ_MMC_MSC0,SPL_PARAMS_FIXER,SPL_OS_OTA_BOOT,GPT_TAB_BUILT_IN,X2600H_DDR,SYS_UART_INDEX=0
2.1.1.2 include/configs/x2600_base.h
// 增加以下三个宏控
#define CONFIG_JZ_SCBOOT
#define CONFIG_JZ_SECURE_ROOTFS
#define CONFIG_STORAGE_REDUCE_SD
#include "x2600_base_common.h"

其中:

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

2.1.2 修改x2600h_mmc0_5.10_defconfig

1

当前系统的ota版本号:A系统当前的版本号,此处ota_version = 0

ota升级服务器地址: apache2 ,电脑端放置OTA升级固件的⽬录:/var/www/html/ 。此处服务器绝对路径为:/var/www/html/ota/x2600h_halley7。

ota kernel 、rootfs镜像路径:A系统编译出的镜像的绝对路径

2.1.3 确保网络可以通讯

2

2.1.4 配置cmd_sc的工具命令

3

4

2.2 B系统配置

2.2.1 修改uboot

2.2.1.1 boards.cfg

在uboot对应的编译配置boards.cfg中删除SPL_OS_BOOT,同时添加 SPL_OS_OTA_BOOT

在uboot对应的编译配置boards.cfg中删除LPJ="11935744",BOOT_FAST_FIXED

x2600h_base_xImage_msc0     mips        xburst2     x2600_base            ingenic        x2600         x2600_base:SPL_JZMMC_SUPPORT,ENV_IS_IN_MMC,GPT_CREATOR,JZ_MMC_MSC0,SPL_PARAMS_FIXER,SPL_OS_OTA_BOOT,GPT_TAB_BUILT_IN,X2600H_DDR,SYS_UART_INDEX=0
2.2.1.2 include/configs/x2600_base.h
// 增加以下三个宏控
#define CONFIG_JZ_SCBOOT
#define CONFIG_JZ_SECURE_ROOTFS
#define CONFIG_STORAGE_REDUCE_SD
#include "x2600_base_common.h"

其中:

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

2.2.2 修改x2600h_mmc0_5.10_defconfig

5

当前系统的ota版本号:B系统当前的版本号,此处ota_version = 1

ota升级服务器地址: apache2 ,电脑端放置OTA升级固件的⽬录:/var/www/html/ 。此处服务器绝对路径为:/var/www/html/ota/x2600h_halley7。

ota kernel 镜像路径:B系统编译出的加密后的镜像文件绝对路径

ota rootfs 镜像路径:B系统编译出的加密前的镜像文件绝对路径

2.2.3 确保网络可以通讯

2

2.2.4 配置cmd_sc的工具命令

3

4

三 签名A、B系统镜像

3.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 7月 9 20:08 key.bin
-rwxrw-r-- 1 zxy zxy 22M 4月 29 09:55 keygen-32
-rwxrwxr-x 1 zxy zxy 16M 4月 29 09:54 keygen-64
-rw-r--r-- 1 root root 1.7K 7月 9 20:08 pri_key.pem
-rw-rw-r-- 1 zxy zxy 536 4月 28 17:28 qm_cn.qm
-rw-r--r-- 1 root root 64 7月 9 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

3.2 签名工具

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

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

[debug]
value=1

8

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

9

10

3.2.1 签名burner bin

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

11

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

12

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

3.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

3.2.3 签名kernel

14

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

x2600_sz/build/output/xImage-dst.bin

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

3.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

注意:此处生成的最终文件xImage-dst_sig.bin因为要制作ota分包,所以文件名及路径要与2.2.2章节中"ota kernel 镜像路径“ 保持一致。

3.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值有所不同,但是不影响使用。

四 生成ota分包

zxy@vb:~/job/linux/testcode/build$ make ota_img

19

五 烧录

20

21

22

23

六 搭建服务器

安装命令: sudo apt-get install apache2

启动命令: service apache2 start

电脑端放置OTA升级固件的⽬录:/var/www/html/

mkdir -p /var/www/html/ota/x2600h_halley7
cd /var/www/html/ota/x2600h_halley7

新建ota_config.in :

/*
关键字 current_version ⽤于定义当前最新的ota的版本
当current_version=1时,对应于⽬录ota_v1/存放ota的升级信息和⽂件
*/
current_version=1

新建和ota_v'N'/⽬录并拷贝待升级的文件:

mkdir ota_v1
cp /home/xy/job/linux/testcode/build/output/ota/* /var/www/html/ota/x2600h_halley7/ota_v1/ -arf

⼿动创建 ota_v1.ok 到 /var/www/html/ota/x2600h_halley7/ota_v1/ ⽂件夹下,最终确定 ota_v1版本发布.

touch ota_v1.ok

七 升级

为开发板联网:

# ifconfig eth0 10.4.3.2 netmask 255.255.255.0 up
#
# ping 10.4.3.4
PING 10.4.3.4 (10.4.3.4): 56 data bytes
64 bytes from 10.4.3.4: seq=0 ttl=64 time=1.719 ms
64 bytes from 10.4.3.4: seq=1 ttl=64 time=1.080 ms
64 bytes from 10.4.3.4: seq=2 ttl=64 time=0.889 ms

在开发板端查看当前ota信息:

cat /etc/ota_info
ota_version=0
ota_site=http://10.4.3.4/ota/x2600h_halley7

从服务器下载并升级:

# sh /etc/ota_bin/network_ota_update.sh 
try to get http://10.4.3.4/ota/x2600h_halley7/ota_config.in
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/ota_v1.ok
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/ota_update.in
ota_kernel 1
ota_kernel_name xImage-dst_sig.bin
ota_kernel_size 4747328
ota_kernel_md5 16e993620cb7a36b79b6e2a4874a44bc
ota_rootfs 1
ota_rootfs_name rootfs.squashfs
ota_rootfs_size 4620288
ota_rootfs_md5 3748ba93f00aa5acca28477e3abf4ad9
ota_rtos 0
ota_rtos_name
ota_rtos_size
ota_rtos_md5
256+0 records in
256+0 records out
256+0 records in
256+0 records out
we are going to ota update
ota: started
start update kernel
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/ota_md5_xImage-dst_sig.bin.16e993620cb7a36b79b6e2a4874a44bc
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/xImage-dst_sig.bin.0000.16e993620cb7a36b79b6e2a4874a44bc
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/xImage-dst_sig.bin.0001.3776bd37c52dd635ea78c8163fa4476b
ota: data processed: 11% 1048576 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/xImage-dst_sig.bin.0002.1ac249baa63690ddcc93c9bf5a554e99
ota: data processed: 22% 2097152 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/xImage-dst_sig.bin.0003.6b4722dfec27cd47cb0bafef921a846c
ota: data processed: 33% 3145728 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/xImage-dst_sig.bin.0004.99ca125ed4d68ea34588846b922484df
ota: data processed: 44% 4194304 9367616
xImage-dst_sig.bin read ok, now quit
ota: data processed: 50% 4747328 9367616
kernel update done
start update rootfs
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/ota_md5_rootfs.squashfs.3748ba93f00aa5acca28477e3abf4ad9
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/rootfs.squashfs.0000.3748ba93f00aa5acca28477e3abf4ad9
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/rootfs.squashfs.0001.b77ac4242e3d180111330425749770ad
ota: data processed: 61% 1048576 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/rootfs.squashfs.0002.a8b2132214e1c2755cf240c8618027f4
ota: data processed: 73% 2097152 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/rootfs.squashfs.0003.ef6349ae438a35cd5a575af56cdf7505
ota: data processed: 84% 3145728 9367616
try to get http://10.4.3.4/ota/x2600h_halley7/ota_v1/rootfs.squashfs.0004.870e33ae642a4069308e123f9c9894f0
ota: data processed: 95% 4194304 9367616
rootfs.squashfs read ok, now quit
ota: data processed: 100% 4620288 9367616
rootfs update done
256+0 records in
256+0 records out
ota update ok
ota: stoped success

八 调试方法

8.1 通过烧录工具回读ota的标识分区信息

24

获取下次启动的系统及是否验签rootfs。

8.2 查看当前启动的系统

# cat /dev/mmcblk0p5
ota:kernel2