KeyMint (先前稱為 Keymaster) API 大量使用授權標記,也就是名稱-值組合。每個可能的標記都包含:
- 具有關聯值的列舉名稱
- 關聯類型 (例如整數、位元組、日期、列舉),其中包含指示是否允許多個值
舉例來說,名稱為 Tag::BLOCK_MODE
的標記具有 4
的基本列舉值,以及 TagType::ENUM_REP
類型標記,表示相關聯的值是可重複的列舉 (在本例中為 BlockMode
)。
標記在 API 上執行雙重功能:
- 例如,HMAC 簽署作業的
Tag::MAC_LENGTH
參數會指出要求的 HMAC 長度。 - 鍵特性:永久綁定至特定鍵的值 (也就是鍵 blob 中包含的值),例如
Tag::EC_CURVE
會指出鍵適用於哪個橢圓曲線。每個主要特徵都會與安全性層級相關聯,指出系統的哪個部分會監控該屬性:- 安全硬體會強制執行安全性等級為
TRUSTED_ENVIRONMENT
或STRONGBOX
的金鑰特性。 - 安全性層級為
SOFTWARE
或KEYSTORE
的關鍵特性,只會由keystore2
系統服務強制執行 (因此這類特性無法抵禦 OS 遭到入侵)。
- 安全硬體會強制執行安全性等級為
許多代碼同時具備關鍵特徵和參數:
- 關鍵特性會指出鍵的允許參數組合,例如:
- ECDSA 金鑰的
Tag::PURPOSE
可能同時包含SIGN
和AGREE_KEY
。 - AES 金鑰的
Tag::BLOCK_MODE
可能包含 ECB、CBC 和 CTR 模式。
- ECDSA 金鑰的
begin()
要求隨後會加入該作業的特定參數值,例如:begin()
具有明確的用途參數,必須與主要特徵的Tag::PURPOSE
值相符。- AES 作業的
begin()
需要在params
欄位中納入Tag::BLOCK_MODE
的單一值,且該值必須與主要特性中的其中一個值相符。
這個雙重函式特別適用於在金鑰產生或匯入作業中,以 keyParams
形式傳遞的標記集合。
- 部分標記會做為金鑰產生作業本身的參數。舉例來說,
Tag::CERTIFICATE_SUBJECT
標記只會影響 (非對稱) 金鑰產生程序,藉此控制傳回 X.509 憑證中的欄位。 - 其他標記會以金鑰特性的形式繫結至新產生的金鑰,並封裝在傳回的金鑰 blob 中,以便永久與金鑰建立關聯。
如要瞭解標記值的詳細資訊,請參閱下列 HAL 介面規格:
- KeyMint:所有標記皆在相關 Android 發布分支的
Tag.aidl
中定義。 - Keymaster:標記會在
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
中定義每個相對應的keymaster-version
,例如 Keymaster 3 的3.0/types.hal
和 Keymaster 4 的4.0/types.hal
。針對 Keymaster 2 以下版本,標記是在platform/hardware/libhardware/include/hardware/keymaster_defs.h
中定義。