Keybox

​ 由于 efuse 空间受限, Tina 上支持了 keybox Secure Storage 功能,该功能默认开启。下面介绍如何自定义keybox进行烧录并读取。

1 固件配置

​ 要想烧录Keybox的前提是安全固件,安全固件的介绍在文档14-Secure Boot

1.1 Keybox_list 自定义

​ uboot会根据环境变量keybox_list来选择加载至secure os中的key。 keybox_list环境变量在env文件中进行配置,使用逗号分隔各 key。

如下:添加自定义的key名称

--- a/device/config/chips/h618/configs/default/env.cfg
+++ b/device/config/chips/h618/configs/default/env.cfg
@@ -13,7 +13,7 @@ mac=
 wifi_mac=
 bt_mac=
 specialstr=
-keybox_list=hdcpkey,widevine
+keybox_list=hdcpkey,widevine,xie
 #set kernel cmdline if boot.img or recovery.img has no cmdline we will use this
 setargs_nand=setenv bootargs earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} selinux=${selinux} specialstr=${specialstr} gpt=1
 setargs_mmc=setenv  bootargs earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${mmc_root} rootwait init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} selinux=${selinux} specialstr=${specialstr} gpt=1

1.2 读取Keybox配置

​ 读取Keybox使用的全志提供的API,并且Tina下已经存放有这些API调用的demo。Keybox读取需要通过TA/CA。

CA:属于 Linux 端应用程序,同其他应用程序一样,编译比较简单,只需要依赖 optee‑client 所提供的库,即可编译完成。

TA:属于安全应用程序,编译需要借助 TA dev‑kit。

1.2.1 TA/CA的编译配置

执行内核配置命令

将下面的选项使能

optee-efuse-read 为我们使用的示例

optee-helloworld 用于确认TA/CA环境是否正常示例

查看是否修改成功

添加符合平台版本的dev_kit

1.2.2 optee-efuse-read 对应修改介绍

​ optee-efuse-read 要能正常读取keybox并打印,需要对原本的demo进行对应的修改,增加对keybox读取到的缓存区进行打印。下面是测试时做的修改,可供参考:

dump为demo自带的16进制打印函数

128 为我烧写的key长度

1.2.3 全志特有API的介绍

  • utee_sunxi_keybox

功能:读取 keybox 中特定名称的数据。

参数:

• keyname: key 数据名称,需与 env*.cfg 文件中 keybox_list 指定的名称相同。

• out_buf:待读取的数据存放空间,空间大小必须大于等于 size。

• size:待读取的长度。

返回值:

• 0:成功

• ‑1:失败

  • utee_sunxi_read_efuse

功能:读取 efuse。

参数:

keyname: key 数据名称。

result_len:返回读取数据的长度。

rd_buf:待读取的数据存放空间,空间大小必须大于等于 efuse 中数据的长度。

返回值:

0:成功

其他:失败

  • utee_sunxi_write_efuse

功能:烧录 efuse。

参数:

keyname: key 数据名称。

write_len:烧录数据的长度,单位 byte。

wr_buf:待烧录的数据,长度必须大于等于 write_len。

返回值:

0:成功

其他:失败

1.3 编译安全固件

配置burn_key 属性

​ 设置 burn_key 属性值为 1 后,设备才会接收 DragonSN 通过 usb 传输的信息,进行相应的烧录工作。该属性在文件 longan/device/config/chips/h618/configs/p2/sys_config.fex中, [target] 项下,如图。如果未显式配置,按 burn_key=0 处理。

image-20241122101659346

生成的安全固件位于:longan/out/ h618_android12_p2_uart0_secure_secure_v0.img

后面的v0就是你设置的版本号,芯片出厂默认是0

1.4 烧录确认

确保keybox_list 已经存在要烧录的key名称xie

uboot中确认,开机上电后一直按s按键进入uboot命令行界面

系统中确认TA/CA 正常

2 烧写Keybox

​ 烧写keybox方法和rotpk 一样,通过 PC 端工具 dragonSN 进行烧录。 DragonSN 工具通过 usb 与设备通信,控制设备烧录指定的 二进制keybox文件信息。具体烧录步骤如下:

打开dragonSN :

image-20250318152318389

鼠标选择配置key

image-20250318152340301

选择确定

image-20250318152416786

image-20250318152535419

鼠标右键列表可以选择删除不要的配置

image-20250318152745256

添加配置

image-20250318152809796
image-20250318152837932

key详细配置如下:key name 为你Keybox_list添加的名称

image-20250318152922597

确定添加

image-20250318153052923
image-20250318153112853

添加完成后返回烧录工具主界面

image-20250318153137093
image-20250318153220826
image-20250318153238161

选择你要烧录的key文件

image-20250318153520969

确定选择的文件后选择配置 擦除之前烧录 和 烧写后关机,非生产阶段不要选择自动烧录,以免烧错。

image-20250318153626900

板子上电后,界面如下:

image-20250318154116349

点击烧录

image-20250318154134143

烧写中

image-20250318154147718

烧写完成

image-20250318154206857

完成后记得关闭工具,以免重启板子后再次识别

3.读取keybox

uboot中读取加密后的keybox

系统中调用demo读取keybox

读取出的对比你烧写的key,一样就是成功了

Last updated