Zynq的启动过程及加密

Xilinx公司所有FPGA都采用外部Flash存储bit流文件,通常是未经加密的二进制代码—所以直接读取Flash中的数据即可获取bit流文件,并可随意复制产品。在知识产权越受重视的今天,我们需要对bit流文件进行加密以防止非法窃取知识产权。

Xilinx公司针对该需求推出了加密方案,在FPGA内集成了AES解密引擎。IES或Vivado在生成ROM文件时使用指定的秘钥将文件加密,将经过加密的ROM文件烧写到Flash中。另外,将相同的秘钥也存放在FPGA中。当FPGA加载Flash中的bit流文件时,使用AES解密引擎恢复出原始bit流实现加载。

经过加密后,他人虽可读取Flash中的数据,但如果没有秘钥则无法破解bit流文件。复制的文件在FPGA加载时AES解密引擎无法恢复出原始bit流,不能完成加载,实现了保护功能。

在做本实验前,应该知道不加密的程序固化和启动。如果不是很熟悉,请看: zynq 程序固化和启动

本文的主要内容包含:加密文件的产生,加密系统的制作,将加密数据或密码写入zynq。

本文的主要依据是:xapp1175_zynq_secure_boot.pdf

程序固化中BOOT.BIN 文件的生成回顾

 在 zynq 程序固化和启动一文中,我们回到BOOT.BIN 文件的生成这个部分:在SDK中,菜单 -> Xilinx->Create Boot Image

出现下面界面,在这里我是直接导入上文中的output.bif (勾选 import from existing BIF file)

Zynq的启动过程及加密_第1张图片

可以看到 Security ,下面还有Encryted, Authenticat,点Security,出现如下界面:

Zynq的启动过程及加密_第2张图片

在Security下面还有个页单选择,上面是Authentication,我这里勾选Use Authentication,下面有5个框需要输入文件名。如果不勾选,就不需要Authentication 文件的输入。

下面点击Security,出现如下界面:

Zynq的启动过程及加密_第3张图片

勾选 Use Encryption ,需要Part Name和 Key file

下面我们来介绍这些文件的制作。

加密密码文件的产生

上面需要输入密码文件的界面其实就可以产生密码文件。

看到那里有个警告提示:specify a part name to auto generate key file

这个部件名怎么输入呢? 在vivado 里面有选择part name 的地方,与那里同名,我的是输入 xc7z010

输入了part name,而不输入密码文件名,点击 create image 就会自动生成密码文件。

我的密码文件名是 output.nky,文件内容如下:

Device       xc7z010;
Key 0        DBBAAAA1C001BC5E142898E15DDD77B2BC3A140008B88D87FEDB15C3D63C0B43;
Key StartCBC 23A7CFD31EA54D56A7701F8726CB59C8;
Key HMAC     3F29FEDCB162A3B6AA57329CB97848AF6B48910211714D7BD12FA5B655381DB9;

在xapp1175_zynq_secure_boot.pdf 里也有命令行方式产生的方法,v2.0 在page 29, v2.1 在page31里,

10. When encryption is selected, SDK Bootgen GUI generates a secure image in which all
partitions in the image are encrypted. The AES/HMAC engine requires a 256-bit AES key and
a 256-bit HMAC key. The AES key can be generated using the Xilinx Bootgen tool or an
external tool. To generate a development AES key using the Xilinx Bootgen software, create
a generate_aeskey.bif file with the following content:
generate_aeskey_image:
{
[aeskeyfile] bbram.nky
[bootloader, encryption=aes] fsbl.elf
}
Use the following Bootgen command to generate an AES key:
bootgen -image generate_aeskey.bif -o temp.mcs -encrypt bbram
If the specified AES key does not exist, Bootgen generates the key with the name in the
generate_aeskey.bif file (bbram.nky in this case)

就是说建立一个文件 generate_aeskey.bif ,内容如下:

generate_aeskey_image:
{
[aeskeyfile] bbram.nky
[bootloader, encryption=aes] fsbl.elf
}

 然后在console 执行bootgen如下:

bootgen -image generate_aeskey.bif -o temp.mcs -encrypt bbram

 这样产生的密码在bbram.nky

以上产生密码的操作在2016.1 前的版本有问题,会报错。以前我是2015.4 产生不了,现在2018.2 可以产生了。实在产生不了,就用我上面这个做测试吧。 

BOOT.BIN文件的制作

有了密码文件就可以制作加密了的BOOT.BIN文件。

上面界面输入密码文件名,part name,就可以制作了。

这里需要指定加密的内容,如下:

Zynq的启动过程及加密_第4张图片

在这里选择指定加密fsbl.elf, system_wrapper.bit,然后点击create Image就建立了加密了的BOOT.BIN。复制者可以复制,但没有密码不能用。

我开始只加密.bit 文件,不加密fsbl 结果退出,不能制作。console里错误信息如下:

cmd /C bootgen -image output.bif -arch zynq -o C:\alinx\my_led_flash\BOOT.bin -encrypt \
bbram -p xc7z010


****** Xilinx Bootgen v2018.2
**** Build date : Jun 14 2018-20:41:20
** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

[ERROR] : Key source 0 not supported

所以必须加密fsbl 还是怎么的。 

那我们怎么用呢,我们把BOOT.BIN 文件写入flash或者 拷入sd卡,然后密码写入zynq,就像没密码一样正常启动,运行。

将加密数据或密码写入zynq

密码写入是在vivado 下进行的,打开hardware manager, 在hardware 里找到xc7z010,点击右键,看到菜单了,

Zynq的启动过程及加密_第5张图片

菜单里有program BBR key, Clear BBR key, program eFUSE Registers和我们这个加密有关。

选择 program BBR key,出现下面对话框:

Zynq的启动过程及加密_第6张图片

在这里导入密码文件,然后OK,密码就写入zynq,

program_hw_devices -key {bbr} [get_hw_devices xc7z010_1]
INFO: [Labtools 27-3088] BBR Key programmed: C:/alinx/my_led_flash/output.nky
INFO: [Labtools 27-3087] Key programming succeeded
CRITICAL WARNING: [Labtoolstcl 44-657] Encrypted bitstreams must be programmed through a non-JTAG secure boot flow.
Resolution: For more information, see app note XAPP1175.
refresh_hw_device [lindex [get_hw_devices xc7z010_1] 0]

验证

将加密的BOOT.BIN 下载flash 或复制到SD卡,按上面方法写入密码,按复位键系统正常启动了。

相反如果不写入密码,就启动不了。

在启动的显示界面里可以看到:

Bitstream

Encrypted

说明加密启动成功。

这种加密的方式,需要有保护电池,否则掉电后密码没有了,我这里没有电池,简单按复位按钮。

如果写入eFuse 则不需要电池,但这是一次性的,熟悉操作了,并且确实是产品阶段才这样做。

介绍到此。

你可能感兴趣的:(fpga,zynq)