Tags de autorização

A API KeyMint (antes Keymaster) usa muito tags de autorização, que são pares nome-valor. Cada tag possível tem:

  • Um nome de enumeração com valor associado
  • Um tipo associado (por exemplo, número inteiro, bytes, data, enum), que inclui uma indicação de se vários valores são permitidos

Por exemplo, a tag com o nome Tag::BLOCK_MODE tem um valor de enumeração de base 4 e um marcador de tipo TagType::ENUM_REP que indica que o valor associado é uma enumeração repetível (neste caso, BlockMode).

As tags têm uma função dupla na API:

  • Como parâmetros de uma operação realizada na API. Por exemplo, o Tag::MAC_LENGTH em uma operação de assinatura HMAC indica o comprimento do HMAC solicitado.
  • Como características principais, valores que estão permanentemente vinculados a uma chave específica (ou seja, incluídos no blob de chave). Por exemplo, o Tag::EC_CURVE indica para qual curva elíptica uma chave é. Cada característica principal está associada a um nível de segurança que indica qual parte do sistema controla o atributo:
    • Uma característica principal com nível de segurança TRUSTED_ENVIRONMENT ou STRONGBOX é aplicada no hardware seguro.
    • Uma característica importante com nível de segurança SOFTWARE ou KEYSTORE é aplicada apenas pelo serviço de sistema keystore2. Portanto, ela não é resiliente a comprometimento do SO.

Muitas tags atuam como parâmetros de características principais:

  • As principais características indicam o conjunto de parâmetros permitidos para uma chave, por exemplo:
    • O Tag::PURPOSE de uma chave ECDSA pode incluir SIGN e AGREE_KEY.
    • O Tag::BLOCK_MODE de uma chave AES pode incluir os modos ECB, CBC e CTR.
  • Uma solicitação begin() inclui um valor de parâmetro específico para a operação, por exemplo:
    • begin() tem um parâmetro de finalidade explícito que precisa corresponder a um dos valores Tag::PURPOSE das características principais.
    • begin() para uma operação AES precisa incluir um único valor para Tag::BLOCK_MODE no campo params, que precisa corresponder a um dos valores nas características da chave.

Essa função dupla é particularmente relevante para a coleta de tags transmitidas como keyParams em uma operação de geração ou importação de chaves.

  • Algumas das tags funcionam como parâmetros para a própria operação de geração de chaves. Por exemplo, a tag Tag::CERTIFICATE_SUBJECT afeta apenas o processo de geração de chaves (assimétricas), controlando um campo no certificado X.509 retornado.
  • Outras tags são vinculadas à chave recém-gerada como características principais e são encapsuladas no keyblob retornado para que fiquem permanentemente associadas à chave.

Informações detalhadas sobre valores de tag podem ser encontradas nas seguintes especificações de interface HAL: