Uboot FIT验签

Uboot FIT验签

fit_image_load
  fit_get_image_type_property--根据image_type获取对应名称。
  fit_image_get_node--如果指定子镜像名称,则直接在FIT里面找到node offset。
  fit_conf_get_node--如果没有指定子镜像名称,则通过configuration加载。如果没有指定configuration,则使用default。
  fit_config_verify--校验configuration。
    fit_config_verify_required_sigs
      fit_config_verify_sig--如果定义了required并且为conf则进行configuration验签。
        fit_config_check_sig
          fit_image_setup_verfify--初始化struct image_sign_info结构体。由checksum_algos和crypto_algos可知,仅支持sha1/sha256+rsa2048/rsa4096组合。由padding_algos可知支持pkcs-1.5/pss两种padding算法。
          fit_image_hash_get_value--获取当前子节点value值,即签名。
          info.crypto->verify--对应verify函数,即rsa_verify()。

            info->checksum->calculate--对应hash_calculate函数。对于验签的哈希,sha1和sha256都是对应此函数。对区域内内容进行哈希计算。
            rsa_verify_with_keynode--获取key-dev类似的公钥节点,然后进行验签。
              fdtdec_get_int--获取rsa,num-bits、rsa,n0-inverse、rsa,exponent、rsa,modulus、rsa,r-squared。
              rsa_verify_key--prop即是RSA public key内容。使用prop对签名进行解密得到hash。
                rsa_mod_exp--使用prop得到的公钥对签名内容进行解密得到pkcs1.5 padding的hash。
                  mod_exp_sw
                    rsa_mod_exp_sw
                padding->verify--可能是padding_pkcs_15_verify()。
                  padding_pkcs_15_verify--先检查padding,然后比较hash是否一致。

                    padding_pkcs_15_verify--检查padding是否符合pkcs1.5规范。
                    ->memcmp--将计算得到的hash值和对签名进行解密的得到的hash进行比较,一致则通过。
  fit_image_select
    fit_image_print--打印FIT镜像的详细信息。
    fit_image_verify--验证镜像的一致性。
      fit_image_get_data_and_size
      fit_image_verify_with_data
        fit_image_verify_required_sigs--处理FIT中signature节点,进行验签。
          fit_image_verify_sig
            fit_image_check_sig
              fit_image_setup_verify
              fit_image_hash_get_value
              info.crypto->verify--对应crypto_algo的verify函数,比如rsa_verify。
        fit_image_check_hash--处理FIT中hash节点。计算hash值,并和从FIT中获取的hash进行比较。
          fit_image_hash_get_algo--获取哈希算法名称。
          fit_image_hash_get_value--获取hash值。
          calculate_hash--计算hash值,。
        fit_image_check_sig--类似于fit_config_check_sig()。
  fit_image_get_data_and_size--获取当前镜像的buf地址和size大小。
  fit_image_get_load--获取当前镜像的load地址。
  image_decomp--如果镜像需要解压,则调用image_decomp将输入数据data解压到load地址。
  memcpy--如果load和当前data地址不一致,则需要memcpy一次。
### 关于 U-Boot FIT 文件 #### 创建 FIT 文件 FIT (Flattened Image Tree) 是一种灵活的映像格式,用于描述多个二进制组件及其属性。为了创建 FIT 文件,通常需要准备一个配置脚本(通常是 YAML 或 FDT 格式),该文件定义了要打包到最终镜像中的各个组成部分。 对于基于 ARM 架构的操作系统启动而言,这可能涉及到 kernel、device tree blob (dtb),以及 root filesystem 的路径和参数设置[^2]。具体来说: 1. 准备好所需的内核 (`zImage` or `uImage`) 和设备树 Blob (`.dtb`) 2. 编写 `.its` 脚本来指定这些资源的位置和其他元数据 3. 利用 mkimage 工具来构建实际的 FIT 映像文件 ```bash mkimage -f my-image.its my-image.fit ``` 此命令会读取名为 `my-image.its` 的输入模板并生成相应的 FIT 文件 `my-image.fit`[^1]。 #### 使用 FIT 文件 一旦有了 FIT 文件之后,在 U-Boot 中加载和引导的过相对简单。假设已经通过 TFTP 或者其他方式获取到了 FIT 文件,则可以在 U-Boot 提示符下执行如下操作: ```bash tftpboot ${loadaddr} my-image.fit setenv fdt_high 0xffffffffffffffff fdt addr ${fdt_addr_r} fit_image_load simplefb console=ttyS0,115200n8 earlycon=uart8250,mmio32,0xff670000 bootm ${loadaddr}#${conf_id} ``` 上述序列展示了如何从网络服务器下载 FIT 文件,并将其作为目标系统的启动源之一。注意这里的 `${conf_id}` 应当被替换为具体的配置 ID 值,它对应着 FIT 文件内部所定义的不同启动选项之一[^3]。 #### 解决常见问题 针对 FIT 文件可能出现的一些典型挑战有: - **证失败**:如果启用了安全特性如 FIT 证功能,那么任何试图篡改 FIT 结构的行为都会触发错误提示。确保所有参与方都遵循相同的安全策略是非常重要的;同时也要意识到即使存在有效的数字名也不能绝对防止某些形式的攻击向量,比如回滚或混搭攻击[^4]。 - **不兼容硬件平台**:不同 SoC 平台之间可能存在细微差异,特别是在处理内存布局方面。务必确认使用的 device tree 符合当前处理器的要求。 - **缺少必要的环境变量**:U-Boot 启动过中依赖一系列预设好的环境变量来进行正确解析 FIT 文件内的信息。检查是否有遗漏的关键项未被适当初始化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值