本頁提供了詳細說明,協助 Keymaster HALs 的實作者。 內容涵蓋 HAL 中的每個標記,而該標記的 Keymaster 版本為 以及代碼是否可重複除非標記說明中另有註明 產生金鑰時,使用下列所有標記來指定金鑰
對於 Keymaster 4,標記是在
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
,
例如
3.0/types.hal,適用於 Keymaster 3 和
4.0/types.hal,對於 Keymaster 2 以下版本,標記會定義在
platform/hardware/libhardware/include/hardware/keymaster_defs.h
。
如需函式,請參閱 Keymaster Functions 頁面。
標記:ACTIVE_DATETIME
版本:1、2、3、4
可重複?否
指定金鑰生效的日期和時間。在此之前
任何嘗試使用金鑰時,因
ErrorCode::KEY_NOT_YET_VALID
。
這個值是一個 64 位元整數,代表從 1 月 1 日開始計算的毫秒數, 1970 年。
標記::ALGORITHM
版本:1、2、3、4
可重複?否
指定要使用金鑰的加密編譯演算法。
可能的值定義如下:
Keymaster 3enum class Algorithm : uint32_t { RSA = 1, EC = 3, AES = 32, HMAC = 128, };Keymaster 2 以下版本
typedef enum { KM_ALGORITHM_RSA = 1, KM_ALGORITHM_EC = 3, KM_ALGORITHM_AES = 32, KM_ALGORITHM_HMAC = 128, } keymaster_algorithm_t;
標記:ALL_APPLICATIONS
版本:1、2、3、4
可重複?否
保留供日後使用。
標記:ALLOW_WHILE_ON_BODY
版本:2、3、4
可重複?否
這個標記僅適用於搭載人體感應器的 Android Wear 裝置。在 這代表任何 TEE 都能安全存取資料 或是人體感應器 要確保安全,所以 預計為完全採用軟體強制執行的功能。
標記:ALL_USERS
版本:3、4
可重複?否
保留供日後使用。
標記:APPLICATION_DATA
版本:1、2、3、4
可重複?否
提供給
generateKey
或 importKey
此標記指定了使用任何鍵時必要的資料。於
以及呼叫
exportKey,並且
getKeyCharacteristics
必須為 clientId
參數提供相同的值,而呼叫
需要提供
這個代碼和與「inParams
」中相同的相關資料
設定。如果未提供正確的資料,函式會傳回
ErrorCode::INVALID_KEY_BLOB
。
此標記的內容會以加密方式繫結至金鑰, 也就是說,如果對手可以存取所有的 安全世界密鑰,但無權存取標記內容來解密 鍵,但禁止強制使用標記內容,應用程式可防止 指定充足的高熵內容
這個值是 blob (任意長度的位元組陣列)。
標記:APPLICATION_ID
版本:1、2、3、4
可重複?否
提供給
generateKey
或 importKey
此標記指定了使用任何鍵時必要的資料。於
以及呼叫
exportKey,並且
getKeyCharacteristics
必須在 clientId
參數中提供相同的值;且
呼叫開始需要
則在 Google Analytics 4 中
已設定inParams
。如果沒有提供正確的資料,函式就會
會傳回 ErrorCode::INVALID_KEY_BLOB
。
此標記的內容會以加密方式繫結至金鑰, 這意味著能存取所有安全世界之秘密的對手 無法存取標記內容,因此無法解密 鍵 (沒有強制使用標記內容)。
這個值是 blob (任意長度的位元組陣列)。
代碼:ASSOCIATED_DATA
版本:1、2、3、4
可重複?否
提供「關聯資料」適用於 AES-GCM 加密或解密。這個標記為 提供的 update 和 指定未加密/解密,但用於運算的資料 GCM 標記。
這個值是 blob,即任意長度的位元組陣列。
標記:ATTESTATION_APPLICATION_ID
版本:3、4
可重複?否
用於識別哪一組可能的應用方式 已開始金鑰認證。
這個值是 blob,即任意長度的位元組陣列。
標記:ATTESTATION_CHALLENGE
版本:3、4
可重複?否
用於在認證中提供驗證。
這個值是 blob,即任意長度的位元組陣列。
標記:ATTESTATION_ID_BRAND
版本:3、4
可重複?否
提供 Build.BRAND
所傳回的裝置品牌名稱
。只有在要求
裝置的識別碼
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記:ATTESTATION_ID_DEVICE
版本:3、4
可重複?否
提供 Build.DEVICE
所傳回裝置的裝置名稱
。只有在要求
裝置的識別碼
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記:ATTESTATION_ID_IMEI
版本:3、4
可重複?是
為裝置中的所有無線電提供 IMEI。只有設定這個欄位 並用於要求裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
代碼:ATTESTATION_ID_MANUFACTURER
版本:3、4
可重複?否
提供裝置的製造商名稱
Android 中的 Build.MANUFACTURER
。這個欄位只有在
要求取得裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記:ATTESTATION_ID_MEID
版本:3、4
可重複?是
為裝置中的所有無線電提供 MEID。只有 並用於要求裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記::ATTESTATION_ID_MODEL
版本:3、4
可重複?否
提供裝置的型號名稱 (由
Android 中的 Build.MODEL
。這個欄位只有在
要求取得裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記:ATTESTATION_ID_PRODUCT
版本:3、4
可重複?否
提供由
Android 中的 Build.PRODUCT
。這個欄位只有在
要求取得裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
標記:ATTESTATION_ID_SERIAL
版本:3、4
可重複?否
提供裝置的序號。這個欄位只有在 要求取得裝置 ID 認證
如果裝置不支援 ID 認證 (或
先前已呼叫 destroyAttestationIds()
,且裝置可
金鑰認證要求,則在
此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
這個值是 blob (任意長度的位元組陣列)。
代碼:AUTH_TIMEOUT
版本:1、2、3、4
可重複?否
指定金鑰授權使用的時間 (以秒為單位)。 驗證。如果標記:USER_SECURE_ID 而這個標記沒有,因此金鑰必須通過驗證,才能包括 使用方式 (請見「開始」瞭解 每項作業的驗證詳細資料)。
這個值是 32 位元的整數,指定在某段時間過後開始的小時間 讓 Tag::USER_SECURE_ID 指定的驗證方法成功驗證 由 Tag::USER_AUTH_TYPE 指定的
代碼:AUTH_TOKEN
版本:1、2、3、4
可重複?否
提供 驗證 符記開始 更新或 finish、 ,針對需要驗證的金鑰作業證明使用者驗證 其 (金鑰具有 Tag::USER_SECURE_ID)。
這個值是包含 hw_auth_token_t
結構的 blob。
標記:BLOB_USAGE_REQUIREMENTS
版本:1、2、3、4
可重複?否
為生成的資產指定必要的系統環境條件 要使用的金鑰
可能的值定義如下:
Keymaster 3enum class KeyBlobUsageRequirements : uint32_t { STANDALONE = 0, REQUIRES_FILE_SYSTEM = 1, };Keymaster 2 以下版本
typedef enum { KM_BLOB_STANDALONE = 0, KM_BLOB_REQUIRES_FILE_SYSTEM = 1, } keymaster_key_blob_usage_requirements_t;
您可以在產生金鑰時指定這個標記,以要求該金鑰為
可在特定條件中使用。必須隨鍵一起傳回
具備的
generateKey
getKeyCharacteristics。
如果呼叫端指定 Tag::BLOB_USAGE_REQUIREMENTS
值 KeyBlobUsageRequirements::STANDALONE
,信任 let 會傳回金鑰 blob
不需檔案系統支援即可使用這對裝置來說非常重要
導致檔案系統無法使用
使用 Keymaster 金鑰解密磁碟。
標記:BLOCK_MODE
版本:1、2、3、4
可重複?是
指定可與金鑰搭配使用的區塊加密模式。 這個標記只與 AES 金鑰相關。
可能的值定義如下:
Keymaster 3enum class BlockMode : uint32_t { ECB = 1, CBC = 2, CTR = 3, GCM = 32, };Keymaster 2 以下版本
typedef enum { KM_MODE_ECB = 1, KM_MODE_CBC = 2, KM_MODE_CTR = 3, KM_MODE_GCM = 32, } keymaster_block_mode_t;
這個標記可以重複,而對於 AES 金鑰作業,則會在
additionalParams
引數
「begin」。
如果指定的模式並非與鍵相關聯的模式,則
作業失敗,並顯示 ErrorCode::INCOMPATIBLE_BLOCK_MODE
。
代碼:BOOT_PATCHLEVEL
版本:4
標記:BOOT_PATCHLEVEL 會指定啟動映像檔 (核心) 安全性修補程式等級
可用於執行金鑰的建構作業這個標記絕對不會傳送至 Keymaster TA,但
將 加入硬體強制執行授權清單。任何嘗試
請使用 Tag::BOOT_PATCHLEVEL
值與
目前執行系統修補程式等級會造成 begin()
如要退貨,請點按 getKeyCharacteristics()
或 exportKey()
ErrorCode::KEY_REQUIRES_UPGRADE
。詳情請參閱 upgradeKey()
。
代碼值是 YYYYMMDD 格式的整數,其中 YYYY 是 上次更新時間的四位數年份,MM 為兩位數的月份,DD 則是 上次更新的兩位數。例如,對在 Cloud SQL 中 Android 裝置上次更新日期為 2018 年 6 月 5 日,這個值會是 20180605。 如果不知道該日期,則可替換 00。
在每次啟動期間,系統啟動載入程式都必須提供開機映像檔的修補程式等級 通往安全的環境 (機制為實作定義)。
必須使用硬體強制執行。
標記::BOOTLOADER_ONLY
版本:1、2、3、4
可重複?否
只有系統啟動載入程式可以使用金鑰。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
當您嘗試從下列位置使用 Tag::BOOTLOADER_ONLY
的金鑰:
Android 系統執行失敗並顯示 ErrorCode::INVALID_KEY_BLOB
。
代碼:CALLER_NONCE
版本:1、2、3、4
可重複?否
指定呼叫端可以為 Nonce 作業提供 Nonce。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
這個標記僅適用於 AES 金鑰,且只適用於 CBC、CTR 和 GCM
封鎖模式如果沒有代碼,導入作業應拒絕任何
作業,並將 Tag::NONCE 傳送至
開始
搭配 ErrorCode::CALLER_NONCE_PROHIBITED
。
標記:CREATION_DATETIME
版本:1、2、3、4
可重複?否
指定金鑰的建立日期和時間 (以毫秒為單位自 1970 年 1 月 1 日。這個標記為選填資訊,僅供參考。
代碼:DIGEST
版本:1、2、3、4
可重複?是
指定可與要搭配使用的金鑰搭配使用的摘要演算法 簽署和驗證作業。這個代碼與回應式搜尋廣告、ECDSA 和 HMAC 金鑰。
可能的值定義如下:
Keymaster 3enum class Digest : uint32_t { NONE = 0, MD5 = 1, SHA1 = 2, SHA_2_224 = 3, SHA_2_256 = 4, SHA_2_384 = 5, SHA_2_512 = 6, };Keymaster 2 以下版本
typedef enum { KM_DIGEST_NONE = 0, KM_DIGEST_MD5 = 1, KM_DIGEST_SHA1 = 2, KM_DIGEST_SHA_2_224 = 3, KM_DIGEST_SHA_2_256 = 4, KM_DIGEST_SHA_2_384 = 5, KM_DIGEST_SHA_2_512 = 6, } keymaster_digest_t;
這個代碼可重複執行。如要執行簽署和驗證作業,請
additionalParams
引數的摘要
「begin」。
如果指定的摘要不在與金鑰相關聯的摘要中,
作業失敗,並顯示 ErrorCode::INCOMPATIBLE_DIGEST
。
代碼:EC_CURVE
版本:2、3、4
可重複?否
在 Keymaster 1 中,系統透過指定鍵猜測 EC 金鑰使用的曲線
大小為了提升日後的彈性
Keymaster 2 推出了
指定曲線的方法強化轉換金鑰產生要求可能
Tag::EC_CURVE
和/或 Tag::KEY_SIZE
。
可能的值定義如下:
Keymaster 3enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };Keymaster 2 以下版本
enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };
如果生成要求僅包含 Tag::KEY_SIZE
,
改回 Keymaster 1 邏輯,選擇適當的 NIST 曲線。
如果要求中只包含 Tag::EC_CURVE
,請使用
。對於 Keymaster 3 以上版本,曲線會定義在
EcCurve
。針對 Keymaster 2 以下版本,曲線會定義
在「keymaster_ec_curve_t
」中。
如果要求包含這兩者,請使用
Tag::EC_CURVE
,並確認指定的金鑰大小為
產生該曲線的樣式如果沒有,則傳回
ErrorCode::INVALID_ARGUMENT
。
標記:INCLUDE_UNIQUE_ID
版本:2、3、4
可重複?否
系統會在產生金鑰時指定這個標記,以表示認證 產生金鑰的憑證應包含應用程式限定範圍, 時間限制裝置專屬 ID,如 Tag::UNIQUE_ID。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
標記:KEY_SIZE
版本:1、2、3、4
可重複?否
指定鍵的大小 (以位元為單位),系統會依照
的演算法。舉例來說,如果是 RSA 金鑰,Tag::KEY_SIZE
可指定
公開模數的大小而針對 AES 金鑰,則會指定
密鑰內容
標記:MAC_LENGTH
版本:1、2、3、4
可重複?否
提供要求的 MAC 或 GCM 驗證標記長度 (以位元為單位)。
這個值為 MAC 長度 (以位元為單位)。是 8 的倍數, 大小至少為 Tag::MIN_MAC_LENGTH 的值 與金鑰建立關聯
標記:MAX_USES_PER_BOOT
版本:1、2、3、4
可重複?否
指定單一金鑰在系統間可使用的次數上限 就會重新開機。這是頻率限制金鑰的另一種機制。
這個值是代表每次啟動使用的 32 位元整數。
在作業中使用含有此標記的鍵時,與金鑰相關聯的計數器
的
begin 呼叫。金鑰之後
超過此值,後續所有使用該鍵的嘗試皆會失敗
使用 ErrorCode::MAX_OPS_EXCEEDED
,直到裝置重新啟動為止。
這表示 Trustlet 保留了具有此特性的金鑰使用計數器表格
標記之前。由於 Keymaster 的記憶體容量通常有限,因此這個資料表可以有
若是嘗試將金鑰用於
。資料表至少要有 16 個金鑰。
如果作業因資料表已滿而失敗,Keymaster 會傳回
ErrorCode::TOO_MANY_OPERATIONS
。
標記:MIN_MAC_LENGTH
版本:1、2、3、4
可重複?否
這個標記可指定可要求或要求的 MAC 長度下限 已使用這組金鑰驗證 HMAC 金鑰和支援 GCM 模式的 AES 金鑰。
這個值是 MAC 長度下限 (以位元為單位)。是 8 的倍數。適用對象 HMAC 金鑰,值至少為 64。GCM 金鑰的值至少為 96 不可超過 128
代碼:MIN_SECONDS_BETWEEN_OPS
版本:1、2、3、4
可重複?否
指定間隔時間下限 來處理這類作業這可用來在結構定義中使用鍵的頻率限制 無限使用可能會遭受暴力攻擊
這個值是 32 位元整數,代表允許之間的秒數 作業。
如果在作業中使用含有此標記的鍵,請啟動計時器
執行期間
abort 通話。不限
呼叫 begin
表示在計時器之前
Tag::MIN_SECONDS_BETWEEN_OPS
已經過失敗,
ErrorCode::KEY_RATE_LIMIT_EXCEEDED
。這個
表示信任小程式保留了具有此標記之金鑰使用計數器的表格。
由於 Keymaster 的記憶體容量通常有限,因此這個資料表可以有固定的數量上限
嘗試以這個標記使用金鑰的作業大小和 Keymaster 可能會失敗
就。表格至少需要有 32 個使用中
金鑰的最小用量間隔到期時,主動重複使用資料表運算單元。
如果作業因資料表已滿而失敗,Keymaster 會傳回
ErrorCode::TOO_MANY_OPERATIONS
。
代碼:NO_AUTH_REQUIRED
版本:1、2、3、4
可重複?否
指定不需驗證即可使用這個金鑰。這個標記為 與 Tag::USER_SECURE_ID 互斥。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
標記:NONCE
版本:1、2、3、4
可重複?否
為 AES GCM、CBC 提供或傳回 Nonce 或 Initialization Vector (IV)。 像是點閱率加密或解密這個標記會提供給 開始 加密與解密作業這個程式庫只會提供給 開始 如果鍵含有 Tag::CALLER_NONCE。如未提供 系統將隨機產生適當的 Nonce 或 IV, Keymaster 並從起點傳回。
這個值是 blob (任意長度的位元組陣列)。允許的長度 取決於模式:GCM Nonce 長度為 12 個位元組。CBC 和點閱率 IV 都是 16 位元組。
代碼::功能
版本:1、2、3、4
可重複?否
指定金鑰的建立位置 (如果已知)。不得指定這個標記 因為在金鑰產生或匯入作業期間,請務必為 來自信任 let
Keymaster 3可能的值位於
android::hardware::keymaster::v3_0::KeyOrigin
:
enum class KeyOrigin : uint32_t { GENERATED = 0, DERIVED = 1, IMPORTED = 2, UNKNOWN = 3, };Keymaster 2 以下版本
可能值定義於 keymaster_origin_t
:
typedef enum { KM_ORIGIN_GENERATED = 0, KM_ORIGIN_IMPORTED = 2, KM_ORIGIN_UNKNOWN = 3, } keymaster_key_origin_t
值的完整含義不僅取決於值,也取決於值是否 它列在硬體強化或軟體強化特性清單中。
GENERATED
表示 Keymaster 產生了金鑰。
如果是硬體強制執行清單
金鑰是在安全的硬體中產生,且設有永久的硬體繫結。如果
位於軟體強制執行清單中,金鑰是在 SoftKeymaster 中產生,且
不受硬體限制
DERIVED
表示金鑰是在 Keymaster 中衍生。
可能存在於裝置外部。
IMPORTED
表示金鑰是在外部產生
匯入至 Keymaster 的
Keymaster。如果是硬體強制執行清單中設有永久繫結,
但可能會存在安全硬體外部的複本如果
軟體強制執行清單,金鑰已匯入 SoftKeymaster,但未匯入
硬體繫結
UNKNOWN
只能出現在硬體強制執行清單中。
它代表鍵
硬體繫結,但不知道金鑰原本是否在硬體上產生
安全硬體或已匯入的電腦只有在 keymaster0 硬體處於
如用於模擬 keymaster1 服務
代碼:ORIGINATION_EXPIRE_DATETIME
版本:1、2、3、4
可重複?否
指定金鑰的簽署日期和時間
加密。之後,如果嘗試透過
KeyPurpose::SIGN 或
已提供 KeyPurpose::ENCRYPT
無法「開始」失敗
搭配 ErrorCode::KEY_EXPIRED
。
這個值是一個 64 位元整數,代表毫秒, 1970 年 1 月 1 日。
代碼:OS_PATCHLEVEL
版本:2、3、4
可重複?否
這個標記一律不會傳送至 Keymaster TA,而是會新增至 由憑證授權協議 (TA) 提供硬體強制執行授權清單。
代碼值是 YYYYMM 格式的整數,其中 YYYY 是 最近更新的四位數年份,MM 代表最近一次更新的兩位數月份 更新。舉例來說,如果是在 Android 裝置上產生的金鑰,上次更新時間: 2015 年 12 月,這個值會是 201512。
如果金鑰的修補程式等級與目前的修補程式等級不同,則不會執行
可用性高嘗試使用這類金鑰的原因
begin、
getKeyCharacteristics、
或 exportKey
即可傳回 ErrorCode::KEY_REQUIRES_UPGRADE
。詳情請見
其他版本繫結
詳細資料。
標記::OS_VERSION
版本:2、3、4
可重複?否
這個標記一律不會傳送至 Keymaster TA,而是會新增至 由憑證授權協議 (TA) 提供硬體強制執行授權清單。
代碼值是 MMmms 格式的整數,其中 MM 是主要值 版本號碼,mm 代表子版本號碼,s 則是副次要版本 號碼。舉例來說,對於在 Android 4.0.3 版中產生的金鑰,值 就是 040003
標記:PADDING
版本:1、2、3、4
可重複?是
指定可與鍵搭配使用的邊框間距模式。這個標記為 與 RSA 和 AES 金鑰相關
可能的值定義如下:
Keymaster 3enum class PaddingMode : uint32_t { NONE = 1, RSA_OAEP = 2, RSA_PSS = 3, RSA_PKCS1_1_5_ENCRYPT = 4, RSA_PKCS1_1_5_SIGN = 5, PKCS7 = 64, };Keymaster 2 以下版本
typedef enum { KM_PAD_NONE = 1, KM_PAD_RSA_OAEP = 2, KM_PAD_RSA_PSS = 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4, KM_PAD_RSA_PKCS1_1_5_SIGN = 5, KM_PAD_PKCS7 = 64, } keymaster_padding_t;
「PaddingMode::RSA_OAEP
」和
已使用 PaddingMode::RSA_PKCS1_1_5_ENCRYPT
僅適用於 RSA 加密/解密金鑰,並指定 RSA PKCS#1v2 OAEP
填充和 RSA PKCS#1 v1.5 隨機填充。
「PaddingMode::RSA_PSS
」和
PaddingMode::RSA_PKCS1_1_5_SIGN
僅適用於回應式搜尋廣告
簽署/驗證金鑰,然後指定 RSA PKCS#1v2 PSS
padding 及 RSA PKCS#1 v1.5 確定性填充值。
「PaddingMode::NONE
」可搭配回應式搜尋廣告或
AES 金鑰。AES 金鑰 (如果使用 PaddingMode::NONE
)
區塊模式 ECB 或 CBC,以及要加密或解密的資料
不是某個 AES 區塊長度的倍數,則要結束的呼叫
失敗,發生 ErrorCode::INVALID_INPUT_LENGTH
。
PaddingMode::PKCS7
只能與 AES 金鑰搭配使用
只能使用 ECB 和 CBC 模式。
這個代碼可重複執行。必須在呼叫 的呼叫中指定邊框間距模式
begin
如果指定的模式未獲授權存取金鑰,作業就會失敗。
只在 ErrorCode::INCOMPATIBLE_BLOCK_MODE
。
代碼:PURPOSE
版本:1、2、3、4
可重複?是
指定這組金鑰的用途組合。
可能的值定義如下:
Keymaster 3enum class KeyPurpose : uint32_t { ENCRYPT = 0, DECRYPT = 1, SIGN = 2, VERIFY = 3, DERIVE_KEY = 4, // since 3.0 WRAP_KEY = 5, // since 3.0 };Keymaster 2 以下版本
typedef enum { KM_PURPOSE_ENCRYPT = 0, KM_PURPOSE_DECRYPT = 1, KM_PURPOSE_SIGN = 2, KM_PURPOSE_VERIFY = 3, } keymaster_purpose_t;
這個標記可重複進行;鍵可能會有多個值
但作業只有單一目的當
呼叫 begin 函式
開始作業,已指定作業的目的。
如果指定作業的用途未獲
鍵,作業失敗並顯示 ErrorCode::INCOMPATIBLE_PURPOSE
。
標記:RESET_SINCE_ID_ROTATION
版本:3、4
可重複?否
說明裝置是否已恢復原廠設定 從上次不重複 ID 輪替後開始至今用於金鑰認證。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
標記:ROLLBACK_RESISTANT
版本:1、2、3、4
可重複?否
表示金鑰可以復原,也就是在刪除時 依 deleteKey 或 deleteAllKeys、 金鑰保證將永久刪除且無法使用。有可能 沒有此標記的鍵可以刪除,然後從備份還原。
此標記是布林值,因此可能的值為 true (如果有標記的話) 傳回 false (如果沒有標記)。
標記::ROOT_OF_TRUST
版本:1、2、3、4
可重複?否
指定信任根,驗證開機程序會使用的金鑰 驗證啟動的作業系統 (如果有的話)。系統絕對不會提供這個代碼 以符合主要特性
標記:RSA_PUBLIC_EXPONENT
版本:1、2、3、4
可重複?否
指定 RSA 金鑰組的公開指數值。這個標記為 和 RSA 金鑰有關,而所有 RSA 金鑰的必要性。
這個值是 64 位元無正負號整數,符合
RSA 公開指數。這個值必須是質數。Trustlet 支援
值 2^16+1,可能也支援其他合理的值,特別是值 3。
如果未指定指數,或是不支援指定的指數,
金鑰產生失敗,並顯示 ErrorCode::INVALID_ARGUMENT
。
標記::UNIQUE_ID
版本:3、4
可重複?否
用於在認證中提供專屬 ID。
這個值是 blob,即任意長度的位元組陣列。
標記:USAGE_EXPIRE_DATETIME
版本:1、2、3、4
可重複?否
指明金鑰的效期截止日期和時間,
解密用途之後,如果嘗試透過
KeyPurpose::VERIFY 或
KeyUsage::DECRYPT 會提供給
begin 失敗
搭配 ErrorCode::KEY_EXPIRED
。
這個值是一個 64 位元整數,代表毫秒, 1970 年 1 月 1 日。
代碼:USER_AUTH_TYPE
版本:1、2、3、4
可重複?否
指定可能用於授權此方式的使用者驗證器類型
鍵。要求 Keymaster 使用具有此屬性的金鑰執行作業時
標記後,該權杖會收到驗證權杖,而權杖的
authenticator_type
欄位必須與標記中的值相符。
例如 (ntoh(token.authenticator_type) &
auth_type_tag_value) != 0
,其中 ntoh
是針對
會將網路排序整數轉換為主機排序整數,以及
auth_type_tag_value
是這個標記的值。
此值為列舉中值的 32 位元整數位元遮罩:
Keymaster 3enum class HardwareAuthenticatorType : uint32_t { NONE = 0u, // 0 PASSWORD = 1 << 0, FINGERPRINT = 1 << 1, ANY = UINT32_MAX, };Keymaster 2 以下版本
typedef enum { HW_AUTH_NONE = 0, HW_AUTH_PASSWORD = 1 << 0, HW_AUTH_FINGERPRINT = 1 << 1, // Additional entries should be powers of 2. HW_AUTH_ANY = UINT32_MAX, } hw_authenticator_type_t;
標記:USER_SECURE_ID
版本:1、2、3、4
可重複?是
指定金鑰只能用於特定的安全使用者 驗證狀態這個標記可以互斥 其中含有 Tag::NO_AUTH_REQUIRED。
這個值是指定驗證政策狀態的 64 位元整數 值必須出現在驗證權杖中 (提供給 開頭為 Tag::AUTH_TOKEN) 來授權使用金鑰。不限 呼叫 begin 附有此標記的鍵不提供 驗證權杖 如果驗證權杖沒有相符政策狀態值,就會失敗。
這個代碼可重複執行。如果提供的值與任何政策相符
狀態值,代表該金鑰已獲得授權。
否則,作業失敗,並顯示
ErrorCode::KEY_USER_NOT_AUTHENTICATED
。
代碼:VENDOR_PATCHLEVEL
版本:4
此標記會指定與金鑰相關聯的供應商映像檔安全性修補程式等級
。這個標記一律不會傳送至 Keymaster TA,而是會新增至
由憑證授權協議 (TA) 提供硬體強制執行授權清單。如果嘗試使用
Tag::VENDOR_PATCHLEVEL
值與目前執行中的值不同
系統修補程式等級造成 begin()
如要退貨,請點按 getKeyCharacteristics()
或 exportKey()
ErrorCode::KEY_REQUIRES_UPGRADE
。詳情請參閱 upgradeKey()
。
代碼值是 YYYYMMDD 格式的整數,其中 YYYY 是 上次更新時間的四位數年份,MM 為兩位數的月份,DD 則是 上次更新的兩位數。例如,對在 Cloud SQL 中 Android 裝置上次更新日期為 2018 年 6 月 5 日,這個值會是 20180605。
IKeymasterDevice HAL 必須從系統讀取目前的供應商修補程式等級
ro.vendor.build.security_patch
並傳送給
首次載入 HAL 時的安全環境 (機制
導入定義)。安全環境不得接受其他
修補程式等級,直到下次啟動
必須使用硬體強制執行。