Impronta HIDL

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 (HIDL) delle impronte per connettersi a una libreria specifica del fornitore e al lettore di impronte digitali (ad es. un sensore di impronte digitali).

Per implementare l'HIDL delle impronte, devi implementare IBiometricsFingerprint.hal in una libreria specifica del fornitore.

Corrispondenza delle impronte

Il sensore di impronte digitali di un dispositivo è in genere inattivo. Tuttavia, in risposta a una chiamata a authenticate o enroll, il sensore di impronte ascolta un tocco (lo schermo potrebbe anche riattivarsi quando un utente tocca il sensore di impronte). Il flusso di alto livello 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 delle impronte in il set corrente di modelli di impronte registrati.
  3. I risultati della corrispondenza vengono passati a FingerprintService.

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

Architettura

L'HAL delle impronte 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.
  • L'**HAL delle impronte** è 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 la crittografia 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 delle impronte

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

FingerprintService e fingerprintd effettuano chiamate tramite l'HAL delle impronte alla 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 per l'HAL delle 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 raw delle impronte o i derivati (ad es. 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 policy. Il canale SPI (Serial Peripheral Interface) deve essere accessibile solo a TEE e deve esistere 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 impronte devono essere firmati con una chiave privata specifica del dispositivo. Per l'algoritmo Advanced Encryption Standard (AES), come minimo un modello deve essere firmato con il percorso assoluto del file system, il gruppo e l'ID del dito in modo che i file 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, la copia dei 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 setActiveGroup() funzione o fornire un modo per cancellare tutti i dati dei modelli utente quando l'utente viene rimosso. È vivamente consigliato di archiviare i file dei modelli di impronte in formato criptato e nel percorso fornito. Se ciò 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 delle impronte

L'interfaccia HIDL delle impronte 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 impronta. Al termine della registrazione, o dopo un timeout, la macchina a stati HAL torna allo stato di inattività.
preEnroll() Genera un token univoco per indicare l'inizio della registrazione di un'impronta. Fornisce un token alla funzione enroll per garantire che sia stata eseguita un'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 corrente.
cancel() Annulla le operazioni di registrazione o autenticazione in attesa. La macchina a stati HAL viene riportata 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 set di impronte appartenenti a un gruppo specificato, identificato da un identificatore di gruppo (GID).
authenticate() Autentica un'operazione relativa alle impronte (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 dallo stato di occupazione.
postEnroll() Completa l'operazione di registrazione e invalida la preEnroll() sfida generata. Questa funzione deve essere chiamata alla fine di una sessione di registrazione di più impronte per indicare che non è possibile aggiungere altre impronte.

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