3.10.3. 安全校验
U-Boot 原生代码仅支持 FIT Image 的签名校验。
在 do_bootm_states() 的 BOOTM_STATE_FINDOS 阶段,程序检查当前内核镜像的格式, 如果是 FIT Image 格式,则根据 FIT Image 的配置,加载对应的内核镜像。
bootm_find_os(); // common/bootm.c
|-> boot_get_kernel(); // common/bootm.c
|-> fit_image_load(); // common/image-fit.c
|-> fit_image_select(); // common/image-fit.c
检查环境变量中是否有设置 “verify” 为 “no”, 如果没有设置,或者被设置为 “yes”, 则在加载 FIT Image 时对镜像数据进行验证。
images.verify = env_get_yesno("verify");
fit_image_select(); // common/image-fit.c
|-> fit_image_verify(fit_hdr, noffset); // common/image-fit.c
|-> fit_image_verify_with_data(fit, image_noffset, data, size);
|-> fit_image_check_sig(fit, noffset, data, size, -1, &err_msg);
| // common/image-sig.c
|-> fit_image_setup_verify(&info, ...); // common/image-fit-sig.c
| // 读取签名所用的算法等信息,以及验证所用的公钥信息
| // 并且保存到 info 中
|
|-> 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 函数进行签名验证。
此处的 rsa_verify 可以对接到硬件 CE,具体可看 UCLASS_MOD_EXP
的相关内容。
如果没有硬件加速器的实现,则使用软件进行计算。