金鑰和 ID 認證

KeyStore 提供更安全的環境,可讓您以受控方式建立、儲存及使用加密編譯金鑰。當可使用並使用硬體支援的金鑰儲存空間時,金鑰內容的安全性會更高,不易從裝置中擷取,而 Keymaster 會強制執行難以破壞的限制。

不過,只有在已知金鑰庫金鑰位於硬體支援儲存空間時,這項做法才適用。在 Keymaster 1 中,應用程式或遠端伺服器無法可靠地驗證是否發生這種情況。金鑰存放區守護程序會載入可用的 Keymaster HAL,並相信 HAL 針對金鑰的硬體支援所說的任何內容。

為解決這個問題,Keymaster 在 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,系統會根據該 Blob 建立認證。
  • attestParams 是認證所需的任何參數清單。這包括 Tag::ATTESTATION_CHALLENGE 和可能的 Tag::RESET_SINCE_ID_ROTATION,以及 Tag::APPLICATION_IDTag::APPLICATION_DATA。如果在金鑰產生期間指定了後兩者,則必須使用這兩者才能解密金鑰 blob。
  • certChain 是輸出參數,會傳回憑證陣列。項目 0 是認證憑證,表示該憑證會認證 keyToAttest 中的金鑰,並包含認證擴充資料。

attestKey 方法可視為已驗證金鑰的公開金鑰作業,因為這項方法可隨時呼叫,且不需要符合授權限制。舉例來說,如果認證金鑰需要使用者驗證,則可在沒有使用者驗證的情況下產生認證。

認證證書

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

認證證明書包含下表中的欄位,且不得包含任何其他欄位。部分欄位會指定固定欄位值。CTS 測試會驗證憑證內容是否與定義完全一致。

憑證序列

欄位名稱 (請參閱 RFC 5280)
tbsCertificate TBSCertificate 序列
signatureAlgorithm 用來簽署金鑰的演算法 ID:
ECDSA 用於 EC 金鑰,RSA 用於 RSA 金鑰。
signatureValue 位元字串,在 ASN.1 DER 編碼 tbsCertificate 上計算的簽章。

TBSCertificate 序列

欄位名稱 (請參閱 RFC 5280)
version INTEGER 2 (代表 v3 憑證)
serialNumber INTEGER 1 (固定值:所有憑證皆相同)
signature 用於簽署金鑰的演算法 ID:ECDSA 用於 EC 金鑰,RSA 用於 RSA 金鑰。
issuer 與批次認證金鑰的主旨欄位相同。
validity 包含兩個日期的序列,其中包含 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 表示,其中包含認證序列的 DER 編碼。

認證擴充功能

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

AIDL 介面規格中定義的 Keymaster/KeyMint 標記類型會轉譯為下列 ASN.1 類型:

Keymaster/KeyMint 類型 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 結構定義說明認證擴充功能內容:

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 結構定義版本。
Keymaster/KeyMint 版本
1Keymaster 2.0 版
2Keymaster 3.0 版
3Keymaster 4.0 版
4Keymaster 4.1 版
100KeyMint 1.0 版
200KeyMint 2.0 版
300KeyMint 3.0 版
attestationSecurityLevel

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

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

SecurityLevel 值

SecurityLevel 值表示 Keystore 相關元素 (例如金鑰組合和認證) 抵禦攻擊的程度。

意義
Software 只要裝置的 Android 系統符合 Android 平台安全性模型 (也就是裝置的系統啟動載入程式處於鎖定狀態,且 verifiedBootStateVerified),就算安全。
TrustedEnvironment 只要受信任的執行環境 (TEE) 未遭入侵,就會安全無虞。TEE 的隔離需求定義在 Android 相容性定義說明文件的 第 9.11 節 [C-1-1] 至 [C-1-4] 中。TEE 可強力抵禦遠端入侵,並可適度抵禦直接硬體攻擊。
StrongBox 只要 StrongBox 未遭到入侵,就安全無虞。StrongBox 是在類似硬體安全性模組的安全元件中實作。Android 相容性定義說明文件的 第 9.11.2 節定義了 StrongBox 的實作要求。StrongBox 可有效抵禦遠端入侵和直接硬體攻擊 (例如實體竄改和旁路攻擊)。

AuthorizationList 欄位

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

