金鑰和 ID 認證

Keystore 提供更安全的位置,可讓您以受控方式建立、儲存及使用加密編譯金鑰。如果裝置提供硬體支援金鑰儲存空間,且您使用這類空間,金鑰內容就不容易遭到擷取,KeyMint (舊稱 Keymaster) 也會強制執行難以規避的限制。

不過,只有在 Keystore 金鑰已知位於採用專屬硬體的儲存空間時,這項說法才成立。在 Keymaster 1 中,應用程式或遠端伺服器無法可靠地驗證是否為這種情況。金鑰儲存空間 Daemon 載入可用的 Keymaster 硬體抽象層 (HAL),並相信 HAL 關於金鑰採用專屬硬體的說法。

為解決這個問題,Android 7.0 (Keymaster 2) 推出了金鑰認證,Android 8.0 (Keymaster 3) 則推出了 ID 認證。

金鑰認證的目的是提供一種方法,可強力判斷非對稱金鑰組是否採用專屬硬體、金鑰的屬性為何,以及金鑰的使用限制條件。

ID 驗證可讓裝置提供硬體 ID 的證明,例如序號或 IMEI。

金鑰認證

為支援金鑰認證,Android 7.0 導入了一組 HAL 的標記、型別和方法。

標記

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

類型

Keymaster 2 以下版本

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

AttestKey 方法

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 以下版本

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev 是 Keymaster 裝置結構。
  • keyToAttest 是從 generateKey 傳回的金鑰 BLOB,用來建立驗證。
  • attestParams 是驗證所需的任何參數清單。包括 Tag::ATTESTATION_CHALLENGETag::RESET_SINCE_ID_ROTATION (可能),以及 Tag::APPLICATION_IDTag::APPLICATION_DATA。如果是在金鑰產生期間指定,後兩者是解密金鑰 Blob 的必要條件。
  • certChain 是輸出參數,會傳回憑證陣列。項目 0 是驗證憑證,也就是認證 keyToAttest 中的金鑰,並包含驗證擴充功能。

attestKey 方法會對經過認證的金鑰執行公開金鑰作業,因為隨時可以呼叫這個方法,且不需要符合授權限制。舉例來說,如果經過認證的金鑰需要使用者驗證才能使用,則可產生認證,不必進行使用者驗證。

認證憑證

認證憑證是標準的 X.509 憑證,其中包含認證擴充功能 (選用),內含認證金鑰的說明。憑證會使用經過認證的認證金鑰簽署。驗證金鑰使用的演算法可能與要驗證的金鑰不同。

認證證明包含下表中的欄位,且不得包含任何額外欄位。部分欄位會指定固定欄位值。CTS 測試會驗證憑證內容是否完全符合定義。

憑證 SEQUENCE

欄位名稱 (請參閱 RFC 5280)
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm 用於簽署金鑰的演算法 AlgorithmIdentifier:
EC 金鑰使用 ECDSA,RSA 金鑰使用 RSA。
signatureValue BIT STRING,在 ASN.1 DER 編碼的 tbsCertificate 上計算的簽章。

TBSCertificate SEQUENCE

欄位名稱 (請參閱 RFC 5280)
version INTEGER 2 (表示 v3 憑證)
serialNumber INTEGER 1 (固定值:所有認證皆相同)
signature 用於簽署金鑰的演算法 AlgorithmIdentifier:EC 金鑰為 ECDSA,RSA 金鑰為 RSA。
issuer 與批次認證金鑰的主體欄位相同。
validity 兩個日期的 SEQUENCE,包含 Tag::ACTIVE_DATETIMETag::USAGE_EXPIRE_DATETIME 的值。 這些值是以自 1970 年 1 月 1 日起的毫秒為單位。 如要瞭解憑證中正確的日期表示法,請參閱 RFC 5280
如果沒有 Tag::ACTIVE_DATETIME,請使用 Tag::CREATION_DATETIME 的值。如果沒有 Tag::USAGE_EXPIRE_DATETIME,請使用批次認證金鑰憑證的到期日。
subject CN =「Android Keystore Key」(固定值:所有憑證都相同)
subjectPublicKeyInfo 包含經過認證公開金鑰的 SubjectPublicKeyInfo。
extensions/Key Usage digitalSignature:如果金鑰具有 KeyPurpose::SIGNKeyPurpose::VERIFY 用途,請設定這個值。所有其他位元都未設定。
extensions/CRL Distribution Points 待定
extensions/"attestation" OID 為 1.3.6.1.4.1.11129.2.1.17,內容定義於下方的「認證擴充功能」一節。與所有 X.509 憑證擴充功能一樣,內容會以 OCTET_STRING 表示,其中包含認證 SEQUENCE 的 DER 編碼。

