HIDL de impressão digital

Em dispositivos com um sensor de impressão digital, os usuários podem registrar uma ou mais impressões digitais e usá-las para desbloquear o dispositivo e realizar outras tarefas. O Android usa a linguagem de definição de interface de hardware (HIDL, na sigla em inglês) de impressão digital para se conectar a uma biblioteca específica do fornecedor e ao hardware de impressão digital (por exemplo, um sensor de impressão digital).

Para implementar a HIDL de impressão digital, é necessário implementar IBiometricsFingerprint.hal em uma biblioteca específica do fornecedor.

Correspondência de impressão digital

O sensor de impressão digital de um dispositivo geralmente fica inativo. No entanto, em resposta a uma chamada para authenticate ou enroll, o sensor de impressão digital fica atento a um toque (a tela também pode ser ativada quando um usuário toca no sensor de impressão digital). O fluxo de alto nível da correspondência de impressão digital inclui as seguintes etapas:

  1. O usuário coloca um dedo no sensor de impressão digital.
  2. A biblioteca específica do fornecedor determina se há uma correspondência de impressão digital em o conjunto atual de modelos de impressão digital registrados.
  3. Os resultados da correspondência são transmitidos para FingerprintService.

Esse fluxo pressupõe que uma impressão digital já tenha sido registrada no dispositivo, ou seja, a biblioteca específica do fornecedor registrou um modelo para a impressão digital. Para mais detalhes, consulte Autenticação.

Arquitetura

O HAL de impressão digital interage com os seguintes componentes.

  • BiometricManager interage diretamente com um app em um processo de app. Cada app tem uma instância de IBiometricsFingerprint.hal.
  • FingerprintService opera no processo do sistema, que processa a comunicação com o HAL de impressão digital.
  • O HAL de impressão digital é uma implementação C/C++ da interface IBiometricsFingerprint HIDL. Ele contém a biblioteca específica do fornecedor que se comunica com o hardware específico do dispositivo.
  • Os componentes da API Keystore e do KeyMint (anteriormente Keymaster) fornecem criptografia com suporte de hardware para armazenamento seguro de chaves em um ambiente seguro, como o ambiente de execução confiável (TEE, na sigla em inglês).
Fluxo de dados para autenticação
por impressão digital
Figura 1. Fluxo de dados de alto nível para autenticação de impressão digital

Uma implementação de HAL específica do fornecedor precisa usar o protocolo de comunicação exigido por um TEE. Imagens brutas e recursos de impressão digital processados não podem ser transmitidos em memória não confiável. Todos esses dados biométricos precisam ser armazenados no hardware seguro, como o TEE. O acesso raiz não pode comprometer os dados biométricos.

FingerprintService e fingerprintd fazem chamadas pelo HAL de impressão digital para a biblioteca específica do fornecedor para registrar impressões digitais e realizar outras operações.

Interação com o fingerprintd
Figura 2. Interação do daemon de impressão digital com a biblioteca específica do fornecedor de impressão digital

Diretrizes de implementação

As diretrizes de HAL de impressão digital a seguir foram projetadas para garantir que os dados de impressão digital não sejam vazados e sejam removidos quando um usuário for removido de um dispositivo:

  • Dados de impressão digital brutos ou derivados (por exemplo, modelos) nunca podem ser acessados de fora do driver do sensor ou do TEE. Se o hardware oferecer suporte a a um TEE, o acesso ao hardware precisará ser limitado ao TEE e protegido por uma política de SELinux policy. O canal de interface periférica serial (SPI, na sigla em inglês) só poderá ser acessado pelo TEE, e precisará haver uma política de SELinux explícita em todos os arquivos do dispositivo.
  • A aquisição, o registro e o reconhecimento de impressões digitais precisam ocorrer dentro do TEE.
  • Somente a forma criptografada dos dados de impressão digital pode ser armazenada no sistema de arquivos, mesmo que o sistema de arquivos seja criptografado.
  • Os modelos de impressão digital precisam ser assinados com uma chave privada específica do dispositivo. Para o Padrão avançado de criptografia (AES, na sigla em inglês), um modelo precisa ser assinado com o caminho absoluto do sistema de arquivos, o grupo e o ID do dedo, de modo que os arquivos de modelo não possam ser usados em outro dispositivo ou por qualquer pessoa que não seja o usuário que os registrou no mesmo dispositivo. Por exemplo, a cópia de dados de impressão digital de um usuário diferente no mesmo dispositivo ou de outro dispositivo não pode funcionar.
  • As implementações precisam usar o caminho do sistema de arquivos fornecido pela setActiveGroup() função ou fornecer uma maneira de apagar todos os dados de modelo do usuário quando ele for removido. É altamente recomendável que os arquivos de modelo de impressão digital sejam armazenados como criptografados e no caminho fornecido. Se isso não for possível devido aos requisitos de armazenamento do TEE, o implementador precisará adicionar hooks para garantir a remoção dos dados quando o usuário for removido.

Métodos de impressão digital

A interface HIDL de impressão digital contém os seguintes métodos principais em IBiometricsFingerprint.hal.

Método Descrição
enroll() Muda a máquina de estado HAL para iniciar a coleta e o armazenamento de um modelo de impressão digital. Quando o registro é concluído, ou após um tempo limite, a máquina de estado HAL retorna ao estado inativo.
preEnroll() Gera um token exclusivo para indicar o início de um registro de impressão digital. Fornece um token para a função enroll para garantir que houve autenticação anterior, por exemplo, usando uma senha. Para evitar adulterações, o token é encapsulado após a confirmação da credencial do dispositivo. O token precisa ser verificado durante o registro para confirmar se ainda é válido.
getAuthenticatorId() Retorna um token associado ao conjunto de impressões digitais atual.
cancel() Cancela operações de registro ou autenticação pendentes. A máquina de estado HAL é retornada ao estado inativo.
enumerate() Chamada síncrona para enumerar todos os modelos de impressão digital conhecidos.
remove() Exclui um modelo de impressão digital.
setActiveGroup() Restringe uma operação HAL a um conjunto de impressões digitais que pertencem a um grupo especificado, identificado por um identificador de grupo (GID).
authenticate() Autentica uma operação relacionada à impressão digital (identificada por um ID de operação).
setNotify() Registra uma função de usuário que recebe notificações do HAL. Se a máquina de estado HAL estiver ocupada, a função será bloqueada até que o HAL saia do estado ocupado.
postEnroll() Conclui a operação de registro e invalida o preEnroll() desafio gerado. Essa função precisa ser chamada no final de uma sessão de registro de vários dedos para indicar que não é possível adicionar mais dedos.

Para mais detalhes sobre esses métodos, consulte os comentários em IBiometricsFingerprint.hal.