Подтверждение ключа и удостоверения личности

Keystore обеспечивает более безопасное место для создания, хранения и использования криптографических ключей контролируемым образом. Когда доступно и используется аппаратное хранилище ключей, ключевой материал более защищен от извлечения с устройства, а Keymaster обеспечивает соблюдение ограничений, которые трудно обойти.

Однако это верно только в том случае, если известно, что ключи хранилища ключей находятся в аппаратном хранилище. В Keymaster 1 не было возможности для приложений или удаленных серверов надежно проверить, так ли это. Демон хранилища ключей загружал доступный keymaster HAL и верил всему, что говорил HAL относительно аппаратного обеспечения ключей.

Чтобы исправить эту ситуацию, Keymaster ввел аттестацию ключей в Android 7.0 (Keymaster 2) и аттестацию идентификаторов в Android 8.0 (Keymaster 3).

Целью аттестации ключей является предоставление способа надежного определения того, имеет ли асимметричная пара ключей аппаратную поддержку, каковы свойства ключа и какие ограничения применяются к его использованию.

Подтверждение идентификатора позволяет устройству предоставить подтверждение своих аппаратных идентификаторов, таких как серийный номер или IMEI.

Ключевое подтверждение

Для поддержки аттестации ключей в Android 7.0 был введен набор тегов, типов и методов для HAL.

Теги

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

Тип

Keymaster 2 и ниже

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

Метод AttestKey

Мастер ключей 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 и ниже

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev — структура устройства keymaster.
  • keyToAttest — это ключевой блок, возвращаемый функцией generateKey , для которого создается подтверждение.
  • attestParams — это список всех параметров, необходимых для аттестации. Сюда входят Tag::ATTESTATION_CHALLENGE и, возможно, Tag::RESET_SINCE_ID_ROTATION , а также Tag::APPLICATION_ID и Tag::APPLICATION_DATA . Последние два необходимы для расшифровки ключа, если они были указаны во время генерации ключа.
  • certChain — выходной параметр, который возвращает массив сертификатов. Запись 0 — это сертификат подтверждения, то есть он удостоверяет ключ из keyToAttest и содержит расширение подтверждения.

Метод attestKey считается операцией открытого ключа на заверенном ключе, поскольку он может быть вызван в любое время и не требует соблюдения ограничений авторизации. Например, если заверенный ключ требует аутентификации пользователя для использования, аттестация может быть сгенерирована без аутентификации пользователя.

Удостоверение личности

Сертификат подтверждения — это стандартный сертификат X.509 с необязательным расширением подтверждения, содержащим описание заверенного ключа. Сертификат подписан сертифицированным ключом подтверждения . Ключ подтверждения может использовать другой алгоритм, нежели заверенный ключ.

Сертификат подтверждения содержит поля, указанные в таблице ниже, и не может содержать никаких дополнительных полей. Некоторые поля указывают фиксированное значение поля. Тесты CTS подтверждают, что содержимое сертификата точно соответствует определению.

ПОСЛЕДОВАТЕЛЬНОСТЬ сертификата

Имя поля (см. RFC 5280 ) Ценить
tbsСертификат ПОСЛЕДОВАТЕЛЬНОСТЬ TBSCertificate
подписьАлгоритм AlgorithmIdentifier алгоритма, используемого для подписи ключа:
ECDSA для ключей EC, RSA для ключей RSA.
подписьЗначение СТРОКА БИТОВ, подпись, вычисленная на основе tbsCertificate в кодировке ASN.1 DER.

ПОСЛЕДОВАТЕЛЬНОСТЬ TBSCertificate

