Fingerabdruck-HIDL

Auf Geräten mit Fingerabdrucksensor können Nutzer einen oder mehrere Fingerabdrücke registrieren und diese Fingerabdrücke verwenden, um das Gerät zu entsperren und andere Aufgaben auszuführen. Android verwendet die Fingerprint Hardware Interface Definition Language (HIDL), um eine Verbindung zu einer anbieterspezifischen Bibliothek und Fingerabdruckhardware herzustellen (z. B. einem Fingerabdrucksensor).

Wenn Sie die Fingerprint-HIDL implementieren möchten, müssen Sie IBiometricsFingerprint.hal in einer anbieterspezifischen Bibliothek implementieren.

Fingerabdruckabgleich

Der Fingerabdrucksensor eines Geräts ist in der Regel inaktiv. Bei einem Aufruf von authenticate oder enroll wartet der Fingerabdrucksensor jedoch auf eine Berührung. Das Display kann auch aktiviert werden, wenn ein Nutzer den Fingerabdrucksensor berührt. Der Ablauf der Fingerabdruckabgleiche umfasst die folgenden Schritte:

  1. Der Nutzer legt einen Finger auf den Fingerabdrucksensor.
  2. Die anbieterspezifische Bibliothek bestimmt, ob es in der aktuellen Gruppe der registrierten Fingerabdruckvorlagen eine Übereinstimmung gibt.
  3. Übereinstimmende Ergebnisse werden an FingerprintService übergeben.

Bei diesem Ablauf wird davon ausgegangen, dass bereits ein Fingerabdruck auf dem Gerät registriert wurde, d. h., dass die anbieterspezifische Bibliothek eine Vorlage für den Fingerabdruck registriert hat. Weitere Informationen finden Sie unter Authentifizierung.

Architektur

Die Fingerprint HAL interagiert mit den folgenden Komponenten.

  • BiometricManager interagiert direkt mit einer App in einem App-Prozess. Jede App hat eine Instanz von IBiometricsFingerprint.hal.
  • FingerprintService wird im Systemprozess ausgeführt, der die Kommunikation mit der Fingerabdruck-HAL verwaltet.
  • Fingerprint HAL ist eine C/C++-Implementierung der HIDL-Schnittstelle IBiometricsFingerprint. Diese enthält die anbieterspezifische Bibliothek, die mit der gerätespezifischen Hardware kommuniziert.
  • Die Komponenten Keystore API und Keymaster bieten hardwaregestützte Kryptografie für den sicheren Schlüsselspeicher in einer sicheren Umgebung wie der Trusted Execution Environment (TEE).
Datenfluss bei der Fingerabdruckauthentifizierung
Abbildung 1. Datenfluss für die Fingerabdruckauthentifizierung

Eine anbieterspezifische HAL-Implementierung muss das von einer TEE erforderliche Kommunikationsprotokoll verwenden. Rohbilder und verarbeitete Fingerabdruckmerkmale dürfen nicht an nicht vertrauenswürdigen Speicher übergeben werden. Alle diese biometrischen Daten müssen auf sicherer Hardware wie dem TEE gespeichert werden. Das Rooten darf keine Auswirkungen auf biometrische Daten haben.

FingerprintService und fingerprintd führen über die Fingerprint HAL Aufrufe an die anbieterspezifische Bibliothek aus, um Fingerabdrücke zu registrieren und andere Vorgänge auszuführen.

Interaktion mit fingerprintd
Abbildung 2. Interaktion des Fingerabdruck-Daemons mit der fingerabdruckspezifischen Bibliothek des Anbieters

Implementierungsrichtlinien

