O Keystore oferece um lugar mais seguro para criar, armazenar e usar chaves criptográficas de maneira controlada. Quando o armazenamento de chaves com suporte de hardware está disponível e é usado, o material da chave fica mais seguro contra extração do dispositivo, e o KeyMint (antes Keymaster) impõe restrições difíceis de subverter.
No entanto, isso só é verdade se as chaves do Keystore estiverem em armazenamento com suporte de hardware. No Keymaster 1, não havia como apps ou servidores remotos verificarem de forma confiável se esse era o caso. O daemon keystore carregou a camada de abstração de hardware (HAL) do Keymaster disponível e acreditou em tudo o que a HAL disse com relação ao suporte de hardware das chaves.
Para resolver isso, o atestado de chave foi introduzido no Android 7.0 (Keymaster 2), e o atestado de ID foi introduzido no Android 8.0 (Keymaster 3).
O atestado de chaves tem como objetivo fornecer uma maneira de determinar 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 prova dos identificadores de hardware, como número de série ou IMEI.
Atestado de chaves
Para oferecer suporte à declaraçã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 Keymaster.keyToAttest
é o blob de chave retornado degenerateKey
para o qual a declaração é criada.attestParams
é uma lista de todos os parâmetros necessários para o atestado. 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 atestada 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 autenticação do usuário.
Certificado de declaração
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 atestada. O certificado é assinado com uma chave de atestado certificada. A chave de atestado pode usar um algoritmo diferente da chave que está sendo atestada.
O certificado de comprovação 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.
SEQUENCE do certificado
Nome do campo (consulte RFC 5280) | Valor |
---|---|
tbsCertificate | SEQUÊNCIA TBSCertificate |
signatureAlgorithm | AlgorithmIdentifier do algoritmo usado para assinar a chave: ECDSA para chaves EC, RSA para chaves RSA. |
signatureValue | BIT STRING, assinatura calculada em tbsCertificate codificado em ASN.1 DER. |
SEQUENCE TBSCertificate
Nome do campo (consulte RFC 5280) | Valor |
---|---|
version |
INTEGER 2 (significa certificado v3) |
serialNumber |
INTEGER 1 (valor fixo: igual 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 "Assunto" da chave de atestado em 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 RFC 5280 para 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 validade do certificado da chave de atestado em lote. |
subject |
CN = "Android Keystore Key" (valor fixo: igual em todos os certificados) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo que contém a 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 definidos. |
extensions/CRL Distribution Points |
Valor (a definir) |
extensions/"attestation" |
O OID é 1.3.6.1.4.1.11129.2.1.17, e 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 que contém uma codificação DER da SEQUENCE 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 da chave.
Os tipos de tag do Keymaster/KeyMint definidos na especificação da interface AIDL são traduzidos para tipos ASN.1 da seguinte forma:
Tipo KeyMint ou Keymaster | 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, às 00:00:00 GMT. |
BOOL |
NULL |
A presença da tag significa "true", e a ausência significa "false". |
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 400
KeyDescription ::= SEQUENCE { attestationVersion 400, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, moduleHash [724] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
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 de KeyDescription
-
attestationVersion
-
A versão do esquema ASN.1.
Valor Versão do KeyMint ou Keymaster 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 400 KeyMint versão 4.0 -
attestationSecurityLevel
-
O nível de segurança do local onde a chave atestada está armazenada.
-
keymasterVersion
/keyMintVersion
-
A versão da implementação da HAL do KeyMint ou do Keymaster.
Valor Versão do KeyMint ou Keymaster 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 400 KeyMint versão 4.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- O nível de segurança da implementação do KeyMint ou Keymaster.
-
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 de chaves. 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 do KeyMint ou do Keymaster aplicada
pelo sistema Android. Essas informações são coletadas ou geradas por código na
plataforma. Ele pode ser confiável desde que o dispositivo esteja executando um
sistema operacional compatível com o
Modelo de segurança da plataforma Android
(ou seja, o carregador de inicialização do dispositivo está bloqueado e o
verifiedBootState
éVerified
). -
hardwareEnforced
- A lista de autorização do KeyMint ou do Keymaster que é aplicada pelo ambiente de execução confiável (TEE) ou pelo 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 de um canal de comunicação seguro que não envolve confiar na plataforma.
Valores de SecurityLevel
O valor SecurityLevel
indica o grau de resiliência a ataques de um elemento relacionado ao
Keystore (por exemplo, par de chaves e comprovação).
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 está bloqueado e o
verifiedBootState é
Verified ). |
TrustedEnvironment |
Seguro, desde que o TEE não seja comprometido. Os requisitos de isolamento para TEEs estã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 esteja 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 estã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 por ataque direto de hardware (por exemplo, adulteração física e ataques de canal lateral). |
Campos de 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 delas, o formato do conteúdo, se elas devem aparecer nos campos softwareEnforced
ou hardwareEnforced
no objeto KeyDescription
, se são mutuamente exclusivas com outras tags etc. Todos os campos AuthorizationList
são opcionais.
Cada campo tem uma tag EXPLICIT
específica do contexto igual ao número da tag do KeyMint ou Keymaster, 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
em 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. -
blockMode
-
Corresponde à tag de autorização
Tag::BLOCK_MODE
, que usa o valor 4 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. -
callerNonce
-
Corresponde à tag de autorização
Tag::CALLER_NONCE
, que usa o valor 7 como ID. -
minMacLength
-
Corresponde à tag de autorização
Tag::MIN_MAC_LENGTH
, que usa o valor 8 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
, 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. -
userSecureId
-
Corresponde à tag de autorização
Tag::USER_SECURE_ID
, que usa o valor 502 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.
-
trustedUserPresenceReq
-
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.
-
trustedConfirmationReq
-
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
. -
unlockedDeviceReq
-
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. -
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. -
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
, 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 de autorização
Tag::ATTESTATION_ID_BRAND
, que usa o valor 710 como ID. -
attestationIdDevice
-
Presente apenas na versão 2 ou mais recente do atestado de chaves.
Corresponde à tag de autorização
Tag::ATTESTATION_ID_DEVICE
, que usa o valor 711 como ID. -
attestationIdProduct
-
Presente apenas na versão 2 ou mais recente do atestado de chaves.
Corresponde à tag de autorização
Tag::ATTESTATION_ID_PRODUCT
, que usa o valor 712 como ID. -
attestationIdSerial
-
Presente apenas na versão 2 ou mais recente do atestado de chaves.
Corresponde à tag de autorização
Tag::ATTESTATION_ID_SERIAL
, 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. -
moduleHash
-
Presente apenas na versão 400 ou mais recente do atestado de chaves.
Corresponde à tag de autorização
Tag::MODULE_HASH
, que usa o valor 724 como ID.
Campos RootOfTrust
-
verifiedBootKey
- Um hash seguro da chave pública usada para verificar a integridade e autenticidade de todo o código executado durante a inicialização do dispositivo como parte da inicialização verificada. Recomendamos o SHA-256.
-
deviceLocked
-
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, esse 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 até
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, então 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 |
A verificação do dispositivo falhou. 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 está
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]), ...}
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 seguinte esquema CDDL:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
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.
-
validated_attested_entity
-
A entidade atestada validada é uma string que descreve o tipo de dispositivo que foi confirmado pelo servidor de provisionamento como atestado. Por exemplo,
STRONG_BOX
ouTEE
.
Chaves 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 introduz o provisionamento remoto de chaves, 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 uma validade menor do que os provisionados na fábrica.
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 restante.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 da chamada attest_key ou 0 se a tag não estiver presente.HBK
é um segredo exclusivo vinculado ao 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 do dispositivo individual. A exclusividade probabilística é aceitável considerando os 128 bits de entropia. A HBK precisa ser derivada do material de chave fundido via HMAC ou AES_CMAC.
Trunca a saída HMAC_SHA256 para 128 bits.
Vários IMEIs
O Android 14 adiciona suporte para vários IMEIs no registro do atestado de chaves do Android. Os OEMs podem implementar esse recurso adicionando uma tag KeyMint para um segundo IMEI. São cada vez mais comuns dispositivos com vários rádios celulares e os OEMs agora podem oferecer suporte para dispositivos com dois IMEIs.
Os OEMs precisam ter um IMEI secundário, se presente nos dispositivos, para ser provisionado nas implementações do KeyMint. Assim, essas implementações podem atestar o IMEI secundário da mesma forma que o primeiro.
Atestado de ID
O Android 8.0 inclui suporte opcional para atestado de ID em dispositivos com Keymaster 3. O atestado de ID permite que o dispositivo forneça prova dos 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. Isso porque a capacidade de provar a identidade do dispositivo permite casos de uso, como a configuração remota verdadeira sem toque, que é mais segura. Isso porque o lado remoto pode ter certeza de que está falando com o dispositivo certo, não com um dispositivo falsificando a identidade.
O atestado de ID funciona criando cópias dos identificadores de hardware do dispositivo que somente o 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 mantidas pelo TEE não podem ser manipuladas dessa forma, garantindo que o atestado do ID do dispositivo ateste apenas os identificadores de hardware originais do dispositivo, impedindo tentativas de spoofing.
A principal plataforma de API para declaração de ID se baseia no mecanismo de declaração de chave atual, introduzido com o Keymaster 2. Ao solicitar um certificado de atestado para uma chave mantida pelo Keymaster, o caller pode pedir 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á encadeado de volta a uma raiz de confiança conhecida. O destinatário de um certificado desse tipo 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 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 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. Assim, 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, mudou o software do sistema e modificou os identificadores retornados pelos frameworks do Android. - As instalações de RMA precisam gerar cópias novas dos dados derivados do identificador de hardware. Assim, um dispositivo que passa por ADM 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 por conta própria, já que isso permitiria que eles obtivessem atestados de IDs falsificados.
- Nenhum código além do app confiável do Keymaster no TEE pode ler os dados derivados do identificador mantidos no armazenamento.
- O armazenamento é inviolável: se o conteúdo do armazenamento tiver sido modificado, o TEE vai tratá-lo como se as cópias do conteúdo tivessem sido destruídas e vai recusar todas as tentativas de comprovação de ID. Isso é implementado assinando ou MACando o armazenamento conforme descrito abaixo.
- O armazenamento não contém os identificadores originais. Como a declaração de ID envolve um desafio, o caller sempre fornece os identificadores a serem declarados. O TEE só precisa verificar se eles correspondem aos valores que tinham originalmente. O armazenamento de 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 seguinte construção S. Não armazene outras cópias dos valores de ID, exceto nos locais normais do sistema, que um proprietário do dispositivo pode modificar fazendo root:
S = D || HMAC(HBK, D)
em que:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
é a construção de HMAC com um hash seguro adequado (SHA-256 recomendado).HBK
é uma chave vinculada ao hardware e 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 de HMAC têm tamanho fixo, não é necessário usar 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 o atestado, as implementações precisam validar S extraindo D de S, calculando HMAC(HBK, D) e comparando-o ao 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
A declaração de ID é compatível com os 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 Android têm os seis primeiros, que são necessários para o funcionamento do recurso. Se o dispositivo tiver rádios celulares integrados, ele também precisará oferecer suporte a comprovação para os IMEIs e/ou MEIDs dos rádios.
A declaração de ID é solicitada realizando uma declaração de chave e incluindo os identificadores de dispositivo a serem declarados 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 for compatível com a declaração de ID (ou
destroyAttestationIds()
tiver sido chamado anteriormente e o dispositivo não puder mais
declarar os IDs), qualquer solicitação de declaração de chave que inclua uma ou mais dessas
tags vai falhar com ErrorCode::CANNOT_ATTEST_IDS
.
Se o dispositivo for compatível com a declaração de ID e uma ou mais das tags acima tiverem sido incluídas em uma solicitação de declaração 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, toda a declaração vai falhar com
ErrorCode::CANNOT_ATTEST_IDS
. É válido fornecer a mesma tag 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 se aplica a todas as outras tags.
Se o atestado for bem-sucedido, 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 estã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 usar de maneira diferente. Por isso, é crucial que esta seção não seja tratada como normativa.