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 fica mais seguro contra extração do dispositivo, e o Keymaster aplica restrições difíceis de subverter.
Isso só é verdadeiro se as chaves do keystore estiverem em armazenamento com suporte de 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 a confirmação de chave no Android 7.0 (Keymaster 2) e a confirmação 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, tipos e métodos na HAL.
Tags
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Tipo
Keymaster 2 e versões 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 degenerateKey
para o qual o atestado é criado.attestParams
é uma lista de todos os parâmetros necessários para atestados. Isso incluiTag::ATTESTATION_CHALLENGE
e possivelmenteTag::RESET_SINCE_ID_ROTATION
, além deTag::APPLICATION_ID
eTag::APPLICATION_DATA
. Os dois últimos são necessários para descriptografar o blob de chave, se eles foram especificados durante a geração de chaves.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 dekeyToAttest
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 na tabela abaixo e não pode conter outros campos. Alguns campos especificam um valor fixo. Os testes do CTS validam se o conteúdo do certificado está exatamente como definido.
SEQUÊNCIA de certificados
Nome do campo (consulte RFC 5280). | Valor |
---|---|
tbsCertificate | 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. |
TBSCertificate SEQUENCE
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 = "Chave do Android Keystore" (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, então 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.
Valor Versão do Keymaster/KeyMint 1 Keymaster versão 2.0 2 Keymaster versão 3.0 3 Keymaster versão 4.0 4 Keymaster versão 4.1 100 KeyMint versão 1.0 200 KeyMint versão 2.0 300 KeyMint versão 3.0 -
attestationSecurityLevel
-
O nível de segurança do local em que a chave atestada é armazenada.
-
keymasterVersion
/keyMintVersion
-
A versão da implementação da camada de abstração de hardware (HAL) do Keymaster/KeyMint.
Valor Versão do Keymaster/KeyMint 2 Keymaster versão 2.0 3 Keymaster versão 3.0 4 Keymaster versão 4.0 41 Keymaster versão 4.1 100 KeyMint versão 1.0 200 KeyMint versão 2.0 300 KeyMint 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 de geração da chave. Se o ID exclusivo não for solicitado, esse campo vai ficar vazio. Para mais detalhes, consulte a seção ID exclusivo.
-
softwareEnforced
-
A lista de autorização
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 envolve a confiança na plataforma.
Valores de SecurityLevel
O valor SecurityLevel
indica o grau em que 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 |
Seguro, desde que o ambiente de execução confiável (TEE) não seja 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 a comprometimento remoto e moderadamente resistentes a comprometimento por ataque direto 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 é sempreRSA
ouEC
. -
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çãoTag::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 |
O dispositivo falhou na verificação. 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 classeSignature
retornada por uma chamada paragetPackageInfo()
. 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 o valor deTag::CREATION_DATETIME
por 2592000000, descartando qualquer resto.T
muda a cada 30 dias (2592000000 = 30 * 24 * 60 * 60 * 1000).C
é o valor deTag::APPLICATION_ID
R
é 1 seTag::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 segredo 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 provisionadas 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, para ser provisionado para as implementações do KeyMint, para que essas implementações possam atestar o mesmo que o primeiro IMEI.
Extensão de informações de provisionamento
A extensão de informações de provisionamento tem o OID
1.3.6.1.4.1.11129.2.1.30
. A extensão fornece informações
sobre o dispositivo conhecidas pelo servidor de provisionamento.
Esquema
A extensão segue o esquema CDDL (link em inglês):
{ 1 : int, ; certificates issued }
O mapa não tem controle de versão, e novos campos opcionais podem ser adicionados.
-
certs_issued
-
Um número aproximado de certificados emitidos para o dispositivo nos últimos 30 dias. Esse valor pode ser usado como um sinal de possível abuso quando o valor é maior que a média em algumas ordens de magnitude.
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 ID é 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 dele, 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 armazenados, conforme preenchido 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 de o dispositivo sair 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 pelo RMA pode fazer a declaração 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 declarações de IDs falsificados.
- Nenhum código, exceto o app confiável Keymaster no TEE, pode 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 do ID na construção S 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 ao hardware que não é usada para nenhuma outra finalidadeID1...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 de HMAC têm tamanho fixo, não são necessários cabeçalhos ou outra estrutura para encontrar hashes de ID individuais ou o HMAC de D. Além de verificar os valores fornecidos para realizar a atestação, 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:
- Nome da marca, conforme retornado por
Build.BRAND
no Android - Nome do dispositivo, conforme retornado por
Build.DEVICE
no Android - Nome do produto, conforme retornado por
Build.PRODUCT
no Android - Nome do fabricante, conforme retornado por
Build.MANUFACTURER
no Android - Nome do modelo, conforme retornado por
Build.MODEL
no Android - Número de série
- IMEIs de todos os rádios
- 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 à atestado de identidade e uma ou mais das tags acima
tiverem sido incluídas em uma solicitação de atestado de chave, 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, o atestado inteiro 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 atestação de 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.