Atestado de chaves e ID

O Keystore oferece um local mais seguro para criar, armazenar e usar chaves criptográficas de maneira controlada. Quando o armazenamento de chaves protegido por hardware está disponível e é usado, o material da chave é mais seguro contra a extração do dispositivo e o Keymaster aplica restrições difíceis de subverter.

No entanto, isso só acontece se as chaves do keystore estiverem no armazenamento protegido por hardware. No Keymaster 1, não havia como apps ou servidores remotos verificar de forma confiável se esse era o caso. O daemon do keystore carregou a HAL do Keymaster disponível e acreditou no que a HAL disse em relação ao suporte de hardware de chaves.

Para corrigir isso, o Keymaster introduziu o atestado de chaves no Android 7.0 (Keymaster 2) e o atestado de ID no Android 8.0 (Keymaster 3).

O objetivo do atestado de chaves é oferecer uma maneira de determinar com precisão se um par de chaves assimétricas é protegido por hardware, quais são as propriedades da chave e quais restrições são aplicadas ao uso dela.

O atestado de ID permite que o dispositivo forneça provas de seus identificadores de hardware, como número de série ou IMEI.

Atestado de chaves

Para oferecer suporte à confirmação de chaves, o Android 7.0 introduziu um conjunto de tags, tipo e método para a HAL.

Tags

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

Tipo

Keymaster 2 e anteriores

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

Método AttestKey

Keymaster 3

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

Keymaster 2 e versões anteriores

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 é a estrutura do dispositivo do keymaster.
  • keyToAttest é o blob de chave retornado de generateKey para o qual o atestado é criado.
  • attestParams é uma lista de todos os parâmetros necessários para o atestado. Isso inclui Tag::ATTESTATION_CHALLENGE e possivelmente Tag::RESET_SINCE_ID_ROTATION, além de Tag::APPLICATION_ID e Tag::APPLICATION_DATA. Os dois últimos são necessários para descriptografar o blob de chave, caso tenham sido especificados durante a geração da chave.
  • certChain é o parâmetro de saída, que retorna uma matriz de certificados. A entrada 0 é o certificado de atestado, ou seja, ele certifica a chave de keyToAttest e contém a extensão de atestado.

O método attestKey é considerado uma operação de chave pública na chave certificada, porque pode ser chamado a qualquer momento e não precisa atender a restrições de autorização. Por exemplo, se a chave atestada precisar de autenticação do usuário para uso, um atestado poderá ser gerado sem a autenticação do usuário.

Certificado de atestado

O certificado de atestado é um certificado X.509 padrão, com uma extensão de atestado opcional que contém uma descrição da chave certificada. O certificado é assinado com uma chave de atestado certificada. A chave de atestado pode usar um algoritmo diferente da chave a ser atestada.

O certificado de atestado contém os campos da tabela abaixo e não pode conter nenhum campo adicional. Alguns campos especificam um valor fixo. Os testes do CTS validam se o conteúdo do certificado é exatamente como definido.

SEQUÊNCIA de certificados

Nome do campo (consulte RFC 5280). Valor
tbsCertificate (em inglês) TBSCertificate SEQUENCE
signatureAlgorithm AlgorithmIdentifier do algoritmo usado para assinar a chave:
ECDSA para chaves EC, RSA para chaves RSA.
signatureValue STRING DE BIT, assinatura computada no tbsCertificate codificado em DER ASN.1.

SEQUÊNCIA DO Certificado TBSCertificate

