mkimage 不会将公钥添加到 .dtb 文件

问题描述 投票:0回答:3

我正在尝试按照文档在 beaglebone black 上进行验证启动

https://github.com/01org/edison-u-boot/blob/master/doc/uImage.FIT/beaglebone_vboot.txt

当我运行命令将公钥放入 .dtb 文件时

mkimage -f sign.its -K am335x-boneblack.dtb -k keys -r image.fit

我得到了输出

FIT description: Beaglebone black
Created:         Fri Mar 24 18:47:51 2017
 Image 0 (kernel@1)
  Description:  unavailable
  Created:      Fri Mar 24 18:47:51 2017
  Type:         Kernel Image
  Compression:  lzo compressed
  Data Size:    8490316 Bytes = 8291.32 KiB = 8.10 MiB
  Architecture: ARM
  OS:           Linux
  Load Address: 0x80008000
  Entry Point:  0x80008000
  Hash algo:    sha1
  Hash value:   9a390ee3c02c5bddc7b191d5cbe107991522a6d7
 Image 1 (fdt@1)
  Description:  beaglebone-black
  Created:      Fri Mar 24 18:47:51 2017
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    38894 Bytes = 37.98 KiB = 0.04 MiB
  Architecture: ARM
  Hash algo:    sha1
  Hash value:   249ca75de41f5202fae334253bd153666f60b7dc
 Default Configuration: 'conf@1'
 Configuration 0 (conf@1)
  Description:  unavailable
  Kernel:       kernel@1
  FDT:          fdt@1

但不幸的是,当我用 fdtdump 读取它时,我的 .dtb 文件中没有像签名或 rsa 这样的字段。

这是我的.its 文件:

/dts-v1/;

/ {
    description = "Beaglebone black";
    #address-cells = <1>;

    images {
        kernel@1 {
            data = /incbin/("zImage.lzo");
            type = "kernel";
            arch = "arm";
            os = "linux";
            compression = "lzo";
            load = <0x80008000>;
            entry = <0x80008000>;
            hash@1 {
                algo = "sha1";
            };
        };
        fdt@1 {
            description = "beaglebone-black";
            data = /incbin/("am335x-boneblack.dtb");
            type = "flat_dt";
            arch = "arm";
            compression = "none";
            hash@1 {
                algo = "sha1";
            };
        };
    };
    configurations {
        default = "conf@1";
        conf@1 {
            kernel = "kernel@1";
            fdt = "fdt@1";
            signature@1 {
                algo = "sha1,rsa2048";
                key-name-hint = "dev";
                sign-images = "fdt", "kernel";
            };
        };
    };
};

也在密钥文件夹中我有 dev.key 和 dev.crt 文件。

感谢您的回答。

bootloader beagleboneblack u-boot
3个回答
1
投票

虽然没有错误信息,但如果 U-Boot 的 .config 中的 CONFIG_FIT_SIGNATURE 没有设置,mkimage 不支持该功能。


0
投票

正如它所说:https://lxr.missinglink electronics.com/#uboot/doc/uImage.FIT/signature.txt

公钥存储

为了验证已使用公钥签名的图像,我们需要 拥有可信的公钥。这不能存储在签名图像中,因为 这很容易改变。对于此实现,我们选择存储 U-Boot 控制 FDT 中的公钥(使用 CONFIG_OF_CONTROL)。

问候,史蒂夫


0
投票

Mkimage 用于使用您传递到此命令行的密钥对您的 itb 映像进行签名。您必须签署您的完整板启动配置,即内核+板dtb+initrd,并独立地保证所有元素的哈希完整性。

因此用合适的图像重建u-bootSIGNATURE配置:menuconfig。

然后在另一边,必须嵌入您的公钥。您可以简单地使用 u-boot control dtb 来完成此操作。 u-boot 的构建阶段会将您的 pub_signature.dtb 添加到 u-boot 控制 dtb 中。 有两种方法:将外部 dtb 附加到 u-boot 二进制文件或直接修改原始板 dts。

签名包可以通过以下方式检查:

ftdget /signature your_uboot.dtb

注意:除了控制dtb之外,还有多种加载pub key的方案;覆盖 dtb、来自网络 tftp、来自另一个 nvram 内存存储以及 tpm 等安全设备...

还有一个控制 dtb 字段和一个 itb 字段,显然必须静态设置以保证推力根。 用于控制的Required-mode 字段和用于itb 的required 字段。

第一次尝试时,我建议您禁用必需模式,因为它会导致主板启动中断。如需建议,请先使用 qemu 虚拟机详细阐述您的流程,然后嵌入您的流程。

注意两边设置正确的键名。

启动时,当执行 bootm 时,您将看到完整性算法检查,后面是签名算法检查,后面是 + 符号。此外,u-boot fdt 工具源允许您在嵌入之前检查签名。

只有一个限制,就是未撤销公钥。在这种情况下,必须重新制作整个过程(u-boot 重建和重新刷新),然后遗留签名将被拒绝。

© www.soinside.com 2019 - 2024. All rights reserved.