8. DATA 分区(userdata)签名与验签

8.1. 概述

  • 目的:DATA 分区(JFFS2)在烧录前做 SHA256 + RSA 签名,设备启动挂载前先 验签;通过则挂载 JFFS2,失败或未签名则挂载 tmpfs,避免使用被篡改或未授权数据。

  • 算法:对 payload 做 SHA256,再对 32 字节哈希做 PKCS#1 v1.5 裸 RSA 签名(2048-bit);验签使用公钥的模数 N 与指数 e,与签名私钥成对。

  • 密钥:签名使用 ramdisk/keys/test_reeos.key;验签公钥由 gen_data_sig_pubkey_h.py 从该私钥(或对应证书)提取并生成 C 头文件;设备端无 OpenSSL,使用 mbedTLS 做 RSA 验签。

8.2. 使用与验证方式

  1. menuconfig->Kernel options->Enable kernel secure boot。

  2. 执行 build_all,或按需 make datamake rootfs:前者生成并签名 data.spinor,后者将 verify_data_sig 等装入 rootfs。

  3. 烧录时将 install/.../data.spinor 整文件写入 DATA(userdata)分区起始位置;镜像路径随板型变化,具体分区名与烧录工具以板级为准。

  4. 设备启动后,对 DATA 分区执行 verify_data_sig,验签通过则挂载 JFFS2,失败或未签名则挂载 tmpfs。

  5. 在设备上执行 mount | grep /mnt/data ,若输出中出现 jffs2,即表示 DATA 验签成功并已挂载 JFFS2;若为 tmpfs,则表示验签未通过或未签名。

8.3. 相关文件一览

文件

作用

build/scripts/append_image_sig.py

对 data 镜像做 SHA256 + RSA 签名并追加 trailer

build/scripts/gen_data_sig_pubkey_h.py

从密钥或证书生成 verify_data_sig_key.h

build/scripts/verify_data_sig.c

设备端与本机验签程序(mbedTLS)

build/scripts/verify_data_sig_key.h

公钥 N/e(由 gen_data_sig_pubkey_h.py 生成)

build/tools/common/image_tool/mkjffs2.py

制作 JFFS2 data.spinor 并预留 trailer 空间

build/tools/common/image_tool/create_automount.py

生成挂载脚本(含 DATA 验签分支)

build/Makefile

编译 verify_data_sig / verify_data_sig_host,构建 host/ARM 用 mbedTLS