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
在 zynq 程序固化和启动一文中,我们回到BOOT.BIN 文件的生成这个部分:在SDK中,菜单 -> Xilinx->Create Boot Image
出现下面界面,在这里我是直接导入上文中的output.bif (勾选 import from existing BIF file)
可以看到 Security ,下面还有Encryted, Authenticat,点Security,出现如下界面:
在Security下面还有个页单选择,上面是Authentication,我这里勾选Use Authentication,下面有5个框需要输入文件名。如果不勾选,就不需要Authentication 文件的输入。
下面点击Security,出现如下界面:
勾选 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文件。
上面界面输入密码文件名,part name,就可以制作了。
这里需要指定加密的内容,如下:
在这里选择指定加密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,就像没密码一样正常启动,运行。
密码写入是在vivado 下进行的,打开hardware manager, 在hardware 里找到xc7z010,点击右键,看到菜单了,
菜单里有program BBR key, Clear BBR key, program eFUSE Registers和我们这个加密有关。
选择 program BBR key,出现下面对话框:
在这里导入密码文件,然后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 则不需要电池,但这是一次性的,熟悉操作了,并且确实是产品阶段才这样做。
介绍到此。