Keymaster 授權標記

本頁面提供詳細資訊,協助實作 Keymaster HAL 的實作者。內容涵蓋 HAL 中的每個標記,而該標記的 Keymaster 版本為 以及代碼是否可重複除非標記說明中另有註明 產生金鑰時,使用下列所有標記來指定金鑰

針對 Keymaster 4,標記是在 platform/hardware/interfaces/keymaster/keymaster-version/types.hal 中定義,例如 Keymaster 3 的 3.0/types.hal 和 Keymaster 4 的 4.0/types.hal。對於 Keymaster 2 以下版本,標記會定義在 platform/hardware/libhardware/include/hardware/keymaster_defs.h

如需瞭解函式,請參閱「Keymaster 函式」頁面。

標記:ACTIVE_DATETIME

版本:1、2、3、4

可重複執行?否

指定金鑰生效的日期和時間。在此之前,任何嘗試使用金鑰的動作都會失敗,並顯示 ErrorCode::KEY_NOT_YET_VALID

這個值是一個 64 位元整數,代表從 1 月 1 日開始計算的毫秒數, 1970 年。

Tag::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 此標記指定了使用任何鍵時必要的資料。具體來說,對 exportKeygetKeyCharacteristics 的呼叫必須在 clientId 參數中提供相同的值,而對 begin 的呼叫則需要提供此代碼和相同的關聯資料,做為 inParams 集的一部分。如果沒有提供正確資料,函式就會 會傳回 ErrorCode::INVALID_KEY_BLOB

這個標記的內容會以加密編譯方式繫結至金鑰,也就是說,如果有攻擊者可以存取所有安全世界機密,但無法存取標記內容,就無法解密金鑰 (除非以暴力破解方式取得標記內容)。

這個值是 blob,也就是任意長度的位元組陣列。

標記:::ASSOCIATED_DATA

版本:1、2、3、4

可重複?否

提供「關聯資料」適用於 AES-GCM 加密或解密。這個標記為 提供的 update 和 指定未加密/解密,但用於運算的資料 GCM 標記。

這個值是 blob,也就是任意長度的位元組陣列。

Tag::ATTESTATION_APPLICATION_ID

版本:3、4

可重複執行?否

用於識別可用的應用程式組合 已開始金鑰認證。

這個值是 blob,也就是任意長度的位元組陣列。

Tag::ATTESTATION_CHALLENGE

版本:3、4

可重複執行?否

用於在認證中提供挑戰。

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

標記:ATTESTATION_ID_BRAND

版本:3、4

可重複執行?否

提供裝置品牌名稱,由 Android 中的 Build.BRAND 傳回。只有在要求 裝置的識別碼