Nome do campo (consulte RFC 5280) Valor
version INTEGER 2 (significa certificado v3)
serialNumber INTEGER 1 (valor fixo: o mesmo em todos os certificados)
signature AlgorithmIdentifier do algoritmo usado para assinar a chave: ECDSA para chaves EC e RSA para chaves RSA.
issuer Igual ao campo de assunto da chave de atestado de lote.
validity SEQUÊNCIA de duas datas, contendo os valores de Tag::ACTIVE_DATETIME e Tag::USAGE_EXPIRE_DATETIME. Esses valores estão em milissegundos desde 1º de janeiro de 1970. Consulte a RFC 5280 para ver representações de data corretas em certificados.
Se Tag::ACTIVE_DATETIME não estiver presente, use o valor de Tag::CREATION_DATETIME. Se Tag::USAGE_EXPIRE_DATETIME não estiver presente, use a data de expiração do certificado de chave de atestado de lote.
subject CN = "Android Keystore Key" (valor fixo: o mesmo em todos os certificados)
subjectPublicKeyInfo SubjectPublicKeyInfo contendo chave pública atestada.
extensions/Key Usage digitalSignature: definido se a chave tiver a finalidade KeyPurpose::SIGN ou KeyPurpose::VERIFY. Todos os outros bits não são definidos.
extensions/CRL Distribution Points Valor (a definir)
extensions/"attestation" O OID é 1.3.6.1.4.1.11129.2.1.17. O conteúdo é definido na seção Extensão de atestado abaixo. Como em todas as extensões de certificado X.509, o conteúdo é representado como uma OCTET_STRING contendo uma codificação DER da sEQUÊNCIA de atestado.

Extensão de atestado

A extensão attestation tem o OID 1.3.6.1.4.1.11129.2.1.17. Ele contém informações sobre o par de chaves que está sendo atestado e o estado do dispositivo no momento da geração de chaves.

Os tipos de tag Keymaster/KeyMint definidos na especificação da interface AIDL são convertidos em tipos ASN.1 da seguinte maneira:

Tipo de Keymaster/KeyMint Tipo ASN.1 Observações
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Milissegundos desde 1º de janeiro de 1970, 00:00:00 GMT.
BOOL NULL A presença da tag significa "verdadeiro", e a ausência significa "falso".
BIGNUM Nenhuma tag tem esse tipo, portanto, nenhum mapeamento é definido.
BYTES OCTET_STRING

Esquema

O conteúdo da extensão de atestado é descrito pelo seguinte esquema ASN.1:

Versão 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),
}

Versão 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),
}

Versão 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),
}

Versão 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),
}

Versão 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),
}

Versão 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),
}

Versão 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),
}

Campos KeyDescription

attestationVersion
A versão do esquema ASN.1.
ValorVersão do Keymaster/KeyMint
1Keymaster versão 2.0
2Keymaster versão 3.0
3Keymaster versão 4.0
4Keymaster versão 4.1
100KeyMint versão 1.0
200KeyMint versão 2.0
300KeyMint versão 3.0
attestationSecurityLevel

O nível de segurança do local em que a chave atestada está armazenada.

keymasterVersion / keyMintVersion
A versão da implementação da camada de abstração de hardware (HAL) do Keymaster/KeyMint.
ValorVersão do Keymaster/KeyMint
2Keymaster versão 2.0
3Keymaster versão 3.0
4Keymaster versão 4.0
41Keymaster versão 4.1
100KeyMint versão 1.0
200KeyMint versão 2.0
300KeyMint versão 3.0
keymasterSecurityLevel / keyMintSecurityLevel
O nível de segurança da implementação do Keymaster/KeyMint.
attestationChallenge
O desafio fornecido no momento da geração da chave.
uniqueId
Um identificador de dispositivo sensível à privacidade que os apps do sistema podem solicitar no momento da geração da chave. Se o ID exclusivo não for solicitado, este campo ficará vazio. Para mais detalhes, consulte a seção ID exclusivo.
softwareEnforced
É a lista de autorização do Keymaster/KeyMint aplicada pelo sistema Android. Essas informações são coletadas ou geradas por código na plataforma e armazenadas na partição do sistema do dispositivo. Ele pode ser confiável, desde que o dispositivo esteja executando um sistema operacional que esteja em conformidade com o Modelo de segurança da plataforma Android, ou seja, o carregador de inicialização do dispositivo está bloqueado e o verifiedBootState está Verified.
hardwareEnforced
A lista de autorização do Keymaster/KeyMint aplicada pelo ambiente de execução confiável (TEE) ou StrongBox do dispositivo. Essas informações são coletadas ou geradas por código no hardware seguro e não são controladas pela plataforma. Por exemplo, as informações podem vir do carregador de inicialização ou por um canal de comunicação seguro que não envolva a confiança na plataforma.

