Term
TBB Trusted Board Boot
TBBR Trusted Board Boot Requirement
FIP Firmware Image Package
1. Introduction
Trusted Board Boot(TBB)可以防止惡意Firmware在平臺上運行,方法是通過一級級的認證所有的firmware鏡像,直到normal bootloader。 這個可信斂的建立過程使用公鑰加密標準(PKCS)
這個文檔描述ARM Trusted Firmware的TBB, ARM Trusted Firmware TBB是Trusted Board Boot Requirement(TBBR)標準的實現。
2. Chain of Trust
可信鏈(CoT)始於一組隱含的可信部件。在ARM開發平臺,這些起始可信部件是:
- 一個根可信公鑰的 SHA-256哈希。存儲在可信根密鑰寄存器中
- BL1鏡像,一般存放在ROM中,所以不能被篡改。
CoT的其餘不見或者是證書或者是bootloader鏡像。證書都符合X.509 v3表準。這個標準允許在證書中增加定製的擴展,可以用來存儲建立CoT的必要信息。
在TBB CoT上的所有證書都是自簽名的。 並不需要一個證書授權中心(CA),因爲CoT的建立,並不是通過驗證證書頒發者有效性,而是通過證書擴展內容實現的
。簽名一個證書,使用PKCS#1 SHA-256,RSA加密簽名模式, RSA密鑰長度爲2048bits。未來的Trusted Firmware將支持額外的加密算法。
憑證分爲key和content憑證。key憑證用來驗證簽名使用的公鑰。內容證書用來存儲bootloader鏡像的hash值。通過比對內容證書中的hash值和計算鏡像內容得到的hash值,相等則說明鏡像通過認證。SHA-256函數用來計算所有的hashes。包含在證書中的公鑰和hashes是X.509 v3的非標準擴展。
用來建立CoT的keys包括:
- Root of the trust key
該密鑰對的私鑰用來簽名BL2內容證書和trusted key證書。公鑰則爲ROTPK
- Trusted world key
該密鑰對的私鑰用來簽名secure world鏡像(比如SCP_BL2, BL31 BL32)對應的公鑰證書。公鑰部分則保存在trusted world證書的擴展域。
- Non-trusted world key
該密鑰對的私鑰用來簽名non-secure world 鏡像(BL33)對應的密鑰證書。公鑰部分則保存在trusted world證書的一個擴展域。
- BL3-X keys
對於SCP_BL2, BL31, BL32和BL33,這些keys被用來簽名內容證書,對應的公鑰則存儲在密鑰證書的擴展域中
CoT中包括下列鏡像:
- BL1
- BL2
- SCP_BL2(可選)
- BL31
- BL33
- BL32(可選)
下列證書用來認證鏡像
- BL2內容證書
這個自簽名證書使用ROT 私鑰。它包含BL2鏡像的hash值
- Trusted key證書
使用ROT私鑰自簽名。包括trusted world公鑰以及non-trusted world公鑰
- SCP_BL2 key證書
使用trusted world密鑰自簽名,它包含SCP_BL2公鑰
- SCP_BL2內容證書
使用SCP_BL2密鑰自簽名,它包含SCP_BL2鏡像的hash值
- BL31 key證書
使用trusted world密鑰自簽名,它包含BL31公鑰
- BL31 content證書
使用BL31密鑰自簽名,包含BL31鏡像的hash值
- BL32 key證書
使用trusted world密鑰自簽名,包含BL32公鑰
- BL32 內容證書
使用BL32密鑰自簽名,包含BL32鏡像的hash值
- BL33 key證書
使用non-trusted world密鑰自簽名,包含BL33的公鑰
- BL33內容證書
使用BL33密鑰自簽名,包含BL33鏡像的hash值
3. Trusted board Boot Sequence
CoT通過以下步驟驗證
- BL1加載並且驗證BL2內容證書。頒發者的公鑰從已驗證過的證書中獲得。首先比較頒發者公鑰hash是否等於從root-key storage寄存器讀到的ROTPK的hash。 如果相等,那麼BL2內容證書應該包含兩部分(我猜測的):內容hash本身,以及使用 頒發者私鑰加密的hash內容。
- BL1加載BL2鏡像,計算鏡像的hash並且和BL2內容證書中的hash做比較,如果比較成功,則跳轉到BL2執行。
- BL2加載並且驗證Trusted key證書(這個/這些?證書應該包含在BL2鏡像中),頒發者的公鑰從已經驗證的證書中獲得。首先比較頒發者公鑰hash是否等於root-key storage寄存器中讀到的ROTPK的hash值。如果比較成功,BL2從驗證的證書中讀取並且保存trusted和non-trusted world公鑰。
接下來,對於SCP_BL2 BL1和BL32鏡像執行類似的操作。對SCP_BL2和BL32鏡像的操作是可選的,取決於鏡像是夠存在。
- BL2加載並且驗證BL3x的key證書。證書籤名使用trusted world public key驗證,如果簽名相同,那麼BL2讀取並保存證書中的BL3X公鑰。
- BL2加載和驗證BL3x內容證書。證書籤名使用BL3x公鑰驗證。如果簽名驗證成功,BL2讀取並且保存BL3x鏡像hash
接下來的兩步僅僅針對BL33鏡像。
- BL2加載並且驗證BL33的key證書。如果簽名驗證成功,BL2讀取並保存BL33公鑰
- BL2加載並且驗證BL33內容鏡像。如果簽名驗證成功, BL2讀取並且保存BL33鏡像hash
下面步驟是針對BL2加載的所有bootloader鏡像
- BL2計算每個鏡像的hash,然後和之前從內容證書獲得的hash比較,如果相同,鏡像認證成功。
TBB實現散佈在通用的和平臺特定的BL1 BL2 code中,以及build主機的tool代碼中。通過特定的build標記使能TBB,具體細節參見user-guide.md
在build 主機,包含工具生成證書,這些證書和bootloader鏡像一起包含到FIP(Firmware Images Package), 這些證書通過IO storage framework加載到Trusted SRAM。然後被Trusted Firmware中的認真模塊驗證。
4. Authentication Framework
Trusted Firmware 中的認證框架爲實現TBB提供了支持, ARM平臺通過Authentication Framework實現了TBBR文檔中描述的啓動需求
關於Authentication Framework的更多描述,參看Auth Framework文檔
5. Certificate Generation Tool
在Trusted Firmware build過程,如果指定了GENERATE_COT=1, cert_create主機端工具會被編譯運行。這個工具使用bootloader images和密鑰作爲輸入(密鑰必須是PEM格式),生成建立CoT所需的證書(DER格式)。如果密鑰沒有提供,那麼會使用這個工具生成新的密鑰。證書隨後會被做爲fiptool工具的輸入,生成FIP。
證書也會單獨存放在build輸出目錄。
工具存放在tools/cert_create目錄下。使用OpenSSL SSL庫1.01 或之後的版本,生成X.509證書。編譯和使用這個工具參見user-guide.md