问题1:求一个带HVB功能的 uboot 源码下载链接
暂时没有带hvb例子的uboot源码,hvb需要自行适配,参考的文档:https://gitee.com/openharmony/startup_hvb

问题2:如果要把 HVB 移植到 Uboot 里,是否有现成的 Patch?Patch 在哪?如果没有 Patch 是否有参考代码?
目前没有这个patch,各个厂商的uboot源码都有自己的特性,一般也不会开源,OH的hvb使用例子在base\startup\hvb\test\hvb_main.c。
hvb就是一套签名机制。在烧录之前对编译生成的镜像签名。然后在bootloader源码阶段加载镜像和解析镜像的时候对已签名的镜像进行校验。

问题3:rvt 是什么?我看 HVB 里引入了一个 rvt 分区,这个分区是做什么的?
rvt是新建立的一个分区,用来存放所有的签名镜像信息。如果要创建这个rvt分区,需要联系设备厂商,添加到分区信息表中,然后烧录的时候,需要可以选择rvt分区。

问题4:关于 rvt 有文档介绍吗? 是不是开了 HVB 需要增加 rvt 物理分区,分区大小是多大?
需要新建一个rvt分区,然后使用命令生成一个 rvt.img镜像。rvt分区的大小是4M,可以参考: https://gitee.com/openharmony/startup_hvb/blob/master/tools/readme.md

问题5: OH3.2 Release 的基线是否能适配 HVB?
3.2可以适配,但后续维护力度和支持力度可能不如4.0。

问题6:如何签名镜像?
可以参考: https://gitee.com/openharmony/startup_hvb/blob/master/tools/readme.md

问题7:对于 system 和 vendor 两个文件系统的 image,签名后的信息是追加到原 image 里,还是要再增加个分区,像 Andorid 上的 vbmeta_system.img 和 vbmeta_vendor.img?
签名后的信息是追加到原 image 里。

问题8:hvb_chain_verify 这个函数已经实现了对 rvt 和 其他 hash_ptn_list 里的分区进行 HVB 的功能了吗?
实现了

问题9:在 base\startup\hvb 里,在 hvb_rvt_verify_root()函数里会调用 ops->valid_rvt_key,而 valid_rvt_key 没有实现,代码没有开放出来,所以 valid_rvt_key 的实现代码在哪?
这个函数需要自行适配,以下是适配步骤:

  1. 解析rv签名公钥 :hexdump -C rvt pub.pem
  2. 将解析的公钥以16进制形式填到数组中:rvt_puk[256] = {
    Ox12, 0x34, 0x56, 0x78, 0x90, 0x9a, 0x09
    0x54, 0xc4, 0x33, 0x87, .........
    }
  3. bootloader阶段实现hvb_ops中的valid_rvt_key函数 公钥格式:
    /* * pubk_data format is |bit length|nO|mod|p_rr| * bit_length: 8bytes, means the bit width of pubk * n0 : 8 bytes * mod : bit_length / 8 bytes, pubk * p_rr : speend up the RSA compute */
    valid_rvt_key(struct hvb_ops *ops, const uint8 t *pubk_data, uint64 t pubk_len, const uint8 t *pubk_metadata, uint64 t pubk_metadata_len, bool out_is_trusted)
    {
    /
    pubk data 为从rvt镜像解析到的公钥 */

out_is_trusted = false;
/
pubk需要跳过bit_length、n0,mod为其真实公钥值,使用pubk_data中的mod,长度为bit_length/8与代码中的rvt_puk进行对比。 /
if (memcmp(rvt_puk, pubk_data的mod, bit_length/8) == 0) {
/
rvt镜像中获取的公钥和固化到代码中的公钥一致,rvt签名可信 */
*out_is_trusted = true;
}
详情参见:https://laval.csdn.net/user/discuss/65ae32fc2c13685765dedfc9?login=from_csdn

问题10:为什么HVB读取分区数据失败?
读取rvt分区,需要根据产品芯片的读取分区接口(联系设备厂商)。无法直接使用码云社区的代码。

问题11:在设计hvb的整包校验时是并未考虑到会申请如35M这样大小的空间吗,后续版本会进行改进吗?
目前还是维持现状,针对较大的hash签名镜像文件校验失败,失败的原因是无法申请足够大的内存,这个需要咨询设备厂商,确认可申请的内存大小是否大于需要hash签名的镜像大小

问题12:对于用 hash 签名方式来校验的分区,放到 hash_ptn_list 中,那对于 hashtree签名方式的分区呢,目前开源的源码能正常校验吗?
针对hashtree的签名一般是在挂载镜像的时候进行的,参考fstab适配,一般会有一个fatab.rk3568文件
#
/dev/block/platform/f8300000.ufs/by-name/system /usr ext4 ro,barrier=1 wait,required,hvb
这个文件适配之后,还需要查看一下内核bootargs的传递是否有误。

问题13:目前已经通过test/hvb_main.c中的例子将libhvb移植到了Bootloader中,例子中会return ret,需要进一步适配通过ret来判断HVB是否校验通过吗?
是的

问题14:想启用hashtree校验的话必须得适配kernel是吗?
是的

问题15:现在想要对system.img进行hashtree校验,除了需要进行fstab适配外还需要什么?
1.需要适配interfaces/innerkits/fs_manager/fstab_mount.c下的MountAllWithFstab相关部分函数
2.以RK3568为例子:device\board\hihope\rk3568\cfg\fstab.rk3568,在原本的系统挂载参数后面加个hvb。也可以上网查查这些参数具体是何含义。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