Valores de SecurityLevel

O valor SecurityLevel indica até que ponto um elemento relacionado ao Keystore (por exemplo, par de chaves e atestado) é resistente a ataques.

Valor Significado
Software Seguro, desde que o sistema Android do dispositivo esteja em conformidade com o modelo de segurança da plataforma Android, ou seja, o carregador de inicialização do dispositivo esteja bloqueado e o verifiedBootState esteja Verified.
TrustedEnvironment Segurança desde que o ambiente de execução confiável (TEE) não esteja comprometido. Os requisitos de isolamento para TEEs são definidos nas seções 9.11 [C-1-1] a [C-1-4] do Documento de definição de compatibilidade do Android. Os TEEs são altamente resistentes ao comprometimento remoto e moderadamente resistentes a ataques diretos de hardware.
StrongBox Seguro, desde que o StrongBox não seja comprometido. O StrongBox é implementado em um elemento seguro semelhante a um módulo de segurança de hardware. Os requisitos de implementação do StrongBox são definidos na seção 9.11.2 do Documento de definição de compatibilidade do Android. O StrongBox é altamente resistente a comprometimento remoto e comprometimento por ataque direto de hardware (por exemplo, adulteração física e ataques de canal lateral).

Campos AuthorizationList

Cada campo corresponde a uma tag de autorização do Keymaster/KeyMint da especificação da interface AIDL. A especificação é a fonte de verdade sobre as tags de autorização: o significado, o formato do conteúdo, se elas devem aparecer nos campos softwareEnforced ou hardwareEnforced no objeto KeyDescription, se elas são mutuamente exclusivas com outras tags etc. Todos os campos AuthorizationList são opcionais.

Cada campo tem uma tag específica do contexto EXPLICIT igual ao número da tag do Keymaster/KeyMint, o que permite uma representação mais compacta dos dados no AuthorizationList. Portanto, o analisador ASN.1 precisa saber o tipo de dados esperado para cada tag específica do contexto. Por exemplo, Tag::USER_AUTH_TYPE é definido como ENUM | 504. No esquema de extensão de atestado, o campo purpose no AuthorizationList é especificado como userAuthType [504] EXPLICIT INTEGER OPTIONAL. Portanto, a codificação ASN.1 vai conter a tag específica do contexto 504 em vez da tag de classe UNIVERSAL para o tipo ASN.1 INTEGER, que é 10.

purpose
Corresponde à tag de autorização Tag::PURPOSE, que usa o valor 1 como ID.
algorithm

Corresponde à tag de autorização Tag::ALGORITHM, que usa o valor 2 como ID.

Em um objeto AuthorizationList de atestado, o valor do algoritmo é sempre RSA ou EC.

keySize
Corresponde à tag de autorização Tag::KEY_SIZE, que usa o valor 3 como ID.
digest
Corresponde à tag de autorização Tag::DIGEST, que usa o valor 5 como ID.
padding
Corresponde à tag de autorização Tag::PADDING, que usa o valor 6 como ID.
ecCurve

Corresponde à tag de autorização Tag::EC_CURVE, que usa o valor 10 como ID.

O conjunto de parâmetros usados para gerar um par de chaves de curva elíptica (EC, na sigla em inglês), que usa ECDSA para assinaturas e verificações, no keystore do sistema Android.

rsaPublicExponent
Corresponde à tag de autorização Tag::RSA_PUBLIC_EXPONENT, que usa o valor 200 como ID.
mgfDigest

Presente apenas na versão 100 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::RSA_OAEP_MGF_DIGEST do KeyMint, que usa o valor 203 como ID.
rollbackResistance

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ROLLBACK_RESISTANCE, que usa o valor 303 como ID.

