Keystore proporciona un lugar más seguro para crear, almacenar y usar claves criptográficas de manera controlada. Cuando el almacenamiento de claves respaldado por hardware está disponible y se usa, el material de claves es más seguro contra la extracción del dispositivo, y Keymaster aplica restricciones que son difíciles de subvertir.
Sin embargo, esto solo es cierto si se sabe que las claves del almacén de claves están en almacenamiento con copia de seguridad de hardware. En Keymaster 1, las apps o los servidores remotos no tenían forma de verificar de forma confiable si este era el caso. El daemon del almacén de claves cargó el HAL de Keymaster disponible y creyó todo lo que dijo el HAL con respecto a la copia de seguridad de claves en hardware.
Para solucionar este problema, Keymaster introdujo la certificación de claves en Android 7.0 (Keymaster 2) y la certificación de ID en Android 8.0 (Keymaster 3).
El objetivo de la certificación de claves es proporcionar una forma de determinar de forma fehaciente si un par de claves asimétricas tiene una copia de seguridad en el hardware, cuáles son las propiedades de la clave y qué restricciones se aplican a su uso.
La certificación de ID permite que el dispositivo proporcione una prueba de sus identificadores de hardware, como el número de serie o el IMEI.
Certificación de claves
Para admitir la certificación de claves, Android 7.0 introdujo un conjunto de etiquetas, tipos y métodos en el HAL.
Etiquetas
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
Tipo
Keymaster 2 y versiones 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 y versiones 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
es la estructura del dispositivo de Keymaster.keyToAttest
es el BLOB de clave que se muestra desdegenerateKey
para el que se crea la certificación.attestParams
es una lista de los parámetros necesarios para la certificación. Esto incluyeTag::ATTESTATION_CHALLENGE
y, posiblemente,Tag::RESET_SINCE_ID_ROTATION
, así comoTag::APPLICATION_ID
yTag::APPLICATION_DATA
. Los dos últimos son necesarios para desencriptar el blob de clave si se especificaron durante la generación de claves.certChain
es el parámetro de salida, que muestra un array de certificados. La entrada 0 es el certificado de certificación, lo que significa que certifica la clave dekeyToAttest
y contiene la extensión de certificación.
El método attestKey
se considera una operación de clave pública en la clave certificada, ya que se puede llamar en cualquier momento y no es necesario que cumpla con las restricciones de autorización. Por ejemplo, si la clave certificada necesita la autenticación del usuario para su uso, se puede generar una certificación sin la autenticación del usuario.
Certificado de certificación
El certificado de certificación es un certificado X.509 estándar, con una extensión de certificación opcional que contiene una descripción de la clave certificada. El certificado está firmado con una clave de certificación certificada. La clave de certificación puede usar un algoritmo diferente al de la clave que se certifica.
El certificado de certificación contiene los campos que se indican en la siguiente tabla y no puede contener ningún campo adicional. Algunos campos especifican un valor de campo fijo. Las pruebas de CTS validan que el contenido del certificado sea exactamente como se define.
SEQUENCE del certificado
Nombre del campo (consulta RFC 5280) | Valor |
---|---|
tbsCertificate | SECUENCIA TBSCertificate |
signatureAlgorithm | AlgorithmIdentifier del algoritmo que se usa para firmar la clave: ECDSA para claves de EC, RSA para claves de RSA. |
signatureValue | CADENA DE BIT, firma calculada en el certificado tbs con codificación DER de ASN.1. |
SEQUENCE de TBSCertificate
Nombre del campo (consulta RFC 5280) | Valor |
---|---|
version |
INTEGER 2 (significa certificado v3) |
serialNumber |
ENTERO 1 (valor fijo: igual en todos los certificados) |
signature |
AlgorithmIdentifier del algoritmo que se usa para firmar la clave: ECDSA para claves de EC, RSA para claves de RSA. |
issuer |
Es igual que el campo de asunto de la clave de certificación por lotes. |
validity |
SEQUENCE de dos fechas, que contiene los valores de Tag::ACTIVE_DATETIME y Tag::USAGE_EXPIRE_DATETIME.
Esos valores se expresan en milisegundos desde el 1 de enero de 1970.
Consulta RFC 5280 para ver las representaciones de fecha correctas en los certificados. Si Tag::ACTIVE_DATETIME no está presente, usa el valor de
Tag::CREATION_DATETIME . Si Tag::USAGE_EXPIRE_DATETIME no está presente, usa la fecha de vencimiento del certificado de clave de certificación por lotes. |
subject |
CN = "Clave de Android Keystore" (valor fijo: igual en todos los certificados) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo que contiene la clave pública certificada |
extensions/Key Usage |
digitalSignature: Se establece si la clave tiene el propósito KeyPurpose::SIGN o KeyPurpose::VERIFY . Todos los demás bits no se establecen. |
extensions/CRL Distribution Points |
Valor (TBD) |
extensions/"attestation" |
El OID es 1.3.6.1.4.1.11129.2.1.17. El contenido se define en la sección Extensión de certificación que aparece a continuación. Al igual que con todas las extensiones de certificados X.509, el contenido se representa como una OCTET_STRING que contiene una codificación DER de la SEQUENCE de certificación. |
Extensión de certificación
La extensión attestation
tiene OID 1.3.6.1.4.1.11129.2.1.17
. Contiene información sobre el par de claves que se certifica y el estado del dispositivo en el momento de la generación de claves.
Los tipos de etiquetas Keymaster/KeyMint definidos en la especificación de la interfaz AIDL se traducen a tipos ASN.1 de la siguiente manera:
Tipo de Keymaster/KeyMint | Tipo ASN.1 | Notas |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
Milisegundos desde el 1 de enero de 1970 a las 00:00:00 (GMT). |
BOOL |
NULL |
La presencia de la etiqueta significa verdadero y la ausencia significa falso. |
BIGNUM |
Ninguna etiqueta tiene este tipo, por lo que no se define ninguna asignación. | |
BYTES |
OCTET_STRING |
Esquema
El siguiente esquema ASN.1 describe el contenido de la extensión de certificación:
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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), }
Versión 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
-
La versión del esquema ASN.1.
Valor Versión de Keymaster/KeyMint 1 Keymaster versión 2.0 2 Keymaster versión 3.0 3 Keymaster versión 4.0 4 Keymaster versión 4.1 100 KeyMint versión 1.0 200 KeyMint versión 2.0 300 KeyMint versión 3.0 -
attestationSecurityLevel
-
El nivel de seguridad de la ubicación en la que se almacena la clave certificada.
-
keymasterVersion
/keyMintVersion
-
Es la versión de la implementación de la capa de abstracción de hardware (HAL) de Keymaster/KeyMint.
Valor Versión de Keymaster/KeyMint 2 Keymaster versión 2.0 3 Keymaster versión 3.0 4 Keymaster versión 4.0 41 Keymaster versión 4.1 100 KeyMint versión 1.0 200 KeyMint versión 2.0 300 KeyMint versión 3.0 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Es el nivel de seguridad de la implementación de Keymaster/KeyMint.
-
attestationChallenge
- Es el desafío que se proporcionó en el momento de la generación de la clave.
-
uniqueId
- Un identificador de dispositivo sensible a la privacidad que las apps del sistema pueden solicitar en el momento de la generación de claves. Si no se solicita el ID único, este campo estará vacío. Para obtener más detalles, consulta la sección ID único.
-
softwareEnforced
-
Es la lista de autorización de Keymaster/KeyMint que aplica el sistema Android. Esta información se recopila o genera a través de código en la plataforma y se almacena en la partición del sistema del dispositivo. Se puede confiar en él, siempre y cuando el dispositivo ejecute un sistema operativo que cumpla con el modelo de seguridad de la plataforma de Android (es decir, el bootloader del dispositivo esté bloqueado y
verifiedBootState
seaVerified
). -
hardwareEnforced
- Es la lista de autorización de Keymaster/KeyMint que aplica el entorno de ejecución confiable (TEE) o StrongBox del dispositivo. Esta información se recopila o genera con código en el hardware seguro y no está controlada por la plataforma. Por ejemplo, la información puede provenir del bootloader o a través de un canal de comunicación seguro que no implique confiar en la plataforma.
Valores de SecurityLevel
El valor de SecurityLevel
indica en qué medida un elemento relacionado con el almacén de claves (por ejemplo, el par de claves y la certificación) es resistente a los ataques.
Valor | Significado |
---|---|
Software |
Son seguros, siempre y cuando el sistema Android del dispositivo cumpla con el modelo de seguridad de la plataforma de Android (es decir, el bootloader del dispositivo esté bloqueado y verifiedBootState sea Verified ). |
TrustedEnvironment |
Son seguros, siempre y cuando el entorno de ejecución confiable (TEE) no esté comprometido. Los requisitos de aislamiento para los TEE se definen en las secciones 9.11 [C-1-1] a [C-1-4] del Documento de definición de compatibilidad de Android. Los TEE son muy resistentes a los ataques remotos y moderadamente resistentes a los ataques de hardware directos. |
StrongBox |
Es segura, siempre y cuando StrongBox no esté comprometido. StrongBox se implementa en un elemento seguro similar a un módulo de seguridad de hardware. Los requisitos de implementación de StrongBox se definen en la sección 9.11.2 del Documento de definición de compatibilidad de Android. StrongBox es muy resistente a los ataques remotos y a los ataques de hardware directos (por ejemplo, manipulaciones físicas y ataques de canal lateral). |
Campos de AuthorizationList
Cada campo corresponde a una etiqueta de autorización de Keymaster/KeyMint de la especificación de la interfaz AIDL.
La especificación es la fuente de información confiable sobre las etiquetas de autorización: su significado, el formato de su contenido, si se espera que aparezcan en los campos softwareEnforced
o hardwareEnforced
del objeto KeyDescription
, si son mutuamente excluyentes con otras etiquetas, etcétera. Todos los campos AuthorizationList
son opcionales.
Cada campo tiene una etiqueta específica del contexto EXPLICIT
igual al número de etiqueta de Keymaster/KeyMint, lo que permite una representación más compacta de los datos en AuthorizationList
. Por lo tanto, el analizador ASN.1 debe conocer el tipo de datos esperado para cada etiqueta específica del contexto. Por ejemplo, Tag::USER_AUTH_TYPE
se define como ENUM | 504
. En el esquema de extensión de certificación, el campo purpose
en AuthorizationList
se especifica como userAuthType [504] EXPLICIT INTEGER OPTIONAL
. Por lo tanto, su codificación ASN.1 contendrá la etiqueta específica del contexto 504
en lugar de la etiqueta de clase UNIVERSAL
para el tipo ASN.1 INTEGER
, que es 10
.
-
purpose
-
Corresponde a la etiqueta de autorización
Tag::PURPOSE
que usa un valor de ID de etiqueta de 1. -
algorithm
-
Corresponde a la etiqueta de autorización
Tag::ALGORITHM
que usa un valor de ID de etiqueta de 2.En un objeto
AuthorizationList
de certificación. El valor del algoritmo es siempreRSA
oEC
. -
keySize
-
Corresponde a la etiqueta de autorización
Tag::KEY_SIZE
que usa un valor de ID de etiqueta de 3. -
digest
-
Corresponde a la etiqueta de autorización
Tag::DIGEST
que usa un valor de ID de etiqueta de 5. -
padding
-
Corresponde a la etiqueta de autorización
Tag::PADDING
que usa un valor de ID de etiqueta de 6. -
ecCurve
-
Corresponde a la etiqueta de autorización
Tag::EC_CURVE
que usa un valor de ID de etiqueta de 10.Es el conjunto de parámetros empleados para generar un par de claves de curva elíptica (CE), que usa ECDSA para la firma y verificación, en el almacén de claves del sistema Android.
-
rsaPublicExponent
-
Corresponde a la etiqueta de autorización
Tag::RSA_PUBLIC_EXPONENT
de Keymaster que usa un valor de ID de etiqueta de 200. -
mgfDigest
-
Solo está presente en la versión de certificación de claves >= 100.
Corresponde a la etiqueta de autorizaciónTag::RSA_OAEP_MGF_DIGEST
de KeyMint que usa un valor de ID de etiqueta de 203. -
rollbackResistance
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::ROLLBACK_RESISTANCE
que usa un valor de ID de etiqueta de 303. -
earlyBootOnly
-
Solo está presente en la versión de certificación de claves >= 4.
Corresponde a la etiqueta de autorización
Tag::EARLY_BOOT_ONLY
que usa un valor de ID de etiqueta de 305. -
activeDateTime
-
Corresponde a la etiqueta de autorización
Tag::ACTIVE_DATETIME
que usa un valor de ID de etiqueta de 400. -
originationExpireDateTime
-
Corresponde a la etiqueta de autorización
Tag::ORIGINATION_EXPIRE_DATETIME
de Keymaster que usa un valor de ID de etiqueta de 401. -
usageExpireDateTime
-
Corresponde a la etiqueta de autorización
Tag::USAGE_EXPIRE_DATETIME
que usa un valor de ID de etiqueta de 402. -
usageCountLimit
-
Corresponde a la etiqueta de autorización
Tag::USAGE_COUNT_LIMIT
que usa un valor de ID de etiqueta de 405. -
noAuthRequired
-
Corresponde a la etiqueta de autorización
Tag::NO_AUTH_REQUIRED
de Keymaster que usa un valor de ID de etiqueta de 503. -
userAuthType
-
Corresponde a la etiqueta de autorización
Tag::USER_AUTH_TYPE
que usa un valor de ID de etiqueta de 504. -
authTimeout
-
Corresponde a la etiqueta de autorización
Tag::AUTH_TIMEOUT
que usa un valor de ID de etiqueta de 505. -
allowWhileOnBody
-
Corresponde a la etiqueta de autorización
Tag::ALLOW_WHILE_ON_BODY
que usa un valor de ID de etiqueta de 506.Permite usar la clave después de su período de espera para la autenticación si el usuario todavía lleva el dispositivo consigo. Recuerda que un sensor corporal seguro determina si el dispositivo está en contacto con el cuerpo del usuario.
-
trustedUserPresenceRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::TRUSTED_USER_PRESENCE_REQUIRED
que usa un valor de ID de etiqueta de 507.Especifica que esta clave solo se puede usar si el usuario proporcionó una prueba de presencia física. Entre los ejemplos, se incluyen los siguientes:
- Para una clave StrongBox, es un botón de hardware conectado con un pin en el dispositivo StrongBox.
- Para una clave de TEE, la autenticación de huella digital proporciona una prueba de presencia siempre y cuando el TEE tenga control exclusivo del escáner y realice el proceso de coincidencia de huella digital.
-
trustedConfirmationRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::TRUSTED_CONFIRMATION_REQUIRED
que usa un valor de ID de etiqueta de 508.Especifica que la clave solo se puede usar si el usuario proporciona confirmación de que los datos se firmarán con un token de aprobación. Para obtener más información acerca de cómo obtener confirmación del usuario, consulta Confirmación de protección de Android.
Nota: Esta etiqueta solo se aplica a claves que usan el propósito
SIGN
. -
unlockedDeviceRequired
-
Solo está presente en la versión de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::UNLOCKED_DEVICE_REQUIRED
que usa un valor de ID de etiqueta de 509. -
allApplications
-
Corresponde a la etiqueta de autorización
Tag::ALL_APPLICATIONS
que usa un valor de ID de etiqueta de 600.Indica si todas las apps de un dispositivo pueden acceder al par de claves.
-
applicationId
-
Corresponde a la etiqueta de autorización
Tag::APPLICATION_ID
que usa un valor de ID de etiqueta de 601. -
creationDateTime
-
Corresponde a la etiqueta de autorización
Tag::CREATION_DATETIME
que usa un valor de ID de etiqueta de 701. -
origin
-
Corresponde a la etiqueta de autorización
Tag::ORIGIN
que usa un valor de ID de etiqueta de 702. -
rollbackResistant
-
Solo está presente en las versiones de certificación 1 y 2.
Corresponde a la etiqueta de autorización
Tag::ROLLBACK_RESISTANT
que usa un valor de ID de etiqueta de 703. -
rootOfTrust
-
Corresponde a la etiqueta de autorización
Tag::ROOT_OF_TRUST
que usa un valor de ID de etiqueta de 704.Para obtener más información, consulta la sección en la que se describe la estructura de datos de RootOfTrust.
-
osVersion
-
Corresponde a la etiqueta de autorización
Tag::OS_VERSION
que usa un valor de ID de etiqueta de 705.Es la versión del sistema operativo Android asociada con Keymaster, especificada como un número entero de seis dígitos. Por ejemplo, la versión 8.1.0 se representa como 080100.
Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.
-
osPatchLevel
-
Corresponde a la etiqueta de autorización
Tag::PATCHLEVEL
que usa un valor de ID de etiqueta de 706.El mes y el año asociados con el parche de seguridad que se usa en Keymaster, especificados como un número entero de seis dígitos. Por ejemplo, el parche de agosto de 2018 se representa como 201808.
Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.
-
attestationApplicationId
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_APPLICATION_ID
de Keymaster que usa un valor de ID de etiqueta de 709.Para obtener más información, consulta la sección en la que se describe la estructura de datos de AttestationApplicationId.
-
attestationIdBrand
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_BRAND
de Keymaster que usa un valor de ID de etiqueta de 710. -
attestationIdDevice
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_DEVICE
de Keymaster que usa un valor de ID de etiqueta de 711. -
attestationIdProduct
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_PRODUCT
de Keymaster que usa un valor de ID de etiqueta de 712. -
attestationIdSerial
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta
Tag::ATTESTATION_ID_SERIAL
de Keymaster, que usa un valor de ID de etiqueta de 713. -
attestationIdImei
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_IMEI
que usa un valor de ID de etiqueta de 714. -
attestationIdMeid
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MEID
que usa un valor de ID de etiqueta de 715. -
attestationIdManufacturer
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MANUFACTURER
que usa un valor de ID de etiqueta de 716. -
attestationIdModel
-
Solo está presente en versiones de certificación >= 2.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_MODEL
que usa un valor de ID de etiqueta de 717. -
vendorPatchLevel
-
Solo está presente en versiones de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::VENDOR_PATCHLEVEL
que usa un valor de ID de etiqueta de 718.Especifica el nivel de parche de seguridad de la imagen del proveedor que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del proveedor. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 1 de agosto de 2018 del proveedor instalado, este valor sería 20180801.
-
bootPatchLevel
-
Solo está presente en versiones de certificación >= 3.
Corresponde a la etiqueta de autorización
Tag::BOOT_PATCHLEVEL
que usa un valor de ID de etiqueta de 719.Especifica el nivel de parche de seguridad de la imagen del kernel que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del sistema. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 5 de agosto de 2018 del sistema instalado, este valor sería 20180805.
-
deviceUniqueAttestation
-
Solo está presente en versiones de certificación de claves >= 4.
Corresponde a la etiqueta de autorización
Tag::DEVICE_UNIQUE_ATTESTATION
que usa un valor de ID de etiqueta de 720. -
attestationIdSecondImei
-
Solo está presente en versiones de certificación de claves >= 300.
Corresponde a la etiqueta de autorización
Tag::ATTESTATION_ID_SECOND_IMEI
que usa un valor de ID de etiqueta de 723.
Campos RootOfTrust
-
verifiedBootKey
- Es un hash seguro de la clave pública que se usa para verificar la integridad y la autenticidad de todo el código que se ejecuta durante el inicio del dispositivo como parte del inicio verificado. Se recomienda SHA-256.
-
deviceLocked
-
Indica si el bootloader del dispositivo está bloqueado.
true
significa que el dispositivo inició una imagen firmada que Verified Boot verificó correctamente. -
verifiedBootState
- El estado de inicio verificado del dispositivo.
-
verifiedBootHash
- Es un resumen de todos los datos protegidos por el inicio verificado. Para dispositivos que usan la implementación de referencia del inicio verificado de Android, este campo contiene el resumen de VBMeta.
Valores de VerifiedBootState
Valor | Estado de inicio correspondiente | Significado |
---|---|---|
Verified |
GREEN |
Una cadena completa de confianza se extiende desde una raíz de confianza protegida por hardware hasta el bootloader y todas las particiones verificadas por el inicio verificado.
En este estado, el campo verifiedBootKey contiene el hash de la raíz de confianza integrada, que es el certificado que el fabricante del dispositivo incorpora en la ROM del dispositivo en la fábrica. |
SelfSigned |
YELLOW |
Es igual que Verified , excepto que la verificación se realizó con una raíz de confianza que configuró el usuario en lugar de la raíz de confianza que incorporó el fabricante en la fábrica.
En este estado, el campo verifiedBootKey contiene el hash de la clave pública que configuró el usuario. |
Unverified |
ORANGE |
El bootloader del dispositivo está desbloqueado, por lo que no se puede establecer una cadena de confianza. El dispositivo se puede modificar libremente, por lo que el usuario debe verificar su integridad fuera de banda. En este estado, el campo verifiedBootKey contiene 32 bytes de ceros. |
Failed |
RED |
El dispositivo no superó la verificación. En este estado, no hay garantías sobre el contenido de los otros campos RootOfTrust . |
AttestationApplicationId
Este campo refleja la creencia de la plataforma de Android de que las apps pueden usar el material de clave secreta en la certificación. Puede contener varios paquetes solo si estos comparten el mismo UID. El campo AttestationApplicationId
en AuthorizationList
es de tipo OCTET_STRING
y tiene el formato según el siguiente 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
-
Es un conjunto de objetos
AttestationPackageInfo
, cada uno de los cuales proporciona un nombre de paquete y un número de versión. signature_digests
-
Un conjunto de resúmenes SHA-256 de los certificados de firma de la app. Una app puede tener varias cadenas de certificados de claves de firma. Para cada una, el certificado de "hoja" se resume y se coloca en el campo
signature_digests
. El nombre del campo es engañoso, ya que los datos resumidos son los certificados de firma de la app, no sus firmas, dado que recibe el nombre de la claseSignature
que muestra una llamada agetPackageInfo()
. El siguiente fragmento de código muestra un conjunto de ejemplo:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
ID único
El ID único es un valor de 128 bits que identifica el dispositivo, pero solo por un período limitado. El valor se calcula con lo siguiente:
HMAC_SHA256(T || C || R, HBK)
donde:
T
es el "valor del contador temporal", que se calcula dividiendo el valor deTag::CREATION_DATETIME
por 2592000000 y descartando cualquier resto.T
cambia cada 30 días (2592000000 = 30 × 24 × 60 × 60 × 1,000).C
es el valor deTag::APPLICATION_ID
.R
es 1 siTag::RESET_SINCE_ID_ROTATION
está presente en el parámetro attest_params de la llamada a attest_key, o 0 si la etiqueta no está presente.HBK
es un secreto único vinculado al hardware que el entorno de ejecución confiable conoce y que nunca revela. El secreto contiene al menos 128 bits de entropía y es único para cada dispositivo (se acepta la unicidad probabilística, dados los 128 bits de entropía). La HBK debe derivarse del material de clave fusionado a través de HMAC o AES_CMAC.
Tronca el resultado de HMAC_SHA256 a 128 bits.
Claves y certificados de certificación
Dos claves, una RSA y una ECDSA, y las cadenas de certificados correspondientes, se aprovisionan de forma segura en el dispositivo.
Android 12 presenta el aprovisionamiento de claves remoto, y Android 13 requiere que los dispositivos lo implementen. El aprovisionamiento de claves remoto proporciona a los dispositivos en el campo certificados de certificación ECDSA P256 por app. Estos certificados tienen una vida útil más corta que los certificados aprovisionados de fábrica.
Varios IMEI
En Android 14, se agrega compatibilidad para varios IMEI en el registro de la Certificación de claves de Android. Los OEMs pueden implementar esta función agregando una etiqueta KeyMint para un segundo IMEI. Cada vez es más frecuente que los dispositivos tengan varias radios, y los OEM ahora pueden admitir dispositivos con dos IMEI.
Los OEMs deben tener un IMEI secundario, si está presente en sus dispositivos, que se aprovisione a las implementaciones de KeyMint para que esas implementaciones puedan certificarlo de la misma manera que certifican el primer IMEI.
Extensión de información de aprovisionamiento
La extensión de información de aprovisionamiento tiene OID 1.3.6.1.4.1.11129.2.1.30
. La extensión proporciona información que el servidor de aprovisionamiento conoce sobre el dispositivo.
Esquema
La extensión sigue el siguiente esquema de CDDL:
{ 1 : int, ; certificates issued }
El mapa no tiene versiones y se pueden agregar nuevos campos opcionales.
-
certs_issued
-
Cantidad aproximada de certificados emitidos al dispositivo en los últimos 30 días. Este valor se puede usar como una señal de posible abuso si el valor es mayor que el promedio en algunos órdenes de magnitud.
Certificación de ID
Android 8.0 incluye compatibilidad opcional con la certificación de ID para dispositivos con Keymaster 3. La certificación de ID permite que el dispositivo proporcione una prueba de sus identificadores de hardware, como el número de serie o el IMEI. Si bien es una función opcional, se recomienda que todas las implementaciones de Keymaster 3 proporcionen compatibilidad con ella, ya que poder probar la identidad del dispositivo permite que casos de uso como la configuración remota sin contacto real sean más seguros (porque el extremo remoto puede estar seguro de que está hablando con el dispositivo correcto, no con un dispositivo que falsifica su identidad).
La certificación de ID funciona creando copias de los identificadores de hardware del dispositivo a los que solo puede acceder el entorno de ejecución confiable (TEE) antes de que el dispositivo salga de la fábrica. Un usuario puede desbloquear el bootloader del dispositivo y cambiar el software del sistema y los identificadores que informan los frameworks de Android. Las copias de los identificadores que contiene el TEE no se pueden manipular de esta manera, lo que garantiza que la certificación del ID del dispositivo solo certifique los identificadores de hardware originales del dispositivo, lo que frustra los intentos de falsificación.
La plataforma de API principal para la certificación de ID se basa en el mecanismo de certificación de claves existente que se introdujo con Keymaster 2. Cuando se solicita un certificado de certificación para una clave que tiene el administrador de claves, el llamador puede solicitar que los identificadores de hardware del dispositivo se incluyan en los metadatos del certificado de certificación. Si la clave se encuentra en el TEE, el certificado se vincula a una raíz de confianza conocida. El destinatario de un certificado de este tipo puede verificar que el TEE haya escrito el certificado y su contenido, incluidos los identificadores de hardware. Cuando se le solicita que incluya identificadores de hardware en el certificado de certificación, el TEE solo certifica los identificadores que se almacenan en su almacenamiento, tal como se propagan en la fábrica.
Propiedades de almacenamiento
El almacenamiento que contiene los identificadores del dispositivo debe tener las siguientes propiedades:
- Los valores derivados de los identificadores originales del dispositivo se copian en el almacenamiento antes de que el dispositivo salga de fábrica.
- El método
destroyAttestationIds()
puede destruir de forma permanente esta copia de los datos derivados del identificador. La destrucción permanente significa que los datos se quitan por completo, de modo que ni un restablecimiento de la configuración de fábrica ni ningún otro procedimiento realizado en el dispositivo puede restablecerlos. Esto es especialmente importante para los dispositivos en los que un usuario desbloqueó el bootloader, cambió el software del sistema y modificó los identificadores que devuelven los frameworks de Android. - Las instalaciones de ADP deben poder generar copias nuevas de los datos derivados del identificador de hardware. De esta manera, un dispositivo que pasa por la ADP puede volver a realizar la certificación de ID. El mecanismo que usan las instalaciones de ADP debe estar protegido para que los usuarios no puedan invocarlo por su cuenta, ya que eso les permitiría obtener certificaciones de IDs falsificados.
- Ningún código que no sea la app de confianza de Keymaster en el TEE puede leer los datos derivados del identificador que se guardan en el almacenamiento.
- El almacenamiento es inviolable: si se modifica el contenido del almacenamiento, el TEE lo trata de la misma manera que si se hubieran destruido las copias del contenido y rechaza todos los intentos de certificación de ID. Para ello, se firma o se aplica un MAC al almacenamiento como se describe a continuación.
- El almacenamiento no contiene los identificadores originales. Debido a que la certificación de ID implica un desafío, el llamador siempre proporciona los identificadores que se certificarán. El TEE solo necesita verificar que coincidan con los valores que tenían originalmente. Esta verificación se habilita cuando se almacenan hashes seguros de los valores originales en lugar de los valores.
Construcción
Para crear una implementación que tenga las propiedades mencionadas anteriormente, almacena los valores derivados del ID en la siguiente construcción S. No almacenes otras copias de los valores de ID, excepto los lugares normales del sistema, que el propietario de un dispositivo puede modificar mediante el acceso raíz:
S = D || HMAC(HBK, D)
donde:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
es la construcción de HMAC con un hash seguro apropiado (se recomienda SHA-256).HBK
es una clave vinculada al hardware que no se usa para ningún otro fin.ID1...IDn
son los valores de ID originales. La asociación de un valor en particular a un índice en particular depende de la implementación, ya que los diferentes dispositivos tienen diferentes cantidades de identificadores.||
representa la concatenación.
Debido a que los resultados de HMAC tienen un tamaño fijo, no se requieren encabezados ni ninguna otra estructura para poder encontrar hashes de ID individuales o el HMAC de D. Además de verificar los valores proporcionados para realizar la certificación, las implementaciones deben validar S extrayendo D de S, calculando HMAC(HBK, D) y comparándola con el valor en S para verificar que no se hayan modificado ni dañado los IDs individuales. Además, las implementaciones deben usar comparaciones de tiempo constante para todos los elementos de ID individuales y la validación de S. El tiempo de comparación debe ser constante, independientemente de la cantidad de IDs proporcionados y de la coincidencia correcta de cualquier parte de la prueba.
Identificadores de hardware
La certificación de ID admite los siguientes identificadores de hardware:
- Es el nombre de la marca, tal como lo muestra
Build.BRAND
en Android. - Nombre del dispositivo, como lo muestra
Build.DEVICE
en Android - Nombre del producto, tal como lo muestra
Build.PRODUCT
en Android - Es el nombre del fabricante, tal como lo muestra
Build.MANUFACTURER
en Android. - Nombre del modelo, como lo muestra
Build.MODEL
en Android - Número de serie
- IMEIs de todas las radios
- MEID de todas las radios
Para admitir la certificación de ID de dispositivo, un dispositivo certifica estos identificadores. Todos los dispositivos que ejecutan Android tienen los primeros seis, y son necesarios para que esta función funcione. Si el dispositivo tiene radios celulares integradas, también debe admitir la certificación de los IMEI o MEID de las radios.
Para solicitar la certificación de ID, se realiza una certificación de claves y se incluyen los identificadores del dispositivo para certificarlos en la solicitud. Los identificadores se etiquetan de la siguiente manera:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
El identificador que se certifica es una cadena de bytes codificada en UTF-8. Este formato también se aplica a los identificadores numéricos. Cada identificador que se certifica se expresa como una cadena codificada en UTF-8.
Si el dispositivo no admite la certificación de ID (o si se llamó a destroyAttestationIds()
anteriormente y el dispositivo ya no puede certificar sus IDs), cualquier solicitud de certificación de claves que incluya una o más de estas etiquetas fallará con ErrorCode::CANNOT_ATTEST_IDS
.
Si el dispositivo admite la certificación de ID y se incluyeron una o más de las etiquetas anteriores en una solicitud de certificación de claves, el TEE verifica que el identificador proporcionado con cada una de las etiquetas coincida con su copia de los identificadores de hardware. Si uno o más identificadores no coinciden, toda la certificación falla con ErrorCode::CANNOT_ATTEST_IDS
. Es válido que se proporcione la misma etiqueta varias veces. Esto puede ser útil, por ejemplo, cuando se certifican los IMEI: un dispositivo puede tener varias radios con varios IMEI. Una solicitud de certificación es válida si el valor proporcionado con cada ATTESTATION_ID_IMEI
coincide con una de las radios del dispositivo. Lo mismo se aplica a todas las demás etiquetas.
Si la certificación se realiza correctamente, los IDs certificados se agregan a la extensión de certificación (OID 1.3.6.1.4.1.11129.2.1.17) del certificado de certificación emitido con el esquema anterior. Los cambios del esquema de certificación de Keymaster 2 están en negrita, con comentarios.
API de Java
Esta sección es solo informativa. Los implementadores de Keymaster no implementan ni usan la API de Java. Esto se proporciona para ayudar a los implementadores a comprender cómo las apps usan la función. Los componentes del sistema pueden usarlo de manera diferente, por lo que es fundamental que esta sección no se trate como normativa.