Отпечаток пальца HIDL

На устройствах с датчиком отпечатков пальцев пользователи могут зарегистрировать один или несколько отпечатков пальцев и использовать эти отпечатки пальцев для разблокировки устройства и выполнения других задач. Android использует язык определения интерфейса оборудования для отпечатков пальцев (HIDL) для подключения к библиотеке поставщика и оборудованию для отпечатков пальцев (например, датчику отпечатков пальцев).

Для реализации Fingerprint HIDL необходимо реализовать IBiometricsFingerprint.hal в библиотеке, специфичной для поставщика.

Сопоставление отпечатков пальцев

Датчик отпечатков пальцев устройства обычно находится в состоянии бездействия. Однако в ответ на вызов authenticate или enroll датчик отпечатков пальцев ожидает касания (экран также может просыпаться, когда пользователь касается датчика отпечатков пальцев). Высокоуровневый поток сопоставления отпечатков пальцев включает следующие шаги:

  1. Пользователь прикладывает палец к датчику отпечатков пальцев.
  2. Специфическая библиотека поставщика определяет, есть ли совпадение отпечатков пальцев в текущем наборе зарегистрированных шаблонов отпечатков пальцев.
  3. Результаты сопоставления передаются в FingerprintService .

Этот поток предполагает, что отпечаток пальца уже зарегистрирован на устройстве, то есть, специфичная для поставщика библиотека зарегистрировала шаблон для отпечатка пальца. Для получения более подробной информации см. Аутентификация .

Архитектура

Fingerprint HAL взаимодействует со следующими компонентами.

  • BiometricManager взаимодействует напрямую с приложением в процессе приложения. Каждое приложение имеет экземпляр IBiometricsFingerprint.hal
  • FingerprintService работает в системном процессе, который управляет связью с HAL отпечатков пальцев.
  • Fingerprint HAL — это реализация интерфейса IBiometricsFingerprint HIDL на C/C++. Она содержит библиотеку, специфичную для поставщика, которая взаимодействует с аппаратным обеспечением, специфичным для устройства.
  • Компоненты Keystore API и Keymaster обеспечивают аппаратную криптографию для безопасного хранения ключей в защищенной среде, такой как Trusted Execution Environment (TEE).
Поток данных для аутентификации по отпечаткам пальцев
Рисунок 1. Высокоуровневый поток данных для аутентификации по отпечаткам пальцев

Реализация HAL, специфичная для поставщика, должна использовать протокол связи, требуемый TEE. Необработанные изображения и обработанные характеристики отпечатков пальцев не должны передаваться в ненадежной памяти. Все такие биометрические данные должны храниться в защищенном оборудовании, таком как TEE. Получение прав root не должно иметь возможности скомпрометировать биометрические данные.

FingerprintService и fingerprintd выполняют вызовы через Fingerprint HAL в библиотеку поставщика для регистрации отпечатков пальцев и выполнения других операций.

Взаимодействие с отпечатками пальцев
Рисунок 2. Взаимодействие демона отпечатков пальцев с библиотекой отпечатков пальцев конкретного поставщика

Руководство по внедрению

Следующие рекомендации HAL отпечатков пальцев призваны гарантировать, что данные отпечатков пальцев не будут утекать и будут удалены , когда пользователь отключается от устройства:

  • Необработанные данные отпечатков пальцев или производные (например, шаблоны) никогда не должны быть доступны извне драйвера датчика или TEE. Если оборудование поддерживает TEE, доступ к оборудованию должен быть ограничен TEE и защищен политикой SELinux. Канал последовательного периферийного интерфейса (SPI) должен быть доступен только TEE, и для всех файлов устройства должна быть определена явная политика SELinux.
  • Получение, регистрация и распознавание отпечатков пальцев должны происходить внутри TEE.
  • В файловой системе можно хранить только зашифрованную форму данных отпечатков пальцев, даже если сама файловая система зашифрована.
  • Шаблоны отпечатков пальцев должны быть подписаны закрытым ключом, специфичным для устройства. Для Advanced Encryption Standard (AES) шаблон должен быть подписан как минимум абсолютным путем файловой системы, группой и идентификатором пальца, чтобы файлы шаблонов были неработоспособны на другом устройстве или для кого-либо, кроме пользователя, который зарегистрировал их на том же устройстве. Например, копирование данных отпечатков пальцев другого пользователя на том же устройстве или с другого устройства не должно работать.
  • Реализации должны либо использовать путь файловой системы, предоставленный функцией setActiveGroup() , либо предоставить способ стирания всех данных шаблона пользователя при удалении пользователя. Настоятельно рекомендуется хранить файлы шаблонов отпечатков пальцев в зашифрованном виде и по предоставленному пути. Если это невозможно из-за требований к хранению TEE, реализатор должен добавить хуки, чтобы гарантировать удаление данных при удалении пользователя.

Методы дактилоскопии

Интерфейс Fingerprint HIDL содержит следующие основные методы в IBiometricsFingerprint.hal .

Метод Описание
enroll() Переключает машину состояний HAL для начала сбора и хранения шаблона отпечатка пальца. После завершения регистрации или по истечении времени ожидания машина состояний HAL возвращается в состояние ожидания.
preEnroll() Генерирует уникальный токен для обозначения начала регистрации отпечатка пальца. Предоставляет токен для функции enroll , чтобы гарантировать, что была предварительная аутентификация, например, с использованием пароля. Чтобы предотвратить подделку, токен упаковывается после подтверждения учетных данных устройства. Токен необходимо проверить во время регистрации, чтобы убедиться, что он все еще действителен.
getAuthenticatorId() Возвращает токен, связанный с текущим набором отпечатков пальцев.
cancel() Отменяет ожидающие операции регистрации или аутентификации. Конечный автомат HAL возвращается в состояние ожидания.
enumerate() Синхронный вызов для перечисления всех известных шаблонов отпечатков пальцев.
remove() Удаляет шаблон отпечатка пальца.
setActiveGroup() Ограничивает операцию HAL набором отпечатков пальцев, принадлежащих указанной группе, идентифицируемой идентификатором группы (GID).
authenticate() Аутентифицирует операцию, связанную с отпечатком пальца (идентифицируется идентификатором операции).
setNotify() Регистрирует пользовательскую функцию, которая получает уведомления от HAL. Если конечный автомат HAL находится в состоянии занятости, функция блокируется до тех пор, пока HAL не выйдет из состояния занятости.
postEnroll() Завершает операцию регистрации и делает недействительным сгенерированный вызов preEnroll() . Это должно быть вызвано в конце сеанса многопальцевой регистрации, чтобы указать, что больше пальцев добавлять нельзя.

Более подробную информацию об этом можно найти в комментариях в IBiometricsFingerprint.hal .