Die folgenden HAL-Richtlinien für Fingerabdrücke sollen dafür sorgen, dass Fingerabdruckdaten nicht gehackt und entfernt werden, wenn ein Nutzer von einem Gerät entfernt wird:

  • Auf Rohfingerabdruckdaten oder abgeleitete Daten (z. B. Vorlagen) darf niemals von außerhalb des Sensortreibers oder der TEE zugegriffen werden. Wenn die Hardware eine TEE unterstützt, muss der Hardwarezugriff auf die TEE beschränkt und durch eine SELinux-Richtlinie geschützt sein. Der SPI-Kanal (Serial Peripheral Interface) muss nur für die TEE zugänglich sein und es muss eine explizite SELinux-Richtlinie für alle Gerätedateien geben.
  • Die Erfassung, Registrierung und Erkennung von Fingerabdrücken muss innerhalb der TEE erfolgen.
  • Im Dateisystem darf nur die verschlüsselte Version der Fingerabdruckdaten abgespeichert werden, auch wenn das Dateisystem selbst verschlüsselt ist.
  • Fingerabdruckvorlagen müssen mit einem privaten, gerätespezifischen Schlüssel signiert sein. Beim Advanced Encryption Standard (AES) muss eine Vorlage mindestens mit dem absoluten Dateisystempfad, der Gruppe und der Fingerabdruck-ID signiert sein, damit Vorlagendateien auf einem anderen Gerät oder für andere Nutzer als denjenigen, der sie auf demselben Gerät registriert hat, nicht verwendet werden können. So ist es beispielsweise nicht möglich, die Fingerabdruckdaten eines anderen Nutzers desselben Geräts oder von einem anderen Gerät zu kopieren.
  • Bei Implementierungen muss entweder der von der Funktion setActiveGroup() bereitgestellte Dateisystempfad verwendet werden oder es muss eine Möglichkeit zum Löschen aller Nutzervorlagedaten beim Entfernen des Nutzers vorhanden sein. Wir empfehlen dringend, Fingerabdruckvorlagendateien verschlüsselt und im angegebenen Pfad zu speichern. Wenn dies aufgrund der Speicheranforderungen von TEE nicht möglich ist, muss der Implementierer Hooks hinzufügen, um sicherzustellen, dass die Daten entfernt werden, wenn der Nutzer entfernt wird.

Fingerabdruckmethoden

Die Fingerprint-HIDL-Oberfläche enthält die folgenden Hauptmethoden in IBiometricsFingerprint.hal.

Method Beschreibung
enroll() Schaltet den HAL-Statusautomaten um, um die Erfassung und Speicherung einer Fingerabdruckvorlage zu starten. Nach Abschluss der Registrierung oder nach einer Zeitüberschreitung kehrt der HAL-Statusautomat in den Inaktivitätsstatus zurück.
preEnroll() Generiert ein eindeutiges Token, um den Beginn der Fingerabdruckregistrierung anzugeben. Stellt der Funktion enroll ein Token zur Verfügung, um sicherzustellen, dass zuvor eine Authentifizierung stattgefunden hat, z. B. mit einem Passwort. Um Manipulationen zu verhindern, wird das Token nach der Bestätigung der Geräteanmeldedaten verpackt. Das Token muss bei der Registrierung geprüft werden, um sicherzustellen, dass es noch gültig ist.
getAuthenticatorId() Gibt ein Token zurück, das mit dem aktuellen Fingerabdrucksatz verknüpft ist.
cancel() Abbrechen ausstehender Registrierungs- oder Authentifizierungsvorgänge. Der HAL-Statusautomat kehrt in den Inaktivitätsstatus zurück.
enumerate() Synchroner Aufruf zum Auflisten aller bekannten Fingerabdruckvorlagen.
remove() Löscht eine Fingerabdruckvorlage.
setActiveGroup() Beschränkt einen HAL-Vorgang auf eine Reihe von Fingerabdrücken, die zu einer bestimmten Gruppe gehören, die durch eine Gruppen-ID (GID) identifiziert wird.
authenticate() Authentifiziert einen fingerabdruckbezogenen Vorgang (identifiziert durch eine Vorgangs-ID).
setNotify() Registriert eine Nutzerfunktion, die Benachrichtigungen von der HAL empfängt. Wenn sich der HAL-Zustandsautomat im Status „Beschäftigt“ befindet, wird die Funktion blockiert, bis der HAL diesen Status verlässt.
postEnroll() Schließt den Registrierungsvorgang ab und macht die von preEnroll() generierte Herausforderung ungültig. Diese Funktion muss am Ende einer Registrierungssitzung mit mehreren Fingern aufgerufen werden, um anzugeben, dass keine weiteren Finger hinzugefügt werden können.

Weitere Informationen dazu finden Sie in den Kommentaren unter IBiometricsFingerprint.hal.