Etiquetas de autorización de Keymaster

En esta página, se proporcionan detalles para ayudar a los implementadores de HAL de Keymaster. Abarca cada etiqueta de la HAL, qué versión de Keymaster está disponible. y si la etiqueta es repetible. Salvo lo que se indica en las descripciones de las etiquetas, todas las etiquetas que se indican a continuación se usan durante la generación de claves para especificar del usuario.

Para Keymaster 4, las etiquetas se definen en platform/hardware/interfaces/keymaster/keymaster-version/types.hal, como, por ejemplo, 3.0/types.hal para Keymaster 3 y 4.0/types.hal para Keymaster 4 Para Keymaster 2 y las versiones anteriores, las etiquetas se definen en platform/hardware/libhardware/include/hardware/keymaster_defs.h

Para conocer las funciones, consulta la Funciones de Keymaster.

Etiqueta::ACTIVE_DATETIME

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la fecha y hora en las que se activa la clave. Antes de esto cualquier intento de usar la clave fallará con ErrorCode::KEY_NOT_YET_VALID

El valor es un número entero de 64 bits que representa los milisegundos transcurridos desde el 1 de enero 1970.

Etiqueta::ALGORITHM

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica el algoritmo criptográfico con el que se usa la clave.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class Algorithm : uint32_t {
    RSA = 1,
    EC = 3,
    AES = 32,
    HMAC = 128,
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_ALGORITHM_RSA = 1,
    KM_ALGORITHM_EC = 3,
    KM_ALGORITHM_AES = 32,
    KM_ALGORITHM_HMAC = 128,
} keymaster_algorithm_t;

Etiqueta::ALL_APPLICATIONS

Versión: 1, 2, 3, 4

¿Es repetible? No

Reservado para uso futuro.

Tag::ALLOW_WHILE_EN_CUERPO

Versión: 2, 3, 4

¿Es repetible? No

Esta etiqueta solo se aplica a dispositivos Android Wear con sensores corporales. En en este punto, no se espera que ningún TEE pueda proporcionar acceso a un sensor corporal o son muy seguros. se espera que sea una función puramente aplicada por software.

Etiqueta::TODOS_USUARIOS

Versión: 3, 4

¿Es repetible? No

Reservado para uso futuro.

Etiqueta::APPLICATION_DATA

Versión: 1, 2, 3, 4

¿Es repetible? No

Cuando se proporciona a generarClave o importKey, esta etiqueta especifica los datos necesarios para todos los usos de la clave. En en particular, las llamadas a exportKey y getKeyCharacteristics debes proporcionar el mismo valor al parámetro clientId, y las llamadas para comenzar deben proporcionar esta etiqueta y los mismos datos asociados como parte de la inParams automático. Si no se proporcionan los datos correctos, la función devuelve ErrorCode::INVALID_KEY_BLOB

El contenido de esta etiqueta está vinculado a la clave criptográficamente, lo que significa que no debe ser posible para un adversario que tenga acceso a todos los los Secrets mundiales seguros, pero no tiene acceso al contenido de la etiqueta para desencriptar el sin forzar el contenido de la etiqueta, lo que las aplicaciones pueden evitar que especifica un contenido con una entropía alta.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::APPLICATION_ID

Versión: 1, 2, 3, 4

¿Es repetible? No

Cuando se proporciona a generarClave o importKey, esta etiqueta especifica los datos necesarios para todos los usos de la clave. En en particular, las llamadas a exportKey y getKeyCharacteristics Debes proporcionar el mismo valor en el parámetro clientId. las llamadas para comenzar deben proporcionar esta etiqueta y los mismos datos asociados como parte del Se estableció inParams. Si no se proporcionan los datos correctos, la función muestra ErrorCode::INVALID_KEY_BLOB.

El contenido de esta etiqueta está vinculado a la clave criptográficamente, lo que significa que es un adversario que puede acceder a todos los secretos del mundo seguro, pero no tiene acceso al contenido de la etiqueta, no puede desencriptar el (sin forzar el contenido de la etiqueta).

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ASSOCIATED_DATA