Имя поля (см. RFC 5280 ) Ценить
version ЦЕЛОЕ ЧИСЛО 2 (означает сертификат v3)
serialNumber ЦЕЛОЕ ЧИСЛО 1 (фиксированное значение: одинаково для всех сертификатов)
signature AlgorithmIdentifier алгоритма, используемого для подписи ключа: ECDSA для ключей EC, RSA для ключей RSA.
issuer То же, что и поле темы ключа пакетной аттестации.
validity ПОСЛЕДОВАТЕЛЬНОСТЬ двух дат, содержащая значения Tag::ACTIVE_DATETIME и Tag::USAGE_EXPIRE_DATETIME . Эти значения указаны в миллисекундах с 1 января 1970 года. См. RFC 5280 для корректного представления дат в сертификатах.
Если Tag::ACTIVE_DATETIME отсутствует, используйте значение Tag::CREATION_DATETIME . Если Tag::USAGE_EXPIRE_DATETIME отсутствует, используйте дату истечения срока действия сертификата ключа подтверждения пакета.
subject CN = «Android Keystore Key» (фиксированное значение: одинаково для всех сертификатов)
subjectPublicKeyInfo SubjectPublicKeyInfo, содержащий заверенный открытый ключ.
extensions/Key Usage digitalSignature: устанавливается, если ключ имеет назначение KeyPurpose::SIGN или KeyPurpose::VERIFY . Все остальные биты не установлены.
extensions/CRL Distribution Points Значение подлежит уточнению
extensions/"attestation" OID — 1.3.6.1.4.1.11129.2.1.17; содержимое определено в разделе Расширение подтверждения ниже. Как и во всех расширениях сертификатов X.509, содержимое представлено как OCTET_STRING, содержащая кодировку DER подтверждения SEQUENCE.

Продление аттестации

Расширение attestation имеет OID 1.3.6.1.4.1.11129.2.1.17 . Оно содержит информацию о аттестуемой паре ключей и состоянии устройства во время генерации ключа.

Типы тегов Keymaster/KeyMint, определенные в спецификации интерфейса AIDL, преобразуются в типы ASN.1 следующим образом:

Тип Keymaster/KeyMint Тип АСН.1 Примечания
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Миллисекунды с 1 января 1970 года 00:00:00 по Гринвичу.
BOOL NULL Наличие тега означает истину, отсутствие — ложь.
BIGNUM Теги этого типа отсутствуют, поэтому сопоставление не определено.
BYTES OCTET_STRING

Схема

Содержимое расширения аттестации описывается следующей схемой ASN.1:

Версия 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
    moduleHash  [724] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Версия 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Поля KeyDescription

attestationVersion
Версия схемы ASN.1.
Ценить Версия Keymaster/KeyMint
1 Keymaster версия 2.0
2 Keymaster версия 3.0
3 Keymaster версия 4.0
4 Мастер ключей версия 4.1
100 KeyMint версии 1.0
200 KeyMint версии 2.0
300 KeyMint версии 3.0
400 KeyMint версии 4.0
attestationSecurityLevel

Уровень безопасности места хранения заверенного ключа.

keymasterVersion / keyMintVersion
Версия реализации уровня аппаратной абстракции (HAL) Keymaster/KeyMint.
Ценить Версия Keymaster/KeyMint
2 Keymaster версия 2.0
3 Keymaster версия 3.0
4 Keymaster версия 4.0
41 Мастер ключей версия 4.1
100 KeyMint версии 1.0
200 KeyMint версии 2.0
300 KeyMint версии 3.0
400 KeyMint версии 4.0
keymasterSecurityLevel / keyMintSecurityLevel
Уровень безопасности реализации Keymaster/KeyMint.
attestationChallenge
Задача решается во время генерации ключа.
uniqueId
Идентификатор устройства, чувствительный к конфиденциальности, который системные приложения могут запрашивать во время генерации ключа. Если уникальный идентификатор не запрашивается, это поле пустое. Подробности см. в разделе Уникальный идентификатор .
softwareEnforced
Список авторизации Keymaster/KeyMint, который обеспечивается системой Android. Эта информация собирается или генерируется кодом платформы. Ей можно доверять, пока устройство работает под управлением операционной системы, соответствующей модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а verifiedBootState имеет Verified ).
hardwareEnforced
Список авторизации Keymaster/KeyMint, который обеспечивается Trusted Execution Environment (TEE) или StrongBox устройства. Эта информация собирается или генерируется кодом в защищенном оборудовании и не контролируется платформой. Например, информация может поступать из загрузчика или через защищенный канал связи, который не подразумевает доверия к платформе.

Значения SecurityLevel

Значение SecurityLevel указывает степень устойчивости элемента, связанного с хранилищем ключей (например, пары ключей и подтверждения), к атакам.

