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