授權標記

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

  • 具有關聯值的列舉名稱
  • 關聯類型 (例如整數、位元組、日期、列舉),其中包含指示是否允許多個值

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

標記在 API 上執行雙重功能:

  • 例如,HMAC 簽署作業的 Tag::MAC_LENGTH 參數會指出要求的 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 憑證中的欄位。
  • 其他標記會以金鑰特性的形式繫結至新產生的金鑰,並封裝在傳回的金鑰 blob 中,以便永久與金鑰建立關聯。

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