Ценить Значение
Software Безопасно, пока система Android устройства соответствует модели безопасности платформы Android (то есть загрузчик устройства заблокирован, а verifiedBootState имеет Verified ).
TrustedEnvironment Безопасно, пока не скомпрометирована Trusted Execution Environment (TEE). Требования к изоляции для TEE определены в разделах 9.11 [C-1-1] — [C-1-4] документа Android Compatibility Definition Document. TEE обладают высокой устойчивостью к удаленной компрометации и умеренной устойчивостью к компрометации путем прямой аппаратной атаки.
StrongBox Безопасно, пока StrongBox не скомпрометирован. StrongBox реализован в защищенном элементе, похожем на аппаратный модуль безопасности. Требования к реализации StrongBox определены в разделе 9.11.2 документа Android Compatibility Definition Document. StrongBox обладает высокой устойчивостью к удаленной компрометации и компрометации путем прямой аппаратной атаки (например, физического вмешательства и атак по сторонним каналам).

Поля AuthorizationList

Каждое поле соответствует тегу авторизации Keymaster/KeyMint из спецификации интерфейса AIDL . Спецификация является источником истины о тегах авторизации: их значении, формате их содержимого, ожидается ли их появление в полях softwareEnforced или hardwareEnforced в объекте KeyDescription , являются ли они взаимоисключающими с другими тегами и т. д. Все поля AuthorizationList являются необязательными.

Каждое поле имеет EXPLICIT контекстно-зависимый тег, равный номеру тега Keymaster/KeyMint, что позволяет более компактно представить данные в AuthorizationList . Поэтому анализатор ASN.1 должен знать ожидаемый тип данных для каждого контекстно-зависимого тега. Например, Tag::USER_AUTH_TYPE определяется как ENUM | 504 . В схеме расширения подтверждения поле purpose в AuthorizationList указывается как userAuthType [504] EXPLICIT INTEGER OPTIONAL . Поэтому его кодировка ASN.1 будет содержать контекстно-зависимый тег 504 вместо тега класса UNIVERSAL для типа ASN.1 INTEGER , который равен 10 .

В подтверждениях, сгенерированных KeyMint 4, присутствуют следующие поля:
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 Tag Tag::RSA_OAEP_MGF_DIGEST , который использует значение идентификатора тега 203.
rollbackResistance

Присутствует только в версии подтверждения ключа >= 3.

Соответствует тегу авторизации Tag::ROLLBACK_RESISTANCE , который использует значение идентификатора тега 303.

earlyBootOnly

Присутствует только в версии подтверждения ключа >= 4.

Соответствует тегу авторизации Tag::EARLY_BOOT_ONLY , который использует значение идентификатора тега 305.

activeDateTime
Соответствует тегу авторизации Tag::ACTIVE_DATETIME , который использует значение идентификатора тега 400.
originationExpireDateTime
Соответствует тегу авторизации Tag::ORIGINATION_EXPIRE_DATETIME , который использует значение идентификатора тега 401.
usageExpireDateTime
Соответствует тегу авторизации Tag::USAGE_EXPIRE_DATETIME , который использует значение идентификатора тега 402.
usageCountLimit
Соответствует тегу авторизации Tag::USAGE_COUNT_LIMIT , который использует значение идентификатора тега 405.
userSecureId
Соответствует тегу авторизации Tag::USER_SECURE_ID , который использует значение идентификатора тега 502.
noAuthRequired

Соответствует тегу авторизации Tag Tag::NO_AUTH_REQUIRED , который использует значение идентификатора тега 503.

userAuthType
Соответствует тегу авторизации Tag::USER_AUTH_TYPE , который использует значение идентификатора тега 504.
authTimeout
Соответствует тегу авторизации Tag::AUTH_TIMEOUT , который использует значение идентификатора тега 505.
allowWhileOnBody

Соответствует тегу авторизации Tag::ALLOW_WHILE_ON_BODY , который использует значение идентификатора тега 506.

Позволяет использовать ключ после истечения периода ожидания аутентификации, если пользователь все еще носит устройство на своем теле. Обратите внимание, что защищенный датчик на теле определяет, носит ли устройство пользователь на теле.

