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 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 da chave, 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
ouSTRONGBOX
é aplicada no hardware seguro. - Uma característica de chave com nível de segurança
SOFTWARE
ouKEYSTORE
é aplicada apenas pelo serviço de sistemakeystore2
. Portanto, essa característica não é resiliente a comprometimento do SO.
- Uma característica de chave com nível de segurança
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 incluirSIGN
eAGREE_KEY
. - O
Tag::BLOCK_MODE
de 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 propósito explícito que precisa corresponder a um dos valoresTag::PURPOSE
das principais características.begin()
para uma operação AES precisa incluir um único valor paraTag::BLOCK_MODE
no campoparams
, 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:
- KeyMint: todas as tags são definidas
em
Tag.aidl
no branch de lançamento relevante do Android. - Keymaster: as tags são definidas em
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
para cadakeymaster-version
, como3.0/types.hal
para Keymaster 3 e4.0/types.hal
para Keymaster 4. Para o Keymaster 2 e versões anteriores, as tags são definidas emplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.