3.6.7. 签名校验

U-Boot 官方的代码,SPL 支持 FIT image 的签名。如果固件使用其他格式, 需要自行添加相应的校验支持。

3.6.7.1. FIT Image 签名校验

要实现验证 FIT Image 的签名,需要在配置中打开选项:

  • CONFIG_SPL_FIT_SIGNATURE

mmc_load_image_raw_sector(); // common/spl/spl_mmc.c
|-> spl_get_load_buffer(-sizeof(*header), bd->blksz);
|-> blk_dread(bd, sector, 1, header);
|-> image_get_magic(header) == FDT_MAGIC // 判断是否为 FIT Image
|-> spl_load_simple_fit(spl_image, &load, sector, header); // common/spl/spl_fit.c
    |-> info->read(info, sector, sectors, fit);
    |   h_spl_load_read(info, sector, sectors, fit); // common/spl/spl_mmc.c
    |   |-> blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
    |-> node = spl_fit_get_image_node(fit, images, "loadables", 0);
        |-> spl_load_fit_image(info, sector, fit, base_offset, node,
            |                 spl_image); // common/spl/spl_fit.c
            |-> // 中间加载过程
            |-> fit_image_verify_with_data(fit, node, src, length);
                | // common/image-fit.c
                |-> fit_image_check_sig(fit, noffset, data, size, -1, &err_msg);
                    |  // common/image-sig.c
                    |-> fit_image_setup_verify();
                    |-> fit_image_hash_get_value();
                    |-> info.crypto->verify(&info, &region, 1,
                                            fit_value, fit_value_len);
                        rsa_verify(&info, &region, 1,
                                   fit_value, fit_value_len);
                                   // lib/rsa/rsa-verify.c

此处的 rsa-verify 可以对接到硬件 CE,具体可看 UCLASS_MOD_EXP 的相关内容。 如果没有硬件加速器的实现,则使用软件进行计算。

3.6.7.2. AIC Image 签名校验

制作 SD 量产卡时,由于 Updater U-Boot 固件需要使用 AIC Image 格式, 因此 SD 量产卡启动过程中, SPL-Updater 需要解析 AIC Image 格式。

(TODO: 需要修改原本流程,添加 AIC 格式的支持)

Updater U-Boot 在两种情况下会被使用。第一种情况是通过 USB 升级时,Updater U-Boot 通过 BROM 下载到 DRAM,并且由 BROM 执行。第二种情况是将其烧录到 SD 量产卡, 从 SD 卡启动到 Updater U-Boot 进入升级程序。

为了平台的安全,BROM 所执行的程序必须经过安全验证,BROM 只支持 AIC Image 格式的固件,因此这里 Updater U-Boot 必须使用 AIC Image 格式。