trustedUserPresenceReq

Присутствует только в версии подтверждения ключа >= 3.

Соответствует тегу авторизации Tag::TRUSTED_USER_PRESENCE_REQUIRED , который использует значение идентификатора тега 507.

Указывает, что этот ключ можно использовать только в том случае, если пользователь предоставил доказательство физического присутствия. Вот несколько примеров:

  • Для ключа StrongBox — аппаратная кнопка, жестко подключенная к контакту на устройстве StrongBox.
  • Для ключа TEE аутентификация по отпечатку пальца обеспечивает доказательство присутствия, если TEE имеет исключительный контроль над сканером и выполняет процесс сопоставления отпечатков пальцев.
trustedConfirmationReq

Присутствует только в версии подтверждения ключа >= 3.

Соответствует тегу авторизации Tag::TRUSTED_CONFIRMATION_REQUIRED , который использует значение идентификатора тега 508.

Указывает, что ключ можно использовать только в том случае, если пользователь подтверждает данные, которые нужно подписать, используя токен одобрения. Для получения дополнительной информации о том, как получить подтверждение пользователя, см. Android Protected Confirmation .

Примечание: этот тег применим только к ключам, которые используют цель SIGN .

unlockedDeviceReq

Присутствует только в версии подтверждения ключа >= 3.

Соответствует тегу авторизации Tag::UNLOCKED_DEVICE_REQUIRED , который использует значение идентификатора тега 509.

creationDateTime
Соответствует тегу авторизации Tag::CREATION_DATETIME , который использует значение идентификатора тега 701.
origin

Соответствует тегу авторизации Tag Tag::ORIGIN , который использует значение идентификатора тега 702.

rootOfTrust

Соответствует тегу авторизации Tag::ROOT_OF_TRUST , который использует значение идентификатора тега 704.

Более подробную информацию смотрите в разделе, описывающем структуру данных RootOfTrust .

osVersion

Соответствует тегу авторизации Tag::OS_VERSION , который использует значение идентификатора тега 705.

Версия операционной системы Android, ассоциированной с Keymaster, указанная как шестизначное целое число. Например, версия 8.1.0 представлена ​​как 080100.

Только версия Keymaster 1.0 или выше включает это значение в список авторизации.

osPatchLevel

Соответствует тегу авторизации Tag::PATCHLEVEL , который использует значение идентификатора тега 706.

Месяц и год, связанные с патчем безопасности, который используется в Keymaster, указанные как шестизначное целое число. Например, патч августа 2018 года представлен как 201808.

Только версия Keymaster 1.0 или выше включает это значение в список авторизации.

attestationApplicationId

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_APPLICATION_ID , который использует значение идентификатора тега 709.

Более подробную информацию см. в разделе, описывающем структуру данных AttestationApplicationId .

attestationIdBrand

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_BRAND , который использует значение идентификатора тега 710.

attestationIdDevice

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_DEVICE , который использует значение идентификатора тега 711.

attestationIdProduct

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_PRODUCT , который использует значение идентификатора тега 712.

attestationIdSerial

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_SERIAL , который использует значение идентификатора тега 713.

attestationIdImei

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_IMEI , который использует значение идентификатора тега 714.

attestationIdMeid

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MEID , который использует значение идентификатора тега 715.

attestationIdManufacturer

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MANUFACTURER , который использует значение идентификатора тега 716.

attestationIdModel

Присутствует только в версиях подтверждения ключей >= 2.

Соответствует тегу авторизации Tag::ATTESTATION_ID_MODEL , который использует значение идентификатора тега 717.

vendorPatchLevel

Присутствует только в версиях подтверждения ключей >= 3.

Соответствует тегу авторизации Tag::VENDOR_PATCHLEVEL , который использует значение идентификатора тега 718.

Указывает уровень исправления безопасности образа поставщика , который должен быть установлен на устройстве для использования этого ключа. Значение отображается в формате ГГГГММДД, представляя дату исправления безопасности поставщика. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности поставщика от 1 августа 2018 года, это значение будет 20180801.

bootPatchLevel

Присутствует только в версиях подтверждения ключей >= 3.