earlyBootOnly

Presente apenas na versão 4 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::EARLY_BOOT_ONLY, que usa o valor 305 como ID.

activeDateTime
Corresponde à tag de autorização Tag::ACTIVE_DATETIME, que usa o valor 400 como ID.
originationExpireDateTime
Corresponde à tag de autorização Tag::ORIGINATION_EXPIRE_DATETIME do Keymaster, que usa o valor 401 como ID.
usageExpireDateTime
Corresponde à tag de autorização Tag::USAGE_EXPIRE_DATETIME, que usa o valor 402 como ID.
usageCountLimit
Corresponde à tag de autorização Tag::USAGE_COUNT_LIMIT, que usa o valor 405 como ID.
noAuthRequired

Corresponde à tag de autorização Tag::NO_AUTH_REQUIRED, que usa o valor 503 como ID.

userAuthType
Corresponde à tag de autorização Tag::USER_AUTH_TYPE, que usa o valor 504 como ID.
authTimeout
Corresponde à tag de autorização Tag::AUTH_TIMEOUT, que usa o valor 505 como ID.
allowWhileOnBody

Corresponde à tag de autorização Tag::ALLOW_WHILE_ON_BODY, que usa o valor 506 como ID.

Permite que a chave seja usada após o tempo limite de autenticação se o usuário ainda estiver usando o dispositivo no corpo. Um sensor corporal seguro determina se o dispositivo está sendo usado pelo usuário.

trustedUserPresenceRequired

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::TRUSTED_USER_PRESENCE_REQUIRED, que usa o valor 507 como ID.

Especifica que essa chave será utilizável apenas quando o usuário fornecer prova de presença física. Entre os exemplos estão os seguintes:

  • Para uma chave StrongBox, um botão físico é conectado a um pino no dispositivo StrongBox.
  • Para uma chave TEE, a autenticação por impressão digital fornece prova de presença, desde que o TEE tenha controle exclusivo do leitor e realize o processo de correspondência da impressão digital.
trustedConfirmationRequired

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::TRUSTED_CONFIRMATION_REQUIRED, que usa o valor 508 como ID.

Especifica que a chave será utilizável apenas quando o usuário fornecer confirmação dos dados que serão assinados usando um token de aprovação. Para saber mais sobre como conseguir a confirmação do usuário, consulte Confirmação protegida pelo Android.

Observação: essa tag é válida apenas para chaves que usam a finalidade SIGN.

unlockedDeviceRequired

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::UNLOCKED_DEVICE_REQUIRED, que usa o valor 509 como ID.

allApplications

Corresponde à tag de autorização Tag::ALL_APPLICATIONS, que usa o valor 600 como ID.

Indica se todos os apps de um dispositivo podem acessar o par de chaves.

applicationId
Corresponde à tag de autorização Tag::APPLICATION_ID, que usa o valor 601 como ID.
creationDateTime
Corresponde à tag de autorização Tag::CREATION_DATETIME, que usa o valor 701 como ID.
origin

Corresponde à tag de autorização Tag::ORIGIN, que usa o valor 702 como ID.

rollbackResistant

Presente apenas nas versões 1 e 2 do atestado de chaves.

Corresponde à tag de autorização Tag::ROLLBACK_RESISTANT, que usa o valor 703 como ID.

rootOfTrust

Corresponde à tag de autorização Tag::ROOT_OF_TRUST, que usa o valor 704 como ID.

Para saber mais, consulte a seção que descreve a estrutura de dados RootOfTrust.

osVersion

Corresponde à tag de autorização Tag::OS_VERSION, que usa o valor 705 como ID.

A versão do sistema operacional Android associada ao Keymaster, especificada como um número inteiro de seis dígitos. Por exemplo, a versão 8.1.0 é representada como 080100.

Somente o Keymaster versão 1.0 ou mais recente inclui esse valor na lista de autorizações.

osPatchLevel