Versión: 1, 2, 3, 4

¿Es repetible? No

Proporciona “datos asociados” para la encriptación o desencriptación AES-GCM. Esta etiqueta es proporcionado para actualizar y especifica los datos que no se encriptan/desencriptan, pero que se usan en procesamiento la etiqueta de GCM.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_APPLICATION_ID

Versión: 3, 4

¿Es repetible? No

Se usan para identificar el conjunto de posibles aplicaciones de cuál ha iniciado una certificación de claves.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_CHALLENGE

Versión: 3, 4

¿Es repetible? No

Se usa para proporcionar un desafío en la certificación.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_BRAND

Versión: 3, 4

¿Es repetible? No

Proporciona el nombre de la marca del dispositivo, como lo muestra Build.BRAND. en Android. Este campo se establece solo cuando se solicita la certificación del identificadores de dispositivos.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_DEVICE

Versión: 3, 4

¿Es repetible? No

Proporciona el nombre del dispositivo, como lo muestra Build.DEVICE. en Android. Este campo se establece solo cuando se solicita la certificación del identificadores de dispositivos.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_IMEI

Versión: 3, 4

¿Es repetible? Sí

Proporciona los IMEI de todas las radios del dispositivo. Este campo solo está configurado Cuando se solicita la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_MANUFACTURER

Versión: 3, 4

¿Es repetible? No

Indica el nombre del fabricante del dispositivo, como lo devuelve Build.MANUFACTURER en Android Este campo solo se establece cuando solicitando la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_MEID

Versión: 3, 4

¿Es repetible? Sí

Proporciona los MEID para todas las radios del dispositivo. Este campo solo se establecerá Cuando se solicita la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_MODEL

Versión: 3, 4

¿Es repetible? No

Proporciona el nombre del modelo del dispositivo, como lo muestra Build.MODEL en Android Este campo solo se establece cuando solicitando la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_PRODUCT

Versión: 3, 4

¿Es repetible? No

Indica el nombre del producto del dispositivo, como lo devuelve Build.PRODUCT en Android Este campo solo se establece cuando solicitando la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::ATTESTATION_ID_SERIAL

Versión: 3, 4

¿Es repetible? No

Indica el número de serie del dispositivo. Este campo solo se establece cuando solicitando la certificación de los identificadores del dispositivo.

Si el dispositivo no admite certificación de ID (o Se llamó a destroyAttestationIds() anteriormente, y el dispositivo puede ya no certifique sus IDs), cualquier solicitud de certificación de claves que incluya esta etiqueta falla con ErrorCode::CANNOT_ATTEST_IDS.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta::AUTH_TIMEOUT

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica el tiempo en segundos durante el cual está autorizado el uso de la clave, después de la autenticación de varios factores. Si Tag::USER_SECURE_ID está presente y esta etiqueta no, la clave necesita autenticación para cada (consulta comienzo para ver detalles del flujo de autenticación por operación).

El valor es un número entero de 32 bits que especifica el tiempo en segundos luego de autenticación correcta del usuario especificado por Tag::USER_SECURE_ID con el método de autenticación especificadas por Tag::USER_AUTH_TYPE que la clave se puede que se usan.

Etiqueta::AUTH_TOKEN

Versión: 1, 2, 3, 4

¿Es repetible? No

Proporciona un autenticación token para comenzar update o terminar, para demostrar la autenticación de usuarios para una operación clave que requiere (la clave tiene Tag::USER_SECURE_ID).

El valor es un BLOB que contiene una estructura hw_auth_token_t.

Etiqueta: BLOB_USAGE_REQUIREMENTS

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica las condiciones de entorno del sistema necesarias para la que se usará.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class KeyBlobUsageRequirements : uint32_t {
    STANDALONE = 0,
    REQUIRES_FILE_SYSTEM = 1,
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_BLOB_STANDALONE = 0,
    KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
} keymaster_key_blob_usage_requirements_t;

