Keystore обеспечивает более безопасное место для контролируемого создания, хранения и использования криптографических ключей. Когда доступно и используется аппаратное хранилище ключей, ключевой материал более защищен от извлечения из устройства, а Keymaster применяет ограничения, которые трудно обойти.
Однако это верно только в том случае, если известно, что ключи хранилища ключей находятся в аппаратном хранилище. В Keymaster 1 у приложений или удаленных серверов не было возможности надежно проверить, так ли это. Демон хранилища ключей загрузил доступный ключевой мастер 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 ) | Ценить |
---|---|
tbsCertificate | TBSCertificate ПОСЛЕДОВАТЕЛЬНОСТЬ |
подписьАлгоритм | AlgorithmIdentifier алгоритма, используемого для подписи ключа: ECDSA для ключей EC, RSA для ключей RSA. |
подписьзначение | BIT STRING, подпись, вычисленная на 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» (фиксированное значение: одинаковое для всех сертификатов) |
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 следующим образом:
Тип 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:
Версия 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 Ключевой мастер версии 2.0 2 Ключевой мастер версии 3.0 3 Ключевой мастер версии 4.0 4 Ключевой мастер версии 4.1 100 КейМинт версия 1.0 200 КейМинт версия 2.0 300 КейМинт версия 3.0 -
attestationSecurityLevel
Уровень безопасности места, где хранится заверенный ключ.
-
keymasterVersion
/keyMintVersion
- Версия реализации уровня аппаратной абстракции (HAL) Keymaster/KeyMint.
Ценить Версия Keymaster/KeyMint 2 Ключевой мастер версии 2.0 3 Ключевой мастер версии 3.0 4 Ключевой мастер версии 4.0 41 Ключевой мастер версии 4.1 100 КейМинт версия 1.0 200 КейМинт версия 2.0 300 КейМинт версия 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Уровень безопасности реализации Keymaster/KeyMint.
-
attestationChallenge
- Задача, представленная во время генерации ключа.
-
uniqueId
- Идентификатор устройства, чувствительный к конфиденциальности, который системные приложения могут запрашивать во время генерации ключа. Если уникальный идентификатор не запрашивается, это поле пусто. Подробности смотрите в разделе Уникальный идентификатор .
-
softwareEnforced
- Список авторизации Keymaster/KeyMint, который применяется системой Android. Эта информация собирается или генерируется кодом платформы и хранится в системном разделе устройства. Ему можно доверять, если на устройстве установлена операционная система, соответствующая модели безопасности платформы Android (т. е. загрузчик устройства заблокирован и значение
verifiedBootState
имеетVerified
). -
hardwareEnforced
- Список авторизации Keymaster/KeyMint, который применяется доверенной средой выполнения (TEE) или StrongBox устройства. Эта информация собирается или генерируется кодом на защищенном оборудовании и не контролируется платформой. Например, информация может поступать от загрузчика или по защищенному каналу связи, не предполагающему доверия к платформе.
Значения уровня безопасности
Значение 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 обладает высокой устойчивостью к удаленному компрометированию и компрометации путем прямых аппаратных атак (например, физического вмешательства и атак по побочным каналам). |
Поля списка авторизации
Каждое поле соответствует тегу авторизации 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. -
digest
- Соответствует тегу авторизации
Tag::DIGEST
, который использует значение идентификатора тега, равное 5. -
padding
- Соответствует тегу авторизации
Tag::PADDING
, который использует значение идентификатора тега 6. -
ecCurve
Соответствует тегу авторизации
Tag::EC_CURVE
, который использует значение идентификатора тега 10.Набор параметров, используемых для создания пары ключей эллиптической кривой (EC), которая использует ECDSA для подписи и проверки, в хранилище ключей системы Android.
-
rsaPublicExponent
- Соответствует тегу авторизации
Tag::RSA_PUBLIC_EXPONENT
, который использует значение идентификатора тега 200. -
mgfDigest
Присутствует только в версии аттестации ключа >= 100.
Соответствует тегу авторизацииTag::RSA_OAEP_MGF_DIGEST
KeyMint, который использует значение идентификатора тега 203.-
rollbackResistance
Присутствует только в версии аттестации ключа >= 3.
Соответствует тегу авторизации
Tag::ROLLBACK_RESISTANCE
, который использует значение идентификатора тега 303.-
earlyBootOnly
Присутствует только в версии аттестации ключа >= 4.
Соответствует тегу авторизации
Tag::EARLY_BOOT_ONLY
, который использует значение идентификатора тега 305.-
activeDateTime
- Соответствует тегу авторизации
Tag::ACTIVE_DATETIME
, который использует значение идентификатора тега 400. -
originationExpireDateTime
- Соответствует тегу авторизации
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster, который использует значение идентификатора тега 401. -
usageExpireDateTime
- Соответствует тегу авторизации
Tag::USAGE_EXPIRE_DATETIME
, который использует значение идентификатора тега 402. -
usageCountLimit
- Соответствует тегу авторизации
Tag::USAGE_COUNT_LIMIT
, который использует значение идентификатора тега 405. -
noAuthRequired
Соответствует тегу авторизации
Tag::NO_AUTH_REQUIRED
, который использует значение идентификатора тега 503.-
userAuthType
- Соответствует тегу авторизации
Tag::USER_AUTH_TYPE
, который использует значение идентификатора тега 504. -
authTimeout
- Соответствует тегу авторизации
Tag::AUTH_TIMEOUT
, который использует значение идентификатора тега 505. -
allowWhileOnBody
Соответствует тегу авторизации
Tag::ALLOW_WHILE_ON_BODY
, который использует значение идентификатора тега 506.Позволяет использовать ключ по истечении времени ожидания аутентификации, если пользователь все еще носит устройство на своем теле. Обратите внимание, что безопасный датчик на теле определяет, носит ли устройство на теле пользователя.
-
trustedUserPresenceRequired
Присутствует только в версии аттестации ключа >= 3.
Соответствует тегу авторизации
Tag::TRUSTED_USER_PRESENCE_REQUIRED
, который использует значение идентификатора тега 507.Указывает, что этот ключ можно использовать только в том случае, если пользователь предоставил доказательство физического присутствия. Несколько примеров включают следующее:
- Для ключа StrongBox — аппаратная кнопка, жестко подключенная к контакту на устройстве StrongBox.
- Для ключа TEE аутентификация по отпечатку пальца обеспечивает доказательство присутствия, пока TEE имеет исключительный контроль над сканером и выполняет процесс сопоставления отпечатков пальцев.
-
trustedConfirmationRequired
Присутствует только в версии аттестации ключа >= 3.
Соответствует тегу авторизации
Tag::TRUSTED_CONFIRMATION_REQUIRED
, который использует значение идентификатора тега 508.Указывает, что ключ можно использовать только в том случае, если пользователь предоставляет подтверждение подписываемых данных с помощью токена утверждения. Дополнительные сведения о том, как получить подтверждение пользователя, см. в разделе Android Protected Confirmation .
Примечание. Этот тег применим только к клавишам, которые используют функцию
SIGN
.-
unlockedDeviceRequired
Присутствует только в версии аттестации ключа >= 3.
Соответствует тегу авторизации
Tag::UNLOCKED_DEVICE_REQUIRED
, который использует значение идентификатора тега 509.-
allApplications
Соответствует тегу авторизации
Tag::ALL_APPLICATIONS
, который использует значение идентификатора тега 600.Указывает, могут ли все приложения на устройстве получить доступ к паре ключей.
-
applicationId
- Соответствует тегу авторизации
Tag::APPLICATION_ID
, который использует значение идентификатора тега 601. -
creationDateTime
- Соответствует тегу авторизации
Tag::CREATION_DATETIME
, который использует значение идентификатора тега 701. -
origin
Соответствует тегу авторизации
Tag::ORIGIN
, который использует значение идентификатора тега 702.-
rollbackResistant
Присутствует только в версиях 1 и 2 аттестации ключей.
Соответствует тегу авторизации
Tag::ROLLBACK_RESISTANT
, который использует значение идентификатора тега 703.-
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
Keymaster, который использует значение идентификатора тега 709.Дополнительные сведения см. в разделе, описывающем структуру данных AttestationApplicationId .
-
attestationIdBrand
Присутствует только в версиях ключевой аттестации >= 2.
Соответствует
Tag::ATTESTATION_ID_BRAND
Keymaster, который использует значение идентификатора тега 710.-
attestationIdDevice
Присутствует только в версиях ключевой аттестации >= 2.
Соответствует
Tag::ATTESTATION_ID_DEVICE
Keymaster, который использует значение идентификатора тега 711.-
attestationIdProduct
Присутствует только в версиях ключевой аттестации >= 2.
Соответствует
Tag::ATTESTATION_ID_PRODUCT
Keymaster, который использует значение идентификатора тега 712.-
attestationIdSerial
Присутствует только в версиях ключевой аттестации >= 2.
Соответствует
Tag::ATTESTATION_ID_SERIAL
Keymaster, который использует значение идентификатора тега 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.
Поля RootOfTrust
-
verifiedBootKey
- Безопасный хэш открытого ключа, используемый для проверки целостности и аутентичности всего кода, который выполняется во время загрузки устройства в рамках проверенной загрузки . Рекомендуется SHA-256.
-
deviceLocked
- Заблокирован ли загрузчик устройства.
true
означает, что устройство загрузило подписанный образ, который был успешно проверен Verified Boot . -
verifiedBootState
- Состояние проверенной загрузки устройства.
-
verifiedBootHash
- Дайджест всех данных, защищенных Verified Boot . Для устройств, использующих эталонную реализацию Android Verified Boot , это поле содержит дайджест VBMeta .
Значения проверенногобутстате
Ценить | Соответствующее состояние загрузки | Значение |
---|---|---|
Verified | GREEN | Полная цепочка доверия простирается от корня доверия, защищенного аппаратным обеспечением, до загрузчика и всех разделов, проверенных проверенной загрузкой . В этом состоянии поле verifiedBootKey содержит хеш встроенного корня доверия , который представляет собой сертификат, встроенный в ПЗУ устройства производителем устройства на заводе. |
SelfSigned | YELLOW | То же, что и Verified , за исключением того, что проверка выполнялась с использованием корня доверия, настроенного пользователем, а не корня доверия, встроенного производителем на заводе. В этом состоянии поле verifiedBootKey содержит хеш открытого ключа, настроенного пользователем. |
Unverified | ORANGE | Загрузчик устройства разблокирован, поэтому цепочку доверия установить невозможно. Устройство можно свободно модифицировать, поэтому целостность устройства должна быть проверена пользователем вне канала. В этом состоянии поле verifiedBootKey содержит 32 байта нулей. |
Failed | RED | Устройство не прошло проверку. В этом состоянии нет никаких гарантий относительно содержимого других полей RootOfTrust . |
Идентификатор приложения аттестации
Это поле отражает мнение платформы 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
— это уникальный аппаратный секрет, известный Доверенной среде выполнения и никогда ею не раскрываемый. Секрет содержит не менее 128 бит энтропии и уникален для отдельного устройства (вероятностная уникальность приемлема, учитывая 128 бит энтропии). HBK должен быть получен из материала объединенного ключа через HMAC или AES_CMAC.
Усеките выходные данные HMAC_SHA256 до 128 бит.
Ключи и сертификаты аттестации
Два ключа, один RSA и один ECDSA, а также соответствующие цепочки сертификатов надежно хранятся в устройстве.
В Android 12 реализована функция удаленного предоставления ключей, а в Android 13 требуется, чтобы устройства реализовали ее. Remote Key Provisioning предоставляет устройствам в полевых условиях сертификаты аттестации ECDSA P256 для каждого приложения. Эти сертификаты имеют более короткий срок действия, чем сертификаты, предоставленные заводом-изготовителем.
Несколько IMEI
В Android 14 добавлена поддержка нескольких IMEI в записи аттестации ключа Android. OEM-производители могут реализовать эту функцию, добавив тег KeyMint для второго IMEI. Все чаще устройства имеют несколько сотовых радиомодулей, и OEM-производители теперь могут поддерживать устройства с двумя IMEI.
OEM-производители должны иметь вторичный IMEI, если он присутствует на их устройствах, который должен быть предоставлен реализации KeyMint, чтобы эти реализации могли подтвердить его так же, как они подтверждают первый IMEI.
удостоверение личности
Android 8.0 включает дополнительную поддержку аттестации идентификатора для устройств с Keymaster 3. Аттестация идентификатора позволяет устройству предоставить подтверждение идентификаторов своего оборудования, таких как серийный номер или IMEI. Несмотря на то, что это необязательная функция, настоятельно рекомендуется, чтобы все реализации Keymaster 3 обеспечивали ее поддержку, поскольку возможность подтверждения идентичности устройства позволяет использовать такие варианты использования, как настоящая удаленная настройка без касания, более безопасными (поскольку удаленная сторона может быть уверена, что она обращается к нужному устройству, а не к устройству, подделывающему его личность).
Аттестация идентификатора работает путем создания копий идентификаторов оборудования устройства, к которым может получить доступ только доверенная среда выполнения (TEE) до того, как устройство покинет завод. Пользователь может разблокировать загрузчик устройства и изменить системное программное обеспечение и идентификаторы, сообщаемые платформами Android. Копиями идентификаторов, хранящихся в TEE, нельзя манипулировать таким образом, гарантируя, что аттестация идентификатора устройства подтверждает только исходные идентификаторы оборудования устройства, тем самым предотвращая попытки подделки.
Основная поверхность API для аттестации идентификаторов построена на основе существующего механизма аттестации ключей, представленного в Keymaster 2. При запросе сертификата аттестации для ключа, хранящегося в keymaster, вызывающая сторона может запросить включение идентификаторов оборудования устройства в метаданные сертификата аттестации. Если ключ хранится в TEE, сертификат связывается с известным корнем доверия. Получатель такого сертификата может убедиться, что сертификат и его содержимое, включая идентификаторы оборудования, были написаны TEE. Когда его просят включить идентификаторы оборудования в сертификат аттестации, TEE подтверждает только те идентификаторы, которые хранятся в его хранилище и заполняются на заводе.
Свойства хранения
Хранилище, в котором хранятся идентификаторы устройства, должно иметь следующие свойства:
- Значения, полученные из исходных идентификаторов устройства, копируются в хранилище до того, как устройство покинет завод.
- Метод
destroyAttestationIds()
может безвозвратно уничтожить эту копию данных, полученных из идентификатора. Безвозвратное уничтожение означает, что данные полностью удалены, поэтому ни сброс к заводским настройкам, ни любая другая процедура, выполняемая на устройстве, не может их восстановить. Это особенно важно для устройств, на которых пользователь разблокировал загрузчик, изменил системное программное обеспечение и изменил идентификаторы, возвращаемые платформами Android. - Средства RMA должны иметь возможность генерировать свежие копии данных, полученных из идентификатора оборудования. Таким образом, устройство, прошедшее через RMA, может снова выполнить аттестацию идентификатора. Механизм, используемый средствами RMA, должен быть защищен так, чтобы пользователи не могли вызвать его самостоятельно, поскольку это позволило бы им получить подтверждения поддельных идентификаторов.
- Никакой код, кроме доверенного приложения Keymaster в TEE, не может читать данные, полученные из идентификатора, хранящиеся в хранилище.
- Хранилище защищено от несанкционированного доступа: если содержимое хранилища было изменено, TEE рассматривает его так же, как если бы копии содержимого были уничтожены, и отклоняет все попытки подтверждения идентификатора. Это реализуется путем подписания или MAC-адреса хранилища , как описано ниже .
- В хранилище не хранятся исходные идентификаторы. Поскольку аттестация идентификатора требует проверки, вызывающая сторона всегда предоставляет идентификаторы, подлежащие аттестации. TEE необходимо только убедиться, что они соответствуют исходным значениям. Хранение безопасных хэшей исходных значений, а не самих значений, обеспечивает такую проверку.
Строительство
Чтобы создать реализацию, имеющую перечисленные выше свойства, сохраните значения, производные от идентификатора, в следующей конструкции S. Не храните другие копии значений идентификатора, за исключением обычных мест в системе, которые владелец устройства может изменить путем рутирования:
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 не реализуют и не используют Java API. Это сделано для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать его по-разному, поэтому крайне важно, чтобы этот раздел не рассматривался как нормативный.