我正在尝试使用 csf 文件一起签署 u-boot 和内核映像以及 dtb 文件。
所以 u-boot 签名已经完成并且可以正常工作,除了收到一个警告。但是在内核签名时我收到如下错误。
> hab_auth_img 0x12000000 0x933348
hab 保险丝未启用
验证来自 DDR 位置 0x12000000 的图像...
坏魔法魔法=0x0 长度=0xa000 版本=0xe1
坏长度魔法=0x0 长度=0xa000 版本=0xe1
坏版本魔法=0x0 长度=0xa000 版本=0xe1
错误:无效的 IVT 结构
允许的 IVT 结构:
IVT HDR = 0x4X2000D1
IVT ENTRY = 0xXXXXXXXX
IVT RSV1 = 0x0
IVT DCD = 0x0
IVT BOOT_DATA = 0xXXXXXXXX
IVT SELF = 0xXXXXXXXX
IVT CSF = 0xXXXXXXXX
IVT RSV2 = 0x0
MX6 HORIZON U-Boot >
这里我的内核 vmlinuz 大小是
hexdump -C vmlinuz-5.10.158-cip22+mel2 | 尾-n 1
00932348
所以我把它填充到 0x1000 并成功了
##objcopy -I binary -O binary --pad-to 0x933348 --gap-fill=0x00 vmlinuz-5.10.158-cip22+mel2 vmlinuz_pad.bin
然后使用 genivt.pl 创建 ivt
下面是我的内容
#!/usr/bin/perl -w
使用严格;
open(my $out, '>:raw', 'ivt.bin') or die "Unable to open: $!";
打印 $out pack("V", 0x412000D1); # 签名
打印 $out pack("V", 0x12000000); # 加载地址 (*load_address)
print $out pack("V", 0x0); # 保留
打印 $out pack("V", 0x0); # DCD 指针
打印 $out pack("V", 0x0); # 引导数据
#print $out pack("V", 0x80EEA000); # 自指针 (*ivt)
打印 $out pack("V", 0x12933348); # 自指针 (*ivt)
打印 $out pack("V", 0x12933368); # CSF 指针 (*csf)
打印 $out pack("V", 0x0); # 预留
close($out);
自指针 (ivt) 计算为加载地址 + padded_image_size(vmlinuxz)
CSF 指针计算为加载地址 + padded_img_size + 0x20
然后在cmd下面使用
cat zImage_pad.bin ivt.bin > zImage_pad_ivt.bin
下面是我的csf-uboot-txt认证数据内容。
[Authenticate Data]
# 用于验证图像数据的密钥槽索引
Verification index = 2
# Authenticate Start Address, Offset, Length and file
# Blocks = 0x877ff400 0x00000000 0x0009ec00 "u-boot-dtb.imx"
Blocks = 0x177ff400 0x00 0x00092c00 "u -boot-dtb.imx",
0x12000000 0x00 0x00932348 "vmlinuz_pad_ivt.bin"
./cst --i csf_additional_images.txt --o csf_zImage.bin将 CSF 二进制文件附加到图像的末尾:
$ cat zImage_pad_ivt.bin csf_zImage.bin > zImage_signed.bin
我正在加载内核映像,如下所示。
U-Boot > load mmc 3:1 0x12000000 /boot/zImage_uboot-signed.bin
9650864 字节读取时间为 298 ms (30.9 MiB/s)
MX6 HORIZON U-Boot >U-Boot > hab_auth_img 0x12000000 0x933348
hab 保险丝未启用
验证来自 DDR 位置 0x12000000 的图像...
坏魔法魔法=0x0 长度=0xa000 版本=0xe1
坏长度魔法=0x0 长度=0xa000 版本=0xe1
坏版本魔法=0x0 长度=0xa000 版本=0xe1
错误:无效的 IVT 结构
允许的 IVT 结构:
IVT HDR = 0x4X2000D1
IVT ENTRY = 0xXXXXXXXX
IVT RSV1 = 0x0
IVT DCD = 0x0
IVT BOOT_DATA = 0xXXXXXXXX
IVT SELF = 0xXXXXXXXX
IVT CSF = 0xXXXXXXXX
IVT RSV2 = 0x0
MX6 HORIZON U-Boot >
有人可以检查这个问题吗,任何输入都是可观的。