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. Excepto como 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 sus características.

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 versiones anteriores, las etiquetas se definen en platform/hardware/libhardware/include/hardware/keymaster_defs.h.

Para obtener información sobre las funciones, consulta la página Funciones de Keymaster.

Etiqueta::ACTIVE_DATETIME

Versión: 1, 2, 3, 4

¿Se puede repetir? No

Especifica la fecha y la hora en que la clave se activa. 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.

Tag::ALGORITHM

Versión: 1, 2, 3, 4

¿Se puede repetir? 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

Se reserva para uso futuro.

Tag::ALLOW_WHILE_EN_CUERPO

Versión: 2, 3, 4

¿Se puede repetir? No

Esta etiqueta solo se aplica a dispositivos Android Wear con sensores corporales. En este punto, no se espera que ningún TEE pueda proporcionar acceso seguro a un sensor corporal, o que los sensores corporales sean muy seguros, por lo que se espera que esta sea una función que se aplique únicamente mediante software.

Etiqueta::ALL_USERS

Versión: 3 y 4

¿Es repetible? No

Reservado para uso futuro.

Etiqueta::APPLICATION_DATA

Versión: 1, 2, 3, 4

¿Se puede repetir? No

Cuando se proporciona a generarClave o importKey, esta etiqueta especifica los datos necesarios para todos los usos de la clave. En particular, las llamadas a exportKey y getKeyCharacteristics deben proporcionar el mismo valor al parámetro clientId, y las llamadas a begin deben proporcionar esta etiqueta y los mismos datos asociados como parte del conjunto 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 no debe ser posible que un adversario que tenga acceso a todos los secretos del mundo seguro, pero no al contenido de la etiqueta, desencripte la clave sin forzar el contenido de la etiqueta, lo que las apps pueden evitar si especifican contenido de entropía lo suficientemente 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 particular, las llamadas a exportKey y getKeyCharacteristics deben proporcionar el mismo valor en el parámetro clientId, y las llamadas a begin deben proporcionar esta etiqueta y los mismos datos asociados como parte del conjunto 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 un adversario que puede acceder a todos los secretos del mundo seguro, pero que no tiene acceso al contenido de la etiqueta, no puede desencriptar la clave (sin forzar el contenido de la etiqueta).

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

Tag::ASSOCIATED_DATA

Versión: 1, 2, 3, 4

¿Se puede repetir? No

Proporciona "datos asociados" para la encriptación o desencriptación de AES-GCM. Esta etiqueta se proporciona para actualizar y especifica datos que no están encriptados ni desencriptados, pero que se usan para calcular 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 usa para identificar el conjunto de apps posibles. 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 y 4

¿Se puede repetir? 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 y 4

¿Se puede repetir? No

Proporciona el nombre de la marca del dispositivo, como lo muestra Build.BRAND. en Android. Este campo solo se establece 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.

Tag::ATTESTATION_ID_DEVICE

Versión: 3 y 4

¿Es repetible? No

Proporciona el nombre del dispositivo, como lo muestra Build.DEVICE. en Android. Este campo solo se establece 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_IMEI

Versión: 3, 4

¿Se puede repetir? 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 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 esta etiqueta fallará con ErrorCode::CANNOT_ATTEST_IDS.

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

Tag::ATTESTATION_ID_MANUFACTURER

Versión: 3 y 4

¿Se puede repetir? 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

¿Se puede repetir? Sí

Proporciona los MEID para 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 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 esta etiqueta fallará con ErrorCode::CANNOT_ATTEST_IDS.

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

Tag::ATTESTATION_ID_MODEL

Versión: 3 y 4

¿Se puede repetir? 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.

Tag::ATTESTATION_ID_PRODUCT

Versión: 3 y 4

¿Se puede repetir? No

Proporciona el nombre del producto del dispositivo, como lo muestra Build.PRODUCT en Android. Este campo solo se establece 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.

Tag::ATTESTATION_ID_SERIAL

Versión: 3 y 4

¿Se puede repetir? No

Proporciona 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.

