Impronta digitale HIDL

Sui dispositivi con un sensore di impronte digitali, gli utenti possono registrare una o più impronte digitali e utilizzarle per sbloccare il dispositivo ed eseguire altre attività. Android utilizza il linguaggio HIDL (Fingerprint Hardware Interface Definition Language) per connettersi a una libreria specifica del fornitore e all'hardware delle impronte digitali (ad esempio, un sensore di impronte digitali).

Per implementare Fingerprint HIDL, è necessario implementare IBiometricsFingerprint.hal in una libreria specifica del fornitore.

Corrispondenza delle impronte digitali

Il sensore di impronte digitali di un dispositivo è generalmente inattivo. Tuttavia, in risposta a una chiamata per authenticate o enroll , il sensore di impronte digitali ascolta un tocco (lo schermo potrebbe anche riattivarsi quando un utente tocca il sensore di impronte digitali). Il flusso di alto livello della corrispondenza delle impronte digitali include i seguenti passaggi:

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

Questo flusso presuppone che un'impronta digitale sia già stata registrata sul dispositivo, ovvero che la libreria specifica del fornitore abbia registrato un modello per l'impronta digitale. Per ulteriori dettagli, vedere Autenticazione .

Architettura

Il Fingerprint HAL 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 digitali.
  • Fingerprint HAL è un'implementazione C/C++ dell'interfaccia IBiometricsFingerprint HIDL. Contiene la libreria specifica del fornitore che comunica con l'hardware specifico del dispositivo.
  • L'API Keystore e i componenti Keymaster forniscono crittografia basata su hardware per l'archiviazione sicura delle chiavi in ​​un ambiente protetto, come Trusted Execution Environment (TEE).
Flusso di dati per l'autenticazione dell'impronta digitale
Figura 1. Flusso di dati di alto livello per l'autenticazione delle impronte digitali

Un'implementazione HAL specifica del fornitore deve utilizzare il protocollo di comunicazione richiesto da un TEE. Le immagini grezze e le caratteristiche delle impronte digitali elaborate non devono essere trasferite in una memoria non attendibile. Tutti questi dati biometrici devono essere archiviati nell'hardware sicuro come il TEE. Il rooting non deve poter compromettere i dati biometrici.

FingerprintService e fingerprintd effettuano chiamate tramite Fingerprint HAL alla libreria specifica del fornitore per registrare le impronte digitali ed eseguire altre operazioni.

Interazione con le impronte digitali
Figura 2. Interazione del demone delle impronte digitali con la libreria specifica del fornitore di impronte digitali

Linee guida per l'attuazione

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

  • I dati grezzi delle impronte digitali o derivati ​​(ad esempio, 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 una policy SELinux. Il canale SPI (Serial Peripheral Interface) deve essere accessibile solo al TEE e deve essere presente una policy SELinux esplicita su tutti i file del dispositivo.
  • L'acquisizione, la registrazione e il riconoscimento delle impronte digitali devono avvenire all'interno del TEE.
  • Solo la forma crittografata dei dati dell'impronta digitale può essere archiviata nel file system, anche se il file system stesso è crittografato.
  • I modelli di impronte digitali devono essere firmati con una chiave privata specifica del dispositivo. Per Advanced Encryption Standard (AES), almeno un modello deve essere firmato con il percorso del file system assoluto, il gruppo e l'ID del dito in modo tale che i file del modello non siano utilizzabili su un altro dispositivo o per chiunque non sia l'utente che li ha registrati sul stesso dispositivo. Ad esempio, la copia dei dati delle impronte digitali da un altro utente 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 del modello utente quando l'utente viene rimosso. Si consiglia vivamente di archiviare i file dei modelli di impronte digitali come crittografati e archiviati 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 impronte digitali

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

Metodo Descrizione
enroll() Commuta la macchina a stati HAL per avviare la raccolta e l'archiviazione di un modello di impronte digitali. 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 della registrazione di un'impronta digitale. Fornisce un token alla funzione enroll per garantire l'autenticazione precedente, ad esempio utilizzando una password. Per evitare manomissioni, il token viene sottoposto a 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 digitali corrente.
cancel() Annulla le operazioni di registrazione o autenticazione in sospeso. La macchina a stati HAL viene riportata allo stato inattivo.
enumerate() Chiamata sincrona per l'enumerazione di tutti i modelli di impronte digitali noti.
remove() Elimina un modello di impronta digitale.
setActiveGroup() Limita un'operazione HAL a un set di impronte digitali che appartengono a un gruppo specificato, identificato da un identificatore di gruppo (GID).
authenticate() Autentica un'operazione correlata all'impronta digitale (identificata da un ID operazione).
setNotify() Registra una funzione utente che riceve notifiche dall'HAL. Se la macchina a stati HAL è in uno stato occupato, la funzione è bloccata finché l'HAL non esce dallo stato occupato.
postEnroll() Termina l'operazione di registrazione e invalida la sfida generata preEnroll() . Questo deve essere chiamato al termine di una sessione di registrazione con più dita per indicare che non è possibile aggiungere altre dita.

Per maggiori dettagli su questi, fare riferimento ai commenti in IBiometricsFingerprint.hal .