Empreinte HIDL

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

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

Correspondance des empreintes digitales

Le lecteur d'empreinte digitale d'un appareil est généralement inactif. Toutefois, en réponse à un appel à authenticate ou enroll, le lecteur d'empreinte digitale écoute un appui (l'écran peut également se réveiller lorsqu'un utilisateur appuie sur le lecteur d'empreinte digitale). Le flux de haut niveau de la mise en correspondance des empreintes digitales comprend les étapes suivantes:

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

Ce flux suppose qu'une empreinte 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. Pour en savoir plus, consultez la section Authentification.

Architecture

Le HAL Fingerprint interagit avec les composants suivants.

  • BiometricManager interagit directement avec une application dans un processus d'application. Chaque application dispose d'une instance de IBiometricsFingerprint.hal.
  • FingerprintService fonctionne dans le processus système, qui gère la communication avec le HAL d'empreinte digitale.
  • Le HAL d'empreinte digitale est une implémentation C/C++ de l'interface HIDL IBiometricsFingerprint. Il contient la bibliothèque spécifique au fournisseur qui communique avec le matériel spécifique à l'appareil.
  • Les composants API Keystore et Keymaster fournissent une cryptographie basée sur le matériel pour le stockage sécurisé des clés dans un environnement sécurisé, tel que l'environnement d'exécution sécurisé (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 fonctionnalités d'empreinte digitale traitées ne doivent pas être transmises dans une mémoire non fiable. Toutes ces données biométriques doivent être stockées dans du matériel sécurisé, tel que le TEE. L'activation du mode root ne doit pas compromettre la sécurité des données biométriques.

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

Interaction avec fingerprintd
Figure 2. Interaction du daemon d'empreinte digitale avec la bibliothèque spécifique au fournisseur d'empreinte digitale

Consignes d'implémentation

Les consignes suivantes concernant le HAL d'empreinte digitale sont conçues pour garantir que les données d'empreinte digitale ne sont pas divulguées et qu'elles sont supprimées lorsqu'un utilisateur est supprimé d'un appareil:

  • Les données d'empreinte digitale brutes ou les dérivées (par exemple, les modèles) ne doivent jamais être accessibles en dehors du pilote du capteur ou du TEE. Si le matériel est compatible avec un TEE, l'accès au matériel doit se limiter au TEE et être protégé par une règle SELinux. Le canal SPI (Serial Peripheral Interface) ne doit être accessible qu'au TEE, et une règle SELinux explicite doit être appliquée à tous les fichiers de l'appareil.
  • L'acquisition, l'enregistrement et la reconnaissance des empreintes digitales doivent se produire dans le TEE.
  • Seule la version chiffrée des données concernant votre empreinte digitale peut être stockée dans le système de fichiers, même si celui-ci est lui-même chiffré.
  • Les modèles d'empreinte digitale doivent être signés à l'aide d'une clé privée spécifique à l'appareil. Pour AES (Advanced Encryption Standard), un modèle doit au minimum être signé avec le chemin d'accès au système de fichiers absolu, le groupe et l'ID de l'empreinte, de sorte que les fichiers de modèle ne puissent pas être utilisés sur un autre appareil ni par quiconque autre que l'utilisateur qui les a enregistrés sur le même appareil. Par exemple, il ne doit pas être possible de copier les données concernant l'empreinte digitale d'un autre utilisateur ou issues d'un autre appareil sur l'appareil en question.
  • Les implémentations doivent utiliser le chemin d'accès au système de fichiers fourni par la fonction setActiveGroup() ou fournir un moyen d'effacer toutes les données du modèle utilisateur lorsque l'utilisateur est supprimé. Il est fortement recommandé de stocker les fichiers de modèle d'empreinte digitale de manière chiffrée dans le chemin d'accès fourni. Si cela n'est pas possible en raison des exigences de stockage du TEE, l'implémentateur doit ajouter des crochets pour s'assurer de la suppression des données lorsque l'utilisateur est supprimé.

Méthodes d'empreinte digitale

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

Méthode Description
enroll() Active la machine d'état HAL pour démarrer la collecte et le stockage d'un modèle d'empreinte digitale. Une fois l'enregistrement terminé ou après un délai avant expiration, la machine d'état HAL revient à l'état d'inactivité.
preEnroll() Génère un jeton unique pour indiquer le début d'une inscription par empreinte digitale. Fournit un jeton à la fonction enroll pour s'assurer qu'une authentification préalable a eu lieu, par exemple à l'aide d'un mot de passe. Pour éviter toute falsification, le jeton est encapsulé une fois les identifiants de l'appareil confirmés. Le jeton doit être vérifié lors de l'enregistrement pour s'assurer qu'il est toujours valide.
getAuthenticatorId() Renvoie un jeton associé à l'empreinte numérique actuelle.
cancel() Annule les opérations d'enregistrement ou d'authentification en attente. La machine d'état HAL est renvoyée à l'état inactif.
enumerate() Appel synchrone pour énumérer tous les modèles d'empreintes connus.
remove() Supprime un modèle d'empreinte digitale.
setActiveGroup() Limite 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 à une empreinte (identifiée par un ID d'opération).
setNotify() Enregistre une fonction utilisateur qui reçoit des notifications de la part du HAL. Si la machine d'état HAL est dans un état occupé, la fonction est bloquée jusqu'à ce que le HAL quitte l'état occupé.
postEnroll() Termine l'opération d'enregistrement et invalide le défi généré par preEnroll(). Cette méthode doit être appelée à la fin d'une session d'enregistrement à plusieurs doigts pour indiquer qu'aucun autre doigt ne peut être ajouté.

Pour en savoir plus, consultez les commentaires dans IBiometricsFingerprint.hal.