Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

密鑰管理員授權標籤

本頁提供詳細信息,以幫助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位整數,表示自1970年1月1日以來的毫秒數。

標籤::算法

版本 :1,2,3,4

可重複嗎?沒有

指定與密鑰一起使用的加密算法。

可能的值由以下枚舉定義:

按鍵大師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時 ,此標記指定在密鑰的所有使用期間必需的數據。特別是,對exportKeygetKeyCharacteristics的調用需要為clientId參數提供相同的值,而對begin的調用需要提供此標記和相同的相關數據作為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加密或解密的“關聯數據”。提供此標籤是為了更新和指定未加密/解密但用於計算GCM標籤的數據。

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_APPLICATION_ID

版本 :3,4

可重複嗎?沒有

用於標識已啟動密鑰證明的一組可能的應用程序。

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_CHALLENGE

版本 :3,4

可重複嗎?沒有

用於提供證明中的挑戰。

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_BRAND

版本 :3,4

可重複嗎?沒有

提供設備的品牌名稱,由Android中的Build.BRAND返回。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或先前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_DEVICE

版本 :3,4

可重複嗎?沒有

提供設備的設備名稱,由Android中的Build.DEVICE返回。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_IMEI

版本 :3,4

可重複嗎?是

為設備上的所有無線電提供IMEI。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_MANUFACTURER

版本 :3,4

可重複嗎?沒有

提供設備的製造商名稱,該名稱由Android中的Build.MANUFACTURER返回。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_MEID

版本 :3,4

可重複嗎?是

提供設備上所有無線電的MEID。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_MODEL

版本 :3,4

可重複嗎?沒有

提供設備的型號名稱,由Android中的Build.MODEL返回。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_PRODUCT

版本 :3,4

可重複嗎?沒有

提供設備的產品名稱,由Android中的Build.PRODUCT返回。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或先前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: ATTESTATION_ID_SERIAL

版本 :3,4

可重複嗎?沒有

提供設備的序列號。僅當請求證明設備標識符時才設置此字段。

如果設備不支持ID證明(或者以前調用了destroyAttestationIds()並且設備不再能夠證明其ID),則包含該標籤的任何密鑰證明請求都將失敗,並顯示ErrorCode::CANNOT_ATTEST_IDS

該值為blob,即字節的任意長度的數組。

標記:: AUTH_TIMEOUT

版本 :1,2,3,4

可重複嗎?沒有

指定認證後授權使用密鑰的時間(以秒為單位)。如果存在Tag :: USER_SECURE_ID而沒有該標籤,則密鑰需要針對每種用法​​進行身份驗證(有關每次操作身份驗證流程的詳細信息,請參閱開始 )。

該值是一個32位整數,用於指定通過Tag :: USER_AUTH_TYPE指定的身份驗證方法可以成功使用Tag :: USER_SECURE_ID指定的用戶後,以秒為單位的時間。

標記:: AUTH_TOKEN

版本 :1,2,3,4

可重複嗎?沒有

提供一個開始更新完成身份驗證令牌 ,以證明需要該密鑰操作的用戶身份驗證(密鑰具有Tag :: USER_SECURE_ID )。

該值是一個blob,其中包含hw_auth_token_t結構。

標記:: BLOB_USAGE_REQUIREMENTS

版本 :1,2,3,4

可重複嗎?沒有

指定要使用的生成密鑰的必要係統環境條件。

可能的值由以下枚舉定義:

按鍵大師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密鑰解密磁盤之後,文件系統才可用。

標記:: BLOCK_MODE

版本 :1,2,3,4

可重複嗎?是

指定可以與密鑰一起使用的分組密碼模式。該標籤僅與AES密鑰相關。

可能的值由以下枚舉定義:

按鍵大師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

Tag :: BOOT_PATCHLEVEL指定可以與密鑰一起使用的引導映像(內核)安全補丁程序級別。該標籤從不發送到密鑰管理員TA,而是由TA添加到硬件強制授權列表中。任何嘗試使用Tag::BOOT_PATCHLEVEL值與當前正在運行的系統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

可重複嗎?沒有

指定調用者可以為需要立即數的操作提供隨機數。