Esta etiqueta se puede especificar durante la generación de la clave para requerir que la clave se que se pueda usar en la condición especificada. Se debe mostrar con la clave características de generateKey y getKeyCharacteristics. Si el llamador especifica Tag::BLOB_USAGE_REQUIREMENTS con valor KeyBlobUsageRequirements::STANDALONE, el Trustlet muestra un BLOB de clave que se pueden usar sin compatibilidad con el sistema de archivos. Esto es fundamental para los dispositivos con discos encriptados, en los que el sistema de archivos no estará disponible hasta después de que se usa una clave de Keymaster para desencriptar el disco.

Etiqueta::BLOCK_MODE

Versión: 1, 2, 3, 4

¿Es repetible? Sí

Especifica los modos de algoritmo de cifrado por bloques con los que se puede usar la clave. Esta etiqueta solo es relevante para las claves AES.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class BlockMode : uint32_t {
    ECB = 1,
    CBC = 2,
    CTR = 3,
    GCM = 32,
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_MODE_ECB = 1,
    KM_MODE_CBC = 2,
    KM_MODE_CTR = 3,
    KM_MODE_GCM = 32,
} keymaster_block_mode_t;

Esta etiqueta es repetible y, para las operaciones de clave AES, especifica un modo en el argumento additionalParams de begin: Si el modo especificado no está en los modos asociados con la clave, la la operación falla con ErrorCode::INCOMPATIBLE_BLOCK_MODE.

Etiqueta::BOOT_PATCHLEVEL

Versión: 4

Tag::BOOT_PATCHLEVEL especifica el nivel de parche de seguridad de la imagen de inicio (kernel) con la que se puede usar la clave. Esta etiqueta nunca se envía al TA de keymaster, pero se agrega a la lista de autorizaciones aplicadas por hardware por parte del TA. Cualquier intento de usa una clave con un valor Tag::BOOT_PATCHLEVEL diferente del El nivel de parche del sistema que se ejecuta actualmente causa begin() getKeyCharacteristics() o exportKey() para devolver ErrorCode::KEY_REQUIRES_UPGRADE Consulta upgradeKey() para conocer los detalles.

El valor de la etiqueta es un número entero con formato AAAAMMDD, donde AAAA es el el año de cuatro dígitos de la última actualización, MM es el mes de dos dígitos y DD es el de dos dígitos de la última actualización. Por ejemplo, para una clave generada en un El dispositivo Android se actualizó por última vez el 5 de junio de 2018; el valor sería 20180605. Si no se conoce el día, se puede sustituir el 00.

Durante cada inicio, el bootloader debe proporcionar el nivel de parche de la imagen de inicio. al entorno seguro (el mecanismo está definido por la implementación).

Se debe aplicar de manera forzosa por hardware.

Tag::BOOTLOADER_ONLY

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica que solo el bootloader puede usar la clave.

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Cualquier intento de usar una clave con Tag::BOOTLOADER_ONLY desde el El sistema Android falla con ErrorCode::INVALID_KEY_BLOB.

Etiqueta::CALLER_NONCE

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica que el llamador puede proporcionar un nonce para operaciones que requieren nonce.

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Esta etiqueta se usa solo para claves AES y solo es relevante para CBC, CTR y GCM los modos de bloqueo. Si la etiqueta no está presente, las implementaciones deberán rechazar cualquier que proporciona Tag::NONCE a comenzar con ErrorCode::CALLER_NONCE_PROHIBITED.

Etiqueta::CREATION_DATETIME

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la fecha y hora en que se creó la clave, en milisegundos, desde 1 de enero de 1970. Esta etiqueta es solo informativa y opcional.

Etiqueta::DIGEST

Versión: 1, 2, 3, 4

¿Es repetible? Sí

