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_LENGTHem 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_CURVEindica 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_ENVIRONMENTouSTRONGBOXé aplicada no hardware seguro. - Uma característica principal com nível de segurança
SOFTWAREouKEYSTOREé aplicada apenas pelo serviço do sistemakeystore2. Portanto, essa característica não é resiliente a comprometimentos do SO.
- Uma característica principal com nível de segurança
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::PURPOSEde uma chave ECDSA pode incluir tantoSIGNquantoAGREE_KEY. - O
Tag::BLOCK_MODEpara uma chave AES pode incluir os modos ECB, CBC, e CTR.
- O
- 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 valoresTag::PURPOSEdas características principais.begin()para uma operação AES precisa incluir um único valor paraTag::BLOCK_MODEno campoparams, 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_SUBJECTafeta 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:
- KeyMint: todas as tags são definidas
em
Tag.aidlno branch de versão relevante do Android. - Keymaster: as tags são definidas
em
platform/hardware/interfaces/keymaster/keymaster-version/types.halpara cadakeymaster-version, como3.0/types.halpara o Keymaster 3 e4.0/types.halpara o Keymaster 4. Para o Keymaster 2 e versões anteriores, as tags são definidas emplatform/hardware/libhardware/include/hardware/keymaster_defs.h.