認證擴充功能

attestation」擴充功能包含 OID 1.3.6.1.4.1.11129.2.1.17。當中包含受認證金鑰組的相關資訊,以及金鑰產生時的裝置狀態。

AIDL 介面規格中定義的 Keymaster/KeyMint 標記類型會轉換為 ASN.1 類型,如下所示:

KeyMint 或 Keymaster 類型 ASN.1 類型 附註
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER 自 1970 年 1 月 1 日 00:00:00 GMT 算起的毫秒數。
BOOL NULL 標記存在表示 true,不存在表示 false。
BIGNUM 沒有任何代碼屬於這個類型,因此未定義任何對應。
BYTES OCTET_STRING

結構定義

認證擴充功能的內容由下列 ASN.1 結構定義說明。AuthorizationList 的 ASN.1 架構也用於匯入加密金鑰。凡是不會顯示在驗證擴充功能中的欄位,都會註明原因。

版本 500

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 500
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 500
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    mlDsaVariant                [11] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 400

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    keyMintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash                 [724] EXPLICIT OCTET_STRING OPTIONAL,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 300

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei    [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 200

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 100

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    keymintSecurityLevel         SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest                  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly              [305] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit            [405] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 4

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation    [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 3

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
    StrongBox                    (2),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL, # Non-attestation
    minMacLength                 [8] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance         [303] EXPLICIT NULL OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL, # Non-attestation
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [509] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel           [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel             [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
    verifiedBootHash           OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

版本 2

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId   [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand         [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice        [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct       [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial        [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei          [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid          [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel         [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey           OCTET_STRING,
    deviceLocked              BOOLEAN,
    verifiedBootState         VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified                  (0),
    SelfSigned                (1),
    Unverified                (2),
    Failed                    (3),
}

版本 1

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software                     (0),
    TrustedEnvironment           (1),
}

AuthorizationList ::= SEQUENCE {
    purpose                      [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm                    [2] EXPLICIT INTEGER OPTIONAL,
    keySize                      [3] EXPLICIT INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent          [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime             [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime        [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    allApplications            [600] EXPLICIT NULL OPTIONAL,
    creationDateTime           [701] EXPLICIT INTEGER OPTIONAL,
    origin                     [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant          [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust                [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion                  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel               [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey            OCTET_STRING,
    deviceLocked               BOOLEAN,
    verifiedBootState          VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified                   (0),
    SelfSigned                 (1),
    Unverified                 (2),
    Failed                     (3),
}

KeyDescription 欄位

attestationVersion
ASN.1 結構定義版本。
KeyMint 或 Keymaster 版本
1Keymaster 2.0 版
2Keymaster 3.0 版
3Keymaster 4.0 版
4Keymaster 4.1 版
100KeyMint 1.0 版
200KeyMint 2.0 版
300KeyMint 3.0 版
400KeyMint 4.0 版
500KeyMint 5.0 版
attestationSecurityLevel

儲存認證金鑰的位置安全等級

keymasterVersion/keyMintVersion
KeyMint 或 Keymaster HAL 實作項目的版本。
KeyMint 或 Keymaster 版本
2Keymaster 2.0 版
3Keymaster 3.0 版
4Keymaster 4.0 版
41Keymaster 4.1 版
100KeyMint 1.0 版
200KeyMint 2.0 版
300KeyMint 3.0 版
400KeyMint 4.0 版
500KeyMint 5.0 版
keymasterSecurityLevel/keyMintSecurityLevel
KeyMint 或 Keymaster 實作的安全等級
attestationChallenge
金鑰產生時提供的驗證問題。
uniqueId
系統應用程式可在金鑰產生時要求使用的隱私權敏感裝置 ID。如果未要求專屬 ID,這個欄位會留空。 詳情請參閱「專屬 ID」一節。
softwareEnforced
由 Android 系統強制執行的 KeyMint 或 Keymaster 授權清單。這項資訊是由平台中的程式碼收集或產生。只要裝置執行的作業系統符合 Android 平台安全模式 (也就是裝置的系統啟動載入程式已鎖定,且 verifiedBootStateVerified),即可信任裝置。
hardwareEnforced
由裝置的受信任執行環境 (TEE) 或 StrongBox 強制執行的 KeyMint 或 Keymaster 授權清單。 這項資訊是由安全硬體中的程式碼收集或產生,不受平台控制。舉例來說,資訊可以來自啟動載入程式,或透過不涉及信任平台的安全通訊管道取得。

SecurityLevel 值

SecurityLevel 值表示金鑰儲存區相關元素 (例如金鑰組和驗證) 對於攻擊的韌性程度。

意義
Software 只要裝置的 Android 系統符合 Android 平台安全防護模型 (也就是裝置的系統啟動載入程式已鎖定,且 verifiedBootStateVerified),裝置就是安全的。
TrustedEnvironment 只要 TEE 未遭入侵,就能確保安全。Android 相容性定義說明文件第 9.11 節 [C-1-1] 至 [C-1-4] 定義了 TEE 的隔離要求。TEE 可強力抵禦遠端入侵,並適度抵禦直接硬體攻擊造成的入侵。
StrongBox 只要 StrongBox 未遭入侵,就能確保安全。StrongBox 是在類似於硬體安全性模組的安全元件中實作。Android 相容性定義說明文件第 9.11.2 節定義了 StrongBox 的實作要求。StrongBox 可有效防範遠端入侵,以及直接硬體攻擊 (例如實體竄改和旁路攻擊)。

AuthorizationList 欄位

每個欄位都會對應至 AIDL 介面規格中的 Keymaster/KeyMint 授權標記。授權標記的真實來源是規格:標記的意義、內容格式、是否應出現在 KeyDescription 物件的 softwareEnforcedhardwareEnforced 欄位、是否與其他標記互斥等。所有 AuthorizationList 欄位皆為選填。

每個欄位都有一個 EXPLICIT 內容專屬標記,等於 KeyMint 或 Keymaster 標記編號,可在 AuthorizationList 中以更精簡的方式呈現資料。因此,ASN.1 剖析器必須知道每個內容專屬標記的預期資料類型。舉例來說,Tag::USER_AUTH_TYPE 定義為 ENUM | 504。在認證擴充功能結構定義中,AuthorizationList 中的 purpose 欄位會指定為 userAuthType [504] EXPLICIT INTEGER OPTIONAL。因此,其 ASN.1 編碼會包含內容專屬標記 504,而非 ASN.1 型別 INTEGERUNIVERSAL 類別標記,也就是 10

KeyMint 5 產生的認證包含下列欄位:
purpose
對應至使用標記 ID 值 1 的 Tag::PURPOSE 授權標記。
algorithm

對應至使用標記 ID 值 2 的 Tag::ALGORITHM 授權標記。

在認證 AuthorizationList 物件中,演算法的值一律為 RSAECML_DSA

keySize
對應至使用標記 ID 值 3 的 Tag::KEY_SIZE 授權標記。
blockMode
對應至使用標記 ID 值 4 的 Tag::BLOCK_MODE 授權標記。
digest
對應至使用標記 ID 值 5 的 Tag::DIGEST 授權標記。
padding
對應至使用標記 ID 值 6 的 Tag::PADDING 授權標記。
callerNonce
對應至使用標記 ID 值 7 的 Tag::CALLER_NONCE 授權標記。認證中絕不會出現這個標記。
minMacLength
對應至使用標記 ID 值 8 的 Tag::MIN_MAC_LENGTH 授權標記。認證中絕不會出現這個標記。
ecCurve

對應至使用標記 ID 值 10 的 Tag::EC_CURVE 授權標記。

這組參數是用來在 Android 系統 KeyStore 中產生橢圓曲線 (EC) 金鑰組 (使用 ECDSA 進行簽署和驗證)。

mlDsaVariant

只存在於金鑰認證 500 以上版本中。

對應至使用標記 ID 值 11 的 Tag::ML_DSA_VARIANT 授權標記。

rsaPublicExponent
對應至使用標記 ID 值 200 的 Tag::RSA_PUBLIC_EXPONENT 授權標記。
mgfDigest

只存在於金鑰認證 100 以上版本中。

對應至使用標記 ID 值 203 的 Tag::RSA_OAEP_MGF_DIGEST KeyMint 授權標記。
rollbackResistance

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 303 的 Tag::ROLLBACK_RESISTANCE 授權標記。

earlyBootOnly

只存在於金鑰認證 4 以上版本中。

對應至使用標記 ID 值 305 的 Tag::EARLY_BOOT_ONLY 授權標記。

activeDateTime
對應至使用標記 ID 值 400 的 Tag::ACTIVE_DATETIME 授權標記。
originationExpireDateTime
對應至使用標記 ID 值 401 的 Tag::ORIGINATION_EXPIRE_DATETIME 授權標記。
usageExpireDateTime
對應至使用標記 ID 值 402 的 Tag::USAGE_EXPIRE_DATETIME 授權標記。
usageCountLimit
對應至使用標記 ID 值 405 的 Tag::USAGE_COUNT_LIMIT 授權標記。
userSecureId
對應至使用標記 ID 值 502 的 Tag::USER_SECURE_ID 授權標記。認證中絕不會出現這個標記。
noAuthRequired

對應至使用標記 ID 值 503 的 Tag::NO_AUTH_REQUIRED 授權標記。

userAuthType
對應至使用標記 ID 值 504 的 Tag::USER_AUTH_TYPE 授權標記。
authTimeout
對應至使用標記 ID 值 505 的 Tag::AUTH_TIMEOUT 授權標記。
allowWhileOnBody

對應至使用標記 ID 值 506 的 Tag::ALLOW_WHILE_ON_BODY 授權標記。

如果使用者仍將裝置戴在身體上,則允許金鑰在驗證逾時後繼續使用。請注意,安全的人體感應器可判斷裝置是否戴在使用者的身體上。

trustedUserPresenceReq

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 507 的 Tag::TRUSTED_USER_PRESENCE_REQUIRED 授權標記。

指定只有在使用者已提供實際存在證明的情況下,這個金鑰才能使用。以下提供幾個範例:

  • 如果是 StrongBox 金鑰,硬體按鈕會以有線方式連接至 StrongBox 裝置上的 PIN 碼。
  • 如果是 TEE 金鑰,只要 TEE 擁有掃描器的專屬控制權,並執行指紋比對程序,指紋驗證功能就會提供存在證明。
trustedConfirmationReq

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 508 的 Tag::TRUSTED_CONFIRMATION_REQUIRED 授權標記。

指定只有在使用者確認要透過已核准權杖簽署資料時,金鑰才能使用。如要進一步瞭解如何取得使用者確認,請參閱「Android 保護確認」。

注意:這個標記僅適用於 SIGN 用途的金鑰。

unlockedDeviceReq

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 509 的 Tag::UNLOCKED_DEVICE_REQUIRED 授權標記。

creationDateTime
對應至使用標記 ID 值 701 的 Tag::CREATION_DATETIME 授權標記。
origin

對應至使用標記 ID 值 702 的 Tag::ORIGIN 授權標記。

rootOfTrust

對應至使用標記 ID 值 704 的 Tag::ROOT_OF_TRUST 授權標記。

詳情請參閱說明 RootOfTrust 資料結構的章節。

osVersion

對應至使用標記 ID 值 705 的 Tag::OS_VERSION 授權標記。

與 Keymaster 相關聯的 Android 作業系統版本,以六位數整數指定。舉例來說,8.1.0 版會以 080100 表示。

只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。

osPatchLevel

對應至使用標記 ID 值 706 的 Tag::OS_PATCHLEVEL 授權標記。

與在 KeyMint (先前為 Keymaster) 中使用的安全修補程式相關聯的月份和年份,以六位數整數表示。舉例來說,2018 年 8 月的修補程式會以 201808 表示。

建議使用這個欄位,而非 vendorPatchLevelbootPatchLevel,檢查裝置最近是否已修補。

只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。

attestationApplicationId

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 709 的 Tag::ATTESTATION_APPLICATION_ID 授權標記。

詳情請參閱說明 AttestationApplicationId 資料結構的章節。

attestationIdBrand

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 710 的 Tag::ATTESTATION_ID_BRAND 授權標記。

attestationIdDevice

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 711 的 Tag::ATTESTATION_ID_DEVICE 授權標記。

attestationIdProduct

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 712 的 Tag::ATTESTATION_ID_PRODUCT 授權標記。

attestationIdSerial

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 713 的 Tag::ATTESTATION_ID_SERIAL 授權標記。

attestationIdImei

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 714 的 Tag::ATTESTATION_ID_IMEI 授權標記。

attestationIdMeid

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 715 的 Tag::ATTESTATION_ID_MEID 授權標記。

attestationIdManufacturer

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 716 的 Tag::ATTESTATION_ID_MANUFACTURER 授權標記。

attestationIdModel

只存在於金鑰認證 2 以上版本中。

對應至使用標記 ID 值 717 的 Tag::ATTESTATION_ID_MODEL 授權標記。

vendorPatchLevel

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 718 的 Tag::VENDOR_PATCHLEVEL 授權標記。

指定如要使用此金鑰,必須在裝置上安裝的「供應商映像檔」安全性修補程式等級。這個值是由安全性修補程式等級移除破折號後形成的整數。舉例來說,如果產生金鑰的 Android 裝置安裝了供應商在 2018 年 8 月 5 日提供的安全性修補程式,這個值會是 20180805。

bootPatchLevel

只存在於金鑰認證 3 以上版本中。

對應至使用標記 ID 值 719 的 Tag::BOOT_PATCHLEVEL 授權標記。

指定如要使用此金鑰,必須在裝置上安裝的「核心映像檔」安全性修補程式等級。這個值是整數,由安全性修補程式等級移除破折號後形成。舉例來說,如果產生金鑰的 Android 裝置安裝了核心在 2018 年 8 月 5 日提供的安全性修補程式,這個值會是 20180805。

deviceUniqueAttestation

只存在於金鑰認證 4 以上版本中。

對應於使用標記 ID 值 720 的 Tag::DEVICE_UNIQUE_ATTESTATION 授權標記。

attestationIdSecondImei

只存在於金鑰認證 300 以上版本中。

對應至使用標記 ID 值 723 的 Tag::ATTESTATION_ID_SECOND_IMEI 授權標記。

moduleHash

只存在於金鑰認證 400 以上版本中。

對應至使用標記 ID 值 724 的 Tag::MODULE_HASH 授權標記。

RootOfTrust 欄位

verifiedBootKey
公開金鑰的安全雜湊值,用於驗證裝置啟動期間執行的所有程式碼完整性和真實性,這是驗證開機程序的一部分。 建議使用 SHA-256。
deviceLocked
裝置的系統啟動載入程式是否已鎖定。true 表示裝置已啟動簽署的映像檔,且該映像檔已通過驗證開機程序驗證。
verifiedBootState
裝置的驗證開機程序狀態
verifiedBootHash
驗證開機程序保護的所有資料摘要。如果裝置使用 Android 驗證開機程序參考實作,這個欄位會包含 VBMeta 摘要

VerifiedBootState 值

對應的啟動狀態 意義
Verified GREEN 完整的信任鏈結會從受硬體保護的信任根層級,延伸至系統啟動載入程式和所有由驗證開機程序驗證的分區。在這個狀態下,verifiedBootKey 欄位包含內嵌信任根的雜湊,也就是裝置製造商在出廠時內嵌於裝置 ROM 中的憑證。
SelfSigned YELLOW Verified 相同,但驗證是使用使用者設定的信任根完成,而非製造商在工廠嵌入的信任根。在這個狀態下,verifiedBootKey 欄位包含使用者設定的公開金鑰雜湊。
Unverified ORANGE 裝置的系統啟動載入程式已解鎖,因此無法建立信任鏈結。裝置可自由修改,因此使用者必須透過頻外方式驗證裝置的完整性。在這個狀態下,verifiedBootKey 欄位包含 32 個位元組的零。
Failed RED 裝置驗證失敗。在這個狀態下,其他 RootOfTrust 欄位內容不保證正確。

AttestationApplicationId

這個欄位反映了 Android 平台允許哪些應用程式使用認證中的密鑰資料。只有在多個套件共用同一個 UID 時,這組 ID 才能包含多個套件。AuthorizationList 中的 AttestationApplicationId 欄位屬於 OCTET_STRING 類型,且格式符合下列 ASN.1 結構定義:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
一組 AttestationPackageInfo 物件,每個物件都會提供套件名稱和版本號碼。
signature_digests

應用程式簽署憑證的 SHA-256 摘要。一個應用程式可以有多個簽署金鑰憑證鏈結。系統會擷取每個「分葉」憑證,並放在 signature_digests 欄位中。欄位名稱會誤導使用者,因為摘要資料是應用程式的簽署憑證,而非應用程式簽章,原因在於其命名依據為呼叫 getPackageInfo() 傳回的 Signature 類別。以下程式碼片段為摘要集的示例:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

佈建資訊擴充功能

佈建資訊擴充資料包含 OID 1.3.6.1.4.1.11129.2.1.30。此擴充資料可透過佈建伺服器提供已知的裝置資訊。

結構定義

擴充功能值包含符合以下簡潔資料定義語言 (CDDL) 結構定義的簡潔二進位物件表示法 (CBOR) 資料:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
      ? 6 : bool,      ; is lost device
  }

對應內容並非版本,因此可加入新的選用欄位。

certs_issued

過去 30 天內核發給裝置的憑證數量約略值。如果此值大於特定數量級的平均值,則可用來當做潛在濫用信號。

validated_attested_entity

這個字串表示經過認證的驗證金鑰來源,由晶片組製造商直接擔保。例如 STRONG_BOXTEE

is_lost_device

布林值,指出裝置是否已回報為遺失。如果存在且為 true,表示憑證是為目前標示為遺失的裝置佈建。

認證金鑰

系統會將兩把金鑰 (RSA 和 ECDSA 各一把) 和對應的憑證鏈安全地佈建到裝置中。

Android 12 推出遠端金鑰佈建功能。這項功能可為現場裝置提供每個應用程式的 ECDSA P-256 驗證憑證,這類憑證的效期比原廠佈建的憑證短。

專屬 ID

專屬 ID 是 128 位元的值,可用於識別裝置,但僅限於限定期間。系統會使用下列項目計算值:

HMAC_SHA256(T || C || R, HBK)

其中:

  • T 是「時間計數器值」,計算方式是將 Tag::CREATION_DATETIME 的值除以 2592000000,並捨棄餘數。T 每 30 天變更一次 (2592000000 = 30 * 24 * 60 * 60 * 1000)。
  • CTag::APPLICATION_ID 的值
  • 如果 attest_key 呼叫的 attest_params 參數中存在 Tag::RESET_SINCE_ID_ROTATION,則 R 為 1,否則為 0。
  • HBK 是受信任執行環境所知的硬體繫結專屬密碼,且絕不會由該環境揭露。這個密碼至少包含 128 位元的熵,且每個裝置都有專屬密碼 (考量到 128 位元的熵,機率上的唯一性是可以接受的)。HBK 應透過 HMAC 或 AES_CMAC 從融合金鑰材料衍生。

將 HMAC_SHA256 輸出內容截斷為 128 位元。

多個 IMEI

Android 14 在 Android 金鑰認證記錄中新增多個 IMEI 支援。原始設備製造商 (OEM) 可以新增第二個 IMEI 的 KeyMint 標記,實作這項功能。 現在越來越多裝置配備多個行動無線電,原始設備製造商 (OEM) 現在可以支援具有兩個 IMEI 的裝置。

如果裝置有次要 IMEI,原始設備製造商必須將該 IMEI 佈建至 KeyMint 實作項目,以便這些實作項目能以驗證主要 IMEI 的方式驗證次要 IMEI。

ID 驗證

Android 8.0 支援裝置 ID 認證 (選用),適用於搭載 Keymaster 3 的裝置。ID 驗證可讓裝置提供硬體 ID 的證明,例如序號或 IMEI。雖然這項功能是選用功能,但強烈建議所有 Keymaster 3 實作項目都提供支援,因為能夠證明裝置身分可實現許多用途,例如確保零接觸遠端設定的安全性 (因為遠端可以確定與正確裝置通訊,而非身分遭偽造的裝置)。

ID 認證機制會在裝置出廠前,建立裝置硬體 ID 的副本,且只有 TEE 可以存取。使用者可以解鎖裝置的開機載入程式,並變更系統軟體和 Android 架構回報的 ID。TEE 持有的 ID 副本無法以這種方式操控,確保裝置 ID 驗證只會驗證裝置的原始硬體 ID,從而阻撓假冒嘗試。

ID 認證的主要 API 介面是以 Keymaster 2 導入的現有金鑰認證機制為基礎建構而成。要求 Keymaster 持有的金鑰認證憑證時,呼叫端可以要求將裝置的硬體 ID 納入認證憑證的中繼資料。如果金鑰存放在 TEE 中,憑證會回溯至已知的信任根。這類憑證的收件者可以驗證憑證及其內容 (包括硬體 ID) 是否由 TEE 撰寫。如果系統要求在認證憑證中加入硬體 ID,TEE 只會認證儲存在其儲存空間中的 ID,這些 ID 是在工廠中填入。

儲存空間屬性

儲存裝置 ID 的儲存空間必須具備下列屬性:

  • 裝置離開工廠前,系統會將衍生自裝置原始 ID 的值複製到儲存空間。
  • destroyAttestationIds()方法可以永久銷毀這份 ID 衍生資料副本。永久銷毀是指徹底移除資料,因此無論將裝置恢復原廠設定或執行任何其他程序,都無法還原資料。如果使用者已解鎖啟動載入程式、變更系統軟體,以及修改 Android 架構傳回的 ID,這點就特別重要。
  • RMA 設施應能產生硬體 ID 衍生資料的全新副本。這樣一來,通過退貨授權程序的裝置就能再次執行 ID 認證。退貨授權機構使用的機制必須受到保護,使用者不得自行叫用,否則他們就能取得偽造 ID 的認證。
  • TEE 中只有 Keymaster 受信任的應用程式可以讀取儲存在儲存空間中的 ID 衍生資料。
  • 儲存空間具有防竄改功能:如果儲存空間的內容遭到修改,TEE 會將其視為內容副本已毀損,並拒絕所有 ID 驗證嘗試。方法是簽署或 MAC 儲存空間,如下所述
  • 儲存空間不會保留原始 ID。由於 ID 認證涉及驗證問題,因此來電者一律會提供要認證的 ID。TEE 只需要驗證這些值是否與原始值相符。儲存原始值的安全雜湊,而非值本身,即可進行這項驗證。

建築

如要建立具有上述屬性的實作項目,請在下列建構函式 S 中儲存 ID 衍生值。請勿儲存 ID 值的其他副本,但系統中的正常位置除外,裝置擁有者可透過 Root 存取這些位置:

S = D || HMAC(HBK, D)

其中:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC 是 HMAC 建構函式,採用適當的安全雜湊 (建議使用 SHA-256)
  • HBK 是與硬體綁定的金鑰,不會用於其他用途
  • ID1...IDn 是原始 ID 值; 特定值與特定索引的關聯取決於實作方式,因為不同裝置的 ID 數量不同
  • || 代表串連

由於 HMAC 輸出內容的大小固定,因此不需要標頭或其他結構,就能找到個別 ID 的雜湊值或 D 的 HMAC。除了檢查所提供的值以執行認證外,實作項目還需要從 S 中擷取 D、計算 HMAC(HBK, D),並與 S 中的值進行比較,以驗證沒有任何 ID 遭到修改/損毀。此外,實作項目必須對所有個別 ID 元素和 S 的驗證使用常數時間比較。無論提供的 ID 數量為何,以及測試的任何部分是否正確比對,比較時間都必須保持不變。

硬體 ID

ID 驗證支援下列硬體 ID:

  1. Android 中 Build.BRAND 傳回的品牌名稱
  2. Android 中 Build.DEVICE 傳回的裝置名稱
  3. Android 中 Build.PRODUCT 回傳的產品名稱
  4. Android 中 Build.MANUFACTURER 傳回的製造商名稱
  5. Android 中 Build.MODEL 傳回的模型名稱
  6. 序號
  7. 所有無線電的 IMEI
  8. 所有無線電的 MEID

為支援裝置 ID 認證,裝置會認證這些 ID。所有搭載 Android 的裝置都有前六個,這項功能必須有這些項目才能運作。如果裝置內建任何行動無線電,裝置也必須支援無線電的 IMEI 和/或 MEID 認證。

如要要求 ID 驗證,請執行金鑰認證,並在要求中加入要驗證的裝置 ID。識別碼會標示為:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

要認證的 ID 是 UTF-8 編碼的位元組字串。這種格式也適用於數字 ID。要驗證的每個 ID 都會以 UTF-8 編碼字串表示。

如果裝置不支援 ID 認證 (或destroyAttestationIds()先前已呼叫過,但裝置無法再認證 ID),任何包含一或多個這些標記的金鑰認證要求都會失敗,並顯示 ErrorCode::CANNOT_ATTEST_IDS

如果裝置支援 ID 認證,且金鑰認證要求中包含一或多個上述標記,TEE 會驗證每個標記提供的 ID 是否與硬體 ID 的副本相符。如果一或多個 ID 不相符,整個認證程序就會失敗,並顯示 ErrorCode::CANNOT_ATTEST_IDS。同一標記可多次提供。舉例來說,這在驗證 IMEI 時非常實用: 裝置可能有多個無線電,因此有多個 IMEI。如果每個 ATTESTATION_ID_IMEI 提供的值都與裝置的其中一個無線電相符,認證要求即為有效。所有其他標記也適用相同規定。

如果認證成功,認證 ID 會使用上述結構定義,新增至核發認證憑證的認證擴充功能 (OID 1.3.6.1.4.1.11129.2.1.17)。Keymaster 2 驗證結構定義的變更內容會以粗體顯示,並附上註解。

Java API

本節內容僅供參考,Keymaster 實作者不會實作或使用 Java API。這項資訊可協助實作者瞭解應用程式如何使用這項功能。系統元件可能會以不同方式使用,因此請務必不要將本節視為規範。