Etiquetas de autorización

La API de KeyMint (anteriormente Keymaster) usa de forma extensiva etiquetas de autorización, que son pares de nombre y valor. Cada etiqueta posible tiene lo siguiente:

  • Nombre de enumeración 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 enumeración base de 4 y un marcador de tipo TagType::ENUM_REP que indica que el valor asociado es una enumeración repetible (en este caso, BlockMode).

Las etiquetas cumplen una doble función en la API:

  • Como parámetros para una operación realizada en la API, por ejemplo, Tag::MAC_LENGTH en una operación de firma HMAC indica la longitud de HMAC solicitada.
  • Como características clave, son valores que están vinculados de forma permanente a una clave en particular (es decir, se incluyen en el blob de la clave). Por ejemplo, Tag::EC_CURVE indica para qué curva elíptica es una clave. Cada característica clave se asocia con un nivel de seguridad que indica qué parte del sistema controla el atributo:
    • Una característica clave con nivel de seguridad TRUSTED_ENVIRONMENT o STRONGBOX se aplica en el hardware seguro.
    • Una característica clave con nivel de seguridad SOFTWARE o KEYSTORE solo se aplica con el servicio del sistema keystore2 (por lo que esa característica no es resistente a la vulneración del SO).

Muchas etiquetas actúan como parámetros y características clave:

  • Las características clave indican el conjunto de parámetros permitidos para una clave, por ejemplo:
    • El Tag::PURPOSE de una clave ECDSA puede incluir SIGN y AGREE_KEY.
    • El Tag::BLOCK_MODE de una clave AES puede incluir los modos ECB, CBC y CTR.
  • 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 valores de Tag::PURPOSE de las características clave.
    • begin() para una operación AES debe incluir un solo valor para Tag::BLOCK_MODE en el campo params, que debe coincidir con uno de los valores en las características de la clave.

Esta función dual es especialmente 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 en sí. Por ejemplo, la etiqueta Tag::CERTIFICATE_SUBJECT solo afecta el proceso de generación de claves (asimétricas), ya que controla un campo en el certificado X.509 que se devuelve.
  • Otras etiquetas se vinculan a la clave recién generada como características de la clave y se encapsulan en el keyblob que se devuelve para que se asocien 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: