Atestación de clave e identificación

Keystore proporciona un lugar más seguro para crear, almacenar y utilizar claves criptográficas de forma controlada. Cuando el almacenamiento de claves respaldado por hardware está disponible y se utiliza, el material de claves es más seguro contra la extracción del dispositivo y Keymaster impone restricciones que son difíciles de subvertir.

Sin embargo, esto sólo es cierto si se sabe que las claves del almacén de claves están en un almacenamiento respaldado por hardware. En Keymaster 1, no había forma de que las aplicaciones o los servidores remotos verificaran de manera confiable si este era el caso. El demonio del almacén de claves cargó el HAL maestro de claves disponible y creyó todo lo que decía el HAL con respecto al respaldo de hardware de las claves.

Para remediar esto, Keymaster introdujola atestación de clave en Android 7.0 (Keymaster 2) y la atestación de ID en Android 8.0 (Keymaster 3).

La atestación de claves tiene como objetivo proporcionar una manera de determinar con precisión si un par de claves asimétricas está respaldado por hardware, cuáles son las propiedades de la clave y qué restricciones se aplican a su uso.

La certificación de identificación permite que el dispositivo proporcione pruebas de sus identificadores de hardware, como el número de serie o IMEI.

atestación clave

Para admitir la atestación de claves, Android 7.1 introdujo un conjunto de etiquetas, tipos y métodos en HAL.

Etiquetas

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

Tipo

Keymaster 2 y inferiores

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

Método AttestKey

Maestro de llaves 3

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

Keymaster 2 y inferiores

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 keymaster.
  • keyToAttest es el blob de claves devuelto por generateKey para el cual se creará la atestación.
  • attestParams es una lista de los parámetros necesarios para la certificación. Esto incluye Tag::ATTESTATION_CHALLENGE y posiblemente Tag::RESET_SINCE_ID_ROTATION , así como Tag::APPLICATION_ID y Tag::APPLICATION_DATA . Los dos últimos son necesarios para descifrar el blob de claves si se especificaron durante la generación de claves.
  • certChain es el parámetro de salida, que devuelve una serie de certificados. La entrada 0 es el certificado de atestación, lo que significa que certifica la clave de keyToAttest y contiene la extensión de atestación.

El método attestKey se considera una operación de clave pública en la clave certificada, porque se puede llamar en cualquier momento y no necesita cumplir restricciones de autorización. Por ejemplo, si la clave certificada necesita autenticación de usuario para su uso, se puede generar una certificación sin autenticación de usuario.

Certificado de atestación

El certificado de atestación es un certificado X.509 estándar, con una extensión de atestación opcional que contiene una descripción de la clave atestada. El certificado está firmado con una clave de atestación certificada. La clave de certificación puede utilizar un algoritmo diferente al de la clave que se está certificando.

El certificado de atestación contiene los campos de la siguiente tabla y no puede contener ningún campo adicional. Algunos campos especifican un valor de campo fijo. Las pruebas CTS validan que el contenido del certificado sea exactamente como se define.

Certificado SECUENCIA

Nombre del campo (ver RFC 5280 ) Valor
tbsCertificado TBSCertificado SECUENCIA
firmaAlgoritmo AlgoritmoIdentificador del algoritmo utilizado para firmar la clave:
ECDSA para claves EC, RSA para claves RSA.
valor de firma BIT STRING, firma calculada en tbsCertificate codificado en ASN.1 DER.

TBSCertificado SECUENCIA

