Keymaster 授權標記

本頁提供了詳細說明,協助 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 3
enum 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

可重複?否

提供給 generateKeyimportKey 此標記指定了使用任何鍵時必要的資料。於 以及呼叫 exportKey,並且 getKeyCharacteristics 必須為 clientId 參數提供相同的值,而呼叫 需要提供 這個代碼和與「inParams」中相同的相關資料 設定。如果未提供正確的資料,函式會傳回 ErrorCode::INVALID_KEY_BLOB

此標記的內容會以加密方式繫結至金鑰, 也就是說,如果對手可以存取所有的 安全世界密鑰,但無權存取標記內容來解密 鍵,但禁止強制使用標記內容,應用程式可防止 指定充足的高熵內容

這個值是 blob (任意長度的位元組陣列)。

標記:APPLICATION_ID

版本:1、2、3、4

可重複?否

提供給 generateKeyimportKey 此標記指定了使用任何鍵時必要的資料。於 以及呼叫 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 3
enum 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_REQUIREMENTSKeyBlobUsageRequirements::STANDALONE,信任 let 會傳回金鑰 blob 不需檔案系統支援即可使用這對裝置來說非常重要 導致檔案系統無法使用 使用 Keymaster 金鑰解密磁碟。

標記:BLOCK_MODE

版本:1、2、3、4

可重複?是

指定可與金鑰搭配使用的區塊加密模式。 這個標記只與 AES 金鑰相關。

可能的值定義如下:

Keymaster 3
enum 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 3
enum 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 3
enum 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。

如果金鑰的修補程式等級與目前的修補程式等級不同,則不會執行 可用性高嘗試使用這類金鑰的原因 begingetKeyCharacteristics、 或 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 3
enum 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 3
enum 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

可重複?否

表示金鑰可以復原,也就是在刪除時 依 deleteKeydeleteAllKeys、 金鑰保證將永久刪除且無法使用。有可能 沒有此標記的鍵可以刪除,然後從備份還原。

此標記是布林值,因此可能的值為 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::VERIFYKeyUsage::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 3
enum 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 時的安全環境 (機制 導入定義)。安全環境不得接受其他 修補程式等級,直到下次啟動

必須使用硬體強制執行。