ZYNQ7000與傳統FPGA有著巨大的差異,它將自己定位為一款All Programmable Soc(軟硬件可編程片上系統),視其為以FPGA作為外設的雙核ARM A9處理器更加準切。它的啟動過程體現了以處理器為核心這一特點,以往植入處理器硬核的FPGA的啟動過程是先啟動邏輯部分,再啟動處理器,ZYNQ7000相反,先啟動處理器再啟動邏輯部分。
一、ZYNQ7000配置過程
ZYNQ7000的配置按先后順序分為3個階段:stage0、stage1、stage2(可選)。
表1:配置步驟
表2:boot模式引腳映射
?
?
表3
?
?
圖1
?
?
圖2
?
?
圖3(UG821)
二、ZYNQ7000安全策略
ZYNQ7000提供諸多安全防范模塊供客戶調用,根據模塊的特性可以分為被動和主動兩類,被動模塊主要包括多種加密、認證策略,主動模塊包括JTAG關閉、溫度電壓監測、代碼一致性檢測、特異性檢測(器件DNA)等,表4詳細地列出這些部件,客戶可根據設計需要調用。
表4:主被動防護模塊
主被動模塊相互配合完成工程的安全設計,以下對常用的部分安全策略進行簡介。
(1)、RSA用戶認證:
在某些情況下,設備對程序來源的合法性有很高要求:必須由合法的組織提供的程序才能啟動設備,以確保設備工作在設定的情景中,任何非法程序或對合法程序的篡改將無法讓設備工作。Xilinx Z7芯片提供的RSA用戶認證功能即是為了滿足對程序進行合法性認證而引入的。
RSA是一種非對稱加密技術,將其與數字簽名技術配合使用,就能對相關數據的合法性進行認證。
Xilinx采用2組公私鑰,1組固定,1組可替換,由此來確保更高的安全性。固定的1組稱為PPK/PSK(primary public key/primary secret key),替換組為SPK/SSK(secondary public key/secondary secret key)。
需要做認證的數據在其后加入1段認證代碼,其包括:PPK,SPK,PSK加密SPK后得到的SPK簽名,SHA-256摘要算法對FSBL做摘要,得到的摘要用SSK進行加密獲得簽名,此簽名也存放到認證代碼,因此,認證代碼包含上述4塊數據。
RSA認證過程是對認證代碼攜帶的信息進行操作。首先使用SHA-256算法對PPK進行摘要,得到的摘要與存儲在EFUSE中的值作對比,一致則進入下一步;認證后的PPK隊SPK簽名進行解密,對比解密后的值與SPK,一致則進入下一步;SPK解密FSBL簽名,同時對FSBL進行SHA-256摘要獲取,對比摘要與SPK解密值,一致則RSA認證結束。
(2)、AES加密與HMAC代碼認證:
Xilinx Zynq-7000通過芯片內嵌的AES-256解密引擎和HMAC (Keyed-hashed message authentication code)認證引擎來保護客戶的知識產權,防止拷貝、抄板等損害客戶知識產權事件的發生。
基本原理:Xilinx Zynq-7000內含AES-256解密引擎和HMAC認證引擎,并支持Secure Boot啟動方式,用于保護客戶的設計(包括軟件的二進制可執行代碼,數據以及FPGA的bitstream編程文件)不被竊取和使用。
客戶在完成設計后,可以使用Xilinx ISE軟件為設計添加用于認證的256-bit的校驗碼,然后再用256-bit密鑰AES算法進行加密。256-bit AES密鑰由客戶生成,保存在FPGA內部,不能被外部讀取。啟動時,Zynq-7000首先執行芯片內部ROM中的代碼。BOOTROM代碼首先通過AES-256解密引擎對對被保護的設計進行解密,然后通過HMAC引擎認證完整性,只有通過認證的設計才能被加載并執行。
對于試圖通過“抄板”竊取知識產權的行為,因為缺少和FLASH內容相對應的AES密鑰,FLASH中內容將不會被加載并執行。256-bit AES密鑰對應的組合達到1.15×1077種,可以充分保證客戶知識產權的安全。
Xilinx Zynq-7000內含的硬件安全引擎的特點:
1. HMAC硬件認證引擎 在內層保護客戶設計不被非法篡改,保證客戶設計的完整性。
使用美國國家標準技術研究所的SHA256 FIPS PUB-182-2算法和HMAC FIPS PUB-198算法,這些算法由美國國家標準技術研究所(National Institute of Standards and Technology, NIST)提供,簽名保存在Boot Image中。
2. AES-256硬件解密引擎 在外層保護客戶設計不被反向工程,不被分析破解,不被拷貝。密鑰保存在片上的eFuse或者BBRAM(battery-backed RAM),不能被JTAG或者FPGA邏輯讀取。eFuse僅支持一次可編程,掉電內容不丟失。BBRAM可支持反復編程,但是掉電內容丟失,因此需要外接電池。
AES算法是美國國家標準技術研究所和美國商務部的正式標準。Xilinx支持最高安全等級的256-bit密鑰加解密方式。
256-bit AES密鑰可以由用戶指定,用Xilinx BitGen工具生成加密的bitstream,也可以由工具生成隨機密鑰。AES密鑰由Xilinx iMPACT軟件通過JTAG寫入Zynq-7000芯片中。寫入AES密鑰時,所有FPGA中的存儲器(密鑰存儲器和配置存儲器)都會被清空。密鑰寫入后,沒有任何辦法可以重新讀出寫入的密鑰,也不可能在不清空全部存儲器的情況下改寫密鑰。當采用BBRAM保存密鑰時,需要在VCCBATT上外接電池,確保系統掉電的情況下BBRAM中的內容不會丟失。系統正常工作時,由VCCAUX對BBRAM供電,而不會使用VCCBATT上的電池供電。當系統掉電時,VCCBATT需要的電流很小(nA級別),一塊手表紐扣電池可以使用很長時間。
在secure boot模式下,PS DAP和PL TAP控制器被關閉,這樣排除了通過JTAG訪問芯片內部的可能。 PS的DAP控制器可以通過eFuse的JTAG CHAIN DISABLE永久關閉。在生成PL bitstream時,可以配置DISABLE_JTAG選項,禁止通過JTAG訪問PL。
(3)、特異性檢測(DNA等):
每片XILINX芯片都有唯一的57bit串行碼對應,稱之為芯片的DNA,特異性檢測使能時,檢測電路會對比基于內部串行碼產生的CRC校驗碼和外部flash輸入的校驗碼,一致才能啟動設計。
由于每片芯片都需單獨的生成配置代碼,對于大批量生產不方便,為了解決這個矛盾,部分芯片內部提供了一片32bit的一次性燒寫efuse,由用戶自定義存入的32bit串行碼,由此解決上述矛盾。
特異性檢測的保護強度因其串行碼位數限制,不及RSA、AES+HMAC認證。
(4)、電壓溫度監測:
ZYNQ7000內置溫度和電壓傳感器,配合片上的AD,可以對芯片的溫度和電壓進行監測,非法讀取或篡改內部信息常常伴隨溫度和電壓反常,當變化值超過設定的上限時,我們可以選擇擦除內部efuse或BBRAM保存的key;
(5)、JTAG關閉:
非法讀取或篡改最常用的手段是通過JTAG口窺視片內程序,針對這一非法行為,XILINX器件可以通過多種手段關閉JTAG口,如efuse使能的永久性關閉、在代碼內調用BSCANE2模塊關閉,bitgen設置關閉。上述手段從物理上截斷了窺視途徑,同時也帶來調試的不方便,一旦JTAG口關閉,必須使用其他的配置器件進行配置。
三、ZYNQ7000安全策略實踐
(1)、key文件生成
上圖為使用sdk14.1生成image所需要填寫的內容,如果key文件需要生成,在key file行填入key文件的文件名,key store選擇存儲介質,part name行填入工程選用的器件名如xc7z020,如果此處填寫錯誤會影響到impact燒寫。
添加FSBL文件時必須選擇aes加密選項,否則sdk會報錯,這是因為zynq是通過FSBL是否加密來決定是否調用解密模塊,所以如果要生成加密image,那么FSBL必須為加密,同時,bitsream文件也必須加密,而其他的文件則可以自由選擇是否加密;
(2)、KEY燒寫
燒寫至BBRAM時很簡單,添加key文件至PL器件后,點擊program即可,但燒寫efuse時遇到麻煩,執行后報警告:
查看EFUSE燒寫所需具備的條件如下:
These are the requirements for programming or reading the eFUSE registers using iMPACT:
? iMPACT is running on a PC with Microsoft Windows XP (32-bit) or Windows 7 (32-bit or 64-bit) OS.
Note Windows 7 64-bit support is only enabled for Zynq-7000 and 7 series devices.
? iMPACT is operating in Boundary Scan mode, and the unconfigured target FPGA device is in the chain in the Boundary Scan window.
? You are connected to the Boundary Scan chain through a Platform Cable USB II download cable.
? The Boundary Scan chain is operating at a cable speed of 3 MHz for Zynq-7000 and 7 series devices, 6 MHz for Virtex-6 FPGAs, or 1.5 MHz or slower for Spartan-6 FPGAs. To set the cable speed, run the command Output > Cable Setup and set the TCK Speed/Baud Rate option in the Cable Communication Setup dialog box.
? The target FPGA is not currently programmed. No bitstream information has been downloaded into the FPGA.
? The VCCAUX and VFS (Virtex-6 and Spartan-6 only) voltages supplied to the FPGA are set to the required levels. Voltages necessary for eFUSE reading and writing are described in the following user guides.
? For reading eFUSE registers, the VCCAUX voltage supplied to the FPGA must be set to the recommended operating condition. For programming Virtex-6 and Spartan-6 eFUSE registers, the VFS voltage supplied to the FPGA must also be set to its recommended operating condition. See the following data sheets for the recommended operating conditions of each power supply.
(3)、JTAG Debug
JTAG的存在方便了調試,但卻留下了安全隱患,下面是如何禁止JTAG port的三種方法。
In Zynq-7000 AP SoC, the JTAG port is used to load software and the bitstream, load the AES key, control information, and for debug. If not disabled, JTAG ports can be used by an adversary to insert malware, and read configuration memory and registers. The JTAG ports must be disabled whenever it is not used in a legitimate debug operation.
The device can be debugged using a DAP controller and/or a JTAG controller. The DAP JTAG chain and PL JTAG chain can be concatenated or used independently. When used independently, the full SoC/FPGA does not need to be exposed to an adversary. For example, if debug only requires access to the PL, the user can select that only PL JTAG chain is used. This prevents access to the PS.
Zynq provides hierarchical control of the JTAG port. This allows different methods to control access to the debug ports based on security requirements. Security requirements may change over the life cycle the embedded device. There are three methods to disable the JTAG debug ports. Prior to fielding an embedded device with Zynq, a one-time programmable eFUSE bit can permanently disable access to the debug ports. Programming this eFUSE bit is irreversible, and debug ports remain disabled after powering down and recycling power.
The second method, which can be used only if the debug port disable eFUSE is not blown,disables/enables debug access port using the JTAG_CHAIN_DISABLE,DAP_EN,SPINDEN, SPIDEN, NIDEN, DBGEN bits in the Control register at 0xF 8 007000 (see Table 4). The debug access control is provided independently for the two JTAG chains or the concatenated chain.
In the third method, a lock register provides semi-permanent disabling of access to the debug ports. In this method, the debug port access disable remains in effect until a power cycle.In a secure boot, the JTAG port is disabled early by the BootROM code. Users who will not use the debug port after product release can disable the JTAG port permanently by writing the eFUSE Disable JTAG register. The disable is done using iMPACT or the Secure Key Driver.
Any attempted read or write access to the BBRAM via JTAG causes the BBRAM contents to be cleared and the entire configuration of the FPGA to be erased prior to access being enabled (i.e., being able to enter “key access mode”)。
(4)、加密策略
最高級別的加密時RSA校驗與AES加密合并使用,目前我們僅選擇AES加密方式。
AES加密的關鍵是key的保護,ZYNQ提供2種保密方式,BBRAM和eFUSE,BBRAM保密更安全,但維護稍顯復雜,efuse熔絲保存方式可能會被物理破解,但這也需要相當的技術背景及專門設備才可以。因此,考慮各方面因素,選擇EFUSE方式保存AES的key文件。
同時,因為JTAG口存在一定的安全隱患,可能被精通器件和相關背景知識的人員調用,進而讀取KEY文件,因此在產品定型后永久性關閉JTAG口。
另一方面需要注意的是,由于ZYNQ產品即使燒寫了KEY文件,但如果image啟動文件為非加密方式,器件仍然能啟動,對于了解這一特性的專業人員,他們可以加載一份非加密文件啟動設備,然后在自己的代碼里打開key的讀取接口,竊取key文件后,再將加密文件破解。因此為防止此類竊取事件,我們設定只能從efuse加密方式啟動(另一種方式是用RSA驗證啟動文件)。
總結我們的加密策略,EFUSE保存,JTAG關閉,僅從efuse加密啟動。
評論
查看更多