手动验证步骤
1、生成RSA密钥对 2、构建镜像,
1.1 生成密钥
私钥: openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa_private_2048.pem
公钥: openssl rsa -in rsa_private_2048.pem -pubout -out public.pem
1.2 从构建系统生成镜像
dd if=/dev/zero of=A_1_6_gos0-fs_targetfs.img bs=1024M count=20
sudo mkfs.ext4 -b 4096 A_1_6_gos0-fs_targetfs.img
2、服务器打包环节:3、生成 加密A_1_6_gos0-fs_targetfs.img 4、生成根哈希,(私钥)
2.1 制作nv包,获得 A_1_6_gos0-fs_targetfs.img
2.1.1 准备好nv的打包工具包
2.1.2 获取docker镜像
iregistry.baidu-int.com/apollo-os/jidu-package:v1.2
2.1.3 将dupkg工具挂载到docker镜像
docker run -it --privileged=true --net=host -v /root/ota/dupkg/:/home iregistry.baidu-int.com/apollo-os/jidu-package:v1.2
2.1.4 获取底软 driveos的产出
wget -O output.tar.gz --no-check-certificate --header "IREPO-TOKEN:c875370d-e42e-4a71-a10d-5543890f3e46" "https://irepo.baidu-int.com/rest/prod/v3/baidu/acu/sanxian_gos_linux/releases/1.2.4.20/files"
2.1.5 挂载完成后,运行dupkg gen 打包命令
python3 /home/dupkg/dupkg.py gen --template dupkg_dual_tegra_template --in TEGRA_A_SRC=/home/output/orin_baidu_sanxian/pdk_6.0.4.0/baidu-acu-s0-ap_signed/642-63663-0001-001_TS2/flash-images TEGRA_B_SRC=/home/output/orin_baidu_sanxian/pdk_6.0.4.0/baidu-acu-s1-ap_signed/642-63663-0001-001_TS2/flash-images TII_META_VER=metav2 CONTAINER1=guest-linux CONTAINER2=qnx-update ERASE_PADDING_FLAG=0 VALIDATE_OPTION=True SHA_ALG=sha512 TARGET_OS=linux --out /home/out_new1
运行 成功后将一个out_new1的文件夹
2.2 进入nv产出包 out_new1 在tii-a 和tii-b 生成加密 A_1_6_gos0-fs_targetfs.img
2.2.1 准备 1GBhash.img 追加到A_1_6_gos0-fs_targetfs.img 尾部用于存放hashtree
dd if=/dev/zero of=hash.img bs=1024M count=1 cat hash.img >> A_1_6_gos0-fs_targetfs.img
2.2.2 sudo veritysetup format A_1_6_gos0-fs_targetfs.img A_1_6_gos0-fs_targetfs.img --data-blocks 5767168 --hash-offset 23622320128 (生成文件data+hash)
同时命令会输出如下信息:
[sudo] password for shaomingjin:VERITY header information for test_loop_hash_daviceUUID: 2e074a75-1230-4051-8702-db8c7b4c58b2Hash type: 1Data blocks: 563200Data block size: 4096Hash block size: 4096Hash algorithm: sha256Salt: 2e86e1f9d278540bbf17f28cff1e32310a63f32b0b0ec566bc6511e726fe03c4Root hash: f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29
2.3生成签名根哈希
Root hash : f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29
cat format_data.txt | grep Root | awk '{print $3}' >roothash.txt
openssl rsautl -sign -inkey rsa_private_2048.pem -in roothash.txt -hexdump
openssl rsautl -sign -inkey rsa_private_2048.pem -in roothash.txt -out sig.dat
2.4 将签名导入到镜像文件
cat sig.dat >> A_1_6_gos0-fs_targetfs.img
2.5 由于更改了A_1_6_gos0-fs_targetfs.img大小,需要同步更新 metadata.json 里的 hash 以及 data_size 大小
2.6 将制作好的nv包压缩,拷贝到集度板卡上,做部署
3、设备上使用: 5、验证签名 6、创建加密对象 7、挂载 (公钥)
3.1 更改initramfs 配置
①打包增加文件
增加openssl相关、veitysetup相关的 bin+so
② 更改init.sh 文件 ,加入 验证签名、创建加密对象、挂载
3.2、验证签名
3.2.1 由于在2.4步骤,已经将sig.dat追加到 A_1_6_gos0-fs_targetfs.img尾部 {23GB + 256B,22G 是ext4的分区没有变化,后面的1G里面 hash tree,256Bsig.dat}
此时我们在 /dev/vblkdev0p1 取出 sig.dat
sudo dd if=$root_img of=sig1.dat bs=256 count=1 skip=96468992
3.2.2 验证签名
openssl rsautl -verify -inkey public.pem --pubin -in sig.dat
如果签名正确将从签名的roothash文件返回roothash
结果 = f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29
3.3、创建加密对象
sudo veritysetup open $root_img fangtroot $root_img --data-blocks 4980736 --hash-offset 20401094656 9dc233ac7d79b41c0c462927d07ead1f35b55e2ab15251c55150df6052bf01e1
删除: sudo dmsetup remove
sudo dmsetup info
3.4、挂载
sudo mount /dev/mapper/fangtroot /mnt/abc
3.5执行部署命令:content_server /opt/data/mj/out_new1 & sample_driveupdate -p /gos-a/content/files
切A分区命令:
common_if_testapp -set_default_bootchain x1 A
common_if_testapp -set_default_bootchain x2 A
切B分区命令:
common_if_testapp -set_default_bootchain x1 B
common_if_testapp -set_default_bootchain x2 B