此標記是布爾值,因此可能的值是true(如果存在標記)和false(如果沒有標記)。

此標記僅用於AES密鑰,並且僅與CBC,CTR和GCM塊模式相關。如果標籤不存在,實現應該拒絕提供任何操作標籤:: NONCE開始ErrorCode::CALLER_NONCE_PROHIBITED

標記:: CREATION_DATETIME

版本 :1,2,3,4

可重複嗎?沒有

指定創建密鑰的日期和時間,自1970年1月1日起以毫秒為單位。此標記是可選的,僅供參考。

標記::摘要

版本 :1,2,3,4

可重複嗎?是

指定可以與密鑰一起使用的摘要算法,以執行簽名和驗證操作。該標籤與RSA,ECDSA和HMAC密鑰相關。

可能的值由以下枚舉定義:

按鍵大師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的說法開始 。如果指定的摘要不在與鍵關聯的摘要中,則操作失敗,並顯示ErrorCode::INCOMPATIBLE_DIGEST

標籤:: EC_CURVE

版本 :2,3,4

可重複嗎?沒有

在Keymaster 1中,根據指定的密鑰大小來猜測用於EC密鑰的曲線。為了提高靈活性,Keymaster 2引入了一種明確的方式來指定曲線。 EC密鑰生成請求可以具有Tag::EC_CURVETag::KEY_SIZE或兩者都有。

可能的值由以下枚舉定義:

按鍵大師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位整數,表示每次引導使用。

在操作中使用帶有此標籤的鍵時,在開始調用期間,應將與鍵相關的計數器加1。密鑰計數器超過此值之後,所有隨後的使用密鑰的嘗試都會失敗,並顯示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位整數,表示允許的操作之間的秒數。

在操作中使用帶有此標籤的鍵時,請在完成中止調用期間啟動計時器。計時器之前收到的任何開始調用都指示Tag::MIN_SECONDS_BETWEEN_OPS指定的時間間隔已失敗,並顯示ErrorCode::KEY_RATE_LIMIT_EXCEEDED 。這意味著trustlet會為帶有此標籤的密鑰保留一個使用情況計數器表。由於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或CTR加密或解密的隨機數或初始化向量(IV)。提供此標籤是為了在加密和解密操作期間開始 。它只是提供給開始鍵是否有標籤:: CALLER_NONCE 。如果未提供,Keymaster將隨機生成適當的隨機數或IV並從開始返回。

該值為blob,即字節的任意長度的數組。允許的長度取決於模式:GCM隨機數的長度為12個字節; CBC和CTR IV的長度為16個字節。

標記::原始

版本 :1,2,3,4

可重複嗎?沒有

指定創建密鑰的位置(如果知道)。可能不會在密鑰生成或導入期間指定此標記,並且必須由trustlet將其添加到密鑰特徵中。

按鍵大師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表示密鑰管理器已生成密鑰。如果在硬件強制列表中,則密鑰是在安全硬件中生成的,並且是永久性硬件綁定的。如果在軟件強制列表中,則該密鑰是在SoftKeymaster中生成的,並且不受硬件限制。

DERIVED表示密鑰是在Keymaster內部派生的。可能存在設備外。

IMPORTED表明該密鑰生成鑰匙大師之外並導入到鑰匙大師。如果在硬件強制列表中,則它是永久硬件綁定的,儘管可能存在安全硬件之外的副本。如果在軟件強制列表中,則密鑰已導入到SoftKeymaster中,並且沒有硬件綁定。

UNKNOWN應該僅出現在硬件強制列表中。它指示密鑰是受硬件綁定的,但是不知道密鑰是最初在安全硬件中生成還是被導入。僅在使用keymaster0硬件來模擬keymaster1服務時才會發生這種情況。

標記:: ORIGINATION_EXPIRE_DATETIME

版本 :1,2,3,4

可重複嗎?沒有

指定密鑰過期的日期和時間,以用於簽名和加密。在此之後,任何企圖利用一鍵KeyPurpose :: SIGNKeyPurpose :: ENCRYPT提供的開始失敗, ErrorCode::KEY_EXPIRED

該值是一個64位整數,表示自1970年1月1日以來的毫秒數。

標記:: OS_PATCHLEVEL

版本 :2,3,4