Corresponde à tag de autorização Tag::PATCHLEVEL, que usa o valor 706 como ID.

O mês e o ano associados ao patch de segurança que está sendo usado no Keymaster, especificados como um número inteiro de seis dígitos. Por exemplo, o patch de agosto de 2018 é representado como 201808.

Somente o Keymaster versão 1.0 ou mais recente inclui esse valor na lista de autorizações.

attestationApplicationId

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_APPLICATION_ID do Keymaster, que usa o valor 709 como ID.

Para saber mais, consulte a seção que descreve a estrutura de dados AttestationApplicationId.

attestationIdBrand

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag Tag::ATTESTATION_ID_BRAND do Keymaster, que usa o valor 710 como ID.

attestationIdDevice

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag Tag::ATTESTATION_ID_DEVICE do Keymaster, que usa o valor 711 como ID.

attestationIdProduct

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag Tag::ATTESTATION_ID_PRODUCT do Keymaster, que usa o valor 712 como ID.

attestationIdSerial

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag Tag::ATTESTATION_ID_SERIAL do Keymaster, que usa o valor 713 como ID.

attestationIdImei

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_ID_IMEI, que usa o valor 714 como ID.

attestationIdMeid

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_ID_MEID, que usa o valor 715 como ID.

attestationIdManufacturer

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_ID_MANUFACTURER, que usa o valor 716 como ID.

attestationIdModel

Presente apenas na versão 2 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_ID_MODEL, que usa o valor 717 como ID.

vendorPatchLevel

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::VENDOR_PATCHLEVEL, que usa o valor 718 como ID.

Especifica o nível do patch de segurança da imagem do fornecedor que precisa ser instalado no dispositivo para que essa chave seja usada. O valor aparece no formato AAAAMMDD, que representa a data do patch de segurança do fornecedor. Por exemplo, se uma chave fosse gerada em um dispositivo Android com o patch de segurança do fornecedor de 1º de agosto de 2018 instalado, esse valor seria 20180801.

bootPatchLevel

Presente apenas na versão 3 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::BOOT_PATCHLEVEL, que usa o valor 719 como ID.

Especifica o nível do patch de segurança da imagem do kernel que precisa ser instalado no dispositivo para que essa chave seja usada. O valor aparece no formato AAAAMMDD, que representa a data do patch de segurança do sistema. Por exemplo, se uma chave fosse gerada em um dispositivo Android com o patch de segurança do sistema de 5 de agosto de 2018 instalado, esse valor seria 20180805.

deviceUniqueAttestation

Presente apenas na versão 4 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::DEVICE_UNIQUE_ATTESTATION, que usa o valor 720 como ID.

attestationIdSecondImei

Presente apenas na versão 300 ou mais recente do atestado de chaves.

Corresponde à tag de autorização Tag::ATTESTATION_ID_SECOND_IMEI, que usa o valor 723 como ID.

Campos RootOfTrust

verifiedBootKey
Hash seguro da chave pública usado para verificar a integridade e autenticidade de todo o código executado durante a inicialização do dispositivo como parte do Inicialização verificada. Recomendamos o SHA-256.
deviceLocked
Indica se o carregador de inicialização do dispositivo está bloqueado. true significa que o dispositivo inicializou uma imagem assinada que foi verificada com sucesso pela Inicialização verificada.
verifiedBootState
O estado da inicialização verificada do dispositivo.
verifiedBootHash
Um resumo de todos os dados protegidos pela Inicialização verificada. Para dispositivos que usam a implementação de referência da Inicialização verificada do Android, este campo contém o resumo VBMeta.

Valores de VerifiedBootState