如果裝置不支援 ID 認證 (或 先前已呼叫 destroyAttestationIds(),且裝置可 金鑰認證要求,則在 此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

標記:ATTESTATION_ID_DEVICE

版本:3、4

可重複執行?否

提供 Build.DEVICE 所傳回裝置的裝置名稱 。只有在要求驗證裝置 ID 時,才會設定這個欄位。

如果裝置不支援 ID 認證 (或 先前已呼叫 destroyAttestationIds(),且裝置可 金鑰認證要求,則在 此代碼無法執行,並顯示 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

標記:ATTESTATION_ID_IMEI

版本:3、4

可重複執行?是

為裝置中的所有無線電提供 IMEI。只有在要求裝置 ID 認證時,系統才會設定這個欄位。

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

代碼:ATTESTATION_ID_MANUFACTURER

版本:3、4

可重複執行?否

提供裝置的製造商名稱 Android 中的 Build.MANUFACTURER。這個欄位只有在 要求取得裝置 ID 認證

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

標記:ATTESTATION_ID_MEID

版本:3、4

可重複?是

為裝置中的所有無線電提供 MEID。只有在要求裝置 ID 認證時,系統才會設定這個欄位。

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

標記:ATTESTATION_ID_MODEL

版本:3、4

可重複?否

提供 Android 中 Build.MODEL 傳回的裝置型號名稱。這個欄位只有在 要求取得裝置 ID 認證

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

標記:ATTESTATION_ID_PRODUCT

版本:3、4

可重複?否

提供由 Android 中的 Build.PRODUCT。只有在要求裝置 ID 認證時,系統才會設定這個欄位。

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

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

標記:ATTESTATION_ID_SERIAL

版本:3、4

可重複?否

提供裝置的序號。只有在要求裝置 ID 認證時,系統才會設定這個欄位。

如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds(),且裝置無法再認證其 ID),則任何包含此標記的金鑰認證要求都會失敗,並傳回 ErrorCode::CANNOT_ATTEST_IDS

這個值是 blob,也就是任意長度的位元組陣列。

Tag::AUTH_TIMEOUT

版本:1、2、3、4

可重複執行?否

指定金鑰在驗證後,可使用的時間長度 (以秒為單位)。如果 Tag::USER_SECURE_ID 存在,而這個標記不存在,則金鑰每次使用時都需要驗證 (請參閱「開始」一節,瞭解驗證每個作業流程的詳細資訊)。

這個值是 32 位元整數,可指定使用者成功通過驗證後的時間 (以秒為單位),驗證方式則是使用 Tag::USER_AUTH_TYPE 指定的驗證方法,而 Tag::USER_SECURE_ID 則指定使用者。使用者必須通過驗證,才能使用金鑰。

Tag::AUTH_TOKEN

版本:1、2、3、4

可重複執行?否

提供驗證權杖開始更新完成,以證明需要驗證的金鑰作業 (金鑰具有 Tag::USER_SECURE_ID)。

這個值是包含 hw_auth_token_t 結構的 Blob。

Tag::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;

您可以在產生金鑰時指定這個標記,要求金鑰必須在指定條件下才能使用。必須搭配 generateKeygetKeyCharacteristics 的鍵屬性傳回。如果呼叫端使用 KeyBlobUsageRequirements::STANDALONE 值指定 Tag::BLOB_USAGE_REQUIREMENTS,信任元件會傳回可在沒有檔案系統支援下使用的金鑰 blob。這對裝置來說非常重要 與加密磁碟相比,檔案系統在 使用 Keymaster 金鑰解密磁碟。

Tag::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 金鑰作業,請在 beginadditionalParams 引數中指定模式。如果指定的模式並非處於與鍵相關聯的模式,則 作業失敗,並顯示 ErrorCode::INCOMPATIBLE_BLOCK_MODE

代碼:BOOT_PATCHLEVEL

版本:4

標記:BOOT_PATCHLEVEL 會指定啟動映像檔 (核心) 安全性修補程式等級 可與鍵搭配使用這個標記絕不會傳送至 Keymaster TA,而是由 TA 新增至硬體強制執行的授權清單。任何嘗試 請使用 Tag::BOOT_PATCHLEVEL 值與 目前執行系統修補程式等級會造成 begin() 如要退貨,請點按 getKeyCharacteristics()exportKey() ErrorCode::KEY_REQUIRES_UPGRADE。詳情請參閱 upgradeKey()

標記的值為 YYYYMMDD 格式的整數,其中 YYYY 是上次更新的四位數年份,MM 是上次更新的兩位數月份,而 DD 則是上次更新的兩位數日期。舉例來說,如果是在 2018 年 6 月 5 日上次更新的 Android 裝置上產生金鑰,這個值會是 20180605。如果不知道日期,可以改用 00。

在每次啟動期間,系統啟動載入程式都必須提供開機映像檔的修補程式等級 通往安全的環境 (機制為實作定義)。

必須由硬體強制執行。

標記::BOOTLOADER_ONLY

版本:1、2、3、4

可重複?否

只有系統啟動載入程式可以使用金鑰。

這個標記是布林值,因此可能的值為 true (如果標記存在) 和 false (如果標記不存在)。

任何嘗試使用 Android 系統中的 Tag::BOOTLOADER_ONLY 金鑰的動作,都會因 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

可重複執行?是

指定可與要執行的金鑰搭配使用的摘要演算法 簽署和驗證作業。這個標記與 RSA、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;

這個代碼可重複執行。如要進行簽署和驗證作業,請在 beginadditionalParams 引數中指定摘要。如果指定的摘要不在與金鑰相關聯的摘要中,作業會失敗並顯示 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

Tag::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 記憶體通常有限,這個資料表可以有固定的最大大小,而 Keymaster 在資料表已滿的情況下,嘗試使用帶有此標記的金鑰時,可能會導致作業失敗。表格至少要能容納 16 個按鍵。如果作業因資料表已滿而失敗,Keymaster 會傳回 ErrorCode::TOO_MANY_OPERATIONS

標記:MIN_MAC_LENGTH

版本:1、2、3、4

可重複執行?否

這個標記會針對支援 GCM 模式的 HMAC 金鑰和 AES 金鑰,指定可使用此金鑰要求或驗證 MAC 的最低長度。

這個值是 MAC 長度下限 (以位元為單位)。是 8 的倍數。對於 HMAC 金鑰,值至少為 64。對於 GCM 鍵,值至少為 96,最多為 128。

標記:MIN_SECONDS_BETWEEN_OPS

版本:1、2、3、4

可重複執行?否

指定間隔時間下限 來處理這類作業這可用來在結構定義中使用鍵的頻率限制 使用次數不限時可能會遭受暴力攻擊

這個值是 32 位元整數,代表允許之間的秒數 作業。

當在作業中使用含有此標記的鍵時,請在 finishabort 呼叫期間啟動計時器。不限 呼叫 begin 表示在計時器之前 Tag::MIN_SECONDS_BETWEEN_OPS 已經過失敗, ErrorCode::KEY_RATE_LIMIT_EXCEEDED。這表示 Trustlet 會為具有此標記的金鑰保留使用計數器表格。由於 Keymaster 的記憶體容量通常有限,因此這個資料表可以有固定的數量上限 嘗試以這個標記使用金鑰的作業大小和 Keymaster 可能會失敗 就。表格至少需要有 32 個使用中 金鑰的最小用量間隔到期時,主動重複使用資料表運算單元。 如果作業因資料表已滿而失敗,Keymaster 會傳回 ErrorCode::TOO_MANY_OPERATIONS

Tag::NO_AUTH_REQUIRED

版本:1、2、3、4

可重複執行?否

指定使用此金鑰時不需要驗證。這個標記為 與 Tag::USER_SECURE_ID 互斥。

這個標記是布林值,因此可能的值為 true (如果標記存在) 和 false (如果標記不存在)。

標記:::NONCE

版本:1、2、3、4

可重複?否

為 AES GCM、CBC 或 CTR 加密或解密作業提供或傳回 Nonce 或初始化向量 (IV)。這個標記會在加密和解密作業期間開始提供。只有在金鑰具有 Tag::CALLER_NONCE 時,才會提供給 begin。如果未提供,Keymaster 會隨機產生適當的 Nonce 或 IV,並從 begin 傳回。

這個值是 blob,也就是任意長度的位元組陣列。允許的長度取決於模式:GCM 隨機碼長度為 12 個位元組;CBC 和 CTR IV 長度為 16 個位元組。

Tag::ORIGIN

版本: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::SIGNKeyPurpose::ENCRYPT 提供給 begin 的金鑰,都會因 ErrorCode::KEY_EXPIRED 而失敗。

這個值是 64 位元整數,代表自 1970 年 1 月 1 日起算的毫秒數。

標記:OS_PATCHLEVEL

版本:2、3、4

可重複執行?否

這個標記一律不會傳送至 Keymaster TA,而是會新增至 由憑證授權協議 (TA) 提供硬體強制執行授權清單。

標記的值為 YYYYMM 格式的整數,其中 YYYY 是上次更新的四位數年份,而 MM 是上次更新的兩位數月份。舉例來說,如果金鑰是在 2015 年 12 月最後更新的 Android 裝置上產生,這個值會是 201512。

如果金鑰的修補程式等級與目前的修補程式等級不同,則不會執行 可用性高嘗試使用這類鍵時,begingetKeyCharacteristicsexportKey 會傳回 ErrorCode::KEY_REQUIRES_UPGRADE。詳情請參閱「版本繫結」。

標記::OS_VERSION

版本:2、3、4

可重複執行?否

這個標記一律不會傳送至 Keymaster TA,而是會新增至 由憑證授權協議 (TA) 提供硬體強制執行授權清單。

標記的值為 MMmmss 的整數,其中 MM 為主要版本號碼、mm 為次要版本號碼,而 ss 為次要次要版本號碼。舉例來說,如果金鑰是在 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_OAEPPaddingMode::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 可搭配 RSA 或 AES 金鑰使用。AES 金鑰 (如果使用 PaddingMode::NONE) 區塊模式 ECB 或 CBC,以及要加密或解密的資料 並非很長的 AES 區塊大小倍數 失敗,發生 ErrorCode::INVALID_INPUT_LENGTH

PaddingMode::PKCS7 只能搭配 AES 金鑰使用,且只能搭配 ECB 和 CBC 模式使用。

這個代碼可重複執行。您必須在呼叫 begin 時指定填充模式。如果指定的模式未獲授權,作業就會失敗。 只在 ErrorCode::INCOMPATIBLE_BLOCK_MODE

標記:目的

版本: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

可重複執行?否

指定信任根,這是驗證開機程序用來驗證已啟動的作業系統 (如有) 的金鑰。這個標記絕不會在 Keymaster 的鍵屬性中提供或傳回。

標記:::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 時的安全環境 (機制 導入定義)。安全環境不得接受其他 修補程式等級,直到下次啟動

必須由硬體強制執行。