前提:加密有風險,操作需謹慎
前言
在許多項目中,經過漫長的等待,我們的 FPGA 設計終于可以投入現場部署了。前期的資金的投入及知識產權的保護,我們需要對現場部署的 FPGA 進行比特流保護以防止逆向工程和未經授權的重復使用。

為了保護我們的 FPGA 設計,AMD FPGA 支持高級加密標準 (AES)。這提供了高級別的安全性,因為比特流使用 256 位 AES 密鑰加密,并在器件編程時在 FPGA 內部解碼。用于解密的 AES 密鑰存儲在 FPGA 內部的一次性可編程電子熔絲 (eFuse) 或電池供電的 RAM (BBRAM) 中。在本篇博文中,我們將使用 Arty S7-50(便宜) 演示如何將 AES 密鑰編程到 BBRAM 中。
BBRAM區域,是一個片內RAM區域。當VCCBATT_0掉電,BBRAM數據將會丟失,AES密鑰也將隨之丟失。VCCBATT_0該引腳可接一個1.0~1.89V范圍電壓的電池。
eFuse區域,是一個一次性寫入區域,可永久存儲密鑰,該方法無需電池
在深入介紹具體步驟之前,我想重申一下,開發安全可靠的系統是一個復雜的課題。例如,最好的安全性來自于使用真正隨機的密鑰,因此我建議除了閱讀本博客外,還請閱讀XAPP1239(https://docs.xilinx.com/v/u/en-US/xapp1239-fpga-bitstream-encryption)和XAPP1084(https://docs.xilinx.com/v/u/en-US/xapp1084_tamp_resist_dsgns) 。
首先創建一個簡單的 MicroBlaze 設計,它每秒通過串口無限輸出一個遞增計數。該 ELF 文件已與bit合并,一旦 FPGA 配置完成,就會開始輸出計數。
要加密比特流,我們需要打開已實現的設計,并在比特流生成選項中設置我們希望加密的比特流。此時,可以根據需要輸入加密密鑰信息(我強烈建議這樣做)。如果此項留空,Vivado 將生成必要的信息,但安全性較低。如果 Vivado 生成了密鑰,它將在實現目錄中生成一個 *.nky 文件。可以添加此文件,以便在將來運行設計時使用。當然,也可以使用相同的格式來定義生成的密鑰。

Device xc7s50;
Key 0 25e2e0380c53f3a3f068baa326733a1e6f5e589a7185339fd73a922e218de87f;
Key StartCBC 9af2391ad0118907e5ba7d4b16a6c3d0;
Key HMAC 37fe8c2b9ab49da759b7cad0687d05b20c2b1a5f09f74441c2201ebfdecb0db3;
保存這些選項后將會向目標 XDC 文件中添加如下約束。
set_property BITSTREAM.ENCRYPTION.ENCRYPT YES [current_design]
set_property BITSTREAM.ENCRYPTION.KEYFILE {C:\hdl_clients\s7_enc\s7_enc.runs\impl_1\design_1_wrapper.nky} [current_design]
將 FPGA 連接到硬件管理器后,就可以對 BBRAM 或 eFuse 密鑰進行編程。

在此示例中,我們將選擇程序 BBR,這將打開一個對話框,使我們能夠對 NKY 文件進行編程。

選擇 NKY 文件后,AES 密鑰將顯示,以便確認是否加載了正確的密鑰。關閉對話框后,密鑰將被編程,TCL 控制臺將顯示此操作的成功或失敗。

我們現在可以使用已用相同密鑰加密的 JTAG 比特流對設計進行編程。
隨著新配置的加載,這、將重新啟動從 0 開始運行的 MicroBlaze 中的程序。

如果我們關閉電源或重置 BBR 密鑰,然后嘗試對加密位流進行編程,我們將發現編程未完成,因為 FPGA 中沒有存儲解密密鑰。

使用此流程,可以開始保護已部署的系統。如果使用 eFuse 編程加密密鑰,請務必遵守 XAPP1239 中規定的規則,因為 AES 密鑰和相關寄存器必須同時進行編程。