Sui dispositivi con un sensore di impronte digitali, gli utenti possono registrare una o più impronte e utilizzarle per sbloccare il dispositivo ed eseguire altre attività. Android utilizza il linguaggio di definizione dell'interfaccia hardware per il riconoscimento delle impronte (HIDL) per connettersi a una libreria specifica del fornitore e a hardware per il riconoscimento delle impronte (ad esempio, un sensore di impronte digitali).
Per implementare l'HIDL Fingerprint, devi implementare IBiometricsFingerprint.hal
in una libreria specifica del fornitore.
Corrispondenza dell'impronta
Il sensore di impronte digitali di un dispositivo è generalmente inattivo. Tuttavia, in risposta a una chiamata a authenticate
o enroll
, il sensore di impronte digitali è in ascolto per un tocco (lo schermo potrebbe anche riattivarsi quando un utente tocca il sensore di impronte digitali). Il flusso generale della corrispondenza delle impronte include i seguenti passaggi:
- L'utente appoggia un dito sul sensore di impronte digitali.
- La libreria specifica del fornitore determina se esiste una corrispondenza della impronta nell'attuale insieme di modelli di impronte registrati.
- I risultati corrispondenti vengono passati a
FingerprintService
.
Questo flusso presuppone che sia già stata registrata un'impronta sul dispositivo, ovvero che la libreria specifica del fornitore abbia registrato un modello per l'impronta. Per maggiori dettagli, vedi Autenticazione.
Architettura
L'HAL Fingerprint interagisce con i seguenti componenti.
BiometricManager
interagisce direttamente con un'app in un processo dell'app. Ogni app ha un'istanza diIBiometricsFingerprint.hal
FingerprintService
opera nel processo di sistema, che gestisce la comunicazione con l'HAL di impronte.- L'HAL di impronte è un'implementazione in C/C++ dell'interfaccia HIDL IBiometricsFingerprint. Questa contiene la libreria specifica del fornitore che comunica con l'hardware specifico del dispositivo.
- I componenti Keystore API e Keymaster forniscono la crittografia basata sull'hardware per la memorizzazione sicura delle chiavi in un ambiente sicuro, come il Trusted Execution Environment (TEE).

Un'implementazione HAL specifica del fornitore deve utilizzare il protocollo di comunicazione richiesto da un TEE. Le immagini non elaborate e le funzionalità di impronte elaborate non devono essere trasmesse in una memoria non attendibile. Tutti questi dati biometrici devono essere memorizzati nell'hardware sicuro, come il TEE. Il rooting non deve essere in grado di compromettere i dati biometrici.
FingerprintService
e fingerprintd
effettuano chiamate tramite l'HAL Fingerprint alla biblioteca specifica del fornitore per registrare le impronte ed eseguire altre operazioni.

Linee guida per l'implementazione
Le seguenti linee guida per l'HAL delle impronte sono progettate per garantire che i dati delle impronte non vengano divulgati e rimossi quando un utente viene rimosso da un dispositivo:
- I dati non elaborati delle impronte o i relativi derivati (ad esempio i modelli) non devono mai essere accessibili dall'esterno del driver del sensore o del TEE. Se l'hardware supporta un TEE, l'accesso alle impronte deve essere limitato al TEE e protetto da un criterio SELinux. Il canale SPI (Serial Peripheral Interface) deve essere accessibile solo al TEE e deve essere presente un criterio SELinux esplicito su tutti i file del dispositivo.
- L'acquisizione, la registrazione e il riconoscimento delle impronte devono avvenire all'interno del TEE.
- I dati relativi alle impronte possono essere memorizzati nel file system solo in forma criptata, anche se il file system stesso è criptato.
- I modelli di impronte devono essere firmati con una chiave privata specifica del dispositivo. Per Advanced Encryption Standard (AES), è necessario firmare almeno un modello con il percorso assoluto del file system, il gruppo e l'ID dito in modo che i file del modello non siano operativi su un altro dispositivo o per chiunque non sia l'utente che li ha registrati sullo stesso dispositivo. Ad esempio, non deve essere possibile copiare i dati delle impronte di un utente diverso sullo stesso dispositivo o di un altro dispositivo.
- Le implementazioni devono utilizzare il percorso del file system fornito dalla funzione
setActiveGroup()
o fornire un modo per cancellare tutti i dati del template utente quando l'utente viene rimosso. È vivamente consigliato memorizzare i file dei modelli di impronte come criptati e nel percorso specificato. Se questo non è fattibile a causa dei requisiti di archiviazione del TEE, l'implementatore deve aggiungere hook per garantire la rimozione dei dati quando l'utente viene rimosso.
Metodi di impronta
L'interfaccia HIDL di Fingerprint contiene i seguenti metodi principali in
IBiometricsFingerprint.hal
.
Metodo | Descrizione |
---|---|
enroll() |
Passa la macchina a stati HAL per avviare la raccolta e lo stoccaggio di un modello di impronta. Al termine della registrazione o dopo un timeout, la macchina a stati HAL torna allo stato inattivo. |
preEnroll() |
Genera un token univoco per indicare l'inizio di una registrazione dell'impronta. Fornisce un token alla funzione enroll per verificare che sia stata eseguita un'autenticazione precedente, ad esempio utilizzando una password. Per evitare manomissioni, il token viene sottoposto a wrapping dopo la conferma della credenziale del dispositivo. Il token deve essere controllato durante la registrazione per verificare che sia ancora valido. |
getAuthenticatorId() |
Restituisce un token associato all'impronta corrente impostata. |
cancel() |
Annullamento delle operazioni di registrazione o autenticazione in attesa. La macchina a stati HAL torna allo stato inattivo. |
enumerate() |
Chiamata sincrona per l'enumerazione di tutti i modelli di impronte noti. |
remove() |
Consente di eliminare un modello di impronta. |
setActiveGroup() |
Limita un'operazione HAL a un insieme di impronte che appartengono a un gruppo specificato, identificato da un identificatore di gruppo (GID). |
authenticate() |
Autentica un'operazione correlata all'impronta (identificata da un ID operazione). |
setNotify() |
Registra una funzione utente che riceve notifiche dall'HAL. Se la macchina a stati HAL è in uno stato di occupazione, la funzione viene bloccata finché l'HAL non esce da questo stato. |
postEnroll() |
Completa l'operazione di registrazione e invalida la verifica generata da preEnroll() . Questo metodo deve essere chiamato alla fine di una sessione di registrazione con più dita per indicare che non è possibile aggiungere altre dita. |
Per maggiori dettagli, consulta i commenti in IBiometricsFingerprint.hal
.