2-Authentication Framework Chain of Trust
引流關(guān)鍵詞: 中斷、同步異常、異步異常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內(nèi)存管理、頁(yè)表…
快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
[專欄目錄]-ATF/FF-A/specification學(xué)習(xí)
2.身份驗(yàn)證框架和信任鏈
本文檔的目的是描述在可信固件-A (TF-A) 中實(shí)現(xiàn)的身份驗(yàn)證框架。該框架滿足以下要求:
(1) 平臺(tái)端口應(yīng)該可以根據(jù)證書層次結(jié)構(gòu)和用于驗(yàn)證特定圖像/證書的機(jī)制來(lái)指定信任鏈。
(2) 該框架應(yīng)區(qū)分:
-
用于編碼和傳輸信息的機(jī)制,例如 DER 編碼的 X.509v3 證書以傳送主題公鑰、散列和非易失性計(jì)數(shù)器。
-
用于驗(yàn)證傳輸信息的機(jī)制,即密碼庫(kù)。
該框架是按照下圖所示的模塊化方法設(shè)計(jì)的:
+---------------+---------------+------------+ | Trusted | Trusted | Trusted | | Firmware | Firmware | Firmware | | Generic | IO Framework | Platform | | Code i.e. | (IO) | Port | | BL1/BL2 (GEN) | | (PP) | +---------------+---------------+------------+^ ^ ^| | |v v v+-----------+ +-----------+ +-----------+| | | | | Image || Crypto | | Auth | | Parser || Module |<->| Module |<->| Module || (CM) | | (AM) | | (IPM) || | | | | |+-----------+ +-----------+ +-----------+^ ^| |v v +----------------+ +-----------------+ | Cryptographic | | Image Parser | | Libraries (CL) | | Libraries (IPL) | +----------------+ +-----------------+| || || |v v+-----------------+| Misc. Libs e.g. || ASN.1 decoder || |+-----------------+DIAGRAM 1.本文檔描述了身份驗(yàn)證框架的內(nèi)部細(xì)節(jié)以及可用于指定信任鏈的抽象機(jī)制。
2.1。框架設(shè)計(jì)
本節(jié)描述了框架設(shè)計(jì)的某些方面及其背后的基本原理。這些方面是驗(yàn)證信任鏈的關(guān)鍵。
2.1.1。信任鏈?
CoT 基本上是一系列身份驗(yàn)證圖像,通常以信任根開始,最終形成單個(gè)數(shù)據(jù)圖像。下圖說(shuō)明了它如何映射到 TBBR-Client 規(guī)范中描述的 BL31 映像的 CoT 。
+------------------+ +-------------------+ | ROTPK/ROTPK Hash |------>| Trusted Key | +------------------+ | Certificate || (Auth Image) |/+-------------------+/ |/ |/ |/ |L v +------------------+ +-------------------+ | Trusted World |------>| BL31 Key | | Public Key | | Certificate | +------------------+ | (Auth Image) |+-------------------+/ |/ |/ |/ |/ v +------------------+ L +-------------------+ | BL31 Content |------>| BL31 Content | | Certificate PK | | Certificate | +------------------+ | (Auth Image) |+-------------------+/ |/ |/ |/ |/ v +------------------+ L +-------------------+ | BL31 Hash |------>| BL31 Image | | | | (Data Image) | +------------------+ | |+-------------------+DIAGRAM 2.信任根通常是已經(jīng)在平臺(tái)中燒毀且無(wú)法修改的公鑰(ROTPK)。
2.1.2. 鏡像類型?
CoT 中的圖像分為認(rèn)證圖像和數(shù)據(jù)圖像。認(rèn)證圖像包含用于認(rèn)證數(shù)據(jù)圖像或另一個(gè)認(rèn)證圖像的信息。數(shù)據(jù)映像通常是引導(dǎo)加載程序二進(jìn)制文件,但也可以是任何其他需要身份驗(yàn)證的數(shù)據(jù)。
2.1.3。組件職責(zé)?
對(duì)于信任鏈中的每個(gè)圖像,執(zhí)行以下高級(jí)操作來(lái)驗(yàn)證它:
-
(1)靜態(tài)或在運(yùn)行時(shí)為圖像分配內(nèi)存。
-
(2)識(shí)別圖像并將其加載到分配的內(nèi)存中。
-
(3)根據(jù)圖像類型檢查圖像的完整性。
-
(4)根據(jù)使用的加密算法對(duì)圖像進(jìn)行身份驗(yàn)證。
-
(5)如果圖像是驗(yàn)證圖像,則提取將用于驗(yàn)證 CoT 中的下一個(gè)圖像的信息。
在圖 1 中,每個(gè)組件負(fù)責(zé)一個(gè)或多個(gè)這些操作。下面簡(jiǎn)要介紹一下職責(zé)。
2.1.3.1。TF-A 通用代碼和 IO 框架(GEN/IO)
這些組件負(fù)責(zé)為 BL1 或 BL2 中的特定圖像啟動(dòng)身份驗(yàn)證過(guò)程。對(duì)于每個(gè)需要身份驗(yàn)證的 BL 圖像,通用代碼會(huì)遞歸地詢問(wèn)身份驗(yàn)證模塊父圖像是什么,直到達(dá)到經(jīng)過(guò)身份驗(yàn)證的圖像或 ROT。然后Generic代碼調(diào)用IO框架加載鏡像并調(diào)用Authentication模塊對(duì)其進(jìn)行認(rèn)證,跟隨CoT從ROT到Image。
2.1.3.2。TF-A 平臺(tái)端口 (PP)
該平臺(tái)負(fù)責(zé):
-
(1)為需要驗(yàn)證的每個(gè)圖像指定 CoT。稍后將解釋平臺(tái)如何指定 CoT 的詳細(xì)信息。該平臺(tái)還指定了用于每個(gè)圖像的身份驗(yàn)證方法和解析方法。
-
(2)為每個(gè)圖像中的每個(gè)參數(shù)靜態(tài)分配內(nèi)存,用于驗(yàn)證 CoT,例如用于公鑰、哈希等的內(nèi)存。
-
(3)提供 ROTPK 或它的散列。
-
(4)向 IPM 提供附加信息以使其能夠識(shí)別和提取圖像中包含的身份驗(yàn)證參數(shù),例如,如果參數(shù)存儲(chǔ)為 X509v3 擴(kuò)展,則必須提供相應(yīng)的 OID。
-
(5)滿足 IPM 和 CM 的任何其他內(nèi)存要求(本文檔中當(dāng)前未描述)。
-
(6)導(dǎo)出函數(shù)來(lái)驗(yàn)證使用 CM 無(wú)法解釋的身份驗(yàn)證方法的圖像,例如,如果必須使用 NV 計(jì)數(shù)器驗(yàn)證圖像,則要與之比較的計(jì)數(shù)器的值只能由平臺(tái)提供。
-
(7)如果正在使用專有圖像格式(稍后描述),則導(dǎo)出自定義 IPM。
2.1.3.3。認(rèn)證模塊 (AM)
它負(fù)責(zé):
-
(1)提供必要的抽象機(jī)制來(lái)描述 CoT。其中,身份驗(yàn)證和圖像解析方法必須由 CoT 中的 PP 指定。
-
(2)利用 PP、IPM 和 CM 導(dǎo)出的功能驗(yàn)證 GEN 通過(guò)的 CoT。
-
(3)跟蹤哪些圖像已經(jīng)過(guò)驗(yàn)證。如果一個(gè)圖像是多個(gè) CoT 的一部分,那么它應(yīng)該只驗(yàn)證一次,例如 TBBR-Client 規(guī)范中的可信世界密鑰證書。包含驗(yàn)證 SCP_BL2、BL31、BL32 的信息,每個(gè)都有單獨(dú)的 CoT。(這個(gè)責(zé)任沒有在本文檔中描述,但應(yīng)該很容易實(shí)現(xiàn))。
-
(4)重用用于數(shù)據(jù)圖像的內(nèi)存來(lái)驗(yàn)證認(rèn)證圖像,例如在圖 2 中描述的 CoT 中,每個(gè)證書都可以在平臺(tái)為 BL31 圖像保留的內(nèi)存中加載和驗(yàn)證。到加載 BL31(數(shù)據(jù)圖像)時(shí),所有驗(yàn)證它的信息都將從父圖像(即 BL31 內(nèi)容證書)中提取出來(lái)。假設(shè)認(rèn)證圖像的大小永遠(yuǎn)不會(huì)超過(guò)數(shù)據(jù)圖像的大小。應(yīng)該可以在構(gòu)建時(shí)使用斷言來(lái)驗(yàn)證這一點(diǎn)。
2.1.3.4。密碼模塊 (CM)?
CM 負(fù)責(zé)提供 API 以:
-
(1)驗(yàn)證數(shù)字簽名。
-
(2)驗(yàn)證哈希。
CM 不包含任何與加密相關(guān)的代碼,但它依賴于外部庫(kù)來(lái)執(zhí)行加密操作。必須實(shí)現(xiàn)鏈接 CM 和外部庫(kù)的加密庫(kù) (CL)。CL必須提供以下功能:
void (*init)(void); int (*verify_signature)(void *data_ptr, unsigned int data_len,void *sig_ptr, unsigned int sig_len,void *sig_alg, unsigned int sig_alg_len,void *pk_ptr, unsigned int pk_len); int (*verify_hash)(void *data_ptr, unsigned int data_len,void *digest_info_ptr, unsigned int digest_info_len);這些函數(shù)使用宏在 CM 中注冊(cè):
REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash);_name必須是包含 CL 名稱的字符串。此名稱用于調(diào)試目的。
2.1.3.5。圖像解析器模塊 (IPM)?
IPM 負(fù)責(zé):
-
(1)檢查 IO 框架加載的每個(gè)圖像的完整性。
-
(2)根據(jù)平臺(tái)在 CoT 描述符中提供的描述提取用于驗(yàn)證圖像的參數(shù)。
圖像可能有不同的格式(例如,身份驗(yàn)證圖像可以是 x509v3 證書、簽名的 ELF 文件或任何其他特定于平臺(tái)的格式)。IPM 允許為 CoT 中使用的每種圖像格式注冊(cè)一個(gè)圖像解析器庫(kù) (IPL)。這個(gè)庫(kù)必須實(shí)現(xiàn)特定的方法來(lái)解析圖像。IPM 從 CoT 獲取圖像格式并調(diào)用正確的 IPL 來(lái)檢查圖像完整性并提取認(rèn)證參數(shù)。
有關(guān) IPM 提供的用于定義和注冊(cè) IPL 的機(jī)制的更多詳細(xì)信息,請(qǐng)參閱“描述圖像解析方法”部分。
2.1.4。身份驗(yàn)證方法?
AM 支持以下認(rèn)證方式:
-
(1)哈希
-
(2)電子簽名
平臺(tái)可以在 CoT 中指定這些方法,以防它決定定義自定義 CoT 而不是重用預(yù)定義的 CoT。
如果一個(gè)數(shù)據(jù)圖像使用多種方法,那么所有方法必須是同一個(gè) CoT 的一部分。參數(shù)的數(shù)量和類型是特定于方法的。這些參數(shù)應(yīng)使用 IPM 從父圖像中獲取。
- (1)哈希
參數(shù):
-
指向要散列的數(shù)據(jù)的指針
-
數(shù)據(jù)長(zhǎng)度
-
指向哈希的指針
-
哈希的長(zhǎng)度
哈希將由以下 ASN.1 類型的 DER 編碼表示:
DigestInfo ::= SEQUENCE {digestAlgorithm DigestAlgorithmIdentifier,digest Digest }這種 ASN.1 結(jié)構(gòu)可以消除任何關(guān)于散列算法類型的假設(shè),因?yàn)榇诵畔殡S散列。這應(yīng)該允許密碼庫(kù) (CL) 支持多種散列算法實(shí)現(xiàn)。
- (2)電子簽名
參數(shù):
-
指向要簽名的數(shù)據(jù)的指針
-
數(shù)據(jù)長(zhǎng)度
-
公鑰算法
-
公鑰值
-
數(shù)字簽名算法
-
數(shù)字簽名值
公鑰參數(shù)將由以下 ASN.1 類型的 DER 編碼表示:
SubjectPublicKeyInfo ::= SEQUENCE {algorithm AlgorithmIdentifier{PUBLIC-KEY,{PublicKeyAlgorithms}},subjectPublicKey BIT STRING }數(shù)字簽名算法將由以下 ASN.1 類型的 DER 編碼表示。
AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {algorithm ALGORITHM.&id({IOSet}),parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL }數(shù)字簽名將由以下形式表示:
signature ::= BIT STRING身份驗(yàn)證框架將使用圖像描述符來(lái)提取與身份驗(yàn)證相關(guān)的所有信息。
2.2. 指定信任鏈
CoT 可以描述為以特定順序鏈接在一起的一組圖像描述符。順序決定了它們必須被驗(yàn)證的順序。每個(gè)圖像都有一組屬性,允許 AM 對(duì)其進(jìn)行驗(yàn)證。這些屬性如下所述。
PP 負(fù)責(zé)為數(shù)據(jù)圖像定義單個(gè)或多個(gè) CoT。除非另有說(shuō)明,以下部分中描述的數(shù)據(jù)結(jié)構(gòu)由 PP 靜態(tài)填充。
2.2.1。描述圖像解析方法?
解析方法是指特定圖像的格式。例如,代表證書的身份驗(yàn)證圖像可以是 X.509v3 格式。表示引導(dǎo)加載程序階段的數(shù)據(jù)映像可以是原始二進(jìn)制或 ELF 格式。IPM 支持三種解析方法。圖像必須使用下面描述的三種方法之一。IPL 負(fù)責(zé)解釋單個(gè)解析方法。平臺(tái)使用的每種方法都必須有一個(gè) IPL。
-
(1)原始格式:此格式實(shí)際上是 nop,因?yàn)槭褂么朔椒ǖ膱D像被視為原始二進(jìn)制格式,例如 TF-A 使用的引導(dǎo)加載程序圖像。此方法應(yīng)僅用于數(shù)據(jù)圖像。
-
(2)X509V3 方法:此方法使用 X.509 等行業(yè)標(biāo)準(zhǔn)來(lái)表示 PKI 證書(身份驗(yàn)證圖像)。預(yù)計(jì)將提供可用于解析此方法表示的圖像的開源庫(kù)。此類庫(kù)可用于編寫相應(yīng)的 IPL,例如 mbed TLS 中的 X.509 解析庫(kù)代碼。
-
(3)平臺(tái)定義方法:此方法滿足平臺(tái)特定的專有標(biāo)準(zhǔn)來(lái)表示身份驗(yàn)證或數(shù)據(jù)圖像。例如,數(shù)據(jù)圖像的簽名可以附加到數(shù)據(jù)圖像原始二進(jìn)制文件中。可以將標(biāo)頭附加到組合的 blob 以指定每個(gè)組件的范圍。平臺(tái)必須實(shí)現(xiàn)相應(yīng)的 IPL 來(lái)解釋這種格式。
以下枚舉可用于定義這三種方法。
typedef enum img_type_enum {IMG_RAW, /* Binary image */IMG_PLAT, /* Platform specific format */IMG_CERT, /* X509v3 certificate */IMG_MAX_TYPES, } img_type_t;IPL 必須提供具有以下原型的函數(shù):
void init(void); int check_integrity(void *img, unsigned int img_len); int get_auth_param(const auth_param_type_desc_t *type_desc,void *img, unsigned int img_len,void **param, unsigned int *param_len);必須使用以下宏注冊(cè)每種類型的 IPL:
REGISTER_IMG_PARSER_LIB(_type, _name, _init, _check_int, _get_param)-
_type: 上述類型之一。
-
_name:包含用于調(diào)試目的的 IPL 名稱的字符串。
-
_init:初始化函數(shù)指針。
-
_check_int:檢查圖像完整性函數(shù)指針。
-
_get_param: 提取認(rèn)證參數(shù)函數(shù)指針。
該init()函數(shù)將用于初始化 IPL。
該check_integrity()函數(shù)傳遞一個(gè)指針,該指針指向 IO 框架已加載圖像的內(nèi)存和圖像長(zhǎng)度。應(yīng)該保證圖片是解析方式對(duì)應(yīng)的格式,沒有被篡改過(guò)。例如,RFC-2459 描述了 X.509 證書的驗(yàn)證序列。
該get_auth_param()函數(shù)被傳遞一個(gè)參數(shù)描述符,其中包含有關(guān)參數(shù) (type_desc和cookie) 的信息,以從圖像中識(shí)別和提取與該參數(shù)對(duì)應(yīng)的數(shù)據(jù)。此數(shù)據(jù)將用于驗(yàn)證 CoT 序列中的當(dāng)前或下一個(gè)圖像。
CoT 中的每個(gè)圖像都將指定它使用的解析方法。IPM 將使用此信息來(lái)查找圖像的正確解析器描述符。
2.2.2。描述身份驗(yàn)證方法?
作為 CoT 的一部分,每個(gè)圖像都必須指定一種或多種身份驗(yàn)證方法,用于對(duì)其進(jìn)行驗(yàn)證。如“身份驗(yàn)證方法”部分所述,AM 支持三種方法。
typedef enum {AUTH_METHOD_NONE,AUTH_METHOD_HASH,AUTH_METHOD_SIG,AUTH_METHOD_NUM } auth_method_type_t;AM 定義了身份驗(yàn)證方法使用的每個(gè)參數(shù)的類型。它使用這些信息來(lái):
指定get_auth_param()IPM 導(dǎo)出的函數(shù),應(yīng)從圖像中提取哪個(gè)參數(shù)。
調(diào)用CM和PP導(dǎo)出的校驗(yàn)函數(shù)時(shí),正確編組參數(shù)。
從父圖像中提取身份驗(yàn)證參數(shù)以驗(yàn)證子圖像,例如為了驗(yàn)證證書圖像,必須從父圖像中獲取公鑰。
typedef enum {AUTH_PARAM_NONE,AUTH_PARAM_RAW_DATA, /* Raw image data */AUTH_PARAM_SIG, /* The image signature */AUTH_PARAM_SIG_ALG, /* The image signature algorithm */AUTH_PARAM_HASH, /* A hash (including the algorithm) */AUTH_PARAM_PUB_KEY, /* A public key */ } auth_param_type_t;AM 定義了以下結(jié)構(gòu)來(lái)識(shí)別驗(yàn)證圖像所需的身份驗(yàn)證參數(shù)。
typedef struct auth_param_type_desc_s {auth_param_type_t type;void *cookie; } auth_param_type_desc_t;cookie平臺(tái)使用它來(lái)為 IPM 指定附加信息,使其能夠唯一標(biāo)識(shí)應(yīng)從??圖像中提取的參數(shù)。例如,BL3x 圖像在其相應(yīng)內(nèi)容證書中的哈希存儲(chǔ)在 X509v3 自定義擴(kuò)展字段中。擴(kuò)展字段只能使用 OID 來(lái)標(biāo)識(shí)。在這種情況下,cookie可以包含指向平臺(tái)為散列擴(kuò)展字段定義的 OID 的指針,而該type字段可以設(shè)置為AUTH_PARAM_HASH。該字段的值為 0cookie表示未使用該字段。
對(duì)于每種方法,AM 都定義了一個(gè)結(jié)構(gòu),其中包含驗(yàn)證圖像所需的參數(shù)。
/** Parameters for authentication by hash matching*/ typedef struct auth_method_param_hash_s {auth_param_type_desc_t *data; /* Data to hash */auth_param_type_desc_t *hash; /* Hash to match with */ } auth_method_param_hash_t;/** Parameters for authentication by signature*/ typedef struct auth_method_param_sig_s {auth_param_type_desc_t *pk; /* Public key */auth_param_type_desc_t *sig; /* Signature to check */auth_param_type_desc_t *alg; /* Signature algorithm */auth_param_type_desc_t *tbs; /* Data signed */ } auth_method_param_sig_t; AM 定義了以下結(jié)構(gòu)來(lái)描述驗(yàn)證圖像的身份驗(yàn)證方法/** Authentication method descriptor*/ typedef struct auth_method_desc_s {auth_method_type_t type;union {auth_method_param_hash_t hash;auth_method_param_sig_t sig;} param; } auth_method_desc_t;使用type字段中指定的方法類型,AM 找出param聯(lián)合內(nèi)需要訪問(wèn)的字段。
2.2.3。存儲(chǔ)認(rèn)證參數(shù)
用于驗(yàn)證圖像的參數(shù)auth_param_type_desc_t可以從圖像本身或其父圖像中獲得。為加載父圖像分配的內(nèi)存將被重新用于加載子圖像。因此,從父級(jí)獲得的用于驗(yàn)證子圖像的參數(shù)需要為它們單獨(dú)分配內(nèi)存,以便存儲(chǔ)它們。此內(nèi)存必須由平臺(tái)端口靜態(tài)分配。
AM 定義了以下結(jié)構(gòu)來(lái)存儲(chǔ)與認(rèn)證參數(shù)對(duì)應(yīng)的數(shù)據(jù)。
typedef struct auth_param_data_desc_s {void *auth_param_ptr;unsigned int auth_param_len; } auth_param_data_desc_t;該auth_param_ptr字段由平臺(tái)初始化。該auth_param_len 字段用于指定內(nèi)存中數(shù)據(jù)的長(zhǎng)度。
對(duì)于可以從子圖像本身獲取的參數(shù),IPM 負(fù)責(zé)在執(zhí)行函數(shù)時(shí)填充auth_param_ptr和字段。auth_param_lenimg_get_auth_param()
AM 定義了以下結(jié)構(gòu),以使圖像能夠描述應(yīng)從中提取并用于驗(yàn)證 CoT 中的下一個(gè)圖像(子圖像)的參數(shù)。
typedef struct auth_param_desc_s {auth_param_type_desc_t type_desc;auth_param_data_desc_t data; } auth_param_desc_t;2.2.4。在 CoT 中描述圖像
CoT 中的圖像是上述 CoT 的以下方面的合并。
-
(1)平臺(tái)指定的唯一標(biāo)識(shí)符,允許 IO 框架在 FIP 中定位圖像并將其加載到為 CoT 中的數(shù)據(jù)圖像保留的內(nèi)存中。
-
(2)AM 使用的一種解析方法來(lái)查找適當(dāng)?shù)?IPM。
-
(3)上一節(jié)中描述的身份驗(yàn)證方法及其參數(shù)。這些用于驗(yàn)證當(dāng)前圖像。
-
(4)用于驗(yàn)證當(dāng)前 CoT 中的下一個(gè)圖像的參數(shù)。這些參數(shù)僅由身份驗(yàn)證圖像指定,一旦經(jīng)過(guò)驗(yàn)證,就可以從當(dāng)前圖像中提取。
以下數(shù)據(jù)結(jié)構(gòu)描述了 CoT 中的圖像。
typedef struct auth_img_desc_s {unsigned int img_id;const struct auth_img_desc_s *parent;img_type_t img_type;const auth_method_desc_t *const img_auth_methods;const auth_param_desc_t *const authenticated_data; } auth_img_desc_t;CoT 定義為指向由字段auth_image_desc_t鏈接在一起的結(jié)構(gòu)的指針數(shù)組。parent那些沒有父節(jié)點(diǎn)的節(jié)點(diǎn)必須使用存儲(chǔ)在平臺(tái)中的 ROTPK 進(jìn)行身份驗(yàn)證。
2.3. 實(shí)現(xiàn)示例
本節(jié)是詳細(xì)指南,解釋使用身份驗(yàn)證框架的可信引導(dǎo)實(shí)現(xiàn)。此示例對(duì)應(yīng)于 TBBR-Client 文檔中指定的應(yīng)用功能模式 (AFM)。建議與源代碼一起閱讀本指南。
2.3.1。TBBR CoT
BL1 和 BL2 特有的 CoT 可以分別在drivers/auth/tbbr/tbbr_cot_bl1.c 和中找到drivers/auth/tbbr/tbbr_cot_bl2.c。在 BL1 和 BL2 中使用的通用 CoT 可以在drivers/auth/tbbr/tbbr_cot_common.c. 這個(gè) CoT 由一組指向圖像描述符的指針組成,并使用宏在框架中注冊(cè)REGISTER_COT(cot_desc),其中 cot_desc必須是數(shù)組的名稱(傳遞指針或任何其他類型的間接將導(dǎo)致注冊(cè)過(guò)程失敗)。
參與引導(dǎo)過(guò)程的映像數(shù)量取決于 CoT。然而,在 TF-A 中有一組最少的圖像是強(qiáng)制性的,因此所有 CoT 都必須呈現(xiàn):
-
BL2
-
SCP_BL2(特定于平臺(tái))
-
BL31
-
BL32(可選的)
-
BL33
TBBR 指定了必須伴隨這些圖像以進(jìn)行正確身份驗(yàn)證的附加證書。有關(guān) TBBR CoT 的詳細(xì)信息可在 Trusted Board Boot文檔中找到。
遵循移植指南,平臺(tái)必須為將在引導(dǎo)過(guò)程中加載的所有映像和證書提供唯一標(biāo)識(shí)符。如果平臺(tái)使用 TBBR 作為可信引導(dǎo)的參考,則這些標(biāo)識(shí)符可以從include/common/tbbr/tbbr_img_def.h. Arm 平臺(tái)將此文件包含在include/plat/arm/common/arm_def.h. 其他平臺(tái)也可能包含此文件或提供自己的標(biāo)識(shí)符。
重要提示:身份驗(yàn)證模塊使用這些標(biāo)識(shí)符來(lái)索引 CoT 數(shù)組,因此數(shù)組中的描述符位置必須與標(biāo)識(shí)符匹配。
每個(gè)圖像描述符必須指定:
-
img_id:平臺(tái)定義的對(duì)應(yīng)圖片唯一標(biāo)識(shí)。
-
img_type:圖像解析器模塊使用圖像類型調(diào)用正確的解析庫(kù)來(lái)檢查圖像完整性并提取所需的認(rèn)證參數(shù)。目前支持三種類型的圖像:
– IMG_RAW:圖像是原始二進(jìn)制文件。除了讀取整個(gè)圖像之外,沒有可用的解析功能。
– IMG_PLAT:圖像格式是特定于平臺(tái)的。平臺(tái)可以將此類型用于身份驗(yàn)證框架不直接支持的自定義圖像。
– IMG_CERT:圖像是 x509v3 證書。 -
parent: 指向父圖像描述符的指針。父級(jí)將包含驗(yàn)證當(dāng)前圖像所需的信息。如果 parent 為 NULL,則從平臺(tái)獲取認(rèn)證參數(shù)(即 BL2 和 Trusted Key 證書使用 ROT 私鑰簽名,其公共部分存儲(chǔ)在平臺(tái)中)。
-
img_auth_methods:這指向一個(gè)數(shù)組,該數(shù)組定義了必須檢查的身份驗(yàn)證方法以認(rèn)為圖像已通過(guò)身份驗(yàn)證。每個(gè)方法都包含一個(gè)類型和一個(gè)參數(shù)描述符列表。參數(shù)描述符由類型和cookie 組成,cookie 將指向從圖像中提取該參數(shù)所需的特定信息(即,如果參數(shù)存儲(chǔ)在x509v3 擴(kuò)展中,cookie 將指向擴(kuò)展OID)。根據(jù)方法類型,必須指定不同數(shù)量的參數(shù)。該指針不應(yīng)為 NULL。支持的方法有:
– AUTH_METHOD_HASH:圖像的哈希必須與從父圖像中提取的哈希匹配。必須指定以下參數(shù)描述符:
----- data:要散列的數(shù)據(jù)(從當(dāng)前圖像中獲取)
----- hash:參考哈希(從父圖像獲得)
– AUTH_METHOD_SIG: 圖像(通常是證書)必須使用其公共部分從父圖像(如果父圖像為 NULL 則為平臺(tái))提取的私鑰簽名。必須指定以下參數(shù)描述符:
----- pk: 公鑰(從父鏡像中獲取)
----- sig:數(shù)字簽名(從當(dāng)前圖像中獲得)
----- alg:使用的簽名算法(從當(dāng)前圖像中獲得)
----- data:要簽名的數(shù)據(jù)(從當(dāng)前圖像中獲取) -
authenticated_data:此數(shù)組指針指示一旦圖像經(jīng)過(guò)身份驗(yàn)證,必須從圖像中提取哪些身份驗(yàn)證參數(shù)。每個(gè)參數(shù)由一個(gè)參數(shù)描述符和用于存儲(chǔ)參數(shù)的緩沖區(qū)地址/大小組成。CoT 負(fù)責(zé)分配所需的內(nèi)存來(lái)存儲(chǔ)參數(shù)。該指針可能為 NULL。
在該tbbr_cot*.c文件中,分配了一組緩沖區(qū)來(lái)存儲(chǔ)從證書中提取的參數(shù)。在 TBBR CoT 的情況下,這些參數(shù)是散列和公鑰。在 DER 格式中,一個(gè) RSA-4096 公鑰需要 550 個(gè)字節(jié),而散列需要 51 個(gè)字節(jié)。根據(jù) CoT 和身份驗(yàn)證過(guò)程,一些緩沖區(qū)可能會(huì)在引導(dǎo)期間的不同階段重復(fù)使用。
接下來(lái)在該文件中,定義參數(shù)描述符。這些描述符將用于從相應(yīng)的圖像中提取參數(shù)數(shù)據(jù)。
2.3.1.1。示例:BL31 信任鏈?
四個(gè)圖像描述符構(gòu)成了 BL31 信任鏈:
static const auth_img_desc_t trusted_key_cert = {.img_id = TRUSTED_KEY_CERT_ID,.img_type = IMG_CERT,.parent = NULL,.img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {[0] = {.type = AUTH_METHOD_SIG,.param.sig = {.pk = &subject_pk,.sig = &sig,.alg = &sig_alg,.data = &raw_data}},[1] = {.type = AUTH_METHOD_NV_CTR,.param.nv_ctr = {.cert_nv_ctr = &trusted_nv_ctr,.plat_nv_ctr = &trusted_nv_ctr}}},.authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {[0] = {.type_desc = &trusted_world_pk,.data = {.ptr = (void *)trusted_world_pk_buf,.len = (unsigned int)PK_DER_LEN}},[1] = {.type_desc = &non_trusted_world_pk,.data = {.ptr = (void *)non_trusted_world_pk_buf,.len = (unsigned int)PK_DER_LEN}}} }; static const auth_img_desc_t soc_fw_key_cert = {.img_id = SOC_FW_KEY_CERT_ID,.img_type = IMG_CERT,.parent = &trusted_key_cert,.img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {[0] = {.type = AUTH_METHOD_SIG,.param.sig = {.pk = &trusted_world_pk,.sig = &sig,.alg = &sig_alg,.data = &raw_data}},[1] = {.type = AUTH_METHOD_NV_CTR,.param.nv_ctr = {.cert_nv_ctr = &trusted_nv_ctr,.plat_nv_ctr = &trusted_nv_ctr}}},.authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {[0] = {.type_desc = &soc_fw_content_pk,.data = {.ptr = (void *)content_pk_buf,.len = (unsigned int)PK_DER_LEN}}} }; static const auth_img_desc_t soc_fw_content_cert = {.img_id = SOC_FW_CONTENT_CERT_ID,.img_type = IMG_CERT,.parent = &soc_fw_key_cert,.img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {[0] = {.type = AUTH_METHOD_SIG,.param.sig = {.pk = &soc_fw_content_pk,.sig = &sig,.alg = &sig_alg,.data = &raw_data}},[1] = {.type = AUTH_METHOD_NV_CTR,.param.nv_ctr = {.cert_nv_ctr = &trusted_nv_ctr,.plat_nv_ctr = &trusted_nv_ctr}}},.authenticated_data = (const auth_param_desc_t[COT_MAX_VERIFIED_PARAMS]) {[0] = {.type_desc = &soc_fw_hash,.data = {.ptr = (void *)soc_fw_hash_buf,.len = (unsigned int)HASH_DER_LEN}},[1] = {.type_desc = &soc_fw_config_hash,.data = {.ptr = (void *)soc_fw_config_hash_buf,.len = (unsigned int)HASH_DER_LEN}}} }; static const auth_img_desc_t bl31_image = {.img_id = BL31_IMAGE_ID,.img_type = IMG_RAW,.parent = &soc_fw_content_cert,.img_auth_methods = (const auth_method_desc_t[AUTH_METHOD_NUM]) {[0] = {.type = AUTH_METHOD_HASH,.param.hash = {.data = &raw_data,.hash = &soc_fw_hash}}} };Trusted Key 證書使用ROT 私鑰簽名,并包含 Trusted World 公鑰和 Non-Trusted World 公鑰作為 x509v3 擴(kuò)展。這必須分別使用 img_auth_methods和authenticated_data數(shù)組在圖像描述符中指定。
可信密鑰證書通過(guò)使用 ROTPK 檢查其數(shù)字簽名來(lái)進(jìn)行身份驗(yàn)證。檢查簽名需要四個(gè)參數(shù):公鑰、算法、簽名和已簽名的數(shù)據(jù)。因此,認(rèn)證方法必須指定四個(gè)參數(shù)描述符:
-
subject_pk: 類型的參數(shù)描述符AUTH_PARAM_PUB_KEY。此類型用于從父圖像中提取公鑰。如果 cookie 是 OID,則從相應(yīng)的 x509v3 擴(kuò)展中提取密鑰。如果 cookie 為 NULL,則檢索主題公鑰。在這種情況下,由于父圖像為 NULL,因此從平臺(tái)獲取公鑰(此密鑰將是 ROTPK)。
-
sig: 類型的參數(shù)描述符AUTH_PARAM_SIG。它用于從證書中提取簽名。
-
sig_alg: 類型的參數(shù)描述符AUTH_PARAM_SIG。它用于從證書中提取簽名算法。
-
raw_data: 類型的參數(shù)描述符AUTH_PARAM_RAW_DATA。它用于從證書中提取要簽名的數(shù)據(jù)。
一旦檢查了簽名并驗(yàn)證了證書,就需要從證書中提取 Trusted World 公鑰。authenticated_data為此,在數(shù)組中創(chuàng)建了一個(gè)新條目。在該條目中,必須指定相應(yīng)的參數(shù)描述符以及緩沖區(qū)地址以存儲(chǔ)參數(shù)值。在這種情況下,trusted_world_pk 描述符用于從具有 OID 的 x509v3 擴(kuò)展中提取公鑰 TRUSTED_WORLD_PK_OID。BL31 密鑰證書將使用該描述符作為簽名認(rèn)證方法中的參數(shù)。密鑰存儲(chǔ)在 trusted_world_pk_buf緩沖區(qū)中。
BL31 Key 證書是通過(guò)使用之前從 Trusted Key 證書中獲得的 Trusted World 公鑰檢查其數(shù)字簽名來(lái)驗(yàn)證的。在圖像描述符中,我們通過(guò)簽名指定單一的身份驗(yàn)證方法,其公鑰為trusted_world_pk. 一旦這個(gè)證書被認(rèn)證,我們必須提取 BL31 公鑰,存儲(chǔ)在soc_fw_content_pk. 該密鑰將被復(fù)制到 content_pk_buf緩沖區(qū)。
BL31 證書是通過(guò)使用先前從 BL31 Key 證書中獲得的BL31 公鑰檢查其數(shù)字簽名來(lái)驗(yàn)證的。soc_fw_content_pk我們使用公鑰指定身份驗(yàn)證方法。身份驗(yàn)證后,我們需要提取 BL31 哈希值,存儲(chǔ)在指定的擴(kuò)展名中soc_fw_hash。此哈希將被復(fù)制到 soc_fw_hash_buf緩沖區(qū)。
BL31圖像通過(guò)計(jì)算其哈希值并將其與從 BL31 證書獲得的哈希值進(jìn)行匹配來(lái)進(jìn)行身份驗(yàn)證。圖像描述符包含通過(guò)哈希的單一身份驗(yàn)證方法。散列方法的參數(shù)是參考散列、soc_fw_hash和要散列的數(shù)據(jù)。在這種情況下,它是整個(gè)圖像,所以我們指定raw_data.
2.3.2. 圖像解析器庫(kù)?
圖像解析器模塊依賴庫(kù)來(lái)檢查圖像完整性并提取身份驗(yàn)證參數(shù)。解析器庫(kù)的數(shù)量和類型取決于 CoT 中使用的圖像。原始圖像不需要庫(kù),因此 TBBR CoT 只需要 x509v3 庫(kù)。
Arm 平臺(tái)將使用基于 mbed TLS 的 x509v3 庫(kù)。這個(gè)庫(kù)可以在drivers/auth/mbedtls/mbedtls_x509_parser.c. 它導(dǎo)出三個(gè)函數(shù):
void init(void); int check_integrity(void *img, unsigned int img_len); int get_auth_param(const auth_param_type_desc_t *type_desc,void *img, unsigned int img_len,void **param, unsigned int *param_len);該庫(kù)使用宏在框架中注冊(cè) REGISTER_IMG_PARSER_LIB()。圖像解析模塊每次需要訪問(wèn)類型為 的圖像時(shí)IMG_CERT,都會(huì)調(diào)用該文件中導(dǎo)出的相應(yīng)函數(shù)。
必須更新構(gòu)建系統(tǒng)以包含相應(yīng)的庫(kù)和 mbed TLS 源。Arm 平臺(tái)使用該arm_common.mk文件來(lái)拉取源。
2.3.3。密碼庫(kù)?
密碼模塊依賴于庫(kù)來(lái)執(zhí)行所需的操作,即驗(yàn)證散列或數(shù)字簽名。Arm 平臺(tái)將使用基于 mbed TLS 的庫(kù),該庫(kù)位于 drivers/auth/mbedtls/mbedtls_crypto.c. 該庫(kù)使用宏在身份驗(yàn)證框架中注冊(cè),REGISTER_CRYPTO_LIB()并導(dǎo)出四個(gè)函數(shù):
void init(void); int verify_signature(void *data_ptr, unsigned int data_len,void *sig_ptr, unsigned int sig_len,void *sig_alg, unsigned int sig_alg_len,void *pk_ptr, unsigned int pk_len); int verify_hash(void *data_ptr, unsigned int data_len,void *digest_info_ptr, unsigned int digest_info_len); int auth_decrypt(enum crypto_dec_algo dec_algo, void *data_ptr,size_t len, const void *key, unsigned int key_len,unsigned int key_flags, const void *iv,unsigned int iv_len, const void *tag,unsigned int tag_len)mbedTLS 庫(kù)算法支持由 TF_MBEDTLS_KEY_ALG和TF_MBEDTLS_KEY_SIZE變量配置。
-
TF_MBEDTLS_KEY_ALG可以接受 3 個(gè)值:rsa、ecdsa或rsa+ecdsa。此變量允許 Makefile 在構(gòu)建中包含各種算法的相應(yīng)源。將變量設(shè)置為rsa+ecdsa 可以支持 mbedTLS 庫(kù)中的 rsa 和 ecdsa 算法。
-
TF_MBEDTLS_KEY_SIZE設(shè)置 TFA 支持的 RSA 密鑰大小。有效值包括 1024、2048、3072 和 4096。
-
TF_MBEDTLS_USE_AES_GCM啟用基于 AES-GCM 算法的認(rèn)證解密支持。有效值為 0 和 1。
注意:如果代碼大小是一個(gè)問(wèn)題,MBEDTLS_SHA256_SMALLER可以在平臺(tái) Makefile 中定義構(gòu)建選項(xiàng)。它將使 mbed TLS 使用 SHA-256 的實(shí)現(xiàn),內(nèi)存占用更小(約 1.5 KB 少)但速度更慢(約 30%)。
總結(jié)
以上是生活随笔為你收集整理的2-Authentication Framework Chain of Trust的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1-Alternative Boot F
- 下一篇: 3-Arm CPU Specific B