Huella digital HIDL

En dispositivos con un sensor de huellas dactilares, los usuarios pueden inscribir una o más huellas dactilares y usarlas para desbloquear el dispositivo y realizar otras tareas. Android usa el lenguaje de definición de interfaz de hardware de huellas dactilares (HIDL) para conectarse a una biblioteca específica del proveedor y a hardware de huellas dactilares (por ejemplo, un sensor de huellas dactilares).

Para implementar el HIDL de huellas dactilares, debes implementar IBiometricsFingerprint.hal en una biblioteca específica del proveedor.

Coincidencia de huellas dactilares

Por lo general, el sensor de huellas dactilares de un dispositivo está inactivo. Sin embargo, en respuesta a una llamada a authenticate o enroll, el sensor de huellas dactilares detecta un toque (la pantalla también puede activarse cuando un usuario toca el sensor de huellas dactilares). El flujo de alto nivel de coincidencia de huellas digitales incluye los siguientes pasos:

  1. El usuario coloca un dedo en el sensor de huellas dactilares.
  2. La biblioteca específica del proveedor determina si hay una coincidencia de huellas digitales en el conjunto actual de plantillas de huellas digitales inscritas.
  3. Los resultados que coinciden se pasan a FingerprintService.

En este flujo, se supone que ya se inscribió una huella dactilar en el dispositivo, es decir, que la biblioteca específica del proveedor inscribió una plantilla para la huella dactilar. Para obtener más detalles, consulta Autenticación.

Arquitectura

El HAL de huellas dactilares interactúa con los siguientes componentes.

  • BiometricManager interactúa directamente con una app en un proceso de la app. Cada app tiene una instancia de IBiometricsFingerprint.hal.
  • FingerprintService funciona en el proceso del sistema, que controla la comunicación con el HAL de huellas dactilares.
  • El HAL de huellas dactilares es una implementación en C/C++ de la interfaz HIDL IBiometricsFingerprint. Contiene la biblioteca específica del proveedor que se comunica con el hardware específico del dispositivo.
  • Los componentes de la API de Keystore y Keymaster proporcionan criptografía respaldada por hardware para el almacenamiento seguro de claves en un entorno seguro, como el entorno de ejecución confiable (TEE).
Flujo de datos para la autenticación con huellas dactilares
Figura 1: Flujo de datos de alto nivel para la autenticación con huellas dactilares

Una implementación de HAL específica del proveedor debe usar el protocolo de comunicación que requiere un TEE. Las imágenes sin procesar y las funciones de huellas dactilares procesadas no deben pasarse a una memoria no confiable. Todos estos datos biométricos deben almacenarse en el hardware seguro, como el TEE. El acceso a la raíz no debe poder vulnerar los datos biométricos.

FingerprintService y fingerprintd realizan llamadas a través del HAL de huellas dactilares a la biblioteca específica del proveedor para inscribir huellas dactilares y realizar otras operaciones.

Interacción con fingerprintd
Figura 2: Interacción del daemon de huellas dactilares con la biblioteca específica del proveedor de huellas dactilares

Lineamientos de implementación

Los siguientes lineamientos de HAL de huellas dactilares están diseñados para garantizar que los datos de huellas dactilares no se filtren y se quiten cuando se quite un usuario de un dispositivo:

  • Nunca se debe poder acceder a los datos sin procesar de la huella digital ni a sus derivados (por ejemplo, plantillas) desde fuera del controlador de sensor o el TEE. Si el hardware admite un TEE, el acceso al hardware debe limitarse al TEE y estar protegido por una política de SELinux. Solo el TEE debe poder acceder al canal de la interfaz periférica serial (SPI) y debe haber una política SELinux explícita en todos los archivos del dispositivo.
  • La adquisición, la inscripción y el reconocimiento de huellas dactilares deben ocurrir dentro del TEE.
  • Solo se puede almacenar en el sistema de archivos la forma encriptada de los datos de la huella digital, incluso si el sistema de archivos está encriptado.
  • Las plantillas de huellas dactilares deben firmarse con una clave privada específica del dispositivo. En el caso del estándar de encriptación avanzada (AES), como mínimo, se debe firmar una plantilla con la ruta de acceso, el grupo y el ID de dedo absolutos del sistema de archivos, de modo que los archivos de plantilla no se puedan usar en otro dispositivo ni para ninguna otra persona que no sea el usuario que los inscribió en el mismo dispositivo. Por ejemplo, no debe funcionar copiar datos de huellas dactilares de un usuario diferente en el mismo dispositivo o desde otro dispositivo.
  • Las implementaciones deben usar la ruta de acceso del sistema de archivos que proporciona la función setActiveGroup() o proporcionar una forma de borrar todos los datos de la plantilla del usuario cuando se quita. Se recomienda encarecidamente que los archivos de plantilla de huellas digitales se almacenen encriptados y en la ruta de acceso proporcionada. Si esto no es posible debido a los requisitos de almacenamiento de TEE, el implementador debe agregar hooks para garantizar la eliminación de los datos cuando se quite el usuario.

Métodos de huellas dactilares

La interfaz de HIDL de huellas dactilares contiene los siguientes métodos principales en IBiometricsFingerprint.hal.

Método Descripción
enroll() Cambia la máquina de estados de HAL para iniciar la recopilación y el almacenamiento de una plantilla de huellas dactilares. Cuando se completa la inscripción o después de un tiempo de espera, la máquina de estados de HAL vuelve al estado inactivo.
preEnroll() Genera un token único para indicar el inicio de una inscripción de huella digital. Proporciona un token a la función enroll para asegurarte de que haya habido una autenticación previa, por ejemplo, con una contraseña. Para evitar alteraciones, el token se une después de que se confirma la credencial del dispositivo. El token se debe verificar durante la inscripción para confirmar que siga siendo válido.
getAuthenticatorId() Muestra un token asociado con el conjunto de huellas digitales actual.
cancel() Cancela las operaciones de inscripción o autenticación pendientes. La máquina de estados de HAL vuelve al estado inactivo.
enumerate() Llamada síncrona para enumerar todas las plantillas de huellas dactilares conocidas.
remove() Borra una plantilla de huella dactilar.
setActiveGroup() Restringe una operación de HAL a un conjunto de huellas digitales que pertenecen a un grupo especificado, identificado por un identificador de grupo (GID).
authenticate() Autentica una operación relacionada con una huella digital (identificada por un ID de operación).
setNotify() Registra una función de usuario que recibe notificaciones del sistema HAL. Si la máquina de estados de HAL está en un estado ocupado, la función se bloquea hasta que el HAL salga del estado ocupado.
postEnroll() Finaliza la operación de inscripción y invalida el desafío generado por preEnroll(). Se debe llamar a esta función al final de una sesión de inscripción de varios dedos para indicar que no se pueden agregar más dedos.

Para obtener más detalles sobre estos, consulta los comentarios en IBiometricsFingerprint.hal.