La API de KeyMint (antes Keymaster) usa de forma extensiva las etiquetas de autorización, que son pares clave-valor. Cada etiqueta posible tiene lo siguiente:
- Un nombre de enum con un valor asociado
- Un tipo asociado (por ejemplo, número entero, bytes, fecha, enum), que incluye una indicación de si se permiten varios valores
Por ejemplo, la etiqueta con el nombre
Tag::BLOCK_MODE
tiene un valor de enum base de 4 y un marcador de tipo TagType::ENUM_REP
que indica que el valor asociado es un enum repetible (en este
caso, BlockMode).
Las etiquetas realizan una función doble en la API:
- Como parámetros para una operación realizada en la API, por ejemplo, el
Tag::MAC_LENGTHen una operación de firma HMAC indica la longitud HMAC solicitada. - Como características clave, valores que están vinculados de forma permanente
a una clave en particular (es decir, incluidos en el blob de clave), por ejemplo,
el
Tag::EC_CURVEindica para qué curva elíptica es una clave. Cada característica clave está asociada con un nivel de seguridad que indica qué parte del sistema aplica el atributo:- Una característica clave con el nivel de seguridad
TRUSTED_ENVIRONMENToSTRONGBOXse aplica en el hardware seguro. - Una característica clave con el nivel de seguridad
SOFTWAREoKEYSTOREsolo se aplica con el servicio del sistemakeystore2(por lo que esa característica no es resistente a la vulneración del SO).
- Una característica clave con el nivel de seguridad
Muchas etiquetas actúan como características clave y parámetros:
- Las características clave indican el conjunto de parámetros permitidos para una clave,
por ejemplo:
- El
Tag::PURPOSEde una clave ECDSA puede incluir tantoSIGNcomoAGREE_KEY. - El
Tag::BLOCK_MODEpara una clave AES puede incluir los modos ECB, CBC, y CTR.
- El
- Una solicitud
begin()incluye un valor de parámetro específico para la operación, por ejemplo:begin()tiene un parámetro de propósito explícito que debe coincidir con uno de los valoresTag::PURPOSEde las características clave.begin()para una operación AES debe incluir un solo valor paraTag::BLOCK_MODEen el campoparams, que debe coincidir con uno de los valores de las características clave.
Esta función doble es particularmente relevante para la colección de etiquetas que se pasan como keyParams en una operación de generación o importación de claves.
- Algunas de las etiquetas actúan como parámetros para la operación de generación de claves
en sí. Por ejemplo, la etiqueta
Tag::CERTIFICATE_SUBJECTsolo afecta el proceso de generación de claves (asimétricas), ya que controla un campo en el certificado X.509 que se muestra. - Otras etiquetas están vinculadas a la clave recién generada como características clave y se encapsulan en el keyblob que se muestra para que estén asociadas de forma permanente con la clave.
Puedes encontrar información detallada sobre los valores de las etiquetas en las siguientes especificaciones de la interfaz HAL:
- KeyMint: Todas las etiquetas se definen
en
Tag.aidlen la rama de versión de Android correspondiente. - Keymaster: Las etiquetas se definen
en
platform/hardware/interfaces/keymaster/keymaster-version/types.halpara cadakeymaster-versionrespectiva, como3.0/types.halpara Keymaster 3 y4.0/types.halpara Keymaster 4. Para Keymaster 2 y versiones anteriores, las etiquetas se definen enplatform/hardware/libhardware/include/hardware/keymaster_defs.h.