Tag::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. Si Tag::USER_SECURE_ID está presente y esta etiqueta no, la clave necesita autenticación para cada uso (consulta comenzar para obtener los 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 token de autenticación para iniciar, actualizar o finalizar, para demostrar la autenticación del usuario para una operación de clave que la requiera (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 del entorno del sistema necesarias para que se use la clave generada.

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 el valor KeyBlobUsageRequirements::STANDALONE, el trustlet muestra un blob de clave que se puede usar sin compatibilidad con el sistema de archivos. Esto es fundamental para los dispositivos con discos encriptados, en los que el sistema de archivos podría no estar disponible hasta que se use una clave de Keymaster para desencriptar el disco.

Etiqueta::BLOCK_MODE

Versión: 1, 2, 3, 4

¿Se puede repetir? 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 se puede repetir y, para las operaciones de claves AES, especifica un modo en el argumento additionalParams de begin. Si el modo especificado no está en los modos asociados con la clave, la operación falla con ErrorCode::INCOMPATIBLE_BLOCK_MODE.

Tag::BOOT_PATCHLEVEL

Versión: 4

Tag::BOOT_PATCHLEVEL especifica el nivel de parche de seguridad de la imagen de inicio (kernel) con los 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 obtener más información.

El valor de la etiqueta es un número entero con el formato AAAAMMDD, en el que AAAA es el año de cuatro dígitos de la última actualización, MM es el mes de dos dígitos y DD es el día de dos dígitos de la última actualización. Por ejemplo, para una clave generada en un dispositivo Android que 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 por 00.

Durante cada inicio, el bootloader debe proporcionar el nivel de parche de la imagen de inicio al entorno seguro (el mecanismo se define en la implementación).

Debe estar implementado en el hardware.

Tag::BOOTLOADER_ONLY

Versión: 1, 2, 3, 4

¿Se puede repetir? 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.

Tag::CALLER_NONCE

Versión: 1, 2, 3, 4

¿Se puede repetir? 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 verdadero (si la etiqueta está presente) y falso (si la etiqueta no está presente).

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

Tag::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 el 1 de enero de 1970. Esta etiqueta es opcional y solo tiene fines informativos.

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, la operación falla con ErrorCode::INCOMPATIBLE_DIGEST.

Tag::EC_CURVE

Versión: 2, 3, 4

¿Se puede repetir? No

En Keymaster 1, la curva que se usaba para las claves EC se adivinaba a partir del tamaño de clave especificado. Para mejorar la flexibilidad en el futuro, Keymaster 2 introdujo una forma explícita de especificar curvas. Las solicitudes de generación de claves de EC 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, muestra ErrorCode::INVALID_ARGUMENT.

Tag::INCLUDE_UNIQUE_ID

Versión: 2, 3, 4

¿Se puede repetir? 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 verdadero (si la etiqueta está presente) y falso (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 la manera habitual para 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, al menos, es tan grande como el valor de Tag::MIN_MAC_LENGTH asociado con la clave.

Etiqueta::MAX_USES_PER_BOOT

Versión: 1, 2, 3, 4

¿Se puede repetir? No

Especifica la cantidad máxima de veces que se puede usar una clave entre los reinicios del sistema. Este es otro mecanismo para limitar la frecuencia de 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 que el contador de claves supere este valor, todos los intentos posteriores de usar la clave fallarán con ErrorCode::MAX_OPS_EXCEEDED hasta que se reinicie el dispositivo. Esto implica que un trustlet mantiene una tabla de contadores de uso para las claves con esta etiqueta. Debido a que la memoria de Keymaster suele ser limitada, esta tabla puede tener un tamaño máximo fijo, y Keymaster puede fallar en 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.

Tag::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 del MAC, en bits. Es un múltiplo de 8. Para las claves HMAC, el valor es de al menos 64. Para las claves de GCM, el valor es de al menos 96 y no más de 128.

Tag::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 podría habilitar ataques de fuerza bruta.

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

Cuando se usa una clave con esta etiqueta en una operación, iniciar un temporizador durante la fase de finalización o llamada abort. Cualquier llamada a begin que se reciba antes de que el temporizador indique que transcurrió el intervalo especificado por Tag::MIN_SECONDS_BETWEEN_OPS falla con ErrorCode::KEY_RATE_LIMIT_EXCEEDED. Esto implica que un trustlet mantiene una tabla de contadores de uso para las claves con esta etiqueta. Debido a que la memoria de Keymaster suele ser limitada, esta tabla puede tener un tamaño máximo fijo, y Keymaster puede fallar en las operaciones que intentan usar claves con esta etiqueta cuando la tabla está llena. La tabla debe admitir, al menos, 32 elementos y reutilizar 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

Tag::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 verdadero (si la etiqueta está presente) y falso (si la etiqueta no está presente).

Etiqueta::NOCE

Versión: 1, 2, 3, 4

¿Es repetible? No

Proporciona o muestra un nonce o un vector de inicialización (IV) para la encriptación o desencriptación de AES GCM, CBC o 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, genera aleatoriamente un nonce o IV adecuado Keymaster y se muestra desde el principio.

El valor es un blob, un array de bytes de longitud arbitraria. Las longitudes permitidas dependen del modo: los nonces de GCM tienen 12 bytes de longitud; los IV de CBC y CTR tienen 16 bytes de longitud.

Tag::ORIGIN

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica dónde se creó la clave, si se conoce. Esta etiqueta no se puede especificar durante la generación o importación de claves, y el trustlet debe agregarla a las características de clave.

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 del valor, sino de si 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á en la lista de software que aplica la política, la clave se importó a SoftKeymaster y no está vinculada al hardware.

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

Tag::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 KeyPurpose::ENCRYPT proporcionada 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::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 el formato AAAAMM, en el que AAAA es 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 del nivel de parche actual no se pueden usar. Un intento de usar tales causas clave comenzar getKeyCharacteristics, o exportKey para mostrar ErrorCode::KEY_REQUIRES_UPGRADE. Consulta Vinculación de versiones para obtener más detalles.

Tag::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 lista de autorizaciones impuestas 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.

Tag::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 PaddingMode::RSA_PKCS1_1_5_ENCRYPT solo se usan para claves de encriptación o desencriptación RSA y especifican el relleno OAEP PKCS#1v2 de RSA y el relleno aleatorio PKCS#1 v1.5 de RSA, respectivamente. PaddingMode::RSA_PSS y PaddingMode::RSA_PKCS1_1_5_SIGN solo se usan para claves de firma o verificación de RSA y especifican el relleno PSS de RSA PKCS#1v2 y el relleno determinista de 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 y 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.

Tag::PURPOSE

Versión: 1, 2, 3, 4

¿Se puede repetir? Sí

Especifica el conjunto de propósitos para los cuales 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 se llama a la función begin para iniciar una operación, se especifica el propósito de la operación. 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 verdadero (si la etiqueta está presente) y falso (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 la reversión, lo que significa que, cuando se borra con deleteKey o deleteAllKeys, se garantiza que se borrará de forma permanente y no se podrá usar. Es posible que las claves sin esta etiqueta podrían borrarse y, luego, restablecerse 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 iniciado (si corresponde). Nunca se proporcionó esta etiqueta o que se devuelven de Keymaster en las características clave.

Tag::RSA_PUBLIC_EXPONENT

Versión: 1, 2, 3, 4

¿Se puede repetir? No

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

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

Etiqueta::ID_ÚNICO

Versión: 3 y 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.

Tag::USAGE_EXPIRE_DATETIME

Versión: 1, 2, 3, 4

¿Es repetible? No

Especifica la fecha y la hora en que vence la clave para fines de verificación y desencriptació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 número entero de 64 bits que representa los milisegundos desde el 1 de enero de 1970.

Tag::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 esto . 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 en particular 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 fallará con ErrorCode::KEY_USER_NOT_AUTHENTICATED.

Tag::VENDOR_PATCHLEVEL

Versión: 4

Esta etiqueta especifica el nivel de parche de seguridad de la imagen del proveedor al que con el que se pueden usar. Esta etiqueta nunca se envía al TA de Keymaster, pero el TA la agrega a la lista de autorizaciones aplicada por el hardware. 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 obtener más información.

El valor de la etiqueta es un número entero con el formato AAAAMMDD, en el que AAAA es el año de cuatro dígitos de la última actualización, MM es el mes de dos dígitos y DD es el día 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 otro nivel de parche hasta después del próximo inicio.

Se debe aplicar de manera forzosa por hardware.