Especifica los algoritmos de resumen que se pueden usar con la clave para realizar de firma y verificación. Esta etiqueta es relevante para RSA, ECDSA y las claves HMAC.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class Digest : uint32_t {
    NONE = 0,
    MD5 = 1,
    SHA1 = 2,
    SHA_2_224 = 3,
    SHA_2_256 = 4,
    SHA_2_384 = 5,
    SHA_2_512 = 6,
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_DIGEST_NONE = 0,
    KM_DIGEST_MD5 = 1,
    KM_DIGEST_SHA1 = 2,
    KM_DIGEST_SHA_2_224 = 3,
    KM_DIGEST_SHA_2_256 = 4,
    KM_DIGEST_SHA_2_384 = 5,
    KM_DIGEST_SHA_2_512 = 6,
}
keymaster_digest_t;

Esta etiqueta se puede repetir. Para las operaciones de firma y verificación, especifica un resumen en el argumento additionalParams de begin: Si el resumen especificado no está en los resúmenes asociados con la clave, el la operación falla con ErrorCode::INCOMPATIBLE_DIGEST.

Etiqueta::EC_CURVE

Versión: 2, 3, 4

¿Es repetible? No

En Keymaster 1, la curva que se usaba para las claves EC se adivinaba a partir de la clave especificada. de tamaño del ensamble. Para mejorar la flexibilidad en el futuro, Keymaster 2 introdujo una estrategia de especificar las curvas. Las solicitudes de generación de claves de EC pueden tener Tag::EC_CURVE, Tag::KEY_SIZE o ambos.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class EcCurve : uint32_t {
    P_224 = 0,
    P_256 = 1,
    P_384 = 2,
    P_521 = 3,
};
Keymaster 2 y versiones anteriores
enum class EcCurve : uint32_t {
    P_224 = 0,
    P_256 = 1,
    P_384 = 2,
P_521 = 3,
};

Si una solicitud de generación solo contiene Tag::KEY_SIZE, volver a la lógica de Keymaster 1 y elegir la curva de NIST apropiada.

Si la solicitud solo contiene Tag::EC_CURVE, usa el elemento de la curva especificada. Para Keymaster 3 y versiones posteriores, las curvas se definen en EcCurve Para Keymaster 2 y las versiones anteriores, las curvas se definen en keymaster_ec_curve_t.

Si la solicitud contiene ambos, usa la curva especificada por Tag::EC_CURVE y validar que el tamaño de clave especificado sea apropiado para esa curva. De lo contrario, devuelve ErrorCode::INVALID_ARGUMENT

Etiqueta::INCLUDE_UNIQUE_ID

Versión: 2, 3, 4

¿Es repetible? No

Esta etiqueta se especifica durante la generación de claves para indicar que una certificación certificado para la clave generada debe contener una clave de ID único del dispositivo con límite de tiempo, como lo especifica el Tag::UNIQUE_ID

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Etiqueta::KEY_SIZE

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica el tamaño, en bits, de la clave, que se mide de manera normal para el el algoritmo de la clave. Por ejemplo, para las claves RSA, Tag::KEY_SIZE especifica el tamaño del módulo público. Para las claves AES, especifica la longitud del material de clave secreta.

Etiqueta::MAC_LENGTH

Versión: 1, 2, 3, 4

¿Es repetible? No

Proporciona la longitud solicitada de una etiqueta de autenticación MAC o GCM, en bits.

El valor es la longitud de MAC en bits. Es un múltiplo de 8 y, tan grande como el valor de Tag::MIN_MAC_LENGTH asociada con la clave.

Etiqueta::MAX_USES_PER_BOOT

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la cantidad máxima de veces que se puede usar una clave entre sistemas reinicios. Este es otro mecanismo para limitar la frecuencia del uso de las claves.

El valor es un número entero de 32 bits que representa los usos por inicio.

Cuando se usa una clave con esta etiqueta en una operación, se crea un contador asociado debería aumentar durante el llamada begin. Después de la llave contador superó este valor, fallarán todos los intentos posteriores para usar la clave con ErrorCode::MAX_OPS_EXCEEDED, hasta que se reinicie el dispositivo. Esto quiere decir que un Trustlet mantiene una tabla de contadores de uso para claves con este etiqueta. Como la memoria de Keymaster suele ser limitada, esta tabla puede tener tamaño máximo y Keymaster pueden fallar las operaciones que intentan usar claves con esta etiqueta cuando la tabla está llena. La tabla debe admitir al menos 16 claves. Si una operación falla porque la tabla está llena, Keymaster muestra ErrorCode::TOO_MANY_OPERATIONS

