El almacén de claves brinda un lugar más seguro para crear, almacenar y usar de forma controlada. Cuando haya almacenamiento de claves con copia de seguridad en hardware cuando se usa, el material de claves es más seguro contra la extracción del dispositivo Keymaster aplica restricciones difíciles de subvertir.
Esto solo sucede, sin embargo, si se sabe que las claves del almacén de claves están en respaldado por hardware. En Keymaster 1, no había forma de que las apps o servidores remotos para verificar de forma confiable si este fue el caso. Daemon del almacén de claves cargó la HAL de keymaster disponible y creyó que lo que decía la HAL con con respecto a la copia de seguridad del hardware de las claves.
Para solucionar este problema, Keymaster introdujo la certificación de claves en Android 7.0 (Keymaster 2) y el ID. en Android 8.0 (Keymaster 3).
El objetivo de la certificación de claves es proporcionar una forma determinar 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 ID permite que el dispositivo proporcione pruebas de sus identificadores de hardware, como el número de serie o IMEI.
Certificación de claves
Para admitir la atestación de claves, Android 7.0 introdujo un conjunto de etiquetas, tipo y al 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 claves que se muestra desdegenerateKey
para la que se creará la certificación.attestParams
es una lista de cualquier parámetro necesario para certificación. Esto incluyeTag::ATTESTATION_CHALLENGE
y posiblementeTag::RESET_SINCE_ID_ROTATION
, así comoTag::APPLICATION_ID
yTag::APPLICATION_DATA
. El los dos últimos son necesarios para desencriptar el BLOB de la clave si se especificaron durante la generación de la clave.certChain
es el parámetro del resultado, que muestra un array de certificados. La entrada 0 es la certificación, lo que significa que certifica la clave dekeyToAttest
y contiene el de certificación de Google Cloud.
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 necesita cumplir con
restricciones de autorización. Por ejemplo, si la clave certificada necesita que el usuario
autenticación para su uso, se puede generar una certificación sin
autenticación.
Certificado de certificación
La certificación es un certificado estándar X.509, con un de certificación que contiene una descripción de la clave certificada. El El certificado se firma con una clave de certificación certificada. La clave de certificación es posible que use un algoritmo diferente al de la clave que se está certificando.
La certificación contiene los campos de la siguiente tabla y no puede que contengan campos adicionales. Algunos campos especifican un valor de campo fijo. CTS las pruebas validan que el contenido del certificado sea exactamente como se definió.
Certificado SEQUENCE
Nombre del campo (consulta RFC 5280) | Valor |
---|---|
Certificado de proceso de certificación | SEQUENCE de TBSCertificate |
signatureAlgorithm | Algoritmo del algoritmo que se usa para firmar la clave: ECDSA para claves de EC, RSA para claves RSA. |
signatureValue | CADENA BIT, firma calculada en tbsCertificate con codificación DER ASN.1. |
TBSCertificate SEQUENCE
Nombre del campo (consulta RFC 5280) | Valor |
---|---|
version |
INTEGER 2 (significa certificado v3) |
serialNumber |
INTEGER 1 (valor fijo: el mismo en todos los certificados) |
signature |
Algoritmo del algoritmo que se usa para firmar la clave: ECDSA para claves de 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
Etiqueta: USAGE_EXPIRE_DATETIME.
Esos valores están en milisegundos desde el 1 de enero de 1970.
Consulta RFC 5280 para ver
representaciones de fechas 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 el vencimiento
la fecha del certificado de clave de certificación de lote. |
subject |
CN = "Clave del almacén de claves de Android" (valor fijo: el mismo en todos los certificados) |
subjectPublicKeyInfo |
SubjectPublicKeyInfo, que contiene una clave pública certificada. |
extensions/Key Usage |
Firma digital: Se establece si la clave tiene el propósito KeyPurpose::SIGN o
KeyPurpose::VERIFY No se establecen todos los demás bits. |
extensions/CRL Distribution Points |
Valor por definir |
extensions/"attestation" |
El OID es 1.3.6.1.4.1.11129.2.1.17. el contenido se define en el Extensión de la certificación que se encuentra a continuación. Como con todos X.509, el contenido se representa como una cadena OCTET_STRING. que contenga una codificación DER de la certificación SEQUENCE. |
Extensión de certificación
La extensión attestation
contiene una descripción completa del keymaster.
autorizaciones asociadas con la clave, en una estructura que se corresponde
a las listas de autorización, tal como se usan en Android y en la HAL de keymaster. Cada etiqueta en
una lista de autorizaciones se representa con un ASN.1 SEQUENCE
.
de forma explícita
con el número de etiqueta de keymaster, pero con el descriptor de tipo (cuatro valores
de bits de orden) enmascarados.
Por ejemplo, en Keymaster 3, Tag::PURPOSE
se define en
types.hal como ENUM_REP | 1
Para la extensión de certificación,
Se quita el valor ENUM_REP
y se deja la etiqueta 1
.
(Para Keymaster 2 y las versiones anteriores, KM_TAG_PURPOSE
se define en
keymaster_defs.h).
Los valores se traducen de una manera directa a tipos ASN.1, según esta tabla:
Tipo de Keymaster | Tipo de ASN.1 |
---|---|
ENUM |
INTEGER |
ENUM_REP |
SET de INTEGER |
UINT |
INTEGER |
UINT_REP |
SET de INTEGER |
ULONG |
INTEGER |
ULONG_REP |
SET de INTEGER |
DATE |
INTEGER (milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT) |
BOOL |
NULL (en keymaster, etiqueta presente significa verdadero; ausente significa falso). Se aplica la misma semántica a la codificación ASN.1). |
BIGNUM |
No se usa actualmente, por lo que no se define ninguna asignación |
BYTES |
OCTET_STRING |
Esquema
El contenido de la extensión de la certificación se describe en el siguiente esquema de 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, 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 KeyDescription
keymasterVersion
y attestationChallenge
los campos correspondientes
posicionalmente, en lugar de hacerlo por etiqueta, por lo que las etiquetas en la forma codificada solo especifican
. Los campos restantes se etiquetan de forma implícita como se especifica en el
.
Nombre del campo | Tipo | Valor |
---|---|---|
attestationVersion |
INTEGER | Versión del esquema de certificación: 1, 2 o 3. |
attestationSecurity |
SecurityLevel | El nivel de seguridad de esta certificación. Es posible obtener software de claves guardadas en hardware. Dichas certificaciones no son confiables si la El sistema Android está comprometido. |
keymasterVersion |
INTEGER | Versión del dispositivo keymaster: 0, 1, 2, 3 o 4. |
keymasterSecurity |
SecurityLevel | El nivel de seguridad de la implementación de la instancia principal de claves. |
attestationChallenge |
OCTET_STRING | Valor de Tag::ATTESTATION_CHALLENGE , especificado para la solicitud de certificación. |
uniqueId |
OCTET_STRING | ID único opcional, presente si la clave tiene
Tag::INCLUDE_UNIQUE_ID |
softwareEnforced |
AuthorizationList | Autorizaciones de keymaster opcionales que el TEE no aplica, si cualquiera. |
teeEnforced |
AuthorizationList | Autorizaciones de Keymaster que aplica el TEE (opcional), si corresponde. |
Campos de AuthorizationList
AuthorizationList
campos son opcionales y están identificados
por el valor de la etiqueta keymaster, con los bits de tipo enmascarados.
Se usa etiquetado explícito para que los campos también contengan una etiqueta que indique
su tipo ASN.1 para un análisis más fácil.
Si deseas obtener detalles sobre los valores de cada campo, consulta types.hal
para Keymaster 3 y
keymaster_defs.h
para Keymaster 2 y versiones anteriores. Nombres de etiquetas de Keymaster
se transformaron en nombres de campo omitiendo KM_TAG
.
el prefijo y cambiar
resto a mayúsculas mediales, de manera que Tag::KEY_SIZE
se convirtió
keySize
Campos RootOfTrust
Los campos RootOfTrust
se identifican posicionalmente.
Nombre del campo | Tipo | Valor |
---|---|---|
verifiedBootKey |
OCTET_STRING | Un hash seguro de la clave que se usa para verificar la imagen del sistema. SHA‐256 se recomienda. |
deviceLocked |
BOOLEAN | Es verdadero si el bootloader está bloqueado, lo que significa que solo las imágenes firmadas pueden se escribirá en la memoria flash y se realizará la comprobación de inicio verificada. |
verifiedBootState |
VerifiedBootState | Estado del inicio verificado. |
verifiedBootHash |
OCTET_STRING | Es un resumen de todos los datos protegidos por el inicio verificado. Para dispositivos que usan la implementación del inicio verificado de Android, este valor Contiene el resumen de VBMeta struct o el Inicio verificado. de la estructura de metadatos. Para obtener más información sobre cómo calcular este valor, consulta Resumen de VBMeta |
Valores VerifiedBootState
Los valores de verifiedBootState
tienen los siguientes significados:
Valor | Significado |
---|---|
Verified |
Indica una cadena completa de confianza que se extiende desde el bootloader hasta la verificación.
particiones, incluidos el bootloader, la partición de inicio y todas
y particiones. En este estado, el valor verifiedBootKey es el hash del elemento
certificado, es decir, el certificado inalterable grabado en ROM.Este estado se corresponde con el estado de inicio verde, como se documenta en la en la documentación del flujo de inicio verificado. |
SelfSigned |
Indica que la partición de inicio se verificó con el SDK incorporado
certificado y la firma sea válida. El bootloader muestra una advertencia y
la huella digital de la clave pública antes de permitir que continúe el proceso de inicio.
En este estado, el valor verifiedBootKey es el hash de la regla de
certificado.Este estado se corresponde con el estado de inicio amarillo, como se documenta en el en la documentación del flujo de inicio verificado. |
Unverified |
Indica que un dispositivo puede modificarse libremente. Se deja la integridad del dispositivo
que el usuario realice la verificación fuera de banda. El bootloader muestra una advertencia al usuario
antes de permitir que continúe el proceso de inicio. En este estado, el valor verifiedBootKey está vacío.Este estado se corresponde con el estado de inicio naranja, como se documenta en la en la documentación del flujo de inicio verificado. |
Failed |
Indica que el dispositivo no superó la verificación. Sin certificación
contiene este valor porque, en este estado, se detiene el bootloader. Es
se incluyen aquí para mayor integridad. Este estado se corresponde con el estado de inicio rojo, como se documenta en la en la documentación del flujo de inicio verificado. |
Valores SecurityLevel
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 el sistema vulnerar con facilidad. |
TrustedEnvironment |
El código que crea o administra el elemento relevante (certificación o clave) se implementa en un entorno de ejecución confiable (TEE). Podría ser alterado si el TEE se ve comprometido, pero este es muy resistente al y son moderadamente resistentes a los ataques mediante ataques directos de hardware. |
StrongBox |
El código que crea o administra el elemento relevante (certificación o clave) se implementa en un módulo de seguridad de hardware dedicado. Podría ser modificar si el módulo de seguridad de hardware está comprometido, resistente a los peligros remotos y altamente resistentes a los peligros ataque de hardware. |
ID único
El ID único es un valor de 128 bits que identifica al dispositivo, pero solo para período limitado. El valor se calcula de la siguiente manera:
HMAC_SHA256(T || C || R, HBK)
donde:
T
es el "valor de contador temporal", que se calcula dividiendo el valor valor deTag::CREATION_DATETIME
por 25,200,000, lo que reduce cualquiera 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
es presente en el parámetro attest_params a la llamada attest_key, o 0 si la la etiqueta no está presente.HBK
es un secreto único vinculado al hardware que conoce el Trusted de ejecución y nunca es revelado por este. El secreto contiene al menos tiene 128 bits de entropía y es única para cada dispositivo (probabilístico la exclusividad es aceptable dada la entropía de 128 bits). La HBK debe ser derivadas del material de claves fusionadas a través de HMAC o AES_CMAC.
Truncar la salida de HMAC_SHA256 a 128 bits
Las claves de certificación y certificados
Hay dos claves, una RSA, una ECDSA y las cadenas de certificados correspondientes, aprovisionados de forma segura en el dispositivo.
Android 12 presenta el aprovisionamiento de claves remotas, y Android 13 requiere dispositivos implementarlo. Remote Key Provisioning proporciona a los dispositivos en el campo y certificación ECDSA P256 por aplicación. Estos certificados son de corta duración que los certificados de fábrica.
Varios IMEI
En Android 14, se agrega compatibilidad con varios IMEI en el Registro de 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 común 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, para poder aprovisionar a las implementaciones de KeyMint para que esas implementaciones puedan lo certifican de la misma manera que lo hacen en el primer IMEI
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 pruebas de su hardware identificadores, como el número de serie o IMEI. Si bien es una función opcional, se se recomienda que todas las implementaciones de Keymaster 3 lo admitan ya que poder demostrar la identidad del dispositivo habilita casos de uso como configuración remota de inscripción automática para que sea más segura (porque el lado remoto puede asegúrate de que se comunique con el dispositivo correcto y no de que falsifique su identidad. identidad).
La certificación de ID crea copias de los identificadores de hardware del dispositivo al que solo puede acceder el entorno de ejecución confiable (TEE) antes que el dispositivo sale de la fábrica. Un usuario puede desbloquear el bootloader del dispositivo y cambiar el el software del sistema y los identificadores informados por los frameworks de Android. El no se pueden manipular de esta manera las copias de los identificadores que conserva el TEE lo que garantiza que la certificación del ID del dispositivo solo certifique identificadores de hardware originales y así frustrar los intentos de falsificación de identidad.
La plataforma principal de la API para la certificación de ID se compila sobre la clave existente. el mecanismo de certificación introducido con Keymaster 2. Al solicitar un para una clave mantenida por el keymaster, el llamador puede solicitar que los identificadores de hardware del dispositivo se incluyan en la certificación en los metadatos del certificado. Si la clave se conserva en el TEE, el certificado a una raíz de confianza conocida. El destinatario de un certificado de este tipo puede que el certificado y su contenido, incluido el hardware identificadores, los escribió el TEE. Cuando se te solicite que incluyas hardware identificadores en la certificación, el TEE certifica únicamente el identificadores conservados en su almacenamiento, tal como se propagan en la planta.
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 permanentemente esta copia de los datos derivados del identificador. Destrucción permanente se refiere los datos se eliminan por completo, por lo que ni un restablecimiento de la configuración de fábrica ni ninguna otra realizado en el dispositivo puede restablecerlo. Esto es especialmente importante para dispositivos en los que un usuario desbloqueó el bootloader y cambió el software del sistema y modificamos los identificadores que muestra Android de seguridad en la nube. - Las instalaciones de ADP deben tener la capacidad de generar copias nuevas de los datos derivados del identificador de hardware. De esta manera, el dispositivo que pasa por la ADP puede volver a realizar la certificación de ID. El mecanismo de control utilizado por las instalaciones de ADP deben protegerse para que los usuarios no puedan invocarlo ellos mismos, ya que eso les permitiría obtener certificaciones de para identificar IDs falsificados.
- Ningún código, excepto la app de confianza de Keymaster, en el TEE puede leer el los datos derivados de identificadores que se mantienen en el almacenamiento.
- El almacenamiento es a prueba de manipulaciones: si el contenido del almacenamiento modificado, el TEE lo trata de la misma manera que si las copias del contenido tuvieran se destruyó y rechaza todos los intentos de certificación de ID. Esto se implementa Firmando o creando un MAC en el almacenamiento como se describe abajo.
- El almacenamiento no contiene los identificadores originales. Porque la certificación de ID implica un desafío, la persona que llama siempre proporciona los identificadores certificado. El TEE solo necesita verificar que estos coincidan con los valores que que tenía originalmente. Almacenar hashes seguros de los valores originales en lugar del de salida habilita esta verificación.
Construcción
Para crear una implementación que tenga las propiedades mencionadas anteriormente, almacena el Valores derivados de ID en la siguiente construcción S. No almacenes otras copias de los valores de ID, excepto los lugares normales en el sistema, donde el propietario de un dispositivo puede modificarse con permisos de administrador:
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 adecuado. (se recomienda SHA-256)HBK
es una clave vinculada al hardware que no se usa para ningún otro propósitoID1...IDn
son los valores de ID originales. asociación de un para un índice en particular depende de la implementación, ya que Cada dispositivo tendrá un número diferente de identificadores||
representa la concatenación.
Debido a que las salidas HMAC son de tamaño fijo, no se deben incluir encabezados ni ninguna otra estructura necesarios para poder encontrar hashes de ID individuales, o el HMAC de D. Además, para verificar los valores proporcionados para realizar la certificación, validar S mediante la extracción de D de S, el cálculo de HMAC(HBK, D) y la comparación con el valor en S para verificar que no se haya modificado ni dañado ningún ID individual. Además, implementaciones deben usar comparaciones de tiempo constante para todos los ID y la validación de S. El tiempo de comparación debe ser constante, independientemente de la cantidad de IDs proporcionados y la coincidencia correcta de cualquier parte de la prueba.
Identificadores de hardware
La certificación de ID admite los siguientes identificadores de hardware:
- Nombre de la marca, como lo muestra
Build.BRAND
en Android - Nombre del dispositivo, como lo muestra
Build.DEVICE
en Android - Nombre del producto, como lo muestra
Build.PRODUCT
en Android - Nombre del fabricante, como lo muestra
Build.MANUFACTURER
en Android - Nombre del modelo, como lo muestra
Build.MODEL
en Android - Número de serie
- IMEI de todas las radios
- MEID de todas las radios
Para admitir la certificación de ID de dispositivo, un dispositivo certifica estos identificadores. Todo Los dispositivos con Android tienen los seis primeros pasos, que son necesarios para que funcione. Si el dispositivo tiene radios móviles integradas, también debe admitir la certificación de los IMEI o MEID de las radios.
para solicitar la certificación de ID se debe realizar una certificación de claves que incluya identificadores de dispositivos 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 debe certificar es una cadena de bytes con codificación UTF-8. Este formato se aplica a también los identificadores numéricos. Cada identificador que se certificará se expresa como un Es una cadena con codificación UTF-8.
Si el dispositivo no admite certificación de ID (o
Se llamó a destroyAttestationIds()
anteriormente, y el dispositivo no puede
certifican sus IDs por más tiempo), cualquier solicitud de certificación de claves que incluya uno o más de
estas etiquetas fallan con ErrorCode::CANNOT_ATTEST_IDS
.
Si el dispositivo admite certificación de ID y una o más de las etiquetas anteriores tienen
en una solicitud de certificación de claves, el TEE verifica el identificador
proporcionada con cada una de las etiquetas coincide 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
varias veces. Esto puede ser útil, por ejemplo, para certificar IMEI:
Un dispositivo puede tener varias radios con diferentes IMEI. Una solicitud de certificación es
válido si el valor proporcionado con cada ATTESTATION_ID_IMEI
coincide
una de las radios del dispositivo. Lo mismo se aplica a todas las demás etiquetas.
Si la certificación es correcta, los IDs certificados se agregan al extensión de certificación (OID 1.3.6.1.4.1.11129.2.1.17) de la certificación emitida, con el esquema anterior. Cambios de Keymaster 2 esquema de certificación están en negrita, con comentarios.
API de Java
Esta sección es solo informativa. Implementadores de Keymaster: implementar ni usar la API de Java. Se proporciona para ayudar a los implementadores a comprender cómo las aplicaciones usan la función. Es posible que los componentes del sistema lo usen de forma diferente, por lo que es fundamental que esta sección no se trate como normativa.