跳转至

量产工具

8 量产工具

从整个安全系统的角度看,需要一整套工具来配合完成对应的工作。

8.1 RSA 密钥对生成工具

目前,有公开的密钥对生成工具openssl,可以生成足够长度的密钥对。Tina 开发平台scripts 下提供了一个生成密钥对的脚本createkeys,该脚本调用dragonsecboot工具,解析dragon_toc*.cfg 中[key_rsa] 字段,并基于字段的内容生成对应名字的密钥 对。关于dm-verity 所需要的keys 是由tina/scripts/dm-verity-key.sh 生成。

8.2 安全固件版本管理

安全固件打包时会解析version_base.mk文件决定。在efuse 中会有一块区域用来记录固件版本。当设备启动时,会将efuse 中记录的版本号同固件中的版本号比较,如果固件中的版本较低,则不能继续启动;如果固件中的版本比较高,将固件中的版本写入efuse,继续启动;如果版本相同,正常启动。可防止固件版本回退。

8.3 数据封包工具

Tina 开发平台中提供固件封包工具dragonsecboot,在安全固件打包过程中会对相关的镜像文件(sboot、uboot、kernel 等)进行签名,并生成证书以及相关信息,以便启动时对这些镜像文件进行校验,验证完整性。

8.4 烧key 工具

烧key 工具用来将rotpk.bin 烧写到设备的efuse 中,efuse 位于IC 内部,由于efuse 中内容一旦写入便不可更改,所以从根源上保证了根证书公钥hash 的安全性。可用的烧key 工具包含DragonKey 或者DragonSN,工具的使用说明位于工具包中。

8.5 关闭jtag

将sys_config.fex 中jtag_para 节下的jtag_enable 设置为0 即可关闭jtag 调试功能。

8.6 密钥说明

8.6.1 固件签名密钥

密钥 安全固件签名私钥
功能 RSA2048 类型私钥。对sboot、monitor、scp、optee、uboot、boot、
rootfs 等分区进行签名
SDK 路径 tina/out/\({BOARD}/keys/*.pem与tina/out/\)/keys/*.bin,除开rotpk.bin
设备位置 设备上不保存
烧写方式 不烧写
保密
密钥 安全固件签名私钥
功能 RSA2048 类型私钥。对sboot、monitor、scp、optee、uboot、boot、
rootfs 等分区进行签名
SDK 路径 位于tina/out/\({BOARD}/image/toc0以及tina/out/\)/image/toc1目录下的证书中
设备位置 flash 上TOC0、TOC1、boot、rootfs 等分区中
烧写方式 随固件一起烧写
保密

8.6.2 efuse 中密钥

密钥 rotpk
功能 签名根密钥公钥的sha256 值,用于安全启动中根证书的校验。长度256bit。
SDK 路径 tina/out/${BOARD}/keys/rotpk.bin
设备位置 IC 中efuse 中的rotpk 区域
烧写方式 DragonSN 等,参考3.4 小节
保密
密钥 ssk
功能 对称密钥。可用于DragonSN 烧写keybox 时对待烧写的内容进行加密,可用
于TA 加密
SDK 路径 SDK 中没有
设备位置 IC 中efuse 中的rotpk 区域
烧写方式 DragonSN 等,参考3.4 小节
保密
密钥 huk
功能 对称密钥。可用于rotpk_na 烧写keybox 时对待烧写的内容进行加密,可用于
OPTEE Secure Storage 对数据进行加密。
SDK 路径 SDK 中没有
设备位置 IC 中efuse 中的huk 区域
烧写方式 对于MR813/MR813B/R818/R818B/R528,安全固件第一次启动时自动使用
CE 产生的随机数进行烧写。其他方案通过DragonSN 烧写
保密

8.6.3 dm-verity 密钥

密钥 dm-verity 私钥
功能 RSA2048 类型私钥。用于对rootfs 的hash table 进行签名
SDK 路径 位于tina/out/${BOARD}/verity/keys/dm-verity-pri.pem与tina/package/security/dmverity/
files/dm-verity-pri.pem
设备位置 设备上不保存
烧写方式 不烧写
保密
密钥 dm-verity 私钥
功能 RSA2048 类型公钥。用于在initramfs 启动脚本中对rootfs 的hash table 进
行验签
SDK 路径 位于tina/out/\({BOARD}/verity/keys/dm-verity-pub.pem、<br/>tina/package/security/dm-verity/files/dm-verity-pub.pem以<br/>及tina/out/\)/compile_dir/target/rootfs_ramfs/verity_key
设备位置 flash 上boot 分区中的initramfs 文件系统中
烧写方式 随固件boot 分区一起烧写
保密

8.6.4 TA 签名密钥

密钥 dm-verity 私钥
功能 RSA2048 类型私钥。用于对TA 进行签名。没有签名或签名错误的TA 将不会
运行
SDK 路径 位于tina/package/security/optee-os-dev-kit/dev_kit/arm-plat-{CHIP}/export-ta_arm32
/keys/default_ta.pem与tina/out/{BOARD}/staging_dir/target/usr/dev_kit/arm-plat-{
CHIP}/export-ta_arm32/keys/default_ta.pem
设备位置 设备上不保存
烧写方式 不烧写
保密
密钥 TA 签名公钥
功能 RSA2048 类型公钥。用于OPTEE 对TA 进行验签。验签失败的TA 将不会运
行。
SDK 路径 tina/device/config/chips/\({CHIP}/bin/optee_\).bin与tina/out/${BOARD}/image/
optee.fex二进制文件中包含TA 签名公
设备位置 flash 上TOC1 分区中的optee 内
烧写方式 随固件TOC1 一起烧写
保密

8.6.5 TA 加密密钥

密钥 TA 签名公钥
功能 对称密钥。用于对TA 进行加密。密钥来源可以是ssk 或由rotpk 派生而来。长
度128bit。
SDK 路径 tina/package/security/optee-os-dev-kit/dev_kit/arm-plat-{CHIP}/export-ta_arm32/
keys/ta_aes_key.bin与tina/out/{BOARD}/staging_dir/target/usr/dev_kit/arm-plat-{
CHIP}/export-ta_arm32/keys/ta_aes_key.bin
设备位置 IC 中efuse 中的ssk 或rotpk 区域
烧写方式 DragonSN
保密

8.6.6 dm-crypt 密钥

密钥 dm-crypt 密钥
功能 对称密钥。用于对dm-crypt 分区文件系统数据进行加密。dm-crypt.sh 脚本中
可使用三种类型的key:keyfile、pass 与optee-pass,建议使用
optee-pass。
SDK 路径 SDK 中没有该密钥
设备位置 对于keyfile 类型,位于根文件系统/encrypt-key-file,此文件经过加密,使用
时需要输入passphrase 进行解密,keyfile 最大8192kiB;对于pass 类型,
不保存,使用时实时输入passphrase,passphrase 最大长度512B;对于
optee-pass 类型,保存在flash 上的keybox 中,长度256bit。
烧写方式 对于keyfile 类型,执行dm-crypt.sh 时,写到根文件系统根目录;对于pass
类型,不需要烧写;对于optee-pass 类型,通过DragonSN 或keybox_na
进行烧写。
保密

8.6.7 rpmb 密钥

密钥 rpmb 密钥
功能 对称密钥。用于访问RPMB 时身份认证。长度256bit。
SDK 路径 SDK 中没有该密钥
设备位置 保证在flash 上的keybox 中,同时保存在eMMC 中的OTP 区域中。
烧写方式 通过DragonSN 或keybox_na 进行烧写。
保密