Etiqueta::MIN_MAC_LENGTH

Versión: 1, 2, 3, 4

¿Es repetible? No

Esta etiqueta especifica la longitud mínima de MAC que puede solicitarse o verificado con esta clave para claves HMAC y AES que admiten el modo GCM.

Este valor es la longitud mínima de MAC en bits. Es un múltiplo de 8. Para HMAC, el valor es 64 como mínimo. Para las claves de GCM, el valor es al menos 96. y no más de 128.

Etiqueta::MIN_SECONDS_BETWEEN_OPS

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la cantidad mínima de tiempo que debe transcurrir entre el tiempo permitido las operaciones con una clave. Se puede usar para limitar la frecuencia de los usos de claves en contextos en los que el uso ilimitado puede permitir ataques de fuerza bruta.

El valor es un número entero de 32 bits que representa los segundos de entre el las operaciones.

Cuando se usa una clave con esta etiqueta en una operación, iniciar un temporizador durante la fase de finalización o llamada abort. Cualquiera llamada a begin que es recibidos antes del temporizador indica que el intervalo especificado por El tiempo transcurrido de Tag::MIN_SECONDS_BETWEEN_OPS falla con ErrorCode::KEY_RATE_LIMIT_EXCEEDED Esta implica que un Trustlet mantiene una tabla de contadores de uso para claves con esta etiqueta. Debido a que la memoria de Keymaster suele ser limitada, esta tabla puede tener un valor el tamaño y Keymaster pueden fallar las operaciones que intentan usar claves con esta etiqueta. cuando la tabla esté llena. La tabla debe admitir, al menos, 32 elementos y volver a usar las ranuras de las tablas de forma agresiva cuando vencen los intervalos de uso mínimo clave. Si una operación falla porque la tabla está llena, Keymaster muestra ErrorCode::TOO_MANY_OPERATIONS

Etiqueta::NO_AUTH_REQUIRED

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica que no se requiere autenticación para usar esta clave. Esta etiqueta es mutuamente excluyentes con Tag::USER_SECURE_ID.

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Etiqueta::NOCE

Versión: 1, 2, 3, 4

¿Es repetible? No

Proporciona o muestra un nonce o vector de inicialización (IV) para AES GCM, CBC, o la encriptación o desencriptación de CTR. Esta etiqueta se proporciona a comenzar durante las operaciones de encriptación y desencriptación. Solo se proporciona a comenzar si la clave tiene Tag::CALLER_NONCE. Si no se proporciona, se generará un nonce o IV apropiado de forma aleatoria Keymaster y se muestra desde el principio.

El valor es un BLOB, un array de bytes de longitud arbitraria. Longitudes permitidas dependen del modo: los nonces de GCM tienen 12 bytes de longitud; Los IV de CBC y CTR son 16 bytes de longitud.

Etiqueta::ORIGIN

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica dónde se creó la clave, si se conoce. No se puede especificar esta etiqueta durante la generación o importación de la clave y debe agregarse a las características por el Trustlet.

Keymaster 3

Los valores posibles se definen en android::hardware::keymaster::v3_0::KeyOrigin:

enum class KeyOrigin : uint32_t {
    GENERATED = 0,
    DERIVED = 1,
    IMPORTED = 2,
    UNKNOWN = 3,
};
Keymaster 2 y versiones anteriores

Los valores posibles se definen en keymaster_origin_t:

typedef enum {
    KM_ORIGIN_GENERATED = 0,
    KM_ORIGIN_IMPORTED = 2,
    KM_ORIGIN_UNKNOWN = 3,
} keymaster_key_origin_t

