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)

可以看到 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文件的製作

有了密碼文件就可以製作加密了的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,就像沒密碼一樣正常啓動,運行。

將加密數據或密碼寫入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 則不需要電池,但這是一次性的,熟悉操作了,並且確實是產品階段才這樣做。

介紹到此。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章