Keystore обеспечивает более безопасное место для создания, хранения и использования криптографических ключей контролируемым образом. Когда доступно и используется аппаратное хранилище ключей, ключевой материал более защищен от извлечения с устройства, а Keymaster обеспечивает соблюдение ограничений, которые трудно обойти.
Однако это верно только в том случае, если известно, что ключи хранилища ключей находятся в аппаратном хранилище. В Keymaster 1 не было возможности для приложений или удаленных серверов надежно проверить, так ли это. Демон хранилища ключей загружал доступный keymaster HAL и верил всему, что говорил HAL относительно аппаратного обеспечения ключей.
Чтобы исправить эту ситуацию, Keymaster ввел аттестацию ключей в Android 7.0 (Keymaster 2) и аттестацию идентификаторов в Android 8.0 (Keymaster 3).
Целью аттестации ключей является предоставление способа надежного определения того, имеет ли асимметричная пара ключей аппаратную поддержку, каковы свойства ключа и какие ограничения применяются к его использованию.
Подтверждение идентификатора позволяет устройству предоставить подтверждение своих аппаратных идентификаторов, таких как серийный номер или 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
Мастер ключей 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
, для которого создается подтверждение. -
attestParams
— это список всех параметров, необходимых для аттестации. Сюда входятTag::ATTESTATION_CHALLENGE
и, возможно,Tag::RESET_SINCE_ID_ROTATION
, а такжеTag::APPLICATION_ID
иTag::APPLICATION_DATA
. Последние два необходимы для расшифровки ключа, если они были указаны во время генерации ключа. -
certChain
— выходной параметр, который возвращает массив сертификатов. Запись 0 — это сертификат подтверждения, то есть он удостоверяет ключ изkeyToAttest
и содержит расширение подтверждения.
Метод attestKey
считается операцией открытого ключа на заверенном ключе, поскольку он может быть вызван в любое время и не требует соблюдения ограничений авторизации. Например, если заверенный ключ требует аутентификации пользователя для использования, аттестация может быть сгенерирована без аутентификации пользователя.
Удостоверение личности
Сертификат подтверждения — это стандартный сертификат X.509 с необязательным расширением подтверждения, содержащим описание заверенного ключа. Сертификат подписан сертифицированным ключом подтверждения . Ключ подтверждения может использовать другой алгоритм, нежели заверенный ключ.
Сертификат подтверждения содержит поля, указанные в таблице ниже, и не может содержать никаких дополнительных полей. Некоторые поля указывают фиксированное значение поля. Тесты CTS подтверждают, что содержимое сертификата точно соответствует определению.
ПОСЛЕДОВАТЕЛЬНОСТЬ сертификата
Имя поля (см. RFC 5280 ) | Ценить |
---|---|
tbsСертификат | ПОСЛЕДОВАТЕЛЬНОСТЬ TBSCertificate |
подписьАлгоритм | AlgorithmIdentifier алгоритма, используемого для подписи ключа: ECDSA для ключей EC, RSA для ключей RSA. |
подписьЗначение | СТРОКА БИТОВ, подпись, вычисленная на основе tbsCertificate в кодировке ASN.1 DER. |
ПОСЛЕДОВАТЕЛЬНОСТЬ TBSCertificate
Имя поля (см. RFC 5280 ) | Ценить |
---|---|
version | ЦЕЛОЕ ЧИСЛО 2 (означает сертификат v3) |
serialNumber | ЦЕЛОЕ ЧИСЛО 1 (фиксированное значение: одинаково для всех сертификатов) |
signature | AlgorithmIdentifier алгоритма, используемого для подписи ключа: ECDSA для ключей EC, RSA для ключей RSA. |
issuer | То же, что и поле темы ключа пакетной аттестации. |
validity | ПОСЛЕДОВАТЕЛЬНОСТЬ двух дат, содержащая значения Tag::ACTIVE_DATETIME и Tag::USAGE_EXPIRE_DATETIME . Эти значения указаны в миллисекундах с 1 января 1970 года. См. 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, содержащая кодировку DER подтверждения SEQUENCE. |
Продление аттестации
Расширение attestation
имеет OID 1.3.6.1.4.1.11129.2.1.17
. Оно содержит информацию о аттестуемой паре ключей и состоянии устройства во время генерации ключа.
Типы тегов Keymaster/KeyMint, определенные в спецификации интерфейса AIDL, преобразуются в типы ASN.1 следующим образом:
Тип Keymaster/KeyMint | Тип АСН.1 | Примечания |
---|---|---|
ENUM | INTEGER | |
ENUM_REP | SET of INTEGER | |
UINT | INTEGER | |
UINT_REP | SET of INTEGER | |
ULONG | INTEGER | |
ULONG_REP | SET of INTEGER | |
DATE | INTEGER | Миллисекунды с 1 января 1970 года 00:00:00 по Гринвичу. |
BOOL | NULL | Наличие тега означает истину, отсутствие — ложь. |
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 Мастер ключей версия 4.1 100 KeyMint версии 1.0 200 KeyMint версии 2.0 300 KeyMint версии 3.0 400 KeyMint версии 4.0 -
attestationSecurityLevel
Уровень безопасности места хранения заверенного ключа.
-
keymasterVersion
/keyMintVersion
- Версия реализации уровня аппаратной абстракции (HAL) Keymaster/KeyMint.
Ценить Версия Keymaster/KeyMint 2 Keymaster версия 2.0 3 Keymaster версия 3.0 4 Keymaster версия 4.0 41 Мастер ключей версия 4.1 100 KeyMint версии 1.0 200 KeyMint версии 2.0 300 KeyMint версии 3.0 400 KeyMint версии 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Уровень безопасности реализации Keymaster/KeyMint.
-
attestationChallenge
- Задача решается во время генерации ключа.
-
uniqueId
- Идентификатор устройства, чувствительный к конфиденциальности, который системные приложения могут запрашивать во время генерации ключа. Если уникальный идентификатор не запрашивается, это поле пустое. Подробности см. в разделе Уникальный идентификатор .
-
softwareEnforced
- Список авторизации Keymaster/KeyMint, который обеспечивается системой Android. Эта информация собирается или генерируется кодом платформы. Ей можно доверять, пока устройство работает под управлением операционной системы, соответствующей модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а
verifiedBootState
имеетVerified
). -
hardwareEnforced
- Список авторизации Keymaster/KeyMint, который обеспечивается Trusted Execution Environment (TEE) или StrongBox устройства. Эта информация собирается или генерируется кодом в защищенном оборудовании и не контролируется платформой. Например, информация может поступать из загрузчика или через защищенный канал связи, который не подразумевает доверия к платформе.
Значения SecurityLevel
Значение SecurityLevel
указывает степень устойчивости элемента, связанного с хранилищем ключей (например, пары ключей и подтверждения), к атакам.
Ценить | Значение |
---|---|
Software | Безопасно, пока система Android устройства соответствует модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а verifiedBootState имеет Verified ). |
TrustedEnvironment | Безопасно, пока не скомпрометирована Trusted Execution Environment (TEE). Требования к изоляции для TEE определены в разделах 9.11 [C-1-1] — [C-1-4] документа Android Compatibility Definition Document. TEE обладают высокой устойчивостью к удаленной компрометации и умеренной устойчивостью к компрометации путем прямой аппаратной атаки. |
StrongBox | Безопасно, пока StrongBox не скомпрометирован. StrongBox реализован в защищенном элементе, похожем на аппаратный модуль безопасности. Требования к реализации StrongBox определены в разделе 9.11.2 документа Android Compatibility Definition Document. StrongBox обладает высокой устойчивостью к удаленной компрометации и компрометации путем прямой аппаратной атаки (например, физического вмешательства и атак по сторонним каналам). |
Поля AuthorizationList
Каждое поле соответствует тегу авторизации Keymaster/KeyMint из спецификации интерфейса AIDL . Спецификация является источником истины о тегах авторизации: их значении, формате их содержимого, ожидается ли их появление в полях softwareEnforced
или hardwareEnforced
в объекте KeyDescription
, являются ли они взаимоисключающими с другими тегами и т. д. Все поля AuthorizationList
являются необязательными.
Каждое поле имеет EXPLICIT
контекстно-зависимый тег, равный номеру тега Keymaster/KeyMint, что позволяет более компактно представить данные в AuthorizationList
. Поэтому анализатор ASN.1 должен знать ожидаемый тип данных для каждого контекстно-зависимого тега. Например, Tag::USER_AUTH_TYPE
определяется как ENUM | 504
. В схеме расширения подтверждения поле purpose
в AuthorizationList
указывается как userAuthType [504] EXPLICIT INTEGER OPTIONAL
. Поэтому его кодировка ASN.1 будет содержать контекстно-зависимый тег 504
вместо тега класса UNIVERSAL
для типа ASN.1 INTEGER
, который равен 10
.
-
purpose
- Соответствует тегу авторизации
Tag::PURPOSE
, который использует значение идентификатора тега 1. -
algorithm
Соответствует тегу авторизации
Tag::ALGORITHM
, который использует значение идентификатора тега 2.В объекте аттестации
AuthorizationList
значение алгоритма всегда равноRSA
илиEC
.-
keySize
- Соответствует тегу авторизации
Tag::KEY_SIZE
, который использует значение идентификатора тега 3. -
blockMode
- Соответствует тегу авторизации
Tag::BLOCK_MODE
, который использует значение идентификатора тега 4. -
digest
- Соответствует тегу авторизации
Tag::DIGEST
, который использует значение идентификатора тега 5. -
padding
- Соответствует тегу авторизации
Tag::PADDING
, который использует значение идентификатора тега 6. -
callerNonce
- Соответствует тегу авторизации
Tag::CALLER_NONCE
, который использует значение идентификатора тега 7. -
minMacLength
- Соответствует тегу авторизации
Tag::MIN_MAC_LENGTH
, который использует значение идентификатора тега 8. -
ecCurve
Соответствует тегу авторизации
Tag::EC_CURVE
, который использует значение идентификатора тега 10.Набор параметров, используемых для генерации пары ключей эллиптической кривой (EC), которая использует ECDSA для подписи и проверки в системном хранилище ключей Android.
-
rsaPublicExponent
- Соответствует тегу авторизации
Tag::RSA_PUBLIC_EXPONENT
, который использует значение идентификатора тега 200. -
mgfDigest
Присутствует только в версии подтверждения ключа >= 100.
Соответствует тегу авторизации KeyMint TagTag::RSA_OAEP_MGF_DIGEST
, который использует значение идентификатора тега 203.-
rollbackResistance
Присутствует только в версии подтверждения ключа >= 3.
Соответствует тегу авторизации
Tag::ROLLBACK_RESISTANCE
, который использует значение идентификатора тега 303.-
earlyBootOnly
Присутствует только в версии подтверждения ключа >= 4.
Соответствует тегу авторизации
Tag::EARLY_BOOT_ONLY
, который использует значение идентификатора тега 305.-
activeDateTime
- Соответствует тегу авторизации
Tag::ACTIVE_DATETIME
, который использует значение идентификатора тега 400. -
originationExpireDateTime
- Соответствует тегу авторизации
Tag::ORIGINATION_EXPIRE_DATETIME
, который использует значение идентификатора тега 401. -
usageExpireDateTime
- Соответствует тегу авторизации
Tag::USAGE_EXPIRE_DATETIME
, который использует значение идентификатора тега 402. -
usageCountLimit
- Соответствует тегу авторизации
Tag::USAGE_COUNT_LIMIT
, который использует значение идентификатора тега 405. -
userSecureId
- Соответствует тегу авторизации
Tag::USER_SECURE_ID
, который использует значение идентификатора тега 502. -
noAuthRequired
Соответствует тегу авторизации Tag
Tag::NO_AUTH_REQUIRED
, который использует значение идентификатора тега 503.-
userAuthType
- Соответствует тегу авторизации
Tag::USER_AUTH_TYPE
, который использует значение идентификатора тега 504. -
authTimeout
- Соответствует тегу авторизации
Tag::AUTH_TIMEOUT
, который использует значение идентификатора тега 505. -
allowWhileOnBody
Соответствует тегу авторизации
Tag::ALLOW_WHILE_ON_BODY
, который использует значение идентификатора тега 506.Позволяет использовать ключ после истечения периода ожидания аутентификации, если пользователь все еще носит устройство на своем теле. Обратите внимание, что защищенный датчик на теле определяет, носит ли устройство пользователь на теле.
-
trustedUserPresenceReq
Присутствует только в версии подтверждения ключа >= 3.
Соответствует тегу авторизации
Tag::TRUSTED_USER_PRESENCE_REQUIRED
, который использует значение идентификатора тега 507.Указывает, что этот ключ можно использовать только в том случае, если пользователь предоставил доказательство физического присутствия. Вот несколько примеров:
- Для ключа StrongBox — аппаратная кнопка, жестко подключенная к контакту на устройстве StrongBox.
- Для ключа TEE аутентификация по отпечатку пальца обеспечивает доказательство присутствия, если TEE имеет исключительный контроль над сканером и выполняет процесс сопоставления отпечатков пальцев.
-
trustedConfirmationReq
Присутствует только в версии подтверждения ключа >= 3.
Соответствует тегу авторизации
Tag::TRUSTED_CONFIRMATION_REQUIRED
, который использует значение идентификатора тега 508.Указывает, что ключ можно использовать только в том случае, если пользователь подтверждает данные, которые нужно подписать, используя токен одобрения. Для получения дополнительной информации о том, как получить подтверждение пользователя, см. Android Protected Confirmation .
Примечание: этот тег применим только к ключам, которые используют цель
SIGN
.-
unlockedDeviceReq
Присутствует только в версии подтверждения ключа >= 3.
Соответствует тегу авторизации
Tag::UNLOCKED_DEVICE_REQUIRED
, который использует значение идентификатора тега 509.-
creationDateTime
- Соответствует тегу авторизации
Tag::CREATION_DATETIME
, который использует значение идентификатора тега 701. -
origin
Соответствует тегу авторизации Tag
Tag::ORIGIN
, который использует значение идентификатора тега 702.-
rootOfTrust
Соответствует тегу авторизации
Tag::ROOT_OF_TRUST
, который использует значение идентификатора тега 704.Более подробную информацию смотрите в разделе, описывающем структуру данных RootOfTrust .
-
osVersion
Соответствует тегу авторизации
Tag::OS_VERSION
, который использует значение идентификатора тега 705.Версия операционной системы Android, ассоциированной с Keymaster, указанная как шестизначное целое число. Например, версия 8.1.0 представлена как 080100.
Только версия Keymaster 1.0 или выше включает это значение в список авторизации.
-
osPatchLevel
Соответствует тегу авторизации
Tag::PATCHLEVEL
, который использует значение идентификатора тега 706.Месяц и год, связанные с патчем безопасности, который используется в Keymaster, указанные как шестизначное целое число. Например, патч августа 2018 года представлен как 201808.
Только версия Keymaster 1.0 или выше включает это значение в список авторизации.
-
attestationApplicationId
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_APPLICATION_ID
, который использует значение идентификатора тега 709.Более подробную информацию см. в разделе, описывающем структуру данных AttestationApplicationId .
-
attestationIdBrand
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_BRAND
, который использует значение идентификатора тега 710.-
attestationIdDevice
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_DEVICE
, который использует значение идентификатора тега 711.-
attestationIdProduct
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_PRODUCT
, который использует значение идентификатора тега 712.-
attestationIdSerial
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_SERIAL
, который использует значение идентификатора тега 713.-
attestationIdImei
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_IMEI
, который использует значение идентификатора тега 714.-
attestationIdMeid
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_MEID
, который использует значение идентификатора тега 715.-
attestationIdManufacturer
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_MANUFACTURER
, который использует значение идентификатора тега 716.-
attestationIdModel
Присутствует только в версиях подтверждения ключей >= 2.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_MODEL
, который использует значение идентификатора тега 717.-
vendorPatchLevel
Присутствует только в версиях подтверждения ключей >= 3.
Соответствует тегу авторизации
Tag::VENDOR_PATCHLEVEL
, который использует значение идентификатора тега 718.Указывает уровень исправления безопасности образа поставщика , который должен быть установлен на устройстве для использования этого ключа. Значение отображается в формате ГГГГММДД, представляя дату исправления безопасности поставщика. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности поставщика от 1 августа 2018 года, это значение будет 20180801.
-
bootPatchLevel
Присутствует только в версиях подтверждения ключей >= 3.
Соответствует тегу авторизации
Tag::BOOT_PATCHLEVEL
, который использует значение идентификатора тега 719.Указывает уровень исправления безопасности образа ядра , который должен быть установлен на устройстве для использования этого ключа. Значение отображается в формате ГГГГММДД, представляя дату исправления безопасности системы. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности системы от 5 августа 2018 года, это значение будет 20180805.
-
deviceUniqueAttestation
Присутствует только в версиях подтверждения ключей >= 4.
Соответствует тегу авторизации
Tag::DEVICE_UNIQUE_ATTESTATION
, который использует значение идентификатора тега 720.-
attestationIdSecondImei
Присутствует только в версиях подтверждения ключей >= 300.
Соответствует тегу авторизации
Tag::ATTESTATION_ID_SECOND_IMEI
, который использует значение идентификатора тега 723.-
moduleHash
Присутствует только в версиях подтверждения ключей >= 400.
Соответствует тегу авторизации
Tag::MODULE_HASH
, который использует значение идентификатора тега 724.
Поля RootOfTrust
-
verifiedBootKey
- Безопасный хэш открытого ключа, используемый для проверки целостности и подлинности всего кода, который выполняется во время загрузки устройства в рамках проверенной загрузки . Рекомендуется использовать SHA-256.
-
deviceLocked
- Заблокирован ли загрузчик устройства. Значение
true
означает, что устройство загрузило подписанный образ, который был успешно проверен Verified Boot . -
verifiedBootState
- Состояние проверенной загрузки устройства.
-
verifiedBootHash
- Дайджест всех данных, защищенных Verified Boot . Для устройств, использующих реализацию эталонной версии Android Verified Boot , это поле содержит дайджест VBMeta .
Значения VerifiedBootState
Ценить | Соответствующее состояние загрузки | Значение |
---|---|---|
Verified | GREEN | Полная цепочка доверия простирается от аппаратно защищенного корня доверия до загрузчика и всех разделов, проверенных Verified Boot . В этом состоянии поле verifiedBootKey содержит хэш встроенного корня доверия , который является сертификатом, встроенным в ПЗУ устройства производителем устройства на заводе. |
SelfSigned | YELLOW | То же, что и Verified , за исключением того, что проверка была выполнена с использованием корня доверия, настроенного пользователем, а не корня доверия, встроенного производителем на заводе. В этом состоянии поле verifiedBootKey содержит хэш открытого ключа, настроенного пользователем. |
Unverified | ORANGE | Загрузчик устройства разблокирован, поэтому цепочка доверия не может быть установлена. Устройство может быть свободно изменено, поэтому целостность устройства должна быть проверена пользователем вне диапазона. В этом состоянии поле verifiedBootKey содержит 32 байта нулей. |
Failed | RED | Устройство не прошло проверку. В этом состоянии нет никаких гарантий относительно содержимого других полей RootOfTrust . |
AttestationApplicationId
Это поле отражает убеждение платформы Android относительно того, каким приложениям разрешено использовать материал секретного ключа при аттестации. Оно может содержать несколько пакетов, если и только если несколько пакетов имеют один и тот же UID. Поле AttestationApplicationId
в AuthorizationList
имеет тип 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
. Имя поля вводит в заблуждение, поскольку дайджестированные данные — это сертификаты подписи приложения, а не подписи приложения, поскольку оно названо по классуSignature
, возвращаемому вызовомgetPackageInfo()
. В следующем фрагменте кода показан пример набора:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
Уникальный идентификатор
Уникальный идентификатор — это 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
равен 1, еслиTag::RESET_SINCE_ID_ROTATION
присутствует в параметре attest_params вызова attest_key, или 0, если тег отсутствует. -
HBK
— уникальный аппаратно-связанный секрет, известный Trusted Execution Environment и никогда им не раскрываемый. Секрет содержит не менее 128 бит энтропии и является уникальным для отдельного устройства (вероятностная уникальность приемлема, учитывая 128 бит энтропии). HBK должен быть получен из материала слитого ключа через HMAC или AES_CMAC.
Усеките вывод HMAC_SHA256 до 128 бит.
Ключи подтверждения подлинности и сертификаты
Два ключа, один RSA и один ECDSA, а также соответствующие цепочки сертификатов надежно хранятся в устройстве.
Android 12 представляет Remote Key Provisioning, а Android 13 требует, чтобы устройства его реализовали. Remote Key Provisioning предоставляет устройствам в полевых условиях сертификаты подтверждения подлинности ECDSA P256 для каждого приложения. Эти сертификаты имеют более короткий срок действия, чем заводские сертификаты.
Несколько IMEI
В Android 14 добавлена поддержка нескольких IMEI в записи Android Key Attestation. OEM-производители могут реализовать эту функцию, добавив тег KeyMint для второго IMEI. Устройства все чаще имеют несколько сотовых радиомодулей, и теперь OEM-производители могут поддерживать устройства с двумя IMEI.
OEM-производители обязаны иметь вторичный IMEI, если он присутствует на их устройствах, для предоставления его реализациям KeyMint, чтобы эти реализации могли подтвердить его таким же образом, как они подтверждают первый IMEI.
Расширение информации о предоставлении
Расширение информации о предоставлении имеет OID 1.3.6.1.4.1.11129.2.1.30
. Расширение предоставляет информацию, известную об устройстве серверу предоставления.
Схема
Расширение следует следующей схеме CDDL :
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
Карта не имеет версий, и в нее могут быть добавлены новые необязательные поля.
-
certs_issued
Приблизительное количество сертификатов, выданных устройству за последние 30 дней. Это значение может быть использовано как сигнал о потенциальном злоупотреблении, если значение превышает среднее на несколько порядков.
-
validated_attested_entity
Проверенная аттестованная сущность — это строка, описывающая тип устройства, которое было подтверждено сервером обеспечения для аттестации. Например,
STRONG_BOX
илиTEE
.
удостоверение личности
Android 8.0 включает дополнительную поддержку подтверждения ID для устройств с Keymaster 3. Подтверждение ID позволяет устройству предоставить подтверждение своих аппаратных идентификаторов, таких как серийный номер или IMEI. Хотя это необязательная функция, настоятельно рекомендуется, чтобы все реализации Keymaster 3 поддерживали ее, поскольку возможность подтверждения личности устройства позволяет использовать такие варианты использования, как настоящая удаленная настройка без касания, более безопасно (поскольку удаленная сторона может быть уверена, что она общается с правильным устройством, а не с устройством, подделывающим ее личность).
Подтверждение идентификатора работает путем создания копий идентификаторов оборудования устройства, к которым может получить доступ только Trusted Execution Environment (TEE) до того, как устройство покинет завод. Пользователь может разблокировать загрузчик устройства и изменить системное программное обеспечение и идентификаторы, сообщаемые фреймворками Android. Копии идентификаторов, хранящиеся в TEE, не могут быть изменены таким образом, что гарантирует, что подтверждение идентификатора устройства подтверждает только оригинальные идентификаторы оборудования устройства, тем самым предотвращая попытки подделки.
Основная поверхность API для подтверждения подлинности идентификатора строится поверх существующего механизма подтверждения подлинности ключа, представленного в Keymaster 2. При запросе сертификата подтверждения подлинности для ключа, хранящегося в keymaster, вызывающий может запросить включение идентификаторов оборудования устройства в метаданные сертификата подтверждения подлинности. Если ключ хранится в TEE, сертификат возвращается к известному корню доверия. Получатель такого сертификата может проверить, что сертификат и его содержимое, включая идентификаторы оборудования, были написаны TEE. При запросе включить идентификаторы оборудования в сертификат подтверждения подлинности TEE подтверждает только идентификаторы, хранящиеся в его хранилище, как они были заполнены на заводе.
Свойства хранения
Хранилище, в котором хранятся идентификаторы устройства, должно обладать следующими свойствами:
- Значения, полученные из исходных идентификаторов устройства, копируются в хранилище до того, как устройство покидает завод.
- Метод
destroyAttestationIds()
может навсегда уничтожить эту копию данных, полученных из идентификатора. Постоянное уничтожение означает, что данные полностью удалены, поэтому ни сброс настроек к заводским настройкам, ни любая другая процедура, выполненная на устройстве, не сможет их восстановить. Это особенно важно для устройств, на которых пользователь разблокировал загрузчик, изменил системное программное обеспечение и изменил идентификаторы, возвращаемые фреймворками Android. - RMA-объекты должны иметь возможность генерировать свежие копии данных, полученных из идентификатора оборудования. Таким образом, устройство, проходящее через RMA, может снова выполнить аттестацию идентификатора. Механизм, используемый RMA-объектами, должен быть защищен, чтобы пользователи не могли вызвать его самостоятельно, поскольку это позволило бы им получить аттестации поддельных идентификаторов.
- Никакой другой код, кроме доверенного приложения Keymaster в TEE, не способен прочитать полученные из идентификатора данные, хранящиеся в хранилище.
- Хранилище защищено от несанкционированного доступа: если содержимое хранилища было изменено, TEE обращается с ним так же, как если бы копии содержимого были уничтожены, и отклоняет все попытки подтверждения личности. Это реализуется путем подписания или MAC-кодирования хранилища , как описано ниже .
- Хранилище не содержит исходные идентификаторы. Поскольку аттестация идентификаторов подразумевает вызов, вызывающая сторона всегда предоставляет идентификаторы для аттестации. TEE нужно только проверить, что они соответствуют значениям, которые у них были изначально. Хранение защищенных хэшей исходных значений, а не значений, позволяет выполнить эту проверку.
Строительство
Чтобы создать реализацию, которая обладает перечисленными выше свойствами, сохраните значения, полученные из идентификатора, в следующей конструкции S. Не храните другие копии значений идентификатора, за исключением обычных мест в системе, которые владелец устройства может изменить, получив права root:
S = D || HMAC(HBK, D)
где:
-
D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
-
HMAC
— это конструкция HMAC с соответствующим безопасным хэшем (рекомендуется SHA-256) -
HBK
— это аппаратно-привязанный ключ, не используемый ни для каких других целей. -
ID 1 ...ID n
— исходные значения идентификаторов; привязка конкретного значения к конкретному индексу зависит от реализации, поскольку разные устройства имеют разное количество идентификаторов. -
||
представляет собой конкатенацию
Поскольку выходные данные HMAC имеют фиксированный размер, не требуется никаких заголовков или другой структуры для нахождения индивидуальных хэшей идентификаторов или HMAC D. Помимо проверки предоставленных значений для выполнения аттестации, реализации должны проверять S путем извлечения D из S, вычисления HMAC(HBK, D) и сравнения его со значением в S для проверки того, что никакие индивидуальные идентификаторы не были изменены/повреждены. Кроме того, реализации должны использовать сравнения с постоянным временем для всех индивидуальных элементов идентификаторов и проверки S. Время сравнения должно быть постоянным независимо от количества предоставленных идентификаторов и правильного сопоставления любой части теста.
Идентификаторы оборудования
Подтверждение идентификатора поддерживает следующие идентификаторы оборудования:
- Название бренда, возвращаемое
Build.BRAND
в Android - Имя устройства, возвращаемое
Build.DEVICE
в Android - Название продукта, возвращаемое
Build.PRODUCT
в Android - Название производителя, возвращаемое
Build.MANUFACTURER
в Android - Название модели, возвращаемое
Build.MODEL
в Android - Серийный номер
- IMEI всех радиостанций
- MEID всех радиостанций
Для поддержки аттестации идентификатора устройства устройство аттестует эти идентификаторы. Все устройства под управлением Android имеют первые шесть, и они необходимы для работы этой функции. Если устройство имеет какие-либо интегрированные сотовые радиомодули, устройство также должно поддерживать аттестацию для IMEI и/или MEID радиомодулей.
Подтверждение идентификатора запрашивается путем выполнения подтверждения ключа и включения идентификаторов устройств для подтверждения в запрос. Идентификаторы помечаются как:
-
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.
Если устройство не поддерживает аттестацию идентификаторов (или destroyAttestationIds()
был вызван ранее и устройство больше не может аттестовать свои идентификаторы), любой запрос на аттестацию ключей, включающий один или несколько из этих тегов, завершается ошибкой ErrorCode::CANNOT_ATTEST_IDS
.
Если устройство поддерживает аттестацию идентификатора и один или несколько из указанных выше тегов были включены в запрос на аттестацию ключа, TEE проверяет, соответствует ли идентификатор, предоставленный с каждым из тегов, его копии идентификаторов оборудования. Если один или несколько идентификаторов не совпадают, вся аттестация завершается с ErrorCode::CANNOT_ATTEST_IDS
. Допустимо, чтобы один и тот же тег был предоставлен несколько раз. Это может быть полезно, например, при аттестации IMEI: Устройство может иметь несколько радиомодулей с несколькими IMEI. Запрос на аттестацию действителен, если значение, предоставленное с каждым ATTESTATION_ID_IMEI
соответствует одному из радиомодулей устройства. То же самое относится ко всем остальным тегам.
Если аттестация прошла успешно, аттестованные идентификаторы добавляются в расширение аттестации (OID 1.3.6.1.4.1.11129.2.1.17) выданного сертификата аттестации, используя схему выше . Изменения от схемы аттестации Keymaster 2 выделены жирным шрифтом с комментариями.
Java-API
Этот раздел носит исключительно информационный характер. Разработчики Keymaster не реализуют и не используют API Java. Это сделано для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать ее по-разному, поэтому крайне важно, чтобы этот раздел не рассматривался как нормативный.