Хранилище ключей обеспечивает более безопасное место для создания, хранения и использования криптографических ключей под контролем. При наличии и использовании аппаратного хранилища ключей ключевые данные более защищены от извлечения с устройства, а KeyMint (ранее Keymaster) обеспечивает соблюдение ограничений, которые сложно обойти.
Однако это справедливо только в том случае, если известно, что ключи хранилища ключей находятся в аппаратном хранилище. В Keymaster 1 приложения или удалённые серверы не могли надёжно проверить это. Демон хранилища ключей загружал доступный уровень аппаратной абстракции (HAL) Keymaster и принимал во внимание всё, что HAL говорил об аппаратном обеспечении ключей.
Чтобы исправить это, в 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 ) | Ценить |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
сигнатурный алгоритм | AlgorithmIdentifier алгоритма, используемого для подписи ключа: ECDSA для ключей EC, RSA для ключей RSA. |
подписьЗначение | БИТОВАЯ СТРОКА, подпись, вычисленная на основе tbsCertificate, закодированного в формате ASN.1 DER. |
TBSCertificate SEQUENCE
Имя поля (см. RFC 5280 ) | Ценить |
---|---|
version | ЦЕЛОЕ ЧИСЛО 2 (означает сертификат v3) |
serialNumber | INTEGER 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» (фиксированное значение: одинаковое для всех сертификатов) |
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-кодировку последовательности аттестации. |
Расширение аттестации
Расширение attestation
имеет OID 1.3.6.1.4.1.11129.2.1.17
. Оно содержит информацию об аттестуемой паре ключей и состоянии устройства на момент генерации ключа.
Типы тегов Keymaster/KeyMint, определенные в спецификации интерфейса AIDL, преобразуются в типы 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 | Миллисекунды с 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.
Ценить Версия 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 -
attestationSecurityLevel
Уровень безопасности места хранения заверенного ключа.
-
keymasterVersion
/keyMintVersion
- Версия реализации HAL KeyMint или Keymaster.
Ценить Версия 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 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Уровень безопасности реализации KeyMint или Keymaster.
-
attestationChallenge
- Задача решается во время генерации ключа.
-
uniqueId
- Идентификатор устройства, чувствительный к конфиденциальности, который системные приложения могут запрашивать при генерации ключа. Если уникальный идентификатор не запрашивается, это поле пустое. Подробнее см. в разделе «Уникальный идентификатор» .
-
softwareEnforced
- Список авторизации KeyMint или Keymaster, применяемый системой Android. Эта информация собирается или генерируется кодом платформы. Доверять ей можно, если устройство работает под управлением операционной системы, соответствующей модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а параметр
verifiedBootState
имеетVerified
). -
hardwareEnforced
- Список авторизации KeyMint или Keymaster, который обеспечивается доверенной средой выполнения (TEE) или StrongBox устройства. Эта информация собирается или генерируется кодом в защищённом оборудовании и не контролируется платформой. Например, информация может поступать от загрузчика или по защищённому каналу связи, не требующему доверия к платформе.
Значения SecurityLevel
Значение SecurityLevel
указывает степень устойчивости элемента, связанного с хранилищем ключей (например, пары ключей и подтверждения), к атакам.
Ценить | Значение |
---|---|
Software | Безопасно, пока система Android устройства соответствует модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а параметр verifiedBootState имеет Verified ). |
TrustedEnvironment | Безопасность сохраняется до тех пор, пока TEE не скомпрометирован. Требования к изоляции TEE определены в разделах 9.11 [C-1-1] – [C-1-4] документа «Определение совместимости Android». TEE обладают высокой устойчивостью к удалённой компрометации и умеренной устойчивостью к компрометации путём прямой аппаратной атаки. |
StrongBox | StrongBox безопасен, пока не скомпрометирован. StrongBox реализован в виде защищенного элемента, аналогичного аппаратному модулю безопасности. Требования к реализации StrongBox изложены в разделе 9.11.2 документа «Определение совместимости Android». StrongBox обладает высокой устойчивостью к удаленной компрометации и компрометации путем прямых аппаратных атак (например, физического вмешательства и атак по сторонним каналам). |
Поля AuthorizationList
Каждое поле соответствует тегу авторизации Keymaster/KeyMint из спецификации интерфейса AIDL . Эта спецификация является источником информации о тегах авторизации: их значении, формате содержимого, предполагается ли их появление в полях softwareEnforced
или hardwareEnforced
объекта KeyDescription
, являются ли они взаимоисключающими с другими тегами и т. д. Все поля AuthorizationList
являются необязательными.
Каждое поле имеет EXPLICIT
контекстно-зависимый тег, равный номеру тега KeyMint или Keymaster, что обеспечивает более компактное представление данных в 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]), ...}
Расширение информации о предоставлении услуг
Расширение информации о предоставлении имеет 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
.
Ключи подтверждения подлинности
Два ключа (один RSA и один ECDSA) и соответствующие цепочки сертификатов надежно защищены в устройстве.
В Android 12 появилась функция удалённой подготовки ключей (Remote Key Provisioning), а в Android 13 требуется её поддержка на устройствах. Функция удалённой подготовки ключей (Remote Key Provisioning) предоставляет устройствам, работающим на местах, сертификаты аттестации ECDSA P256 для каждого приложения. Срок действия этих сертификатов короче, чем у заводских сертификатов.
Уникальный идентификатор
Уникальный идентификатор — это 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
— это уникальный аппаратный секрет, известный среде доверенного выполнения и никогда ею не раскрываемый. Секрет содержит не менее 128 бит энтропии и уникален для каждого устройства (вероятностная уникальность приемлема, учитывая 128 бит энтропии). HBK следует получать из слитого ключевого материала с помощью HMAC или AES_CMAC.
Усеките вывод HMAC_SHA256 до 128 бит.
Несколько IMEI
В Android 14 добавлена поддержка нескольких IMEI в записи подтверждения ключа Android. OEM-производители могут реализовать эту функцию, добавив тег KeyMint для второго IMEI. Устройства становятся всё более распространёнными, и теперь OEM-производители могут поддерживать устройства с двумя IMEI.
Производители оригинального оборудования обязаны иметь вторичный IMEI, если он присутствует на их устройствах, для предоставления его реализациям KeyMint, чтобы эти реализации могли подтвердить его таким же образом, как они подтверждают первый IMEI.
подтверждение личности
В Android 8.0 реализована опциональная поддержка подтверждения подлинности ID для устройств с Keymaster 3. Подтверждение ID позволяет устройству подтвердить свои аппаратные идентификаторы, такие как серийный номер или IMEI. Хотя эта функция является необязательной, настоятельно рекомендуется, чтобы все реализации Keymaster 3 поддерживали её, поскольку возможность подтверждения подлинности устройства повышает безопасность таких вариантов использования, как полностью автоматическая удалённая настройка (поскольку удалённая сторона может быть уверена, что взаимодействует с нужным устройством, а не с устройством, подделывающим его идентификатор).
Подтверждение идентификатора устройства работает путём создания копий аппаратных идентификаторов устройства, к которым до выхода устройства с завода имеет доступ только 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. Это сделано для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать её по-разному, поэтому крайне важно не рассматривать этот раздел как нормативный.