密钥库提供了一个更安全的地方,用于以受控方式创建、存储和使用加密密钥。当硬件后盾密钥存储可用并被使用时,密钥材料更安全,可以防止从设备中提取,并且 Keymaster 会强制执行难以破坏的限制。
但是,只有在已知密钥库密钥位于硬件后盾存储中时,情况才是如此。在 Keymaster 1 中,应用或远程服务器无法可靠地验证是否是这种情况。密钥库守护程序加载了可用的 Keymaster HAL,并相信 HAL 关于密钥硬件后盾的任何说法。
为了解决这个问题,Keymaster 在 Android 7.0 (Keymaster 2) 中引入了密钥认证,在 Android 8.0 (Keymaster 3) 中引入了 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_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 类型
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 架构描述
版本 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 架构版本。
值 Keymaster/KeyMint 版本 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 -
attestationSecurityLevel
-
经过认证的密钥存储位置的安全级别。
-
keymasterVersion
/keyMintVersion
- Keymaster/KeyMint 硬件抽象层 (HAL) 实现的版本。
值 Keymaster/KeyMint 版本 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 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint 实现的安全级别。
-
attestationChallenge
- 密钥生成时提供的质询。
-
uniqueId
- 一种隐私敏感的设备标识符,系统应用可以在密钥生成时请求。如果未请求唯一 ID,则此字段为空。有关详情,请参阅唯一 ID部分。
-
softwareEnforced
- 由 Android 系统强制执行的 Keymaster/KeyMint 授权列表。此信息由平台中的代码收集或生成。只要设备运行的操作系统符合Android 平台安全模型(即,设备的引导加载程序已锁定,并且
verifiedBootState
为Verified
),就可以信任此信息。 -
hardwareEnforced
- 由设备的 Trusted Execution Environment (TEE) 或 StrongBox 强制执行的 Keymaster/KeyMint 授权列表。此信息由安全硬件中的代码收集或生成,不受平台控制。例如,信息可能来自引导加载程序,或者通过不涉及信任平台的安全通信渠道获得。
SecurityLevel 值
SecurityLevel
值指示与密钥库相关的元素(例如,密钥对和认证)抵御攻击的程度。
值 | 含义 |
---|---|
软件 |
只要设备的 Android 系统符合Android 平台安全模型(即,设备的引导加载程序已锁定,并且 verifiedBootState 为 Verified ),就安全。 |
TrustedEnvironment |
只要 Trusted Execution Environment (TEE) 未被破坏,就安全。TEE 的隔离要求在 Android 兼容性定义文档的第 9.11 节 [C-1-1] 到 [C-1-4] 中定义。TEE 非常抗远程破坏,并且中等程度地抗直接硬件攻击破坏。 |
StrongBox |
只要 StrongBox 未被破坏,就安全。StrongBox 在类似于硬件安全模块的安全元件中实现。StrongBox 的实现要求在 Android 兼容性定义文档的第 9.11.2 节中定义。StrongBox 非常抗远程破坏和直接硬件攻击(例如,物理篡改和侧信道攻击)破坏。 |
AuthorizationList 字段
每个字段都对应于 AIDL 接口规范中的 Keymaster/KeyMint 授权标记。该规范是关于授权标记的真实来源:它们的含义、其内容的格式、它们是否应出现在 KeyDescription
对象中的 softwareEnforced
或 hardwareEnforced
字段中,它们是否与其他标记互斥等等。所有 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
的 UNIVERSAL
类标记,后者为 10
。
-
purpose
- 对应于
Tag::PURPOSE
授权标记,该标记使用标记 ID 值 1。 -
algorithm
-
对应于
Tag::ALGORITHM
授权标记,该标记使用标记 ID 值 2。在认证
AuthorizationList
对象中,算法值始终为RSA
或EC
。 -
keySize
- 对应于
Tag::KEY_SIZE
授权标记,该标记使用标记 ID 值 3。 -
digest
- 对应于
Tag::DIGEST
授权标记,该标记使用标记 ID 值 5。 -
padding
- 对应于
Tag::PADDING
授权标记,该标记使用标记 ID 值 6。 -
ecCurve
-
对应于
Tag::EC_CURVE
授权标记,该标记使用标记 ID 值 10。用于在 Android 系统密钥库中生成椭圆曲线 (EC) 密钥对(使用 ECDSA 进行签名和验证)的参数集。
-
rsaPublicExponent
- 对应于
Tag::RSA_PUBLIC_EXPONENT
授权标记,该标记使用标记 ID 值 200。 -
mgfDigest
-
仅在密钥认证版本 >= 100 中存在。
对应于Tag::RSA_OAEP_MGF_DIGEST
KeyMint 授权标记,该标记使用标记 ID 值 203。 -
rollbackResistance
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::ROLLBACK_RESISTANCE
授权标记,该标记使用标记 ID 值 303。 -
earlyBootOnly
-
仅在密钥认证版本 >= 4 中存在。
对应于
Tag::EARLY_BOOT_ONLY
授权标记,该标记使用标记 ID 值 305。 -
activeDateTime
- 对应于
Tag::ACTIVE_DATETIME
授权标记,该标记使用标记 ID 值 400。 -
originationExpireDateTime
- 对应于
Tag::ORIGINATION_EXPIRE_DATETIME
授权标记,该标记使用标记 ID 值 401。 -
usageExpireDateTime
- 对应于
Tag::USAGE_EXPIRE_DATETIME
授权标记,该标记使用标记 ID 值 402。 -
usageCountLimit
- 对应于
Tag::USAGE_COUNT_LIMIT
授权标记,该标记使用标记 ID 值 405。 -
noAuthRequired
-
对应于
Tag::NO_AUTH_REQUIRED
授权标记,该标记使用标记 ID 值 503。 -
userAuthType
- 对应于
Tag::USER_AUTH_TYPE
授权标记,该标记使用标记 ID 值 504。 -
authTimeout
- 对应于
Tag::AUTH_TIMEOUT
授权标记,该标记使用标记 ID 值 505。 -
allowWhileOnBody
-
对应于
Tag::ALLOW_WHILE_ON_BODY
授权标记,该标记使用标记 ID 值 506。允许密钥在其身份验证超时期限过后使用,如果用户仍然将设备佩戴在身上。请注意,安全的佩戴传感器会确定设备是否佩戴在用户的身上。
-
trustedUserPresenceRequired
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授权标记,该标记使用标记 ID 值 507。指定仅当用户提供物理存在证明时,此密钥才可用。以下是几个示例
- 对于 StrongBox 密钥,硬连线到 StrongBox 设备上的引脚的硬件按钮。
- 对于 TEE 密钥,指纹身份验证提供存在证明,只要 TEE 独占控制扫描仪并执行指纹匹配过程即可。
-
trustedConfirmationRequired
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::TRUSTED_CONFIRMATION_REQUIRED
授权标记,该标记使用标记 ID 值 508。指定仅当用户使用批准令牌确认要签名的数据时,密钥才可用。有关如何获得用户确认的更多信息,请参阅Android 受保护的确认。
注意:此标记仅适用于使用
SIGN
用途的密钥。 -
unlockedDeviceRequired
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::UNLOCKED_DEVICE_REQUIRED
授权标记,该标记使用标记 ID 值 509。 -
allApplications
-
对应于
Tag::ALL_APPLICATIONS
授权标记,该标记使用标记 ID 值 600。指示设备上的所有应用是否可以访问密钥对。
-
applicationId
- 对应于
Tag::APPLICATION_ID
授权标记,该标记使用标记 ID 值 601。 -
creationDateTime
- 对应于
Tag::CREATION_DATETIME
授权标记,该标记使用标记 ID 值 701。 -
origin
-
对应于
Tag::ORIGIN
授权标记,该标记使用标记 ID 值 702。 -
rollbackResistant
-
仅在密钥认证版本 1 和 2 中存在。
对应于
Tag::ROLLBACK_RESISTANT
授权标记,该标记使用标记 ID 值 703。 -
rootOfTrust
-
对应于
Tag::ROOT_OF_TRUST
授权标记,该标记使用标记 ID 值 704。有关更多详细信息,请参阅描述 RootOfTrust 数据结构的章节。
-
osVersion
-
对应于
Tag::OS_VERSION
授权标记,该标记使用标记 ID 值 705。与 Keymaster 关联的 Android 操作系统的版本,指定为六位整数。例如,版本 8.1.0 表示为 080100。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
osPatchLevel
-
对应于
Tag::PATCHLEVEL
授权标记,该标记使用标记 ID 值 706。与 Keymaster 中使用的安全补丁关联的月份和年份,指定为六位整数。例如,2018 年 8 月的补丁表示为 201808。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
attestationApplicationId
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_APPLICATION_ID
授权标记,该标记使用标记 ID 值 709。有关更多详细信息,请参阅描述 AttestationApplicationId 数据结构的章节。
-
attestationIdBrand
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_BRAND
授权标记,该标记使用标记 ID 值 710。 -
attestationIdDevice
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_DEVICE
授权标记,该标记使用标记 ID 值 711。 -
attestationIdProduct
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_PRODUCT
授权标记,该标记使用标记 ID 值 712。 -
attestationIdSerial
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_SERIAL
授权标记,该标记使用标记 ID 值 713。 -
attestationIdImei
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_IMEI
授权标记,该标记使用标记 ID 值 714。 -
attestationIdMeid
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_MEID
授权标记,该标记使用标记 ID 值 715。 -
attestationIdManufacturer
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_MANUFACTURER
授权标记,该标记使用标记 ID 值 716。 -
attestationIdModel
-
仅在密钥认证版本 >= 2 中存在。
对应于
Tag::ATTESTATION_ID_MODEL
授权标记,该标记使用标记 ID 值 717。 -
vendorPatchLevel
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::VENDOR_PATCHLEVEL
授权标记,该标记使用标记 ID 值 718。指定必须在设备上安装的供应商映像安全补丁级别才能使用此密钥。该值以 YYYYMMDD 格式显示,表示供应商安全补丁的日期。例如,如果密钥是在安装了供应商 2018 年 8 月 1 日安全补丁的 Android 设备上生成的,则此值为 20180801。
-
bootPatchLevel
-
仅在密钥认证版本 >= 3 中存在。
对应于
Tag::BOOT_PATCHLEVEL
授权标记,该标记使用标记 ID 值 719。指定必须在设备上安装的内核映像安全补丁级别才能使用此密钥。该值以 YYYYMMDD 格式显示,表示系统安全补丁的日期。例如,如果密钥是在安装了系统 2018 年 8 月 5 日安全补丁的 Android 设备上生成的,则此值为 20180805。
-
deviceUniqueAttestation
-
仅在密钥认证版本 >= 4 中存在。
对应于
Tag::DEVICE_UNIQUE_ATTESTATION
授权标记,该标记使用标记 ID 值 720。 -
attestationIdSecondImei
-
仅在密钥认证版本 >= 300 中存在。
对应于
Tag::ATTESTATION_ID_SECOND_IMEI
授权标记,该标记使用标记 ID 值 723。 -
moduleHash
-
仅在密钥认证版本 >= 400 中存在。
对应于
Tag::MODULE_HASH
授权标记,该标记使用标记 ID 值 724。
RootOfTrust 字段
-
verifiedBootKey
- 用于验证设备启动期间作为已验证启动一部分执行的所有代码的完整性和真实性的公钥的安全哈希值。建议使用 SHA-256。
-
deviceLocked
- 设备的引导加载程序是否已锁定。
true
表示设备启动了已签名映像,该映像已通过已验证启动成功验证。 -
verifiedBootState
- 设备的已验证启动状态。
-
verifiedBootHash
- 受已验证启动保护的所有数据的摘要。对于使用Android Verified Boot参考实现的设备,此字段包含VBMeta 摘要。
VerifiedBootState 值
值 | 对应的启动状态 | 含义 |
---|---|---|
Verified |
绿色 |
完整的信任链从硬件保护的信任根扩展到引导加载程序和已验证启动验证的所有分区。在此状态下,verifiedBootKey 字段包含嵌入式信任根的哈希值,即设备制造商在工厂中嵌入到设备 ROM 中的证书。 |
SelfSigned |
黄色 |
与 Verified 相同,不同之处在于验证是使用用户配置的信任根而不是制造商在工厂中嵌入的信任根完成的。在此状态下,verifiedBootKey 字段包含用户配置的公钥的哈希值。 |
Unverified |
橙色 |
设备的引导加载程序已解锁,因此无法建立信任链。可以自由修改设备,因此设备的完整性必须由用户带外验证。在此状态下,verifiedBootKey 字段包含 32 字节的零。 |
Failed |
红色 |
设备验证失败。在此状态下,无法保证其他 RootOfTrust 字段的内容。 |
AttestationApplicationId
此字段反映 Android 平台认为哪些应用被允许使用正在认证的密钥材料。如果多个软件包共享相同的 UID,则它可以包含多个软件包。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)。C
是Tag::APPLICATION_ID
的值R
如果Tag::RESET_SINCE_ID_ROTATION
存在于 attest_key 调用的 attest_params 参数中,则为 1;如果该标记不存在,则为 0。HBK
是 Trusted Execution Environment 已知的唯一硬件绑定密钥,并且永远不会被其泄露。该密钥包含至少 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 相同的方式验证它。
预配信息扩展
预配信息扩展的 OID 为 1.3.6.1.4.1.11129.2.1.30
。此扩展提供预配服务器已知的关于设备的信息。
架构
此扩展遵循以下 CDDL 架构
{ 1 : int, ; certificates issued }
此映射是未版本化的,并且可能会添加新的可选字段。
-
certs_issued
-
过去 30 天内向设备颁发的证书的大概数量。如果此值比平均值大几个数量级,则可以用作潜在滥用的信号。
ID 身份验证
Android 8.0 为使用 Keymaster 3 的设备提供了对 ID 身份验证的可选支持。ID 身份验证允许设备提供其硬件标识符(例如序列号或 IMEI)的证明。虽然这是一项可选功能,但强烈建议所有 Keymaster 3 实现都提供对其的支持,因为能够证明设备的身份可以使用例(例如真正的零接触远程配置)更加安全(因为远程端可以确定它正在与正确的设备对话,而不是冒充其身份的设备)。
ID 身份验证的工作原理是创建设备硬件标识符的副本,这些副本只能由可信执行环境 (TEE) 在设备出厂前访问。用户可以解锁设备的引导加载程序并更改系统软件以及 Android 框架报告的标识符。TEE 持有的标识符副本无法以这种方式进行操纵,从而确保设备 ID 身份验证仅验证设备的原始硬件标识符,从而阻止欺骗尝试。
ID 身份验证的主要 API 表面构建于 Keymaster 2 引入的现有密钥身份验证机制之上。当请求 Keymaster 持有的密钥的身份验证证书时,调用者可以请求将设备的硬件标识符包含在身份验证证书的元数据中。如果密钥保存在 TEE 中,则证书会链接回已知的信任根。此类证书的接收者可以验证证书及其内容(包括硬件标识符)是否由 TEE 编写。当被要求在身份验证证书中包含硬件标识符时,TEE 仅验证存储在其存储中的标识符,这些标识符在工厂车间填充。
存储属性
保存设备标识符的存储需要具有以下属性
- 从设备原始标识符派生的值在设备出厂前复制到存储中。
destroyAttestationIds()
方法可以永久销毁此标识符派生数据的副本。永久销毁意味着数据被完全删除,因此工厂重置或设备上执行的任何其他过程都无法恢复它。这对于用户已解锁引导加载程序并更改系统软件以及修改 Android 框架返回的标识符的设备尤其重要。- RMA 设施应具有生成硬件标识符派生数据新副本的能力。这样,通过 RMA 的设备可以再次执行 ID 身份验证。RMA 设施使用的机制必须受到保护,以防止用户自己调用它,因为这将允许他们获得欺骗 ID 的身份验证。
- TEE 中除了 Keymaster 可信应用之外的任何代码都无法读取存储中保存的标识符派生数据。
- 存储是防篡改的:如果存储的内容已被修改,则 TEE 会将其视为内容副本已被销毁一样,并拒绝所有 ID 身份验证尝试。这是通过对存储进行签名或 MAC 处理来实现的,如下所述。
- 存储不保存原始标识符。由于 ID 身份验证涉及质询,因此调用者始终提供要验证的标识符。TEE 只需要验证这些标识符是否与它们最初拥有的值匹配。存储原始值的安全哈希值而不是值可以实现此验证。
构造
要创建具有上述属性的实现,请将 ID 派生值存储在以下构造 S 中。不要存储 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 值;特定值与特定索引的关联取决于实现,因为不同的设备具有不同数量的标识符||
表示串联
由于 HMAC 输出是固定大小的,因此不需要标头或其他结构即可找到单个 ID 哈希或 D 的 HMAC。除了检查提供的值以执行身份验证外,实现还需要通过从 S 中提取 D、计算 HMAC(HBK, D) 并将其与 S 中的值进行比较来验证 S,以验证是否没有单个 ID 被修改/损坏。此外,实现必须对所有单个 ID 元素和 S 的验证使用恒定时间比较。比较时间必须是恒定的,而与提供的 ID 数量以及测试的任何部分的正确匹配无关。
硬件标识符
ID 身份验证支持以下硬件标识符
- 品牌名称,由 Android 中的
Build.BRAND
返回 - 设备名称,由 Android 中的
Build.DEVICE
返回 - 产品名称,由 Android 中的
Build.PRODUCT
返回 - 制造商名称,由 Android 中的
Build.MANUFACTURER
返回 - 型号名称,由 Android 中的
Build.MODEL
返回 - 序列号
- 所有无线装置的 IMEI
- 所有无线装置的 MEID
为了支持设备 ID 身份验证,设备需要验证这些标识符。所有运行 Android 的设备都具有前六个标识符,它们是此功能正常工作所必需的。如果设备有任何集成的蜂窝无线装置,则设备还必须支持无线装置的 IMEI 和/或 MEID 的身份验证。
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
要验证的标识符是 UTF-8 编码的字节字符串。此格式也适用于数字标识符。每个要验证的标识符都表示为 UTF-8 编码的字符串。
如果设备不支持 ID 身份验证(或者之前调用了 destroyAttestationIds()
并且设备无法再验证其 ID),则任何包含一个或多个这些标记的密钥身份验证请求都会失败,并显示 ErrorCode::CANNOT_ATTEST_IDS
。
如果设备支持 ID 身份验证,并且密钥身份验证请求中包含一个或多个上述标记,则 TEE 会验证与每个标记一起提供的标识符是否与其硬件标识符的副本匹配。如果一个或多个标识符不匹配,则整个身份验证都会失败,并显示 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。提供此信息是为了帮助实现者了解应用如何使用此功能。系统组件的使用方式可能有所不同,因此将本节视为规范性内容至关重要。