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 3enum class Algorithm : uint32_t { RSA = 1, EC = 3, AES = 32, HMAC = 128, };
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 3enum class KeyBlobUsageRequirements : uint32_t { STANDALONE = 0, REQUIRES_FILE_SYSTEM = 1, };
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 3enum class BlockMode : uint32_t { ECB = 1, CBC = 2, CTR = 3, GCM = 32, };
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 3enum 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, };
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 3enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };
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 3Los valores posibles se definen en
android::hardware::keymaster::v3_0::KeyOrigin
:
enum class KeyOrigin : uint32_t { GENERATED = 0, DERIVED = 1, IMPORTED = 2, UNKNOWN = 3, };
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 3enum 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, };
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 3enum class KeyPurpose : uint32_t { ENCRYPT = 0, DECRYPT = 1, SIGN = 2, VERIFY = 3, DERIVE_KEY = 4, // since 3.0 WRAP_KEY = 5, // since 3.0 };
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 3enum class HardwareAuthenticatorType : uint32_t { NONE = 0u, // 0 PASSWORD = 1 << 0, FINGERPRINT = 1 << 1, ANY = UINT32_MAX, };
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.