KeyMint (先前稱為 Keymaster) API 會大量使用授權標記,也就是名稱/值組合。每個可能的標記都有:
- 具有相關聯值的列舉名稱
- 相關聯的型別 (例如整數、位元組、日期、列舉),包括是否允許多個值的指標
舉例來說,名稱為 Tag::BLOCK_MODE
的標記具有 4
的基本列舉值和 TagType::ENUM_REP
類型標記,表示相關聯的值是可重複的列舉 (在本例中為 BlockMode
)。
標記在 API 中有雙重功能:
- 做為在 API 上執行的作業參數,例如
Tag::MAC_LENGTH
表示要求的 HMAC 長度 (適用於 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 憑證中的欄位。 - 其他標記會以金鑰特徵的形式繫結至新產生的金鑰,並封裝在傳回的 keyblob 中,以便永久與金鑰建立關聯。
如要瞭解標記值的詳細資訊,請參閱下列 HAL 介面規格:
- KeyMint - 所有標記都定義在相關 Android 發行分支的
Tag.aidl
中。 - Keymaster:標記是在每個對應的
keymaster-version
中定義,例如 Keymaster 3 的3.0/types.hal
,以及 Keymaster 4 的4.0/types.hal
。platform/hardware/interfaces/keymaster/keymaster-version/types.hal
如果是 Keymaster 2 以下版本,標記定義於platform/hardware/libhardware/include/hardware/keymaster_defs.h
。