每個欄位都有一個 EXPLICIT 特定情境標記,等同於 Keymaster/KeyMint 標記編號,可讓 AuthorizationList 以更精簡的方式呈現資料。因此,ASN.1 剖析器必須瞭解每個特定情境標記的預期資料類型。例如,Tag::USER_AUTH_TYPE 定義為 ENUM | 504。在認證擴充功能結構定義中,AuthorizationList 中的 purpose 欄位會指定為 userAuthType [504] EXPLICIT INTEGER OPTIONAL。因此,其 ASN.1 編碼會包含特定情境的標記 504,而非 ASN.1 類型 INTEGER (即 10) 的 UNIVERSAL 類別標記。

purpose
對應至使用標記 ID 值 1 的 Tag::PURPOSE 授權標記。
algorithm

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

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

keySize
對應至使用標記 ID 值 3 的 Tag::KEY_SIZE 授權標記。
digest
對應至使用標記 ID 值 5 的 Tag::DIGEST 授權標記。
padding
對應至使用標記 ID 值 6 的 Tag::PADDING 授權標記。
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 Keymaster 授權標記。
usageExpireDateTime
對應至使用標記 ID 值 402 的 Tag::USAGE_EXPIRE_DATETIME 授權標記。
usageCountLimit
對應至使用標記 ID 值 405 的 Tag::USAGE_COUNT_LIMIT 授權標記。
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 授權標記。

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

trustedUserPresenceRequired

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

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

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

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

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

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

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

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

unlockedDeviceRequired

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

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

allApplications

對應至使用標記 ID 值 600 的 Tag::ALL_APPLICATIONS 授權標記。

指出裝置上的所有應用程式是否都能存取金鑰組。

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

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

rollbackResistant

只存在於金鑰認證版本 1 和 2 中。

對應至使用標記 ID 值 703 的 Tag::ROLLBACK_RESISTANT 授權標記。

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

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

attestationIdBrand

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

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

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

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

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

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]), ...}
    

專屬 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_ROTATIONR 就會設為 1;如果沒有這個標記,就會設為 0。
  • HBK 是受信任執行環境所知的專屬硬體限制機密,且不會由該環境揭露。該機密金鑰至少包含 128 位元熵,且為個別裝置專屬 (由於有 128 位元熵,因此可接受機率唯一性)。HBK 應透過 HMAC 或 AES_CMAC 從融合金鑰內容衍生。

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

認證金鑰和憑證

兩個金鑰 (一個 RSA 和一個 ECDSA) 和對應的憑證鏈結已安全地佈建至裝置。

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

多個 IMEI

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

OEM 必須具備次要 IMEI(如果裝置上有此資訊),並將其配置給 KeyMint 實作項目,以便這些實作項目能以與驗證第一個 IMEI 相同的方式驗證次要 IMEI。

佈建資訊擴充資料

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

結構定義

擴充功能遵循下列 CDDL 結構定義:

  {
        1 : int,   ; certificates issued
  }

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

certs_issued

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

ID 認證

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

ID 認證機制會建立裝置硬體 ID 的副本,只有在裝置離開工廠前,信任執行環境 (TEE) 才能存取這些副本。使用者可以解鎖裝置的引導程序,並變更系統軟體和 Android 架構回報的 ID。TEE 持有的 ID 副本無法以這種方式操控,可確保裝置 ID 認證只會認證裝置的原始硬體 ID,進而防範假冒攻擊。

身分認證的主要 API 途徑會在 Keymaster 2 推出的現有金鑰認證機制上建構。當呼叫端為金鑰管理員所持有的金鑰要求認證憑證時,可以要求將裝置的硬體 ID 納入認證憑證的中繼資料。如果金鑰儲存在 TEE 中,憑證鏈結會回溯至已知的信任根。這類憑證的收件者可以驗證憑證及其內容 (包括硬體 ID) 是由 TEE 寫入。當系統要求在認證證明書中加入硬體 ID 時,TEE 只會針對工廠填入的儲存裝置 ID 進行認證。

儲存空間屬性

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

  • 從裝置原始 ID 衍生的值會在裝置離開工廠前複製到儲存空間。
  • destroyAttestationIds() 方法可以永久刪除這個 ID 衍生資料的副本。永久銷毀資料,表示資料已完全移除,因此即使恢復原廠設定或在裝置上執行任何其他程序,也無法還原資料。對於使用者已解鎖引導程序、變更系統軟體,以及修改 Android 架構所傳回的 ID 的裝置而言,這點尤其重要。
  • 退貨授權 (RMA) 設施應具備產生硬體 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 認證。這些 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 時,這項功能就非常實用:如果每個 ATTESTATION_ID_IMEI 提供的值與裝置的其中一個無線電相符,認證要求就有效。所有其他標記也適用相同的做法。

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

Java API

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