Valor Estado de inicialização correspondente Significado
Verified GREEN Uma cadeia completa de confiança se estende de uma raiz de confiança protegida por hardware para o carregador de inicialização e todas as partições verificadas pela Inicialização verificada. Nesse estado, o campo verifiedBootKey contém o hash da raiz de confiança incorporada, que é o certificado incorporado à ROM do dispositivo pelo fabricante na fábrica.
SelfSigned YELLOW Igual a Verified, exceto que a verificação foi feita usando uma raiz de confiança configurada pelo usuário em vez da raiz de confiança incorporada pelo fabricante na fábrica. Nesse estado, o campo verifiedBootKey contém o hash da chave pública configurada pelo usuário.
Unverified ORANGE O carregador de inicialização do dispositivo está desbloqueado, então não é possível estabelecer uma cadeia de confiança. O dispositivo pode ser modificado livremente, portanto, a integridade dele precisa ser verificada pelo usuário fora da banda. Nesse estado, o campo verifiedBootKey contém 32 bytes de zeros.
Failed RED Falha na verificação do dispositivo. Nesse estado, não há garantias sobre o conteúdo dos outros campos RootOfTrust.

AttestationApplicationId

Esse campo reflete a crença da plataforma Android sobre quais apps podem usar o material de chave secreta que está sendo atestado. Ele pode conter vários pacotes somente quando eles compartilham o mesmo UID. O campo AttestationApplicationId em AuthorizationList é do tipo OCTET_STRING e é formatado de acordo com o seguinte esquema 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
Um conjunto de objetos AttestationPackageInfo, cada um fornecendo um nome de pacote e número de versão.
signature_digests

Um conjunto de resumos SHA-256 dos certificados de assinatura do app. Um app pode ter várias cadeias de certificados de chaves de assinatura. Para cada um, o certificado "de folha" é resumido e colocado no campo signature_digests. O nome do campo pode ser confuso, já que os dados resumidos são os certificados de assinatura do app, não as assinaturas dele. Isso acontece porque ele é nomeado para a classe Signature retornada por uma chamada para getPackageInfo(). O snippet de código a seguir mostra um conjunto de exemplos:

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

ID exclusivo

O ID exclusivo é um valor de 128 bits que identifica o dispositivo, mas apenas por um período limitado. O valor é calculado com:

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

