La API de KeyMint (anteriormente Keymaster) usa ampliamente las etiquetas de autorización, que son pares nombre-valor. Cada etiqueta posible tiene lo siguiente:
- Un nombre de enum con valor asociado
- Un tipo asociado (por ejemplo, número entero, bytes, fecha, enumeración), 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 una enum repetible (en este caso, BlockMode
).
Las etiquetas realizan una doble función en la API:
- Como parámetros de una operación que se realiza en la API, por ejemplo, el
Tag::MAC_LENGTH
en una operación de firma de HMAC indica la longitud de HMAC solicitada. - Como características clave, los valores que están vinculados de forma permanente a una clave en particular (es decir, incluidos en el blob de clave), por ejemplo,
Tag::EC_CURVE
indica 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 controla el atributo:- Se aplica una característica clave con el nivel de seguridad
TRUSTED_ENVIRONMENT
oSTRONGBOX
en el hardware seguro. - Una característica clave con el nivel de seguridad
SOFTWARE
oKEYSTORE
solo se aplica mediante el servicio del sistemakeystore2
(por lo que una característica de este tipo no es resistente a la vulneración del SO).
- Se aplica 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::PURPOSE
de una clave ECDSA puede incluirSIGN
yAGREE_KEY
. - El
Tag::BLOCK_MODE
de una clave AES puede incluir los modos ECB, CBC y CTR.
- El
- Luego, 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::PURPOSE
de las características clave.begin()
para una operación AES debe incluir un solo valor paraTag::BLOCK_MODE
en el campoparams
, que debe coincidir con uno de los valores de las características clave.
Esta función doble es particularmente relevante para la recopilació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. Por ejemplo, la etiqueta
Tag::CERTIFICATE_SUBJECT
solo afecta al proceso de generación de claves (asimétricas), ya que controla un campo en el certificado X.509 que se muestra. - Otras etiquetas se vinculan a la clave recién generada como características de la clave y se encapsulan en el keyblob que se muestra para que se asocien de forma permanente con la clave.
Puedes encontrar información detallada sobre los valores de etiqueta en las siguientes especificaciones de la interfaz de HAL:
- KeyMint: Todas las etiquetas se definen en
Tag.aidl
en la rama de lanzamiento relevante de Android. - Keymaster: Las etiquetas se definen en
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
para cadakeymaster-version
correspondiente, como3.0/types.hal
para Keymaster 3 y4.0/types.hal
para Keymaster 4. Para Keymaster 2 y versiones anteriores, las etiquetas se definen enplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.