Tags de autorização

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

  • Um nome de tipo enumerado com valor associado
  • Um tipo associado (por exemplo, número inteiro, bytes, data, tipo enumerado), 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 tipo enum de 4 e um marcador de tipo TagType::ENUM_REP que indica que o valor associado é um tipo enum repetível (neste caso, BlockMode).

As tags têm duas funções na API:

  • Como parâmetros para 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 da chave, os valores que são permanentemente vinculados a uma chave específica (ou seja, incluídos no blob de chaves). Por exemplo, Tag::EC_CURVE indica a curva elíptica para a qual uma chave se destina. Cada característica principal é associada a um nível de segurança que indica qual parte do sistema fiscaliza o atributo:
    • Uma característica de chave com nível de segurança TRUSTED_ENVIRONMENT ou STRONGBOX é aplicada no hardware seguro.
    • Uma característica de chave com nível de segurança SOFTWARE ou KEYSTORE é aplicada apenas pelo serviço de sistema keystore2. Portanto, essa característica não é resiliente a comprometimento do SO.

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

  • As características da chave 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 propósito explícito que precisa corresponder a um dos valores Tag::PURPOSE das principais características.
    • 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 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 chave (assimétrica), controlando um campo no certificado X.509 retornado.
  • Outras tags são vinculadas à chave recém-gerada como características de chave e são encapsuladas no keyblob retornado para que sejam associadas permanentemente à chave.

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