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, &region, 1,
                                    fit_value, fit_value_len);
                rsa_verify(&info, &region, 1, fit_value, fit_value_len); // lib/rsa/rsa-verify.c

最终调用 rsa_verify 函数进行签名验证。 此处的 rsa_verify 可以对接到硬件 CE,具体可看 UCLASS_MOD_EXP 的相关内容。 如果没有硬件加速器的实现,则使用软件进行计算。