El significado completo del valor depende no solo de este, sino también de se encuentra en la lista de características aplicadas por hardware o por software.

GENERATED indica que Keymaster generó la clave. Si está en la lista de apps aplicadas por hardware, La clave se generó en hardware seguro y está vinculada al hardware de forma permanente. Si en la lista aplicada por software, la clave se generó en SoftKeymaster y es no depende del hardware.

DERIVED indica que la clave se derivó dentro de Keymaster. Es probable que exista fuera del dispositivo.

IMPORTED indica que la clave se generó fuera de Keymaster y se importó a Keymaster Si se encuentra en la lista aplicada por hardware, está vinculado al hardware de forma permanente aunque es posible que existan copias fuera del hardware seguro. Si estás en la software-aplica, la clave se importó a SoftKeymaster y no es depende del hardware.

UNKNOWN solo debe aparecer en la lista de aplicaciones aplicadas por hardware. Indica que la clave está vinculado al hardware, pero no se sabe si la clave se generó originalmente en el hardware seguro o se importó. Esto solo ocurre cuando el hardware de keymaster0 se que se usa para emular servicios de keymaster1.

Etiqueta::ORIGINATION_EXPIRE_DATETIME

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la fecha y hora en que vence la clave para firmar y para la encriptación. Después de este tiempo, cualquier intento de usar una clave con Keypurpose::SIGN o Se proporcionó el KeyObjetivo::ENCRYPT para comenzar falla con ErrorCode::KEY_EXPIRED.

El valor es un entero de 64 bits que representa los milisegundos 1 de enero de 1970.

Etiqueta::OS_PATCHLEVEL

Versión: 2, 3, 4

¿Es repetible? No

Esta etiqueta nunca se envía al TA de la instancia principal de la instancia principal, pero se agrega al lista de autorizaciones impuestas por hardware por parte de la TA.

El valor de la etiqueta es un número entero con formato AAAAMM, donde AAAA es el el año de cuatro dígitos de la última actualización y MM es el mes de dos dígitos de la última actualización. Por ejemplo, para una clave generada en un dispositivo Android por última vez en diciembre de 2015, el valor sería 201512.

Las claves que tienen un nivel de parche diferente al actual no lo son utilizable. Un intento de usar tales causas clave comenzar getKeyCharacteristics, o exportKey para mostrar ErrorCode::KEY_REQUIRES_UPGRADE. Consulta Vinculación de versiones para más opciones más detalles.

Etiqueta::OS_VERSION

Versión: 2, 3, 4

¿Es repetible? No

Esta etiqueta nunca se envía al TA de la instancia principal de la instancia principal, pero se agrega al de autorización impuesta por hardware por parte de la TA.

El valor de la etiqueta es un número entero con el formato MMmmss, donde MM es el valor mayor el número de versión, mm es el número de versión secundaria y ss es la versión subsecundaria de la fila. Por ejemplo, para una clave generada en Android 4.0.3, el valor sería 040003.

Etiqueta::PADDING

Versión: 1, 2, 3, 4

¿Es repetible? Sí

Especifica los modos de padding que se pueden usar con la clave. Esta etiqueta es relevante para las claves RSA y AES.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class PaddingMode : uint32_t {
    NONE = 1,
    RSA_OAEP = 2,
    RSA_PSS = 3,
    RSA_PKCS1_1_5_ENCRYPT = 4,
    RSA_PKCS1_1_5_SIGN = 5,
    PKCS7 = 64,
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_PAD_NONE = 1,
    KM_PAD_RSA_OAEP = 2,
    KM_PAD_RSA_PSS = 3,
    KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
    KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
    KM_PAD_PKCS7 = 64,
} keymaster_padding_t;

PaddingMode::RSA_OAEP y Se usaron PaddingMode::RSA_PKCS1_1_5_ENCRYPT solo para claves de encriptación/desencriptación RSA y especifica RSA PKCS#1v2 OAEP y el relleno aleatorio RSA PKCS#1 v1.5, respectivamente. PaddingMode::RSA_PSS y PaddingMode::RSA_PKCS1_1_5_SIGN solo se usan para RSA claves de firma/verificación y especificar el PSS de RSA PKCS#1v2 y el relleno determinista RSA PKCS#1 v1.5, respectivamente.

