授權標記

KeyMint (先前稱為 Keymaster) API 會大量使用授權標記,也就是名稱/值組合。每個可能的標記都有:

  • 具有相關聯值的列舉名稱
  • 相關聯的型別 (例如整數、位元組、日期、列舉),包括是否允許多個值的指標

舉例來說,名稱為 Tag::BLOCK_MODE 的標記具有 4 的基本列舉值和 TagType::ENUM_REP 類型標記,表示相關聯的值是可重複的列舉 (在本例中為 BlockMode)。

標記在 API 中有雙重功能:

  • 做為在 API 上執行的作業參數,例如 Tag::MAC_LENGTH 表示要求的 HMAC 長度 (適用於 HMAC 簽署作業)。
  • 做為重要特徵,值會永久繫結至特定金鑰 (即包含在金鑰 Blob 中),例如 Tag::EC_CURVE 會指出金鑰適用的橢圓曲線。每個重要特徵都與安全等級相關聯,指出系統的哪個部分會控管該屬性:
    • 安全等級為 TRUSTED_ENVIRONMENTSTRONGBOX 的重要特徵會在安全硬體中強制執行。
    • 安全等級為 SOFTWAREKEYSTORE 的主要特徵僅由 keystore2 系統服務強制執行 (因此這類特徵無法抵禦 OS 遭入侵)。

許多標記會同時做為主要特徵參數:

  • 主要特徵會指出金鑰的一組允許參數,例如:
    • ECDSA 金鑰的 Tag::PURPOSE 可能同時包含 SIGNAGREE_KEY
    • AES 金鑰的 Tag::BLOCK_MODE 可能包含 ECB、CBC 和 CTR 模式。
  • 接著,begin() 要求會包含作業的特定參數值,例如:
    • begin() 具有明確的用途參數,必須與其中一個主要特徵的 Tag::PURPOSE 值相符。
    • AES 作業的 begin() 必須在 params 欄位中包含 Tag::BLOCK_MODE 的單一值,且該值必須與金鑰特徵中的其中一個值相符。

這項雙重功能與在金鑰產生或匯入作業中以 keyParams 傳遞的標記集合特別相關。

  • 部分標記會做為金鑰產生作業本身的參數。舉例來說,Tag::CERTIFICATE_SUBJECT 標記只會影響 (非對稱) 金鑰產生程序,方法是控制傳回的 X.509 憑證中的欄位。
  • 其他標記會以金鑰特徵的形式繫結至新產生的金鑰,並封裝在傳回的 keyblob 中,以便永久與金鑰建立關聯。

如要瞭解標記值的詳細資訊,請參閱下列 HAL 介面規格: