1. 概述
Xilinx FPGA從7系列開始,設備有了片上高級加密標準(AES)解密邏輯,提供了高度的設計安全性。加密的Xilinx FPGA設計不能被復制或反向工程用于其他FPGA。
Xilinx FPGA負責加密的AES系統由基于軟件的位流加密和片上位流解密組成,加密密鑰由片上的專用內存存儲。對于7系列或UltraScale& UltraScale+,Xilinx Vivado工具可用于生成加密密鑰和加密的比特流;對于Zynq系列,XilinxSDK/Vitis的bootgen工具可用于生成加密密鑰和加密的打包文件。密鑰可由工具隨機生成也可以由用戶指定。
Xilinx FPGA將加密密鑰存儲在片上專用RAM中,可以選擇存放在BBRAM或eFUSE。以7系列為例,加密密鑰只能通過JTAG端口編程到設備上;7系列設備執行反向操作,在配置時對傳入的比特流進行解密。7系列AES加密邏輯采用256位加密密鑰。片上AES解密邏輯不能用于比特流解密之外的任何用途,AES解密邏輯對用戶設計不可用,不能用于解密配置比特流以外的數據。
Xilinx 7系列采用的是AES-CBC塊加密的模式,而UltraScale & UltraScale+采用的是AES-GCM流加密模式,效率更高且自帶GMAC信息校驗碼,用以校驗密文完整性。加密方式及操作上大同小異,本文僅介紹7系列和Zynq-7000裸機打包bin文件的加密方法。
2. 7系列AES加密
2.1 AES
7系列FPGA加密系統采用AES加密算法,AES是由美國國家標準與技術研究所(NIST)和美國商務部支持的官方標準。具體標準請參考:https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf。7系列FPGA AES加密系統使用一個256位的加密密鑰一次加密或解密128位的數據塊。根據NIST的說法,一個256位的密鑰有1.1x10的77次方種可能的組合。對稱加密算法(如AES)使用相同的密鑰進行加密和解密,因此,數據的安全性依賴于密鑰的保密性。
2.2 實現框圖
Xilinx 7系列加密解密框圖由圖2-1示。
圖2-1 Xilinx 7系列AES加密解密實現框圖
如圖2-1所示,Vivado工具負責根據用戶指定的密鑰對bit流進行AES加密,同時將密鑰寫入FPGA片上的專用內存中;7系列在加載加密后的bit流時,會根據用戶設置的密鑰通過片上的AES解密邏輯進行AES解密,從而還原得到器件可以識別的未加密bit流。
2.3 AES實現步驟
2.3.1 生成KEY和加密后的bitstream
在此之前,我們先要清楚BBRAM和eFUSE之間的區別,以方便我們做相應的配置。BBRAM和eFUSE的比較如表2-1所示。
表2-1 BBRAM和eFUSE的的比較
配置bitstream屬性,選擇Enable Bitstream Encryption;指定密鑰key存放方式(BBRAM或eFUSE);提供HMAC key、AES key以及AES的初始向量。如圖2-2所示:
圖2-2 bitstream配置界面
除了通過以上GUI配置,還可以通過直接編寫XDC約束文件達到同樣目的。
圖2-3 XDC約束文件
如果用戶沒有在GUI或XDC中指定,工具會在伴隨bit流自動生成的.key文件中隨機生成。
用戶通常需要提供三個向量,分別為:
A. hkey(HMAC key):FPGA片上支持keyed-Hash Message Authentication Code (HMAC),提供AES單獨解密額外的安全性。對于HMAC,具體標準請參考:https://csrc.nist.gov/publications/detail/fips/198/1/final
B. AES key:即256bit密鑰(最重要)。
C. StartCBC:128bit AES初始向量。
圖2-4 key文件中隨機生成的StartCBC
配置完成后,即可以生成加密后的bit流,并通過JTAG、SPIFLASH等方式加載到FPGA。當然,此時片上的AES解密邏輯不知道正確的密鑰因此FPGA無法正常啟動。加密和未加密的bit流對比如下:
圖2-5 加密與未加密的bit流對比
2.3.2 通過JTAG將密鑰寫入片內
如前文提到的,根據bit流的配置,選擇將key寫入BBRAM或eFUSE中。
圖2-6 燒寫key
我們以BBRAM為例(如果客戶最終選擇Efuse也強烈建議用戶先在BBRAM上驗證好)。選擇ProgramBBR Key,并指定工程bit流文件所在路徑下的.key文件。密鑰值為之前設置的256‘h123456789。如下圖所示:
圖2-7 燒寫key到BBRAM
點擊OK即可將密鑰燒寫至BBRAM,Tcl Console會有相應打印:
圖2-8 key燒寫成功的打印
2.3.3 驗證
用戶可以嘗試單獨改變vivadobit流配置端的AES密鑰或片上BBRAM的密鑰進行驗證,程序將不能正常加載。
此時,無論是從spi flash重新加載加密后的程序還是JTAG燒寫加密后的程序,程序都能通過AES解密邏輯解密并正常執行。
2.3.4 eFUSE
eFUSE是一種非易失的一次性可編程技術,是通過熔絲技術來實現不可逆。如果對寄存器的訪問被禁用,則無法重新啟用該寄存器。FPGA邏輯只能訪問FUSE_USER寄存器值。所有其他的eFUSE位都不能從FPGA邏輯訪問。
所以用戶在配置和使用eFUSE的時候要小心謹慎,注意兩點:
A. 確保密鑰正確且不會再修改后再燒寫到 eFUSE;
B. 除非清楚eFUSE相關寄存器的真正含義,否則不要輕易修改寄存器的值。尤其是eFUSE Control Register的CFG_AES_Only,如果該位置1,則片上會強制執行AES解密操作,一旦密鑰忘記或弄丟,這片FPGA就無法再使用了。
3. ZYNQ-7000 AES加密
3.1 生成key和加密后的boot.bin
與7系列的方法類似,key文件的生成有兩種方式:
A. 手動編輯,根據以上.nky文件格式對里面的內容進行修改,主要修改key 0 即可;
B. 使用Vitis或SDK的bootgen工具生成:
圖3-1 key文件的內容
以Vitis的環境為例,打開一個Vitis工程,并選擇工具欄中的Xilinx Tools->Creat BootImage如圖3-2,選擇加密選項、添加boot.bin打包所需要的文件。
圖3-2 CreatBoot Image加密界面
由于沒有指定key file,同時又對fsbl.elf 文件打包加密,所以Vitis會自動生成一個.nky的加密文件在生成打包文件的目錄內。生成加密文件過程中的打印信息可以看到bootgen的命令:
圖3-3 Console打印
此時生成的boot.bin即為加密后可供燒寫的打包文件。
3.2 通過JTAG將密鑰寫入片內
該步驟與7系列的操作方式一致,請參考2.3.2章節。
4. 利用DNA自定義加密
Xilinx 針對7系列或7系列以上的設備設計了具有片上高級加密標準(AES)解密邏輯的功能,提供了高度的設計安全性。但同時對于某些客戶也有不方便的地方:
A. BBRAM方式需要外接電池才能保證掉電重啟后能正常工作,同時電池往往難以匹配FPGA的工作壽命和工作環境;
B. eFUSE的熔斷機制決定了key只能燒寫一次,不可更改;
C. 對小客戶的批量生產不友好;
D. Spartan-6等老型號芯片不支持;
基于這些原因,我們可以利用Device DNA(唯一ID)設計一種自定義的并且適合批量生產的加密方式。
4.1 自定義加密流程圖
一種適合批量燒寫的自定義加密流程如圖4-1所示:
圖4-1 加密流程圖
如上圖所示,這種加密方式需要應用到Xilinx FPGA的multi-boot特性,因此,flash中存在兩份程序,一份為負責加密運算的Golden程序,而另一份則為包含了解密運算的主程序。除此之外,flash中還需要指定一片空間存儲密文。
4.2 DNA讀取
Xilinx每一個FPGA都有一個獨特的ID,也就是DeviceDNA,在FPGA芯片生產的時候就已經寫死在芯片的eFUSE寄存器中,因為使用的是熔斷技術所以具有不可修改的屬性。在7系列及之前的設備,DNA的ID位寬都是57bit;在Xilinx的Ultraslace架構下DNA的位寬為96bit。通過JTAG可以訪問到DNA的值,如下圖所示:
圖4-2 JTAG讀取DNA
本設計中需要使用原語讀取DNA,以7K325T為例,原語及端口說明如下圖所示:
圖4-3 DNA原語
我們只需要設計一個串行接收的邏輯即可將讀取到的DNA轉換成57bit的并行數據,讀取到的DNA與圖4-2 JTAG讀取到的DNA一致。
圖4-4 原語讀取DNA觀測信號
4.2 加密/解密
加密/解密算法可以使用AES或DES等對稱算法,對于7系列或7系列以下的型號,需要自行設計AES或DES的加密/解密邏輯;而對于UltraScale &UltraScale+的設備,Xilinx提供有AES的IP core,可以直接應用。本文僅介紹相對簡單的DES加密/解密邏輯。
DES算法全稱為Data Encryption Standard,即數據加密算法,它是IBM公司于1975年研究成功并公開發表的。DES算法的入口參數有三個:key、des_in、mode。其中Key為56位,是DES算法的工作密鑰;des_in為64位,是要被加密或被解密的數據;mode為DES的工作方式,有兩種:加密或解密。
圖4-5 加密和解密框圖
如圖4-5所示,Multi-boot中的Golden程序負責提取DNA作為明文,并配合用戶自定義的密鑰進行DES的加密操作,再將加密后的密文寫入flash中。
而Multi-boot中的主程序則完成對稱的鏡像操作,將flash中的密文讀取,并配合用戶自定義的密鑰進行DES的解密操作,然后還原成明文。
下圖通過頂層調用DNA的讀取、DES加密、DES解密來驗證數據通路。
圖4-6 頂層添加模塊測試
ILA抓取的波形如下圖:
圖4-7 加密/解密數據波形
由ILA抓取的波形可以驗證DES模塊的對稱性。
4.3 其他
除了DNA讀取模塊和加密/解密模塊,還需要設計spi flash的控制器,可以通過verilog實現,也可以通過microblaze的軟核實現。這里推薦用microblaze的方式來設計。具體不再闡述。
加密需要涉及的MultiBoot操作可以參考往期的《Xilinx FPGAde Multiboot功能介紹和實現》。
批量生產時,flash里面燒寫統一的包含Golden和Main的MCS文件,然后再貼片至各個機器。每臺機器一旦上電,Golden便會寫入密文到flash并自擦除,實現flash與FPGA配合的唯一性,達到加密的目的。
XC6SLX100-2FGG676I
XC6SLX150-2CSG484I
XC6SLX150-2FGG484I
XC6SLX16-2CSG324C
XC6SLX16-2FTG256C
XC6SLX16-2FTG256I
XC6SLX25-2CSG324C
XC6SLX25-2CSG324I
XC6SLX25-2FTG256C
XC6SLX25-3FTG256C
XC6SLX4-2TQG144C
XC6SLX45-2FGG676C
XC6SLX45-2FGG484C
XC6SLX45-L1CSG324I
XC6SLX45T-2FGG484I
XC6SLX75T-3FGG484I
XC6SLX9-2CSG324C
XC6SLX9-2CSG324I
XC6SLX9-2FTG256C
XC6SLX9-2FTG256I
XC6SLX9-2TQG144C
XC7A100T-2FGG484I
XC7A75T-2FGG676I
XC7K160T-2FFG676C
XC7K160T-2FFG676I
XC7Z010-2CLG400I
XC7Z020-1CLG400I
XC7Z030-1FBG484C
XC7Z045-2FFG900I