使用运行密钥来保护开发环境中的器件密钥 - 2022.1 Chinese

Vitis 统一软件平台文档 嵌入式软件开发 (UG1400)

Document ID
UG1400
Release Date
2022-04-26
Version
2022.1 简体中文

以下步骤提供了如下场景下的解决方案:存在 2 支开发团队,团队 A(安全团队)管理红色私钥,团队 B(非安全团队)协作构建加密镜像,但不共享红色私钥。团队 A 管理红色私钥。团队 B 构建加密镜像用于开发和测试。但,后者无权访问红色私钥。

团队 A 使用器件密钥(通过使用 Op_key 选项)来对启动加载程序进行加密 - 将加密后的启动加载程序交付给团队 B。团队 B 使用 Op_key 对所有其它分区进行加密。

团队 B 使用其创建的已加密分区以及团队 A 为其提供的已加密的启动加载程序,并使用 Bootgen 将所有一切都缝合在一起,组成单个 boot.bin。

以下过程描述了用于构建镜像的步骤:

步骤 1

在初始步骤中,团队 A 使用器件密钥和 opt_key 选项对启动加载程序进行加密,然后将加密后的启动加载程序交付给团队 B。现在,团队 B 即可一次性创建完整的镜像,其中包含所有分区和已加密的启动加载程序(使用“运行密钥”作为“器件密钥”)。

  1. 使用器件密钥来对启动加载程序进行加密:
    bootgen -arch zynqmp -image stage1.bif -o fsbl_e.bin -w on -log error
    stage1.bif 示例:
    stage1:
    {
    	[fsbl_config] opt_key
    	[keysrc_encryption] bbram_red_key
    	[
    	  bootloader,
    	  destination_cpu=a53-0,
    	  encryption=aes,aeskeyfile=aes.nky
    	] fsbl.elf
    }
    对应 stage1 的 aes.nky 示例:
    Device xc7z020clg484;
    Key 0 AD00C023E238AC9039EA984D49AA8C819456A98C124AE890ACEF002100128932;
    IV 0 F7F8FDE08674A28DC6ED8E37;
    Key Opt 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F;
  2. 将加密后的启动加载程序和其余分区(使用“运行密钥”作为“器件密钥”)连接在一起构成完整镜像:
    bootgen -arch zynqmp -image stage2a.bif -o final.bin -w on -log error
    stage2.bif 示例:
    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
    }
    对应 stage2 的 aes-opt.nky 示例:
    Device xc7z020clg484;
    Key 0 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F;
    IV 0 F7F8FDE08674A28DC6ED8E37;

步骤 2

在初始步骤中,团队 A 使用器件密钥和 opt_key 选项对启动加载程序进行加密,然后将加密后的启动加载程序交付给团队 B。现在,团队 B 即可为每个分区单独创建经过加密的镜像(使用“运行密钥”作为“器件密钥”)。最后,团队 B 可使用 Bootgen 来将所有经过加密的分区和经过加密的启动加载程序连接起来,获得完整的镜像:

  1. 使用器件密钥来对启动加载程序进行加密:
    bootgen -arch zynqmp -image stage1.bif -o fsbl_e.bin -w on -log error
    stage1.bif 示例:
    stage1:
    {
    	[fsbl_config] opt_key
    	[keysrc_encryption] bbram_red_key
    	
    	[
    	  bootloader,
    	  destination_cpu=a53-0,
    	  encryption=aes,aeskeyfile=aes.nky
    	] fsbl.elf
    }
    对应 stage1 的 aes.nky 示例:
    Device xc7z020clg484;
    Key 0 AD00C023E238AC9039EA984D49AA8C819456A98C124AE890ACEF002100128932;
    IV 0 F7F8FDE08674A28DC6ED8E37;
    Key Opt 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F
  2. 使用“运行密钥”作为“器件密钥”,对其余分区进行加密:
    bootgen -arch zynqmp -image stage2a.bif -o hello_e.bin -w on -log error
    stage2a.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
    stage2b.bif 示例:
    stage2b:
    {
    	[aeskeyfile] aes-opt.nky
    	[
    	  destination_cpu=a53-1,
    	  encryption=aes,
    	  aeskeyfile=aes-opt.nky
    	] hello1.elf
    }
    对应 stage2a 和 stage2b 的 aes-opt.nky 示例:
    Device xc7z020clg484;
    Key 0 229C993D1310DD27B6713749B6D07FCF8D3DCA01EC9C64778CBAF457D613508F;
    IV 0 F7F8FDE08674A28DC6ED8E37;
  3. 使用 Bootgen 将以上示例连接在一起,构成完整的镜像:
    Use bootgen to stitch the above, to form a complete image.
    stage3.bif 示例:
    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 也必须相同。