签名校验
25 Dec 2024
Read time: 2 minute(s)
U-Boot 官方的代码,SPL 支持 FIT image 的签名。如果固件使用其他格式, 需要自行添加相应的校验支持。
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 的相关内容。 如果没有硬件加速器的实现,则使用软件进行计算。
AIC Image 签名校验
制作 SD 量产卡时,由于 Updater U-Boot 固件需要使用 AIC Image 格式, 因此 SD 量产卡启动过程中,SPL-Updater 需要解析 AIC Image 格式。
为了平台的安全,BROM 所执行的程序必须经过安全验证。BROM 只支持 AIC Image 格式的固件,因此这里 Updater U-Boot 必须使用 AIC Image 格式。
在下列两种情况下,会使用 Updater U-Boot:
-
通过 USB 升级时,通过 BROM 将 Updater U-Boot 下载到 DRAM,并且由 BROM 执行。
-
将 Updater U-Boot 烧录到 SD 量产卡,从 SD 卡启动到 Updater U-Boot 进入升级程序。