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, ®ion, 1,
fit_value, fit_value_len);
rsa_verify(&info, ®ion, 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 格式。