Соответствует тегу авторизации Tag::BOOT_PATCHLEVEL , который использует значение идентификатора тега 719.

Указывает уровень исправления безопасности образа ядра , который должен быть установлен на устройстве для использования этого ключа. Значение отображается в формате ГГГГММДД, представляя дату исправления безопасности системы. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности системы от 5 августа 2018 года, это значение будет 20180805.

deviceUniqueAttestation

Присутствует только в версиях подтверждения ключей >= 4.

Соответствует тегу авторизации Tag::DEVICE_UNIQUE_ATTESTATION , который использует значение идентификатора тега 720.

attestationIdSecondImei

Присутствует только в версиях подтверждения ключей >= 300.

Соответствует тегу авторизации Tag::ATTESTATION_ID_SECOND_IMEI , который использует значение идентификатора тега 723.

moduleHash

Присутствует только в версиях подтверждения ключей >= 400.

Соответствует тегу авторизации Tag::MODULE_HASH , который использует значение идентификатора тега 724.

Поля RootOfTrust

verifiedBootKey
Безопасный хэш открытого ключа, используемый для проверки целостности и подлинности всего кода, который выполняется во время загрузки устройства в рамках проверенной загрузки . Рекомендуется использовать SHA-256.
deviceLocked
Заблокирован ли загрузчик устройства. Значение true означает, что устройство загрузило подписанный образ, который был успешно проверен Verified Boot .
verifiedBootState
Состояние проверенной загрузки устройства.
verifiedBootHash
Дайджест всех данных, защищенных Verified Boot . Для устройств, использующих реализацию эталонной версии Android Verified Boot , это поле содержит дайджест VBMeta .

Значения VerifiedBootState

Ценить Соответствующее состояние загрузки Значение
Verified GREEN Полная цепочка доверия простирается от аппаратно защищенного корня доверия до загрузчика и всех разделов, проверенных Verified Boot . В этом состоянии поле verifiedBootKey содержит хэш встроенного корня доверия , который является сертификатом, встроенным в ПЗУ устройства производителем устройства на заводе.
SelfSigned YELLOW То же, что и Verified , за исключением того, что проверка была выполнена с использованием корня доверия, настроенного пользователем, а не корня доверия, встроенного производителем на заводе. В этом состоянии поле verifiedBootKey содержит хэш открытого ключа, настроенного пользователем.
Unverified ORANGE Загрузчик устройства разблокирован, поэтому цепочка доверия не может быть установлена. Устройство может быть свободно изменено, поэтому целостность устройства должна быть проверена пользователем вне диапазона. В этом состоянии поле verifiedBootKey содержит 32 байта нулей.
Failed RED Устройство не прошло проверку. В этом состоянии нет никаких гарантий относительно содержимого других полей RootOfTrust .

AttestationApplicationId

Это поле отражает убеждение платформы Android относительно того, каким приложениям разрешено использовать материал секретного ключа при аттестации. Оно может содержать несколько пакетов, если и только если несколько пакетов имеют один и тот же UID. Поле AttestationApplicationId в AuthorizationList имеет тип OCTET_STRING и отформатировано в соответствии со следующей схемой ASN.1:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Набор объектов AttestationPackageInfo , каждый из которых содержит имя пакета и номер версии.
signature_digests

Набор дайджестов SHA-256 сертификатов подписи приложения. Приложение может иметь несколько цепочек сертификатов ключей подписи. Для каждого сертификат «листа» дайджестируется и помещается в поле signature_digests . Имя поля вводит в заблуждение, поскольку дайджестированные данные — это сертификаты подписи приложения, а не подписи приложения, поскольку оно названо по классу Signature , возвращаемому вызовом getPackageInfo() . В следующем фрагменте кода показан пример набора:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

Уникальный идентификатор

Уникальный идентификатор — это 128-битное значение, которое идентифицирует устройство, но только на ограниченный период времени. Значение вычисляется с помощью:

HMAC_SHA256(T || C || R, HBK)

