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_CHALLENGETag::INCLUDE_UNIQUE_IDTag::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_CHALLENGE和Tag::RESET_SINCE_ID_ROTATION(可能),以及Tag::APPLICATION_ID和Tag::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_DATETIME 和 Tag::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::SIGN 或 KeyPurpose::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 版本 1 Keymaster 2.0 版 2 Keymaster 3.0 版 3 Keymaster 4.0 版 4 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 300 KeyMint 3.0 版 400 KeyMint 4.0 版 500 KeyMint 5.0 版 -
attestationSecurityLevel -
儲存認證金鑰的位置安全等級。
-
keymasterVersion/keyMintVersion -
KeyMint 或 Keymaster HAL 實作項目的版本。
值 KeyMint 或 Keymaster 版本 2 Keymaster 2.0 版 3 Keymaster 3.0 版 4 Keymaster 4.0 版 41 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 300 KeyMint 3.0 版 400 KeyMint 4.0 版 500 KeyMint 5.0 版 -
keymasterSecurityLevel/keyMintSecurityLevel - KeyMint 或 Keymaster 實作的安全等級。
-
attestationChallenge - 金鑰產生時提供的驗證問題。
-
uniqueId - 系統應用程式可在金鑰產生時要求使用的隱私權敏感裝置 ID。如果未要求專屬 ID,這個欄位會留空。 詳情請參閱「專屬 ID」一節。
-
softwareEnforced -
由 Android 系統強制執行的 KeyMint 或 Keymaster 授權清單。這項資訊是由平台中的程式碼收集或產生。只要裝置執行的作業系統符合 Android 平台安全模式 (也就是裝置的系統啟動載入程式已鎖定,且
verifiedBootState為Verified),即可信任裝置。 -
hardwareEnforced - 由裝置的受信任執行環境 (TEE) 或 StrongBox 強制執行的 KeyMint 或 Keymaster 授權清單。 這項資訊是由安全硬體中的程式碼收集或產生,不受平台控制。舉例來說,資訊可以來自啟動載入程式,或透過不涉及信任平台的安全通訊管道取得。
SecurityLevel 值
SecurityLevel 值表示金鑰儲存區相關元素 (例如金鑰組和驗證) 對於攻擊的韌性程度。
| 值 | 意義 |
|---|---|
Software |
只要裝置的 Android 系統符合 Android 平台安全防護模型 (也就是裝置的系統啟動載入程式已鎖定,且 verifiedBootState 為 Verified),裝置就是安全的。 |
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 物件的 softwareEnforced 或 hardwareEnforced 欄位、是否與其他標記互斥等。所有 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 型別 INTEGER 的 UNIVERSAL 類別標記,也就是 10。
-
purpose -
對應至使用標記 ID 值 1 的
Tag::PURPOSE授權標記。 -
algorithm -
對應至使用標記 ID 值 2 的
Tag::ALGORITHM授權標記。在認證
AuthorizationList物件中,演算法的值一律為RSA、EC或ML_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_DIGESTKeyMint 授權標記。 -
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 表示。
建議使用這個欄位,而非
vendorPatchLevel或bootPatchLevel,檢查裝置最近是否已修補。只有 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_BOX或TEE。
-
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)。C是Tag::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:
- Android 中
Build.BRAND傳回的品牌名稱 - Android 中
Build.DEVICE傳回的裝置名稱 - Android 中
Build.PRODUCT回傳的產品名稱 - Android 中
Build.MANUFACTURER傳回的製造商名稱 - Android 中
Build.MODEL傳回的模型名稱 - 序號
- 所有無線電的 IMEI
- 所有無線電的 MEID
為支援裝置 ID 認證,裝置會認證這些 ID。所有搭載 Android 的裝置都有前六個,這項功能必須有這些項目才能運作。如果裝置內建任何行動無線電,裝置也必須支援無線電的 IMEI 和/或 MEID 認證。
如要要求 ID 驗證,請執行金鑰認證,並在要求中加入要驗證的裝置 ID。識別碼會標示為:
ATTESTATION_ID_BRANDATTESTATION_ID_DEVICEATTESTATION_ID_PRODUCTATTESTATION_ID_MANUFACTURERATTESTATION_ID_MODELATTESTATION_ID_SERIALATTESTATION_ID_IMEIATTESTATION_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。這項資訊可協助實作者瞭解應用程式如何使用這項功能。系統元件可能會以不同方式使用,因此請務必不要將本節視為規範。