Tags de autorização

A API KeyMint (anteriormente Keymaster) usa muito tags de autorização, que são pares de 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, enumeração), 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 base de 4 e um marcador de tipo TagType::ENUM_REP que indica que o valor associado é uma enumeração repetível (nesse caso, BlockMode).

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

  • Como parâmetros de uma operação realizada na API. Por exemplo, a Tag::MAC_LENGTH em uma operação de assinatura HMAC indica o comprimento 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, a 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 aplica o atributo:
    • Uma característica principal com nível de segurança TRUSTED_ENVIRONMENT ou STRONGBOX é aplicada no hardware seguro.
    • Uma característica principal com nível de segurança SOFTWARE ou KEYSTORE é aplicada apenas pelo serviço do sistema keystore2. Portanto, essa característica não é resiliente a comprometimentos do SO.

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

  • As características principais indicam o conjunto de parâmetros permitidos para uma chave, por exemplo:
    • O Tag::PURPOSE de uma chave ECDSA pode incluir tanto SIGN quanto AGREE_KEY.
    • O Tag::BLOCK_MODE para 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 principais.

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

  • Algumas das tags atuam como parâmetros para a operação de geração de chaves em si. 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 os valores de tag podem ser encontradas nas seguintes especificações de interface HAL: