Отпечаток пальца 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 и KeyMint (ранее Keymaster) обеспечивают аппаратную криптографию для безопасного хранения ключей в защищенной среде, такой как доверенная среда выполнения (TEE).
Поток данных для аутентификации по отпечаткам пальцев
Рисунок 1. Высокоуровневый поток данных для аутентификации по отпечаткам пальцев

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

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

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

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

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

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