安全校验
25 Dec 2024
Read time: 1 minute(s)
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 的相关内容。 如果没有硬件加速器的实现,则使用软件进行计算。