rk3568安全启动功能实践

        本文主要讲述笔者在rk3568芯片上开发安全启动功能实践的流程。其中主要参考瑞芯微官方文档《Rockchip_Developer_Guide_Secure_Boot_for_UBoot_Next_Dev_CN.pdf》。文档中描述逻辑不是很清晰而且和当前瑞芯微的sdk中安全启动的流程匹配度不高。本文就不再对瑞芯微官方文档的内容进行赘述,读者可以先查看官方文件后再阅读本文章。

        所谓的安全验证引导流程分为安全性校验与完整性校验。安全性校验是加密公钥的校验,流程为从安全存储(OTP & efuse)中读取公钥 hash,与计算的公钥 hash 对比,是否一致,然后公钥用于解密固件hash。完整性校验为校验固件的完整性,流程为从存储里加载固件,计算固件的hash与解密出来的hash对比是否一致。

1、使用什么方案?

        Linux 系统中,提供了新旧2种Secure Boot方案,FIT和AVB方案,效果是一样的,两种方案不可混用,各个芯片具体选用那种方案,请参考产品版本。

  从上面的图中可知RK356X kernel校验方式为FIT,安全分区为OTP。AVB和FIT的差异以及EFUSE和OTP的差异在瑞芯微官方文档中有详细描述这里不再赘述,只是希望读者不要使用错误的方案。在配置时设置RK_SECUREBOOT_FIT=y ,不要配置RK_SECUREBOOT_AVB=y,因为rk3568芯片不支持AVB方案。

        FIT(flattened image tree)是U-Boot⽀持的⼀种新固件类型的引导⽅案,⽀持任意多个image打包和校验。FIT使⽤its(image source file)⽂件描述image信息,最后通过mkimage⼯具⽣成itb(flattened image tree blob)镜像。its⽂件使⽤DTS的语法规则,⾮常灵活,可以直接使⽤libfdt 库和相关⼯具。同时自带一套全新的安全检验方式。

2、对uboot进行签名

2.1、生成密钥对

        在对镜像进行签名之前,需要生成秘钥对,该秘钥对用于对镜像签名使用,私钥签名,公钥验签。层层验签流程如下:bootrom对loader进行验签,验签通过则运行loader。loader再对uboot进行验签,验签通过则运行uboot。uboot再对kernel验签,验签通过则运行kernel。bootrom对loader验签时,先要判断存放在OTP区公钥的hash值(需要提前烧录hash值到OTP区,后面部分有相关内容描述)和loader中存放的公钥计算出来的hash值是否相等,相等则表明公钥没有被篡改。注意公钥是可以对外开放的,私钥千万不要泄露

        U-Boot工程下执行如下三条命令可以生成签名用的RSA密钥对。通常情况下只需要生成一次,此后都用这对密钥签名和验证固件,请妥善保管。

        第一步:放key的目录:keys

        mkdir -p keys

        第二步:使用RK的"rk_sign_tool"工具生成RSA2048的私钥privateKey.pem和publicKey.pem,分别更名存放为:keys/dev.key和keys/dev.pubkey。命令为:

        ../rkbin/tools/rk_sign_tool kk --bits 2048 --out .

        ln -s privateKey.pem keys/dev.key

        ln -s publicKey.pem keys/dev.pubkey

        第三步:使用-x509和私钥生成一个自签名证书:keys/dev.crt (效果本质等同于公钥)

        openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt

注意:上述的"keys"、"dev.key"、"dev.crt" 、"dev.pubkey"名字都不可变。因为这些名字已经在its

文件中静态定义,如果改变则会打包失败。

        当然上面的步骤可以通过 build.sh security-createkeys命令来实现。

2.2、uboot配置

        U-Boot的defconfig打开如下配置:

        CONFIG_FIT_SIGNATURE=y

        CONFIG_SPL_FIT_SIGNATURE=y