Em que:

  • T é o "valor do contador temporal", calculado dividindo-se o valor de Tag::CREATION_DATETIME por 259.200.000, descartando o restante. T muda a cada 30 dias (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C é o valor de Tag::APPLICATION_ID
  • R é 1 se Tag::RESET_SINCE_ID_ROTATION estiver presente no parâmetro attest_params para a chamada attest_key ou 0 se a tag não estiver presente.
  • HBK é um secret exclusivo vinculado a hardware conhecido pelo ambiente de execução confiável e nunca revelado por ele. O segredo contém pelo menos 128 bits de entropia e é exclusivo para o dispositivo individual (a exclusividade probabilística é aceitável considerando os 128 bits de entropia). A HBK precisa ser derivada do material de chave mesclada por HMAC ou AES_CMAC.

Trunca a saída HMAC_SHA256 para 128 bits.

Chaves e certificados de atestado

Duas chaves, uma RSA e uma ECDSA, e as cadeias de certificados correspondentes, são provisionados com segurança no dispositivo.

O Android 12 introduziu o provisionamento de chave remota, e o Android 13 exige que os dispositivos o implementem. O provisionamento remoto de chaves fornece aos dispositivos em campo certificados de atestado ECDSA P256 por app. Esses certificados têm vida útil mais curta do que os certificados provisionados pela fábrica.

Vários IMEIs

O Android 14 adiciona suporte para vários IMEIs no registro do atestado de chaves do Android. OEMs podem implementar esse recurso adicionando uma tag KeyMint para um segundo IMEI. É cada vez mais comum que os dispositivos tenham vários rádios celulares e os OEMs agora podem oferecer suporte a dispositivos com dois IMEIs.

Os OEMs precisam ter um IMEI secundário, se presente nos dispositivos, que será provisionado às implementações do KeyMint para que elas possam atestá-lo da mesma maneira que o primeiro IMEI

Atestado de identidade

O Android 8.0 inclui suporte opcional para atestado de ID para dispositivos com Keymaster 3. O atestado de ID permite que o dispositivo forneça provas de seus identificadores de hardware, como número de série ou IMEI. Embora seja um recurso opcional, é altamente recomendável que todas as implementações do Keymaster 3 ofereçam suporte a ele, porque a capacidade de provar a identidade do dispositivo permite que casos de uso, como a configuração remota sem toque, sejam mais seguros, porque o lado remoto pode ter certeza de que está se comunicando com o dispositivo certo, e não com um dispositivo que está falsificando a identidade.

O atestado de ID funciona criando cópias dos identificadores de hardware do dispositivo que só o ambiente de execução confiável (TEE) pode acessar antes que o dispositivo saia da fábrica. Um usuário pode desbloquear o carregador de inicialização do dispositivo e mudar o software do sistema e os identificadores informados pelos frameworks do Android. As cópias dos identificadores mantidos pelo TEE não podem ser manipuladas dessa maneira, garantindo que o atestado de ID do dispositivo ateste apenas os identificadores de hardware originais do dispositivo, impedindo tentativas de spoofing.

A plataforma principal da API para atestado de identidade é baseada no mecanismo de atestado de chave atual introduzido com o Keymaster 2. Ao solicitar um certificado de atestado para uma chave mantida pelo keymaster, o autor da chamada pode solicitar que os identificadores de hardware do dispositivo sejam incluídos nos metadados do certificado de atestado. Se a chave for mantida no TEE, o certificado será vinculado a uma raiz de confiança conhecida. O destinatário desse certificado pode verificar se o certificado e o conteúdo, incluindo os identificadores de hardware, foram gravados pelo TEE. Quando solicitado a incluir identificadores de hardware no certificado de atestado, o TEE atesta apenas os identificadores mantidos no armazenamento, conforme preenchidos na fábrica.

Propriedades de armazenamento

O armazenamento que contém os identificadores do dispositivo precisa ter estas propriedades:

  • Os valores derivados dos identificadores originais do dispositivo são copiados para o armazenamento antes que o dispositivo saia da fábrica.
  • O método destroyAttestationIds() pode destruir permanentemente essa cópia dos dados derivados do identificador. A destruição permanente significa que os dados são completamente removidos, de modo que nem uma redefinição de fábrica nem qualquer outro procedimento realizado no dispositivo pode restaurá-los. Isso é especialmente importante para dispositivos em que um usuário desbloqueou o carregador de inicialização e mudou o software do sistema e modificou os identificadores retornados pelos frameworks do Android.
  • As instalações de ADM precisam ser capazes de gerar novas cópias dos dados derivados do identificador de hardware. Dessa forma, um dispositivo que passa pela ADM pode realizar o atestado de ID novamente. O mecanismo usado pelas instalações de ADM precisa ser protegido para que os usuários não possam invocá-lo, já que isso permitiria que eles recebessem atestados de identificação falsificados.
  • Nenhum código, exceto o app confiável do Keymaster no TEE, é capaz de ler os dados derivados do identificador mantidos no armazenamento.
  • O armazenamento é inviolável: se o conteúdo do armazenamento for modificado, o TEE vai tratá-lo como se as cópias do conteúdo tivessem sido destruídas e recusar todas as tentativas de atestado de identidade. Isso é implementado assinando ou usando o MAC do armazenamento conforme descrito abaixo.
  • O armazenamento não contém os identificadores originais. Como a atestação de identificação envolve um desafio, o autor da chamada sempre fornece os identificadores a serem atestados. O TEE só precisa verificar se eles correspondem aos valores originais. Armazenar hashes seguros dos valores originais em vez dos valores permite essa verificação.

Construção

Para criar uma implementação com as propriedades listadas acima, armazene os valores derivados de ID no S de construção a seguir. Não armazene outras cópias dos valores de ID, exceto os locais normais no sistema, que um proprietário do dispositivo pode modificar com acesso root:

S = D || HMAC(HBK, D)

em que:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC é a construção do HMAC com um hash seguro adequado (SHA-256 recomendado).
  • HBK é uma chave vinculada a hardware que não é usada para nenhuma outra finalidade
  • ID1...IDn são os valores de ID originais. A associação de um valor específico a um índice específico depende da implementação, já que dispositivos diferentes têm números diferentes de identificadores.
  • || representa a concatenação

Como as saídas do HMAC têm tamanho fixo, nenhum cabeçalho ou outra estrutura é necessário para encontrar hashes de ID individuais ou o HMAC de D. Além de verificar os valores fornecidos para realizar o atestado, as implementações precisam validar S extraindo D de S, calculando HMAC(HBK, D) e comparando-o com o valor em S para verificar se nenhum ID individual foi modificado/corrompido. Além disso, as implementações precisam usar comparações de tempo constante para todos os elementos de ID individuais e a validação de S. O tempo de comparação precisa ser constante, independente do número de IDs fornecidos e da correspondência correta de qualquer parte do teste.

Identificadores de hardware

O atestado de identidade oferece suporte aos seguintes identificadores de hardware:

  1. Nome da marca, conforme retornado por Build.BRAND no Android
  2. Nome do dispositivo, conforme retornado por Build.DEVICE no Android
  3. Nome do produto, conforme retornado por Build.PRODUCT no Android
  4. Nome do fabricante, conforme retornado por Build.MANUFACTURER no Android
  5. Nome do modelo, conforme retornado por Build.MODEL no Android.
  6. Número de série
  7. IMEIs de todos os rádios
  8. MEIDs de todos os rádios

Para oferecer suporte ao atestado de ID do dispositivo, um dispositivo atesta esses identificadores. Todos os dispositivos com Android têm os seis primeiros, que são necessários para que esse recurso funcione. Se o dispositivo tiver rádios celulares integrados, ele também precisará oferecer suporte a atestados para os IMEIs e/ou MEIDs dos rádios.

O atestado de ID é solicitado executando um atestado de chave e incluindo os identificadores do dispositivo a serem atestados na solicitação. Os identificadores são marcados como:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

O identificador a ser atestado é uma string de bytes codificada em UTF-8. Esse formato também se aplica a identificadores numéricos. Cada identificador a ser atestado é expresso como uma string codificada em UTF-8.

Se o dispositivo não oferecer suporte ao atestado de ID (ou destroyAttestationIds() foi chamado anteriormente e o dispositivo não pode mais atestar os IDs), qualquer solicitação de atestado de chave que inclua uma ou mais dessas tags falhará com ErrorCode::CANNOT_ATTEST_IDS.

Se o dispositivo oferecer suporte ao atestado de ID e uma ou mais das tags acima tiverem sido incluídas em uma solicitação de atestado de chaves, o TEE vai verificar se o identificador fornecido com cada uma das tags corresponde à cópia dos identificadores de hardware. Se um ou mais identificadores não corresponderem, todo o atestado vai falhar com ErrorCode::CANNOT_ATTEST_IDS. É válido que a mesma tag seja fornecida várias vezes. Isso pode ser útil, por exemplo, ao atestar IMEIs: um dispositivo pode ter vários rádios com vários IMEIs. Uma solicitação de atestado é válida se o valor fornecido com cada ATTESTATION_ID_IMEI corresponder a um dos rádios do dispositivo. O mesmo vale para todas as outras tags.

Se a atestação for bem-sucedida, os IDs atestados serão adicionados à extensão de atestado (OID 1.3.6.1.4.1.11129.2.1.17) do certificado de atestado emitido, usando o esquema acima. As mudanças do esquema de atestado do Keymaster 2 são em negrito, com comentários.

API Java

Esta seção é apenas informativa. Os implementadores do Keymaster não implementam nem usam a API Java. Isso é fornecido para ajudar os implementadores a entender como o recurso é usado pelos apps. Os componentes do sistema podem usá-lo de maneira diferente, por isso é crucial que esta seção não seja tratada como normativa.