金鑰和 ID 認證

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

不過,只有在 Keystore 金鑰位於硬體支援儲存空間時,這項說法才成立。在 Keymaster 1 中,應用程式或遠端伺服器無法可靠地驗證是否為這種情況。金鑰儲存空間精靈載入可用的 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 值 TBD
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 結構定義說明:

版本 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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,
}

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  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    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,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [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  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT 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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] 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  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    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,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] 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  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    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 版
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 版
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。在認證擴充功能結構定義中,purpose 欄位會指定為 userAuthType [504] EXPLICIT INTEGER OPTIONALAuthorizationList因此,ASN.1 編碼會包含內容專屬標記 504,而非 ASN.1 型別 INTEGERUNIVERSAL 類別標記,也就是 10

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

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

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

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 進行簽署和驗證)。

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::PATCHLEVEL 授權標記。

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

只有 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 授權標記。

指定如要使用此金鑰,必須在裝置上安裝的「供應商映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表供應商提供安全性修補程式的日期。舉例來說,如果產生金鑰的 Android 裝置安裝了供應商在 2018 年 8 月 1 日提供的安全性修補程式,這個值會是 20180801。

bootPatchLevel

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

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

指定如要使用此金鑰,必須在裝置上安裝的「核心映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表系統提供安全性修補程式的日期。舉例來說,如果產生金鑰的 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 結構定義:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

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

certs_issued

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

validated_attested_entity

經過驗證的認證實體是字串,用於說明由佈建伺服器確認已認證的裝置類型。例如 STRONG_BOXTEE

認證金鑰

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

Android 12 推出遠端金鑰佈建功能,Android 13 則要求裝置實作這項功能。遠端金鑰佈建功能可為現場裝置提供每個應用程式的 ECDSA P256 認證憑證。這類憑證的效期比原廠佈建的憑證短。

專屬 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_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 標記,藉此實作這項功能。 裝置配備多個行動無線電越來越常見,原始設備製造商現在可以支援具有兩個 IMEI 的裝置。

如果 OEM 裝置有次要 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 衍生資料的全新副本。這樣一來,通過 RMA 的裝置就能再次執行 ID 認證。退貨授權機構使用的機制必須受到保護,使用者不得自行叫用,否則他們就能取得偽造 ID 的認證。
  • TEE 中除了 Keymaster 信任的應用程式外,沒有任何程式碼可以讀取儲存在儲存空間中的 ID 衍生資料。
  • 儲存空間具有防竄改功能:如果儲存空間的內容遭到修改,TEE 會將其視為內容副本已毀損,並拒絕所有 ID 認證嘗試。方法是簽署或 MAC 儲存空間,如下所述
  • 儲存空間不會保留原始 ID。由於 ID 認證涉及驗證問題,因此呼叫者一律會提供要認證的 ID。TEE 只需要驗證這些值是否與原始值相符。儲存原始值的安全雜湊,而非值本身,即可進行這項驗證。

營造業

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

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。提供這項資訊,是為了協助實作者瞭解應用程式如何使用這項功能。系統元件可能會以不同方式使用,因此請務必不要將本節視為規範。