Impronta HIDL

Sui dispositivi con 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 le impronte (HIDL) per connettersi a una libreria specifica del fornitore e all'hardware per le impronte (ad esempio, un sensore di impronte).

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 rileva 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:

  1. L'utente appoggia un dito sul sensore di impronte digitali.
  2. La libreria specifica del fornitore determina se esiste una corrispondenza dell'impronta nell'insieme corrente di modelli di impronte registrati.
  3. I risultati corrispondenti vengono passati a FingerprintService.

Questo flusso presuppone che un'impronta sia già stata registrata sul dispositivo, ovvero 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 di IBiometricsFingerprint.hal
  • FingerprintService opera nel processo di sistema, che gestisce la comunicazione con l'HAL delle impronte.
  • Fingerprint HAL è un'implementazione C/C++ dell'interfaccia IBiometricsFingerprint HIDL. Contiene la libreria specifica del fornitore che comunica con l'hardware specifico del dispositivo.
  • I componenti API Keystore e KeyMint (in precedenza Keymaster) forniscono crittografia basata su hardware per l'archiviazione sicura delle chiavi in un ambiente sicuro, come il Trusted Execution Environment (TEE).
Flusso di dati per l'autenticazione
con impronta
Figura 1. Flusso di dati di alto livello per l'autenticazione tramite impronta

Un'implementazione HAL specifica del fornitore deve utilizzare il protocollo di comunicazione richiesto da un TEE. Le immagini non elaborate e le funzionalità di impronta elaborate non devono essere trasmesse in una memoria non attendibile. Tutti questi dati biometrici devono essere archiviati nell'hardware sicuro, ad esempio il TEE. Il rooting non deve essere in grado di compromettere i dati biometrici.

FingerprintService e fingerprintd effettuano chiamate tramite l'HAL delle impronte all'interno della libreria specifica del fornitore per registrare le impronte ed eseguire altre operazioni.

Interazione con fingerprintd
Figura 2. Interazione del daemon delle impronte con la libreria specifica del fornitore di impronte

Linee guida per l'implementazione

Le seguenti linee guida HAL per le impronte sono progettate per garantire che i dati delle impronte non vengano divulgati e vengano rimossi quando un utente viene rimosso da un dispositivo:

  • I dati grezzi delle impronte o i 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 all'hardware deve essere limitato al TEE e protetto da norme SELinux. Il canale Serial Peripheral Interface (SPI) deve essere accessibile solo al TEE e deve essere presente una norma SELinux esplicita 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 impronta devono essere firmati con una chiave privata specifica del dispositivo. Per l'Advanced Encryption Standard (AES), un modello deve essere firmato almeno con il percorso assoluto del file system, il gruppo e l'ID impronta in modo che i file del modello non siano utilizzabili su un altro dispositivo o da chiunque altro che non sia l'utente che li ha registrati sullo stesso dispositivo. Ad esempio, copiare i dati delle impronte di un utente diverso sullo stesso dispositivo o da un altro dispositivo non deve funzionare.
  • Le implementazioni devono utilizzare il percorso del file system fornito dalla funzione setActiveGroup() o fornire un modo per cancellare tutti i dati dei modelli utente quando l'utente viene rimosso. È consigliabile che i file modello delle impronte vengano archiviati in formato criptato e nel percorso fornito. Se ciò non è fattibile a causa dei requisiti di archiviazione TEE, l'implementatore deve aggiungere hook per garantire la rimozione dei dati quando l'utente viene rimosso.

Metodi di fingerprinting

L'interfaccia HIDL Fingerprint contiene i seguenti metodi principali in IBiometricsFingerprint.hal.

Metodo Descrizione
enroll() Passa alla macchina a stati HAL per avviare la raccolta e l'archiviazione 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 assicurarsi che sia stata eseguita un'autenticazione precedente, ad esempio utilizzando una password. Per evitare manomissioni, il token viene eseguito il wrapping dopo la conferma delle credenziali del dispositivo. Il token deve essere controllato durante la registrazione per verificare che sia ancora valido.
getAuthenticatorId() Restituisce un token associato al set di impronte corrente.
cancel() Annulla le operazioni di registrazione o autenticazione in attesa. La macchina a stati HAL torna allo stato di inattività.
enumerate() Chiamata sincrona per enumerare tutti i modelli di impronte noti.
remove() Elimina 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 le notifiche dall'HAL. Se la macchina a stati HAL è in uno stato occupato, la funzione viene bloccata finché HAL non esce dallo stato occupato.
postEnroll() Termina l'operazione di registrazione e invalida la sfida preEnroll() generata. Questo metodo deve essere chiamato alla fine di una sessione di registrazione multifinger per indicare che non è possibile aggiungere altre dita.

Per maggiori dettagli, consulta i commenti in IBiometricsFingerprint.hal.