2.3、buildroot的配置

        在瑞芯微sdk目录下执行 make menuconfig->Security feature (secureboot, encryption, verity, etc.)  来进行安全启动相关配置的配置,配置了这些内容后,编译SDK时会自动对uboot和kernel进行签名。

        如果想这些配置一开始就生效,可以在 SDK所在目录的device/rockchip/rk3566_rk3568/rockchip_rk3568_evb1_ddr4_v10_defconfig 中添加fit相关的配置(rockchip_rk3568_evb1_ddr4_v10_defconfig 是笔者当前系统使用的配置,读者需要根据自己编译SDK时选择的配置项修改对应的配置文件):

RK_UBOOT_SPL=y

RK_SECURITY=y

#

# Security check method (system-verity) needs squashfs rootfs type

#

RK_SECUREBOOT_METHOD="fit"

RK_SECUREBOOT_FIT=y

# RK_SECUREBOOT_AVB is not set

RK_SECURITY_OPTEE_STORAGE="rpmb"

RK_SECURITY_OPTEE_STORAGE_RPMB=y

# RK_SECURITY_OPTEE_STORAGE_SECURITY is not set

RK_SECURITY_CHECK_METHOD="base"

RK_SECURITY_CHECK_BASE=y

# RK_SECURITY_CHECK_SYSTEM_ENCRYPTION is not set

# RK_SECURITY_BURN_KEY is not set

3、对kernle进行签名

        在kernel内核配置文件rockchip_linux_defconfig文件中添加如下配置:

CONFIG_BLK_DEV_DM=y

CONFIG_DM_CRYPT=y

CONFIG_BLK_DEV_CRYPTOLOOP=y

CONFIG_DM_VERITY=y

        将optee设备树配置信息添加到rk3568.dtsi设备树中

optee: optee {

        compatible = "linaro,optee-tz";

        method = "smc";

        status = "okay";

};

        内核开启CONFIG_DM_VERITY=y的情况下,parameter-buildroot-fit.txt分区配置脚本中GROW_ALIGN: 1必须设置为1.具体可以查看SDK中的check-grow-align.sh 脚本,该脚本存在如下程序进行检查:

# DM_VERITY存在且非空并并且GROW_ALIGN_VAL值为1,则exit 0

if [ "$DM_VERITY" -a "$GROW_ALIGN_VAL" = "1" ]; then

        # DM verity + grow align

        exit 0

fi

        不配置的话,编译时也会报错提醒,根据提示信息修改即可。感兴趣的同学可以通读这个脚本。

4、验证

        注意,我们还没有烧录公钥的hash值到OTP区。执行SDK的全编译,将编译后的固件烧录到设备中。公钥hash是否烧写,只会影响Maskrom是否校验loader,且烧录后,无法撤销。loader验证uboot以及后续验证流程还是一致的。因此,调试阶段建议先不用burn-key-hash。

进行验证,关键打印信息如下:
Trying fit image at 0x4000 sector
## Verified-boot: 0
sha256,rsa2048:dev## Verified-boot: 0

## Checking atf-1 0x00040000 (gzip @0x00240000) ... sha256(ee9d731c06...) + sha256(b5946ac63d...) + OK
## Checking uboot 0x00a00000 (gzip @0x00c00000) ... sha256(49f841525c...) + sha256(30f02600a8...) + OK
## Checking fdt 0x00b53b50 ... sha256(f133b1d7de...) + OK
## Checking atf-2 0xfdcc1000 ... sha256(b8dca786b4...) + OK
## Checking atf-3 0x0006b000 ... sha256(2f91089eb7...) + OK
## Checking atf-4 0xfdcce000 ... sha256(86ef885748...) + OK
## Checking atf-5 0xfdcd0000 ... sha256(0b2b146c60...) + OK
## Checking atf-6 0x00069000 ... sha256(a9a1e63bef...) + OK
## Checking optee 0x08400000 (gzip @0x08600000) ... sha256(8f745f9f51...) + sha256(ac96eda7b3...) + OK

Jumping to U-Boot(0x00a00000) via ARM Trusted Firmware(0x00040000)
Total: 174.537/261.748 ms

......
## Loading kernel from FIT Image at 7925ce00 ...
   Using 'conf' configuration
optee api revision: 2.0
find partition m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值