HIDL delle impronte digitali

Sui dispositivi dotati di 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 Fingerprint Hardware Interface Definition Language (HIDL) 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 di 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 di alto livello della corrispondenza delle impronte digitali comprende 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 dell'impronta digitale 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 maggiori dettagli, vedere 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 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.
  • I componenti API Keystore e Keymaster forniscono crittografia supportata da hardware per l'archiviazione sicura delle chiavi in ​​un ambiente protetto, come il Trusted Execution Environment (TEE).
Flusso di dati per l'autenticazione delle impronte digitali
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 funzionalità delle impronte digitali elaborate non devono essere passate nella memoria non attendibile. Tutti questi dati biometrici devono essere archiviati in un hardware sicuro come il TEE. Il rooting non deve poter compromettere i dati biometrici.

FingerprintService e fingerprintd effettuano chiamate tramite l'HAL Fingerprint 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 delle impronte digitali

Linee guida per l'attuazione

Le seguenti linee guida HAL per le impronte digitali 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 o i derivati ​​delle impronte digitali (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 una policy SELinux. Il canale SPI (Serial Peripheral Interface) deve essere accessibile solo al TEE e deve esserci una politica SELinux esplicita su tutti i file del dispositivo.
  • L'acquisizione, la registrazione e il riconoscimento dell'impronta digitale 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), come minimo un modello deve essere firmato con il percorso assoluto del file system, il gruppo e l'ID finger in modo che i file modello non siano utilizzabili su un altro dispositivo o per chiunque diverso dall'utente che li ha registrati sul stesso dispositivo. Ad esempio, la copia dei dati dell'impronta digitale 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 del modello utente quando l'utente viene rimosso. Si consiglia vivamente di archiviare i file dei modelli di impronte digitali come crittografati e archiviarli 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() Cambia la macchina a stati dell'HAL per avviare la raccolta e l'archiviazione di un modello di impronta digitale. Una volta completata la registrazione o dopo un timeout, la macchina a stati HAL ritorna allo stato inattivo.
preEnroll() Genera un token univoco per indicare l'inizio della registrazione dell'impronta digitale. Fornisce un token alla funzione enroll per garantire che sia stata effettuata un'autenticazione preventiva, ad esempio utilizzando una password. Per evitare manomissioni, il token viene incapsulato 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 conosciuti.
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 relativa alle impronte digitali (identificata da un ID operazione).
setNotify() Registra una funzione utente che riceve notifiche dall'HAL. Se la macchina a stati dell'HAL è in stato occupato, la funzione viene bloccata finché l'HAL non lascia lo 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 multifinger per indicare che non possono essere aggiunte altre dita.

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