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 3enum 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 3enum 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 3enum 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 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, };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 3enum 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 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, };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 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, };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 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 };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 3enum 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.