U-boot FIT签名验证
参考
https://source.denx.de/u-boot/u-boot/-/blob/v2020.01/doc/uImage.FIT/signature.txt?ref_type=tags
简介
签名流程
- 对FIT中的镜像进行哈希处理
- 使用私钥对哈希值进行签名,生成签名
- 将生成的签名存储在FIT中
验签的流程
- 读取FIT
- 获取公钥
- 从FIT中提取签名
- 对FIT中的镜像进行哈希处理
- 使用公钥验证从FIT中提取的签名是否与哈希值匹配
FIT镜像创建流程
its和itb
its(image tree source)是创建
加密签名过程分析
环境准备
openssl安装(3.0.7)
下载源码:https://github.com/openssl/openssl/tree/openssl-3.0.7
cd 源码目录
mkdir build install
cd build
…/config --prefix=xxx/install
make
make install
mkimage安装
mkimage是uboot下面的一个工具,用来将zImage制作成uImage,制作内核启动镜像(给zImage镜像添加64字节的头信息成uImage);
mkimage的源码在"uboot/tool"目录下,在编译uboot时默认会编译出mkimage工具;
注意需要在LD_LIBRARY_PATH中添加openssl的动态库路径
创建RSA密钥及其证书
//通过openssl创建RSA2048的私钥:
openssl genpkey -algorithm RSA -out dev.key -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
/**
genpkey:这是OpenSSL命令行工具的一部分,用于生成新的私钥和公钥(密钥对)。
algorithm RSA:指定生成密钥对时使用的算法,这里是RSA算法。
out dev.key:指定生成的密钥的输出文件名为dev.key,生成的私钥和公钥将保存在这个文件中。
pkeyopt rsa_keygen_bits:2048:这是一个选项,指定了RSA密钥对中的模数(modulus,一般理解为密钥的长度)的位数。在此示例中,密钥长度为2048位。密钥长度越长,加密强度通常越高,但也会带来更大的计算开销。
pkeyopt rsa_keygen_pubexp:65537:这是另一个选项,指定了RSA密钥生成过程中使用的公钥指数。65537是一个常见的公钥指数选择,因为它是一个较小的质数,且适用于加密和解密的效率。
**/
//或者使用如下命令创建:
openssl genrsa -out dev.key 2048
//然后创建RSA2048私钥的X509证书:
openssl req -batch -new -x509 -key dev.key -out dev.crt
/**
req:这是 OpenSSL 命令行工具的一部分,用于处理证书签名请求(CSR)和相关操作。
batch:这是一个选项,表示在执行期间不需要用户干预。它将使命令自动化,确保不需要用户输入任何附加信息。
new:这是一个选项,表示创建一个新的证书请求(CSR)。
x509:这是一个选项,表示生成自签名的 X.509 证书。
key dev.key:这个参数指定了生成证书请求时使用的私钥文件 dev.key,该私钥将与新生成的证书相关联。
out dev.crt:这个参数指定了生成的证书文件的输出位置和名称,这里的 dev.crt 将是生成的自签名 X.509 证书的输出文件。
**/
//见dev.key的公钥提取出来并显示
openssl rsa -in keys/dev.key -pubout