以下步骤提供了如下场景下的解决方案:存在 2 支开发团队,团队 A(安全团队)管理红色私钥,团队 B(非安全团队)协作构建加密镜像,但不共享红色私钥。团队 A 管理红色私钥。团队 B 构建加密镜像用于开发和测试。但,后者无权访问红色私钥。
团队 A 使用器件密钥(通过使用 Op_key
选项)来对启动加载程序进行加密 - 将加密后的启动加载程序交付给团队 B。团队 B 使用 Op_key
对所有其它分区进行加密。
团队 B 使用其创建的已加密分区以及团队 A 为其提供的已加密的启动加载程序,并使用 Bootgen 将所有一切都缝合在一起,组成单个 boot.bin。
以下过程描述了用于构建镜像的步骤:
步骤 1
在初始步骤中,团队 A 使用器件密钥和 opt_key
选项对启动加载程序进行加密,然后将加密后的启动加载程序交付给团队 B。现在,团队 B 即可一次性创建完整的镜像,其中包含所有分区和已加密的启动加载程序(使用“运行密钥”作为“器件密钥”)。
- 使用器件密钥来对启动加载程序进行加密:
stage1.bif 示例:bootgen -arch zynqmp -image stage1.bif -o fsbl_e.bin -w on -log error
对应 stage1 的stage1: { [fsbl_config] opt_key [keysrc_encryption] bbram_red_key [ bootloader, destination_cpu=a53-0, encryption=aes,aeskeyfile=aes.nky ] fsbl.elf }
aes.nky
示例:Device xc7z020clg484; Key 0 AD00C023E238AC9039EA984D49AA8C819456A98C124AE890ACEF002100128932; IV 0 F7F8FDE08674A28DC6ED8E37; Key Opt 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F;
- 将加密后的启动加载程序和其余分区(使用“运行密钥”作为“器件密钥”)连接在一起构成完整镜像:
stage2.bif 示例:bootgen -arch zynqmp -image stage2a.bif -o final.bin -w on -log error
对应 stage2 的 aes-opt.nky 示例:stage2: { [bootimage]fsbl_e.bin [ destination_cpu=a53-0, encryption=aes, aeskeyfile=aes-opt.nky ] hello.elf [ destination_cpu=a53-1, encryption=aes, aeskeyfile=aes-opt1.nky ] hello1.elf }
Device xc7z020clg484; Key 0 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F; IV 0 F7F8FDE08674A28DC6ED8E37;
步骤 2
在初始步骤中,团队 A 使用器件密钥和 opt_key 选项对启动加载程序进行加密,然后将加密后的启动加载程序交付给团队 B。现在,团队 B 即可为每个分区单独创建经过加密的镜像(使用“运行密钥”作为“器件密钥”)。最后,团队 B 可使用 Bootgen 来将所有经过加密的分区和经过加密的启动加载程序连接起来,获得完整的镜像:
- 使用器件密钥来对启动加载程序进行加密:
stage1.bif 示例:bootgen -arch zynqmp -image stage1.bif -o fsbl_e.bin -w on -log error
对应 stage1 的stage1: { [fsbl_config] opt_key [keysrc_encryption] bbram_red_key [ bootloader, destination_cpu=a53-0, encryption=aes,aeskeyfile=aes.nky ] fsbl.elf }
aes.nky
示例:Device xc7z020clg484; Key 0 AD00C023E238AC9039EA984D49AA8C819456A98C124AE890ACEF002100128932; IV 0 F7F8FDE08674A28DC6ED8E37; Key Opt 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F
- 使用“运行密钥”作为“器件密钥”,对其余分区进行加密:
stage2a.bif 示例:bootgen -arch zynqmp -image stage2a.bif -o hello_e.bin -w on -log error
stage2b.bif 示例:stage2a: { [ destination_cpu=a53-0, encryption=aes, aeskeyfile=aes-opt.nky ] hello.elf } bootgen -arch zynqmp -image stage2b.bif -o hello1_e.bin -w on -log error
对应 stage2a 和 stage2b 的stage2b: { [aeskeyfile] aes-opt.nky [ destination_cpu=a53-1, encryption=aes, aeskeyfile=aes-opt.nky ] hello1.elf }
aes-opt.nky
示例:Device xc7z020clg484; Key 0 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F; IV 0 F7F8FDE08674A28DC6ED8E37;
- 使用 Bootgen 将以上示例连接在一起,构成完整的镜像:
stage3.bif 示例:Use bootgen to stitch the above, to form a complete image.
stage3: { [bootimage]fsbl_e.bin [bootimage]hello_e.bin [bootimage]hello1_e.bin }
注释:aes.nky
的 opt_key 与aes-opt.nky
中的 Key 0 相同,两个 nky 文件中的 IV 0 也必须相同。