HIDL d'empreinte digitale

Sur les appareils équipés d'un capteur 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 de définition d'interface matérielle (HIDL) pour empreintes digitales afin de se connecter à une bibliothèque spécifique au fournisseur et au matériel d'empreintes digitales (par exemple, un capteur d'empreintes digitales).

Pour implémenter le HIDL d'empreinte digitale, 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 capteur d'empreinte digitale détecte un contact (l'écran peut également s'allumer lorsqu'un utilisateur touche le capteur d'empreinte digitale). Le processus de 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 s'il existe une empreinte digitale correspondante dans 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 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 en savoir plus, consultez la section Authentification.

Architecture

Le HAL d'empreinte digitale 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 le HAL d'empreinte digitale.
  • Fingerprint HAL est une implémentation C/C++ de l'interface IBiometricsFingerprint HIDL. Elle contient la bibliothèque spécifique au fournisseur qui communique avec le matériel spécifique à l'appareil.
  • Les composants Keystore API et KeyMint (anciennement Keymaster) fournissent un chiffrement 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 caractéristiques 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 le matériel sécurisé, tel que l'environnement d'exécution sécurisé (TEE). L'activation du mode root ne doit pas pouvoir compromettre les données biométriques.

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

Interaction avec fingerprintd
Figure 2. Interaction du démon 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 sont supprimées lorsqu'un utilisateur est supprimé d'un appareil :

  • Les données brutes d'empreinte digitale ou leurs dérivés (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) doit être accessible uniquement au TEE, et une règle SELinux explicite doit s'appliquer à tous les fichiers de l'appareil.
  • L'acquisition, l'enregistrement et la reconnaissance de l'empreinte digitale doivent avoir lieu 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'empreintes digitales doivent être signés avec une clé privée spécifique à l'appareil. Pour la norme AES (Advanced Encryption Standard), un modèle doit au minimum être signé avec le chemin d'accès absolu au système de fichiers, le groupe et l'ID d'empreinte digitale, de sorte que les fichiers de modèle soient inutilisables sur un autre appareil ou par toute personne 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 du système de fichiers fourni par la fonction setActiveGroup() ou fournir un moyen d'effacer toutes les données de modèle utilisateur lorsque l'utilisateur est supprimé. Nous vous recommandons vivement de stocker les fichiers de modèles d'empreintes digitales sous forme chiffrée et dans le chemin d'accès fourni. Si cela n'est pas possible en raison des exigences de stockage TEE, l'implémenteur doit ajouter des hooks pour s'assurer que les données sont supprimées lorsque l'utilisateur est supprimé.

Méthodes d'empreinte digitale

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

Méthode Description
enroll() Permet à la machine à états HAL de 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 d'inactivité, la machine à états HAL revient à l'état inactif.
preEnroll() Génère un jeton unique pour indiquer le début de l'enregistrement d'une empreinte digitale. Fournit un jeton à la fonction enroll pour s'assurer qu'une authentification préalable a été effectuée, 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'ensemble d'empreintes digitales actuel.
cancel() Annule les opérations d'enregistrement 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 à l'empreinte digitale (identifiée par un ID d'opération).
setNotify() Enregistre une fonction utilisateur qui reçoit des notifications du HAL. Si la machine à états HAL est occupée, la fonction est bloquée jusqu'à ce que HAL quitte l'état occupé.
postEnroll() Termine l'opération d'enregistrement et invalide le défi preEnroll() généré. Cette méthode doit être appelée à la fin d'une session d'enregistrement de plusieurs empreintes digitales pour indiquer qu'aucun autre doigt ne peut être ajouté.

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