Empreintes digitales HIDL

Sur les appareils dotés d'un capteur d'empreintes digitales, les utilisateurs peuvent enregistrer une ou plusieurs empreintes digitales et utiliser ces empreintes digitales pour déverrouiller l'appareil et effectuer d'autres tâches. Android utilise le langage HIDL (Empreinte Hardware Interface Definition Language) pour se connecter à une bibliothèque spécifique au fournisseur et à un matériel d'empreinte digitale (par exemple, un capteur d'empreintes digitales).

Pour implémenter Fingerprint HIDL, vous devez implémenter IBiometricsFingerprint.hal dans une bibliothèque spécifique au fournisseur.

Correspondance d'empreintes digitales

Le capteur d’empreintes digitales d’un appareil est généralement inactif. Cependant, en réponse à un appel pour authenticate ou enroll , le capteur d'empreintes digitales écoute un contact (l'écran peut également se réveiller lorsqu'un utilisateur touche le capteur d'empreintes digitales). Le flux de haut niveau de correspondance d’empreintes digitales comprend les étapes suivantes :

  1. L'utilisateur place un doigt sur le capteur d'empreintes digitales.
  2. La bibliothèque spécifique au fournisseur détermine s'il existe une correspondance d'empreinte digitale dans l'ensemble actuel de modèles d'empreintes digitales inscrits.
  3. Les résultats correspondants sont transmis à FingerprintService .

Ce flux suppose qu'une empreinte digitale a déjà été enregistrée sur l'appareil, c'est-à-dire que la bibliothèque spécifique au fournisseur a enregistré un modèle pour l'empreinte digitale. Pour plus de détails, voir Authentification .

Architecture

Le HAL d'empreintes digitales interagit avec les composants suivants.

  • BiometricManager interagit directement avec une application dans un processus d'application. Chaque application possède une instance de IBiometricsFingerprint.hal
  • FingerprintService fonctionne dans le processus système, qui gère la communication avec l'empreinte digitale HAL.
  • Fingerprint HAL est une implémentation C/C++ de l'interface IBiometricsFingerprint HIDL. Celui-ci contient la bibliothèque spécifique au fournisseur qui communique avec le matériel spécifique au périphérique.
  • L'API Keystore et les composants Keymaster fournissent une cryptographie matérielle pour un stockage sécurisé des clés dans un environnement sécurisé, tel que Trusted Execution Environment (TEE).
Flux de données pour l'authentification par empreinte digitale
Figure 1. Flux de données de haut niveau pour l'authentification par empreinte digitale

Une implémentation HAL spécifique au fournisseur doit utiliser le protocole de communication requis par un TEE. Les images brutes et les caractéristiques d’empreintes digitales traitées ne doivent pas être transmises dans une mémoire non fiable. Toutes ces données biométriques doivent être stockées dans un matériel sécurisé tel que le TEE. Le rooting ne doit pas pouvoir compromettre les données biométriques.

FingerprintService et fingerprintd effectuent des appels via Fingerprint HAL vers la bibliothèque spécifique au fournisseur pour enregistrer les empreintes digitales et effectuer d'autres opérations.

Interaction avec les empreintes digitales
Figure 2. Interaction du démon d'empreintes digitales avec la bibliothèque spécifique au fournisseur d'empreintes digitales

Lignes directrices de mise en œuvre

Les directives HAL d'empreintes digitales suivantes sont conçues pour garantir que les données d'empreintes digitales ne sont pas divulguées et sont supprimées lorsqu'un utilisateur est supprimé d'un appareil :

  • Les données brutes d'empreintes digitales ou leurs dérivés (par exemple, les modèles) ne doivent jamais être accessibles depuis l'extérieur du pilote du capteur ou du TEE. Si le matériel prend en charge un TEE, l'accès au matériel doit être limité au TEE et protégé par une politique SELinux. Le canal SPI (Serial Peripheral Interface) doit être accessible uniquement au TEE et il doit y avoir une politique SELinux explicite sur tous les fichiers de périphérique.
  • L'acquisition, l'enregistrement et la reconnaissance des empreintes digitales doivent avoir lieu à l'intérieur du TEE.
  • Seule la forme cryptée des données d'empreintes digitales peut être stockée sur le système de fichiers, même si le système de fichiers lui-même est crypté.
  • Les modèles d’empreintes digitales doivent être signés avec une clé privée spécifique à l’appareil. Pour Advanced Encryption Standard (AES), au minimum, un modèle doit être signé avec le chemin absolu du système de fichiers, le groupe et l'ID de doigt, de sorte que les fichiers modèles soient inutilisables sur un autre appareil ou pour toute personne autre que l'utilisateur qui les a inscrits sur le même appareil. Par exemple, la copie des données d'empreintes digitales d'un autre utilisateur sur le même appareil ou depuis un autre appareil ne doit pas fonctionner.
  • Les implémentations doivent soit utiliser le chemin du système de fichiers fourni par la fonction setActiveGroup() , soit fournir un moyen d'effacer toutes les données du modèle utilisateur lorsque l'utilisateur est supprimé. Il est fortement recommandé que les fichiers de modèles d'empreintes digitales soient stockés sous forme chiffrée et stockés dans le chemin fourni. Si cela est impossible en raison des exigences de stockage TEE, l'implémenteur doit ajouter des hooks pour garantir la suppression des données lorsque l'utilisateur est supprimé.

Méthodes d'empreintes digitales

L'interface Fingerprint HIDL contient les principales méthodes suivantes dans IBiometricsFingerprint.hal .

Méthode Description
enroll() Commute la machine à états HAL pour démarrer la collecte et le stockage d’un modèle d’empreinte digitale. Une fois l'inscription terminée ou après un délai d'attente, la machine à états HAL revient à l'état inactif.
preEnroll() Génère un jeton unique pour indiquer le début d’un enregistrement d’empreinte digitale. Fournit un jeton à la fonction enroll pour garantir qu’il y a eu une authentification préalable, par exemple à l’aide d’un mot de passe. Pour éviter toute falsification, le jeton est enveloppé une fois les informations d'identification de l'appareil confirmées. Le jeton doit être vérifié lors de l'inscription pour vérifier qu'il est toujours valide.
getAuthenticatorId() Renvoie un jeton associé au jeu d'empreintes digitales actuel.
cancel() Annule les opérations d’inscription ou d’authentification en attente. La machine à états HAL revient à l'état inactif.
enumerate() Appel synchrone pour énumérer tous les modèles d’empreintes digitales connus.
remove() Supprime un modèle d'empreinte digitale.
setActiveGroup() Restreint une opération HAL à un ensemble d'empreintes digitales appartenant à un groupe spécifié, identifié par un identifiant de groupe (GID).
authenticate() Authentifie une opération liée aux empreintes digitales (identifiée par un ID d'opération).
setNotify() Enregistre une fonction utilisateur qui reçoit des notifications de HAL. Si la machine à états HAL est dans un état occupé, la fonction est bloquée jusqu'à ce que la HAL quitte l'état occupé.
postEnroll() Termine l'opération d'inscription et invalide le défi généré par preEnroll() . Celui-ci doit être appelé à la fin d'une session d'inscription multi-doigts pour indiquer qu'aucun autre doigt ne peut être ajouté.

Pour plus de détails à ce sujet, reportez-vous aux commentaires dans IBiometricsFingerprint.hal .