可重複嗎?沒有

該標籤從不發送到密鑰管理員TA,而是由TA添加到硬件強制授權列表中。

標籤的值是格式為YYYYMM的整數,其中YYYY是最後一次更新的四位數年份,而MM是最後一次更新的兩位數月份。例如,對於在2015年12月最後一次更新的Android設備上生成的密鑰,其值為201512。

補丁程序級別與當前補丁程序級別不同的密鑰不可用。嘗試使用此類鍵會導致begingetKeyCharacteristicsexportKey返回ErrorCode::KEY_REQUIRES_UPGRADE 。有關更多詳細信息,請參見版本綁定

標記:: OS_VERSION

版本 :2,3,4

可重複嗎?沒有

該標籤從不發送到密鑰管理員TA,而是由TA添加到硬件強制授權列表中。

標籤的值是MMmmss形式的整數,其中MM是主要版本號,mm是次要版本號,而ss是次要版本號。例如,對於在Android版本4.0.3上生成的密鑰,其值為040003。

標籤::填充

版本 :1,2,3,4

可重複嗎?是

指定可以與鍵一起使用的填充模式。該標籤與RSA和AES密鑰有關。

可能的值由以下枚舉定義:

按鍵大師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_PSSPaddingMode::RSA_PKCS1_1_5_SIGN僅用於RSA簽名/驗證密鑰,並分別指定RSA PKCS#1v2 PSS填充和RSA PKCS#1 v1.5確定性填充。

PaddingMode::NONE可以與RSA或AES密鑰一起使用。對於AES密鑰,如果PaddingMode::NONE與塊模式ECB或CBC一起使用,並且要加密或解密的數據不是AES塊大小的倍數,則完成調用失敗,並顯示ErrorCode::INVALID_INPUT_LENGTH

PaddingMode::PKCS7只能與AES密鑰一起使用,並且只能與ECB和CBC模式一起使用。

該標籤是可重複的。必須在呼叫開始中指定填充模式。如果未為密鑰授權指定的模式,則操作將失敗,並顯示ErrorCode::INCOMPATIBLE_BLOCK_MODE

標籤::目的

版本 :1,2,3,4

可重複嗎?是

指定可以使用密鑰的目的集。

可能的值由以下枚舉定義:

按鍵大師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或從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 :: VERIFYKeyPurpose :: DECRYPT 開始使用密鑰的任何嘗試都會失敗,並顯示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位整數位掩碼:

按鍵大師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位的整數,指定其需要存在在認證令牌中的認證策略的狀態值(提供給開始標籤:: AUTH_TOKEN )以授權對密鑰的使用。任何以該標籤的密鑰開頭的呼叫,如果沒有提供身份驗證令牌,或者提供的身份驗證令牌沒有匹配的策略狀態值,則調用將失敗。

該標籤是可重複的。如果提供的任何值與身份驗證令牌中的任何策略狀態值匹配,則該密鑰被授權使用。否則,操作將失敗,並顯示ErrorCode::KEY_USER_NOT_AUTHENTICATED

標記:: VENDOR_PATCHLEVEL

版本 :4

此標記指定可以使用密鑰的供應商映像安全補丁程序級別。該標籤從不發送到密鑰管理員TA,而是由TA添加到硬件強制授權列表中。嘗試使用Tag::VENDOR_PATCHLEVEL值與當前正在運行的系統Tag::VENDOR_PATCHLEVEL不同的鍵的任何嘗試都必須使begin()getKeyCharacteristics()exportKey()返回ErrorCode::KEY_REQUIRES_UPGRADE 。有關詳細信息,請參見upgradeKey()

標籤的值是格式為YYYYMMDD的整數,其中YYYY是上次更新的四位數年份,MM是兩位數的月份,DD是最後更新的兩位數的日期。例如,對於最後一次於2018年6月5日更新的Android設備上生成的密鑰,其值為20180605。

IKeymasterDevice HAL必須從系統屬性ro.vendor.build.security_patch讀取當前的供應商ro.vendor.build.security_patch並在首次加載HAL時將其交付到安全環境(機制是實現定義的)。安全環境必須等到下一次引導後才能接受其他補丁程序級別。

必須是硬件強制的。