Fingerabdruck-HIDL

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

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 im Leerlauf. Als Reaktion auf einen Aufruf von authenticate oder enroll wartet der Fingerabdrucksensor jedoch auf eine Berührung. Der Bildschirm wird möglicherweise auch aktiviert, wenn ein Nutzer den Fingerabdrucksensor berührt. Der allgemeine Ablauf des Fingerabdruckabgleichs umfasst die folgenden Schritte:

  1. Der Nutzer legt einen Finger auf den Fingerabdrucksensor.
  2. Die anbieterspezifische Bibliothek ermittelt, ob es eine Übereinstimmung mit einem Fingerabdruck in der aktuellen Gruppe registrierter Fingerabdruckvorlagen gibt.
  3. Die Ergebnisse des Abgleichs werden an FingerprintService übergeben.

Bei diesem Ablauf wird davon ausgegangen, dass bereits ein Fingerabdruck auf dem Gerät registriert wurde, d. h. die anbieterspezifische Bibliothek hat eine Vorlage für den Fingerabdruck registriert. 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 Fingerprint HAL übernimmt.
  • Fingerprint HAL ist eine C/C++-Implementierung der IBiometricsFingerprint HIDL-Schnittstelle. Sie enthält die anbieterspezifische Bibliothek die mit der gerätespezifischen Hardware kommuniziert.
  • Die Komponenten Keystore API und KeyMint (ehemals Keymaster) bieten hardwaregestützte Kryptografie für die sichere Speicherung von Schlüsseln in einer vertrauenswürdigen Ausführungsumgebung, wie der Trusted Execution Environment (TEE).
Datenfluss für die Fingerabdruckauthentifizierung
Abbildung 1. Allgemeiner Datenfluss für die Fingerabdruckauthentifizierung

Eine anbieterspezifische HAL-Implementierung muss das von einer TEE erforderliche Kommunikationsprotokoll verwenden. Unbearbeitete Bilder und verarbeitete Fingerabdruckmerkmale dürfen nicht in nicht vertrauenswürdigen Speicher übergeben werden. Alle solchen biometrischen Daten müssen in der sicheren Hardware wie der TEE gespeichert werden. Das Rooting darf biometrische Daten nicht gefährden.

FingerprintService und fingerprintd rufen über die Fingerprint HAL die anbieterspezifische Bibliothek auf, um Fingerabdrücke zu registrieren und andere Vorgänge auszuführen.

Interaktion mit fingerprintd
Abbildung 2. Interaktion des Fingerabdruck-Daemons mit der anbieterspezifischen Fingerabdruckbibliothek

Implementierungsrichtlinien

Die folgenden Richtlinien für die Fingerprint HAL sollen sicherstellen, dass Fingerabdruckdaten nicht offengelegt und entfernt werden, wenn ein Nutzer von einem Gerät entfernt wird:

  • Unbearbeitete Fingerabdruckdaten oder Derivate (z. B. Vorlagen) dürfen niemals zugänglich sein von außerhalb des Sensortreibers oder der TEE. 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) darf nur für die TEE zugänglich sein und für alle Gerätedateien muss eine explizite SELinux-Richtlinie vorhanden sein.
  • 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 werden. Für den Advanced Encryption Standard (AES) muss eine Vorlage mindestens signiert werden mit dem absoluten Dateisystempfad, der Gruppe und der Finger-ID, damit Vorlagendateien auf einem anderen Gerät oder von anderen Nutzern als dem Nutzer, der sie auf demselben Gerät registriert hat, nicht verwendet werden können. Beispielsweise darf das Kopieren von Fingerabdruckdaten von einem anderen Nutzer auf demselben Gerät oder von einem anderen Gerät nicht funktionieren.
  • Bei Implementierungen muss entweder der von der setActiveGroup() Funktion bereitgestellte Dateisystempfad verwendet werden oder es muss eine Möglichkeit vorhanden sein, alle Vorlagendaten des Nutzers zu löschen, wenn der Nutzer entfernt wird. Es wird dringend empfohlen, Fingerabdruckvorlagendateien verschlüsselt im angegebenen Pfad zu speichern. Wenn dies aufgrund der Speicheranforderungen der 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-Schnittstelle enthält die folgenden wichtigen Methoden in IBiometricsFingerprint.hal.

Methode Beschreibung
enroll() Schaltet die HAL-Zustandsmaschine um, um die Erfassung und Speicherung einer Fingerabdruckvorlage zu starten. Nach Abschluss der Registrierung, oder nach einem Timeout kehrt die HAL-Zustandsmaschine in den Leerlauf zurück.
preEnroll() Generiert ein eindeutiges Token, um den Beginn einer Fingerabdruckregistrierung anzugeben. Stellt der Funktion enroll ein Token zur Verfügung, um sicherzustellen, dass zuvor eine Authentifizierung erfolgt ist, z. B. mit einem Passwort. Um Manipulationen zu verhindern, wird das Token umschlossen, nachdem die Geräteanmeldedaten bestätigt wurden. Das Token muss während der Registrierung geprüft werden, um sicherzustellen dass es noch gültig ist.
getAuthenticatorId() Gibt ein Token zurück, das mit der aktuellen Fingerabdruckgruppe verknüpft ist.
cancel() Bricht ausstehende Registrierungs- oder Authentifizierungsvorgänge ab. Die HAL-Zustandsmaschine kehrt in den Leerlauf zurück.
enumerate() Synchroner Aufruf zum Auflisten aller bekannten Fingerabdruckvorlagen.
remove() Löscht eine Fingerabdruckvorlage.
setActiveGroup() Beschränkt einen HAL-Vorgang auf eine Gruppe von Fingerabdrücken, die zu einer bestimmten Gruppe gehören, die durch eine Gruppen-ID (GID) identifiziert wird.
authenticate() Authentifiziert einen Fingerabdruckvorgang (identifiziert durch eine Vorgangs-ID).
setNotify() Registriert eine Nutzerfunktion, die Benachrichtigungen von der HAL empfängt. Wenn sich die HAL-Zustandsmaschine in einem ausgelasteten Zustand befindet, wird die Funktion blockiert, bis die HAL den ausgelasteten Zustand verlässt.
postEnroll() Schließt den Registrierungsvorgang ab und macht die preEnroll() generierte Challenge ungültig. Diese Funktion muss am Ende einer Registrierungssitzung für mehrere Finger aufgerufen werden, um anzugeben, dass keine weiteren Finger hinzugefügt werden dürfen.

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