Где:

  • T — это «временное значение счетчика», вычисляемое путем деления значения Tag::CREATION_DATETIME на 2592000000, с отбрасыванием остатка. T изменяется каждые 30 дней (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C — значение Tag::APPLICATION_ID
  • R равен 1, если Tag::RESET_SINCE_ID_ROTATION присутствует в параметре attest_params вызова attest_key, или 0, если тег отсутствует.
  • HBK — уникальный аппаратно-связанный секрет, известный Trusted Execution Environment и никогда им не раскрываемый. Секрет содержит не менее 128 бит энтропии и является уникальным для отдельного устройства (вероятностная уникальность приемлема, учитывая 128 бит энтропии). HBK должен быть получен из материала слитого ключа через HMAC или AES_CMAC.

Усеките вывод HMAC_SHA256 до 128 бит.

Ключи подтверждения подлинности и сертификаты

Два ключа, один RSA и один ECDSA, а также соответствующие цепочки сертификатов надежно хранятся в устройстве.

Android 12 представляет Remote Key Provisioning, а Android 13 требует, чтобы устройства его реализовали. Remote Key Provisioning предоставляет устройствам в полевых условиях сертификаты подтверждения подлинности ECDSA P256 для каждого приложения. Эти сертификаты имеют более короткий срок действия, чем заводские сертификаты.

Несколько IMEI

В Android 14 добавлена ​​поддержка нескольких IMEI в записи Android Key Attestation. OEM-производители могут реализовать эту функцию, добавив тег KeyMint для второго IMEI. Устройства все чаще имеют несколько сотовых радиомодулей, и теперь OEM-производители могут поддерживать устройства с двумя IMEI.

OEM-производители обязаны иметь вторичный IMEI, если он присутствует на их устройствах, для предоставления его реализациям KeyMint, чтобы эти реализации могли подтвердить его таким же образом, как они подтверждают первый IMEI.

Расширение информации о предоставлении

Расширение информации о предоставлении имеет OID 1.3.6.1.4.1.11129.2.1.30 . Расширение предоставляет информацию, известную об устройстве серверу предоставления.

Схема

Расширение следует следующей схеме CDDL :

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

Карта не имеет версий, и в нее могут быть добавлены новые необязательные поля.

certs_issued

Приблизительное количество сертификатов, выданных устройству за последние 30 дней. Это значение может быть использовано как сигнал о потенциальном злоупотреблении, если значение превышает среднее на несколько порядков.

validated_attested_entity

Проверенная аттестованная сущность — это строка, описывающая тип устройства, которое было подтверждено сервером обеспечения для аттестации. Например, STRONG_BOX или TEE .

удостоверение личности

Android 8.0 включает дополнительную поддержку подтверждения ID для устройств с Keymaster 3. Подтверждение ID позволяет устройству предоставить подтверждение своих аппаратных идентификаторов, таких как серийный номер или IMEI. Хотя это необязательная функция, настоятельно рекомендуется, чтобы все реализации Keymaster 3 поддерживали ее, поскольку возможность подтверждения личности устройства позволяет использовать такие варианты использования, как настоящая удаленная настройка без касания, более безопасно (поскольку удаленная сторона может быть уверена, что она общается с правильным устройством, а не с устройством, подделывающим ее личность).

Подтверждение идентификатора работает путем создания копий идентификаторов оборудования устройства, к которым может получить доступ только Trusted Execution Environment (TEE) до того, как устройство покинет завод. Пользователь может разблокировать загрузчик устройства и изменить системное программное обеспечение и идентификаторы, сообщаемые фреймворками Android. Копии идентификаторов, хранящиеся в TEE, не могут быть изменены таким образом, что гарантирует, что подтверждение идентификатора устройства подтверждает только оригинальные идентификаторы оборудования устройства, тем самым предотвращая попытки подделки.

Основная поверхность API для подтверждения подлинности идентификатора строится поверх существующего механизма подтверждения подлинности ключа, представленного в Keymaster 2. При запросе сертификата подтверждения подлинности для ключа, хранящегося в keymaster, вызывающий может запросить включение идентификаторов оборудования устройства в метаданные сертификата подтверждения подлинности. Если ключ хранится в TEE, сертификат возвращается к известному корню доверия. Получатель такого сертификата может проверить, что сертификат и его содержимое, включая идентификаторы оборудования, были написаны TEE. При запросе включить идентификаторы оборудования в сертификат подтверждения подлинности TEE подтверждает только идентификаторы, хранящиеся в его хранилище, как они были заполнены на заводе.

Свойства хранения

Хранилище, в котором хранятся идентификаторы устройства, должно обладать следующими свойствами:

  • Значения, полученные из исходных идентификаторов устройства, копируются в хранилище до того, как устройство покидает завод.
  • Метод destroyAttestationIds() может навсегда уничтожить эту копию данных, полученных из идентификатора. Постоянное уничтожение означает, что данные полностью удалены, поэтому ни сброс настроек к заводским настройкам, ни любая другая процедура, выполненная на устройстве, не сможет их восстановить. Это особенно важно для устройств, на которых пользователь разблокировал загрузчик, изменил системное программное обеспечение и изменил идентификаторы, возвращаемые фреймворками Android.
  • RMA-объекты должны иметь возможность генерировать свежие копии данных, полученных из идентификатора оборудования. Таким образом, устройство, проходящее через RMA, может снова выполнить аттестацию идентификатора. Механизм, используемый RMA-объектами, должен быть защищен, чтобы пользователи не могли вызвать его самостоятельно, поскольку это позволило бы им получить аттестации поддельных идентификаторов.
  • Никакой другой код, кроме доверенного приложения Keymaster в TEE, не способен прочитать полученные из идентификатора данные, хранящиеся в хранилище.
  • Хранилище защищено от несанкционированного доступа: если содержимое хранилища было изменено, TEE обращается с ним так же, как если бы копии содержимого были уничтожены, и отклоняет все попытки подтверждения личности. Это реализуется путем подписания или MAC-кодирования хранилища , как описано ниже .
  • Хранилище не содержит исходные идентификаторы. Поскольку аттестация идентификаторов подразумевает вызов, вызывающая сторона всегда предоставляет идентификаторы для аттестации. TEE нужно только проверить, что они соответствуют значениям, которые у них были изначально. Хранение защищенных хэшей исходных значений, а не значений, позволяет выполнить эту проверку.

Строительство

Чтобы создать реализацию, которая обладает перечисленными выше свойствами, сохраните значения, полученные из идентификатора, в следующей конструкции S. Не храните другие копии значений идентификатора, за исключением обычных мест в системе, которые владелец устройства может изменить, получив права root:

S = D || HMAC(HBK, D)

где:

  • D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
  • HMAC — это конструкция HMAC с соответствующим безопасным хэшем (рекомендуется SHA-256)
  • HBK — это аппаратно-привязанный ключ, не используемый ни для каких других целей.
  • ID 1 ...ID n — исходные значения идентификаторов; привязка конкретного значения к конкретному индексу зависит от реализации, поскольку разные устройства имеют разное количество идентификаторов.
  • || представляет собой конкатенацию

Поскольку выходные данные HMAC имеют фиксированный размер, не требуется никаких заголовков или другой структуры для нахождения индивидуальных хэшей идентификаторов или HMAC D. Помимо проверки предоставленных значений для выполнения аттестации, реализации должны проверять S путем извлечения D из S, вычисления HMAC(HBK, D) и сравнения его со значением в S для проверки того, что никакие индивидуальные идентификаторы не были изменены/повреждены. Кроме того, реализации должны использовать сравнения с постоянным временем для всех индивидуальных элементов идентификаторов и проверки S. Время сравнения должно быть постоянным независимо от количества предоставленных идентификаторов и правильного сопоставления любой части теста.

Идентификаторы оборудования

Подтверждение идентификатора поддерживает следующие идентификаторы оборудования:

  1. Название бренда, возвращаемое Build.BRAND в Android
  2. Имя устройства, возвращаемое Build.DEVICE в Android
  3. Название продукта, возвращаемое Build.PRODUCT в Android
  4. Название производителя, возвращаемое Build.MANUFACTURER в Android
  5. Название модели, возвращаемое Build.MODEL в Android
  6. Серийный номер
  7. IMEI всех радиостанций
  8. 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. Это сделано для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать ее по-разному, поэтому крайне важно, чтобы этот раздел не рассматривался как нормативный.