PaddingMode::NONE se puede usar con RSA o Claves AES. Para las claves AES, si se usa PaddingMode::NONE con el ECB o CBC en modo bloque y los datos que se encriptarán o desencriptarán no es múltiplo del tamaño del bloque de AES en longitud, la llamada para finalizar falla con ErrorCode::INVALID_INPUT_LENGTH.

PaddingMode::PKCS7 solo se puede usar con claves AES. solo con los modos ECB y CBC.

Esta etiqueta se puede repetir. Se debe especificar un modo de relleno en la llamada a begin Si no se autoriza el modo especificado para la clave, la operación falla con ErrorCode::INCOMPATIBLE_BLOCK_MODE.

Etiqueta::PRORPOSE

Versión: 1, 2, 3, 4

¿Es repetible? Sí

Especifica el conjunto de propósitos para los que se puede usar la clave.

Los valores posibles se definen mediante la siguiente enumeración:

Keymaster 3
enum class KeyPurpose : uint32_t {
    ENCRYPT = 0,
    DECRYPT = 1,
    SIGN = 2,
    VERIFY = 3,
    DERIVE_KEY = 4,  // since 3.0
    WRAP_KEY = 5,    // since 3.0
};
Keymaster 2 y versiones anteriores
typedef enum {
    KM_PURPOSE_ENCRYPT = 0,
    KM_PURPOSE_DECRYPT = 1,
    KM_PURPOSE_SIGN = 2,
    KM_PURPOSE_VERIFY = 3,
} keymaster_purpose_t;

Esta etiqueta se puede repetir. las claves se pueden generar con varios valores, aunque una operación tiene un solo propósito. Cuando función begin se llama para iniciar una operación, se especifica su propósito. Si el propósito especificado para la operación no está autorizado por el la operación falla con ErrorCode::INCOMPATIBLE_PURPOSE.

Tag::RESET_SINCE_ID_ROTATION

Versión: 3, 4

¿Es repetible? No

Especifica si se restableció la configuración de fábrica del dispositivo desde la última rotación del ID único. Se usa para la certificación de claves.

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Tag::ROLLBACK_RESISTANT

Versión: 1, 2, 3, 4

¿Es repetible? No

Indica que la clave es resistente a las reversiones, lo que significa que, cuando se borra mediante deleteKey o deleteAllKeys, que se borrará de manera permanente y que no se pueda usar. Es posible que las claves sin esta etiqueta se podrían borrar y, luego, restablecer desde la copia de seguridad.

Esta etiqueta es booleana, por lo que los valores posibles son verdaderos (si la etiqueta está presente). y false (si la etiqueta no está presente).

Etiqueta::ROOT_OF_TRUST

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la raíz de confianza, la clave que usa el inicio verificado para validar el sistema operativo que se inició (si corresponde). Nunca se proporcionó esta etiqueta o que se devuelven de Keymaster en las características clave.

Etiqueta::RSA_PUBLIC_EXPONENT

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica el valor del exponente público para un par de claves RSA. Esta etiqueta es relevante solo para las claves RSA y necesaria para todas las claves RSA.

El valor es un número entero de 64 bits sin firma que cumple con los requisitos de una Exponente público de RSA. Este valor debe ser un número primo. Los Trustlets admiten el el valor 2^16+1 y puede admitir otros valores razonables, en particular el valor 3. Si no se especifica un exponente o si el que se especificó no se admite, la generación de claves falla con ErrorCode::INVALID_ARGUMENT.

Etiqueta::UNIQUE_ID

Versión: 3, 4

¿Es repetible? No

Se usa para proporcionar un ID único en la certificación.

El valor es un BLOB, un array de bytes de longitud arbitraria.

