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:
- O usuário coloca um dedo no sensor de impressão digital.
- 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.
- 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.
BiometricManagerinterage diretamente com um app em um processo de app. Cada app tem uma instância deIBiometricsFingerprint.hal.FingerprintServiceopera 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).
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.
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.