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

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

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

Для решения этой проблемы в Android 7.0 (Keymaster 2) была введена аттестация ключей , а в Android 8.0 (Keymaster 3) — аттестация идентификаторов.

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

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

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

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

Теги

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

Тип

Keymaster 2 и ниже

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

Метод AttestKey

Ключница 3

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

Keymaster 2 и ниже

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

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

Свидетельство о подтверждении

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

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

Последовательность сертификатов

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

ПОСЛЕДОВАТЕЛЬНОСТЬ СЕРТИФИКАТОВ TBSC

Название поля (см. RFC 5280 ) Ценить
version Целое число 2 (означает сертификат версии 3)
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 следующим образом:

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

Схема

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

Версия 400

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 400
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 400
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

Modules ::= SET OF Module
Module ::= SEQUENCE {
    packageName                OCTET_STRING,
    version                    INTEGER,
}

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           INTEGER, # Value 300
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 300
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 200
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 200
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 100
    attestationSecurityLevel     SecurityLevel,
    keyMintVersion               INTEGER, # Value 100
    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,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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           INTEGER, # Value 4
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 41
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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),
}

Версия 3

KeyDescription ::= SEQUENCE {
    attestationVersion           INTEGER, # Value 3
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 4
    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,
    blockMode                    [4] EXPLICIT SET OF INTEGER OPTIONAL,
    digest                       [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding                      [6] EXPLICIT SET OF INTEGER OPTIONAL,
    callerNonce                  [7] EXPLICIT NULL OPTIONAL,
    minMacLength                 [8] EXPLICIT 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,
    userSecureId               [502] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired             [503] EXPLICIT NULL OPTIONAL,
    userAuthType               [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout                [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody           [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceReq     [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationReq     [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceReq          [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,
}

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           INTEGER, # Value 2
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 3
    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           INTEGER, # Value 1
    attestationSecurityLevel     SecurityLevel,
    keymasterVersion             INTEGER, # Value 2
    keymasterSecurityLevel       SecurityLevel,
    attestationChallenge         OCTET_STRING,
    uniqueId                     OCTET_STRING,
    softwareEnforced             AuthorizationList,
    hardwareEnforced             AuthorizationList,
}

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

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

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

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

Поля KeyDescription

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

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

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

Значения SecurityLevel

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

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

Поля списка авторизации

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

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

В аттестациях, созданных 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::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::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» .

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

unlockedDeviceReq

Присутствует только в ключевой версии аттестации >= 3.

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

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

Соответствует тегу авторизации 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::OS_PATCHLEVEL , который использует значение идентификатора тега 706.

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

Для проверки того, было ли устройство недавно обновлено, предпочтительнее использовать это поле вместо vendorPatchLevel или bootPatchLevel .

Только в версиях 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 с установленным исправлением безопасности поставщика от 05.08.2018, это значение будет 20180805.

bootPatchLevel

Присутствует только в ключевых версиях аттестации >= 3.

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

Указывает уровень исправлений безопасности образа ядра , который должен быть установлен на устройстве для использования этого ключа. Значение представляет собой целое число, полученное путем удаления дефисов из уровня исправлений безопасности. Например, если ключ был сгенерирован на устройстве Android с установленным исправлением безопасности ядра от 05.08.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
Надежный хеш открытого ключа, используемый для проверки целостности и подлинности всего кода, выполняемого во время загрузки устройства в рамках функции Verified Boot . Рекомендуется использовать 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 .

Идентификатор заявки на аттестацию

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

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

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

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

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

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

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

Схема

Расширенное значение представляет собой данные в формате краткого двоичного представления объекта (CBOR) , соответствующие схеме краткого языка определения данных (CDDL) :

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

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

certs_issued

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

validated_attested_entity

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

Ключи аттестации

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

В Android 12 появилась функция удаленной настройки ключей (Remote Key Provisioning) , а в Android 15 все устройства должны ее поддерживать. Удаленная настройка ключей предоставляет устройствам в полевых условиях сертификаты аттестации ECDSA P256 для каждого приложения. Срок действия этих сертификатов короче, чем у заводских сертификатов.

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

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

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

Где:

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

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

Несколько IMEI

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

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

Подтверждение личности

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

Аттестация идентификатора устройства работает путем создания копий аппаратных идентификаторов устройства, к которым имеет доступ только TEE (Telephone Time Entity) до того, как устройство покинет завод. Пользователь может разблокировать загрузчик устройства и изменить системное программное обеспечение и идентификаторы, сообщаемые фреймворками 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 не используют и не внедряют Java API. Данная информация предоставлена ​​для того, чтобы помочь разработчикам понять, как эта функция используется приложениями. Компоненты системы могут использовать её по-разному, поэтому крайне важно, чтобы этот раздел не рассматривался как нормативный.