Etiqueta: USAGE_EXPIRE_DATETIME

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la fecha y hora en que vence la clave para la verificación y su encriptación. Después de este tiempo, cualquier intento de usar una clave con Keypurpose::VERIFY o Se proporcionó el campo Keypurpose::DECRYPT a begin falla con ErrorCode::KEY_EXPIRED.

El valor es un entero de 64 bits que representa los milisegundos 1 de enero de 1970.

Etiqueta::USER_AUTH_TYPE

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica los tipos de autenticadores de usuario que se pueden usar para autorizar este . Cuando se solicita a Keymaster que realice una operación con una clave que contiene lo siguiente: recibe un token de autenticación y el estado El campo authenticator_type debe coincidir con el valor de la etiqueta. Por ejemplo, (ntoh(token.authenticator_type) & auth_type_tag_value) != 0, donde ntoh es una función que convierte enteros ordenados por red en enteros ordenados por host, y auth_type_tag_value es el valor de esta etiqueta.

El valor es una máscara de bits de número entero de 32 bits de los valores de la enumeración:

Keymaster 3
enum class HardwareAuthenticatorType : uint32_t {
    NONE = 0u, // 0
    PASSWORD = 1 << 0,
    FINGERPRINT = 1 << 1,
    ANY = UINT32_MAX,
};
Keymaster 2 y versiones anteriores
typedef enum {
    HW_AUTH_NONE = 0,
    HW_AUTH_PASSWORD = 1 << 0,
    HW_AUTH_FINGERPRINT = 1 << 1,
    // Additional entries should be powers of 2.
    HW_AUTH_ANY = UINT32_MAX,
} hw_authenticator_type_t;

Etiqueta::USER_SECURE_ID

Versión: 1, 2, 3, 4

¿Es repetible? Sí

Especifica que una clave solo se puede usar con un usuario seguro específico el estado de autenticación. Esta etiqueta es mutuamente excluyente con Tag::NO_AUTH_REQUIRED.

El valor es un número entero de 64 bits que especifica el estado de la política de autenticación valor que debe estar presente en un token de autenticación (proporcionado a comienza con Tag::AUTH_TOKEN) para autorizar el uso de la clave. Cualquiera Llamar a begin con una clave con esta etiqueta que no proporciona un token de autenticación o proporciona un El token de autenticación sin un valor de estado de política coincidente falla.

Esta etiqueta se puede repetir. Si alguno de los valores proporcionados coincide con alguna política de estado en el token de autenticación, se autoriza el uso de la clave. De lo contrario, la operación falla con ErrorCode::KEY_USER_NOT_AUTHENTICATED

Etiqueta: VENDOR_PATCHLEVEL

Versión: 4

Esta etiqueta especifica el nivel de parche de seguridad de la imagen del proveedor con el que la clave por lotes. Esta etiqueta nunca se envía al TA de la instancia principal de la instancia principal, pero se agrega al lista de autorizaciones impuestas por hardware por parte de la TA. Cualquier intento de usar una clave con una Un valor de Tag::VENDOR_PATCHLEVEL diferente del que se está ejecutando actualmente El nivel de parche del sistema debe causar begin(), getKeyCharacteristics() o exportKey() para devolver ErrorCode::KEY_REQUIRES_UPGRADE Consulta upgradeKey() para conocer los detalles.

El valor de la etiqueta es un número entero con formato AAAAMMDD, donde AAAA es el el año de cuatro dígitos de la última actualización, MM es el mes de dos dígitos y DD es el de dos dígitos de la última actualización. Por ejemplo, para una clave generada en un El dispositivo Android se actualizó por última vez el 5 de junio de 2018; el valor sería 20180605.

La HAL de IKeymasterDevice debe leer el nivel de parche del proveedor actual del sistema. la propiedad ro.vendor.build.security_patch y entregarla al seguro cuando la HAL se carga por primera vez (el mecanismo definidas por la implementación). El entorno seguro no debe aceptar otra parche hasta después del próximo inicio.

Se debe aplicar de manera forzosa por hardware.