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

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. Время сравнения должно быть постоянным независимо от количества предоставленных идентификаторов и правильного соответствия любой части теста.

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

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

  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 не реализуют и не используют Java API. Это сделано для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать его по-разному, поэтому крайне важно, чтобы этот раздел не рассматривался как нормативный.