Nombre del campo (ver RFC 5280 ) Valor
version INTEGER 2 (significa certificado v3)
serialNumber INTEGER 1 (valor fijo: igual en todos los certificados)
signature AlgoritmoIdentificador del algoritmo utilizado para firmar la clave: ECDSA para claves EC, RSA para claves RSA.
issuer Igual que el campo de asunto de la clave de certificación de lote.
validity SECUENCIA de dos fechas, que contiene los valores de Tag::ACTIVE_DATETIME y Tag::USAGE_EXPIRE_DATETIME . Esos valores están en milisegundos desde el 1 de enero de 1970. Consulte RFC 5280 para conocer las representaciones de fechas correctas en los certificados.
Si Tag::ACTIVE_DATETIME no está presente, utilice el valor de Tag::CREATION_DATETIME . Si Tag::USAGE_EXPIRE_DATETIME no está presente, utilice la fecha de vencimiento del certificado de clave de atestación por lotes.
subject CN = "Clave del almacén de claves de Android" (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 un propósito KeyPurpose::SIGN o KeyPurpose::VERIFY . Todos los demás bits desactivados.
extensions/CRL Distribution Points Valor por determinar
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 atestación a continuación. Como ocurre con todas las extensiones de certificado X.509, el contenido se representa como OCTET_STRING que contiene una codificación DER de la SECUENCIA de atestación.

Extensión de atestación

La extensión attestation contiene una descripción completa de las autorizaciones de Keymaster asociadas con la clave, en una estructura que corresponde directamente a las listas de autorización utilizadas en Android y Keymaster HAL. Cada etiqueta en una lista de autorización está representada por una entrada SEQUENCE ASN.1, etiquetada explícitamente con el número de etiqueta maestra de clave, pero con el descriptor de tipo (cuatro bits de orden superior) enmascarado.

Por ejemplo, en Keymaster 3, Tag::PURPOSE se define en tipos.hal como ENUM_REP | 1 . Para la extensión de atestación, el valor ENUM_REP se elimina, dejando la etiqueta 1 . (Para Keymaster 2 y versiones anteriores, KM_TAG_PURPOSE se define en keymaster_defs.h.)

Los valores se traducen de forma sencilla a tipos ASN.1, según esta tabla:

Tipo de maestro de llaves tipo ASN.1
ENUM ENTERO
ENUM_REP CONJUNTO DE ENTEROS
UINT ENTERO
UINT_REP CONJUNTO DE ENTEROS
ULONG ENTERO
ULONG_REP CONJUNTO DE ENTEROS
DATE ENTERO (milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT)
BOOL NULL (en keymaster, la etiqueta presente significa verdadera, ausente significa falsa.
La misma semántica se aplica a la codificación ASN.1)
BIGNUM No se utiliza actualmente, por lo que no se define ningún mapeo
BYTES OCTET_STRING

Esquema

El contenido de la extensión de certificación se describe en el siguiente esquema ASN.1.

KeyDescription ::= SEQUENCE {
  attestationVersion         INTEGER, # KM2 value is 1. KM3 value is 2. KM4 value is 3.
  attestationSecurityLevel   SecurityLevel,
  keymasterVersion           INTEGER,
  keymasterSecurityLevel     SecurityLevel,
  attestationChallenge       OCTET_STRING,
  uniqueId                   OCTET_STRING,
  softwareEnforced           AuthorizationList,
  teeEnforced                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, # KM4
  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, # KM4
  trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, # KM4
  unlockedDeviceRequired      [509] EXPLICIT NULL OPTIONAL, # KM4
  allApplications             [600] EXPLICIT NULL OPTIONAL,
  applicationId               [601] EXPLICIT OCTET_STRING OPTIONAL,
  creationDateTime            [701] EXPLICIT INTEGER OPTIONAL,
  origin                      [702] EXPLICIT INTEGER OPTIONAL,
  rollbackResistant           [703] EXPLICIT NULL OPTIONAL, # KM2 and KM3 only.
  rootOfTrust                 [704] EXPLICIT RootOfTrust OPTIONAL,
  osVersion                   [705] EXPLICIT INTEGER OPTIONAL,
  osPatchLevel                [706] EXPLICIT INTEGER OPTIONAL,
  attestationApplicationId    [709] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdBrand          [710] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdDevice         [711] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdProduct        [712] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdSerial         [713] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdImei           [714] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdMeid           [715] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdManufacturer   [716] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdModel          [717] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  vendorPatchLevel            [718] EXPLICIT INTEGER OPTIONAL, # KM4
  bootPatchLevel              [719] EXPLICIT INTEGER OPTIONAL, # KM4
}

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

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

Campos de descripción clave

Los campos keymasterVersion y attestationChallenge se identifican posicionalmente, en lugar de por etiqueta, por lo que las etiquetas en el formulario codificado solo especifican el tipo de campo. Los campos restantes están etiquetados implícitamente como se especifica en el esquema.

Nombre del campo Tipo Valor
attestationVersion ENTERO Versión del esquema de atestación: 1, 2 o 3.
attestationSecurity Nivel de seguridad El nivel de seguridad de esta certificación. Es posible obtener certificaciones de software de claves respaldadas por hardware. No se puede confiar en dichas certificaciones si el sistema Android está comprometido.
keymasterVersion ENTERO Versión del dispositivo keymaster: 0, 1, 2, 3 o 4.
keymasterSecurity Nivel de seguridad El nivel de seguridad de la implementación del keymaster.
attestationChallenge OCTET_STRING Valor de Tag::ATTESTATION_CHALLENGE , especificado en la solicitud de atestación.
uniqueId OCTET_STRING ID único opcional, presente si la clave tiene Tag::INCLUDE_UNIQUE_ID
softwareEnforced Lista de autorizaciones Autorizaciones opcionales de maestro de llaves que no son aplicadas por el TEE, si las hubiera.
teeEnforced Lista de autorizaciones Opcional, autorizaciones de Keymaster que aplica el TEE, si las hubiera.

Campos de la lista de autorización

Los campos AuthorizationList son todos opcionales y se identifican mediante el valor de la etiqueta Keymaster, con los bits de tipo enmascarados. Se utiliza etiquetado explícito para que los campos también contengan una etiqueta que indique su tipo ASN.1, para facilitar el análisis.

Para obtener detalles sobre los valores de cada campo, consulte types.hal para Keymaster 3 y keymaster_defs.h para Keymaster 2 y siguientes. Los nombres de las etiquetas Keymaster se transformaron en nombres de campos omitiendo el prefijo KM_TAG y cambiando el resto a mayúsculas y minúsculas, por lo que Tag::KEY_SIZE se convirtió en keySize .

Campos RootOfTrust

Los campos RootOfTrust se identifican posicionalmente.

Nombre del campo Tipo Valor
verifiedBootKey OCTET_STRING Un hash seguro de la clave utilizada para verificar la imagen del sistema. Se recomienda SHA-256.
deviceLocked BOOLEANO Verdadero si el gestor de arranque está bloqueado, lo que significa que solo se pueden actualizar las imágenes firmadas y que se realiza una verificación de arranque verificada.
verifiedBootState Estado de arranque verificado Estado de arranque verificado.
verifiedBootHash OCTET_STRING Un resumen de todos los datos protegidos por Verified Boot. Para los dispositivos que utilizan la implementación de Verified Boot de Android Verified Boot, este valor contiene el resumen de la estructura VBMeta o la estructura de metadatos de Verified Boot. Para obtener más información sobre cómo calcular este valor, consulte The VBMeta Digest

Valores de VerifiedBootState

Los valores de verifiedBootState tienen los siguientes significados:

Valor Significado
Verified Indica una cadena de confianza completa que se extiende desde el cargador de arranque hasta las particiones verificadas, incluido el cargador de arranque, la partición de arranque y todas las particiones verificadas.
En este estado, el valor verifiedBootKey es el hash del certificado integrado, es decir, el certificado no modificable grabado en la ROM.
Este estado corresponde con el estado de inicio verde como se documenta en la documentación del flujo de inicio verificado .
SelfSigned Indica que la partición de inicio se ha verificado mediante el certificado integrado y que la firma es válida. El gestor de arranque muestra una advertencia y la huella digital de la clave pública antes de permitir que continúe el proceso de arranque.
En este estado, el valor verifiedBootKey es el hash del certificado autofirmado.
Este estado corresponde con el estado de inicio amarillo como se documenta en la documentación del flujo de inicio verificado .
Unverified Indica que un dispositivo puede modificarse libremente. La integridad del dispositivo se deja en manos del usuario para verificarla fuera de banda. El gestor de arranque muestra una advertencia al usuario antes de permitir que continúe el proceso de arranque.
En este estado, el valor verifiedBootKey está vacío.
Este estado corresponde con el estado de inicio naranja como se documenta en la documentación del flujo de inicio verificado .
Failed Indica que el dispositivo no superó la verificación. En realidad, ningún certificado de atestación contiene este valor, porque en este estado el gestor de arranque se detiene. Se incluye aquí para que esté completo.
Este estado corresponde con el estado de inicio rojo como se documenta en la documentación del flujo de inicio verificado .

Valores de nivel de seguridad

Los valores de securityLevel tienen los siguientes significados:

Valor Significado
Software El código que crea o administra el elemento relevante (certificación o clave) se implementa en el sistema Android y podría modificarse si ese sistema se ve comprometido.
TrustedEnvironment El código que crea o gestiona el elemento relevante (certificación o clave) se implementa en un entorno de ejecución confiable (TEE). Podría modificarse si el TEE se ve comprometido, pero el TEE es altamente resistente al compromiso remoto y moderadamente resistente al compromiso por ataque directo al hardware.
StrongBox El código que crea o gestiona el elemento relevante (certificación o clave) se implementa en un módulo de seguridad de hardware dedicado. Podría modificarse si el módulo de seguridad del hardware se ve comprometido, pero es altamente resistente al compromiso remoto y altamente resistente al compromiso por ataque directo al hardware.

Identificación única

El ID único es un valor de 128 bits que identifica el dispositivo, pero sólo por un período de tiempo limitado. El valor se calcula con:

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

Dónde:

  • T es el "valor del contador temporal", calculado dividiendo el valor de Tag::CREATION_DATETIME por 2592000000, eliminando el resto. T cambia cada 30 días (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C es el valor de Tag::APPLICATION_ID
  • R es 1 si Tag::RESET_SINCE_ID_ROTATION está presente en el parámetro attest_params de la llamada attest_key, o 0 si la etiqueta no está presente.
  • HBK es un secreto único vinculado al hardware conocido por el entorno de ejecución confiable y que nunca revela. El secreto contiene al menos 128 bits de entropía y es exclusivo de cada dispositivo individual (la unicidad probabilística es aceptable dados los 128 bits de entropía). HBK debe derivarse de material de clave fusionada mediante HMAC o AES_CMAC.

Trunca la salida HMAC_SHA256 a 128 bits.

Claves de atestación y certificados

Se proporcionan de forma segura en el dispositivo dos claves, una RSA y una ECDSA, y las cadenas de certificados correspondientes.

Android 12 introduce el aprovisionamiento remoto de claves y Android 13 requiere que los dispositivos lo implementen. Remote Key Provisioning proporciona a los dispositivos en el campo certificados de atestación ECDSA P256 por aplicación. Estos certificados tienen una vida más corta que los certificados proporcionados por la fábrica.

Múltiples IMEI

Android 14 agrega soporte para múltiples IMEI en el registro de atestación de clave de Android. Los OEM pueden implementar esta función agregando una etiqueta KeyMint para un segundo IMEI. Cada vez es más común que los dispositivos tengan múltiples radios celulares y los OEM ahora pueden admitir dispositivos con dos IMEI.

Los OEM deben tener un IMEI secundario, si está presente en sus dispositivos, para ser aprovisionado en las implementaciones de KeyMint para que esas implementaciones puedan dar fe de él de la misma manera que dan fe del primer IMEI.

atestación de identidad

Android 8.0 incluye soporte opcional para la certificación de identificación para dispositivos con Keymaster 3. La certificación de identificación permite que el dispositivo proporcione pruebas de sus identificadores de hardware, como el número de serie o IMEI. Aunque es una característica opcional, se recomienda encarecidamente que todas las implementaciones de Keymaster 3 brinden soporte para ella porque poder probar la identidad del dispositivo permite que casos de uso como la verdadera configuración remota sin intervención sean más seguros (porque el lado remoto puede estar seguro de que está hablando con el dispositivo correcto, no con un dispositivo que suplanta su identidad).

La certificación de identificación funciona mediante la creación de copias de los identificadores de hardware del dispositivo a las que solo el entorno de ejecución confiable (TEE) puede acceder antes de que el dispositivo salga de fábrica. Un usuario puede desbloquear el gestor de arranque del dispositivo y cambiar el software del sistema y los identificadores informados por los marcos de Android. Las copias de los identificadores en poder del TEE no se pueden manipular de esta manera, lo que garantiza que la certificación de ID del dispositivo solo dará fe de los identificadores de hardware originales del dispositivo, frustrando así los intentos de suplantación de identidad.

La superficie API principal para la atestación de ID se basa en el mecanismo de atestación de claves existente introducido con Keymaster 2. Al solicitar un certificado de atestación para una clave en poder de Keymaster, la persona que llama puede solicitar que los identificadores de hardware del dispositivo se incluyan en los metadatos del certificado de atestación. Si la clave se encuentra en el TEE, el certificado se encadenará a una raíz de confianza conocida. El destinatario de dicho certificado puede verificar que el certificado y su contenido, incluidos los identificadores de hardware, fueron escritos por el TEE. Cuando se le solicita que incluya identificadores de hardware en el certificado de certificación, el TEE certifica solo los identificadores que se encuentran en su almacenamiento, tal como se encuentran en la fábrica.

Propiedades de almacenamiento

El almacenamiento que contiene los identificadores del dispositivo debe tener estas 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 permanentemente esta copia de los datos derivados del identificador. La destrucción permanente significa que los datos se eliminan por completo, por lo que ni un restablecimiento de fábrica ni ningún otro procedimiento realizado en el dispositivo pueden restaurarlos. Esto es especialmente importante para dispositivos en los que un usuario desbloqueó el gestor de arranque, cambió el software del sistema y modificó los identificadores devueltos por los marcos de Android.
  • Las instalaciones de RMA deben tener la capacidad de generar copias nuevas de los datos derivados del identificador de hardware. De esta manera, un dispositivo que pasa por RMA puede volver a realizar la certificación de identidad. El mecanismo utilizado por las instalaciones de RMA debe protegerse para que los usuarios no puedan invocarlo ellos mismos, ya que eso les permitiría obtener certificaciones de identificaciones falsificadas.
  • Ningún otro código que no sea la aplicación confiable de Keymaster en el TEE puede leer los datos derivados del identificador guardados en el almacenamiento.
  • El almacenamiento es a prueba de manipulaciones: si el contenido del almacenamiento ha sido modificado, el TEE lo trata igual que si las copias del contenido hubieran sido destruidas y rechaza todos los intentos de certificación de identidad. Esto se implementa firmando o asignando MAC al almacenamiento como se describe a continuación .
  • El almacenamiento no contiene los identificadores originales. Dado que la certificación de identidad implica un desafío, la persona que llama siempre proporciona los identificadores que se deben certificar. El TEE sólo necesita verificar que estos coincidan con los valores que tenían originalmente. Almacenar hashes seguros de los valores originales en lugar de los valores permite esta verificación.

Construcción

Para crear una implementación que tenga las propiedades enumeradas anteriormente, almacene los valores derivados de ID en la siguiente construcción S. No almacene otras copias de los valores de ID, excepto los lugares normales en el sistema, que el propietario de un dispositivo puede modificar mediante rooteo:

S = D || HMAC(HBK, D)

dónde:

  • D = HMAC(HBK, ID 1 ) || HMAC(HBK, ID 2 ) || ... || HMAC(HBK, ID n )
  • HMAC es la construcción HMAC con un hash seguro apropiado (se recomienda SHA-256)
  • HBK es una clave vinculada al hardware que no se utiliza para ningún otro propósito.
  • ID 1 ...ID n son los valores de ID originales; La asociación de un valor particular a un índice particular depende de la implementación, ya que diferentes dispositivos tendrán diferentes números de identificadores.
  • || representa concatenación

Debido a que las salidas 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ándolo con el valor en S para verificar que no se modificaron/corrompieron ID individuales. Además, las implementaciones deben utilizar 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 ID proporcionadas y de la coincidencia correcta de cualquier parte de la prueba.

Identificadores de hardware

La atestación de ID admite los siguientes identificadores de hardware:

  1. Nombre de la marca, según lo devuelto por Build.BRAND en Android
  2. Nombre del dispositivo, según lo devuelto por Build.DEVICE en Android
  3. Nombre del producto, según lo devuelto por Build.PRODUCT en Android
  4. Nombre del fabricante, según lo devuelto por Build.MANUFACTURER en Android
  5. Nombre del modelo, según lo devuelto por Build.MODEL en Android
  6. Número de serie
  7. IMEI de todas las radios
  8. MEID de todas las radios

Para admitir la certificación de ID de dispositivo, un dispositivo certifica estos identificadores. Todos los dispositivos con Android tienen los primeros seis y son necesarios para que esta función funcione. Si el dispositivo tiene radios celulares integradas, el dispositivo también debe admitir la certificación de los IMEI y/o MEID de las radios.

La certificación de identificación se solicita realizando una certificación de clave e incluyendo los identificadores del dispositivo para certificar en la solicitud. Los identificadores están etiquetados 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

El identificador a dar fe es una cadena de bytes codificada en UTF-8. Este formato también se aplica a los identificadores numéricos. Cada identificador a certificar se expresa como una cadena codificada en UTF-8.

Si el dispositivo no admite la certificación de ID (o anteriormente se llamó a destroyAttestationIds() y el dispositivo ya no puede certificar sus ID), cualquier solicitud de certificación de clave que incluya una o más de estas etiquetas falla con ErrorCode::CANNOT_ATTEST_IDS .

Si el dispositivo admite la certificación de identificación y una o más de las etiquetas anteriores se han incluido en una solicitud de certificación de clave, el TEE verifica que el identificador suministrado 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 la misma etiqueta se proporcione varias veces. Esto puede resultar útil, por ejemplo, al comprobar 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 atestación se realiza correctamente, los ID atestiguados se agregan a la extensión de atestación (OID 1.3.6.1.4.1.11129.2.1.17) del certificado de atestación emitido, utilizando el esquema anterior . Los cambios del esquema de certificación de Keymaster 2 están en negrita y con comentarios.

API de Java

Esta sección es sólo informativa. Los implementadores de Keymaster no implementan ni utilizan la API de Java. Esto se proporciona para ayudar a los implementadores a comprender cómo las aplicaciones utilizan la característica. Los componentes del sistema pueden usarlo de manera diferente, por lo que es fundamental que esta sección no se trate como normativa.