指纹 HIDL

在带有指纹传感器的设备上,用户可以注册一个或多个指纹并使用这些指纹解锁设备并执行其他任务。 Android 使用指纹硬件接口定义语言 (HIDL) 连接到特定于供应商的库和指纹硬件(例如指纹传感器)。

要实现指纹 HIDL,您必须在特定于供应商的库中实现IBiometricsFingerprint.hal

指纹比对

设备的指纹传感器通常处于空闲状态。但是,为了响应对authenticateenroll ,指纹传感器会侦听触摸(当用户触摸指纹传感器时,屏幕也可能会唤醒)。指纹匹配的高级流程包括以下步骤:

  1. 用户将手指放在指纹传感器上。
  2. 供应商特定的库确定当前注册的指纹模板集中是否存在指纹匹配。
  3. 匹配结果传递给FingerprintService

此流程假设设备上已注册指纹,即供应商特定库已注册指纹模板。有关更多详细信息,请参阅身份验证

建筑学

Fingerprint HAL 与以下组件交互。

  • BiometricManager直接与应用程序进程中的应用程序交互。每个应用程序都有一个IBiometricsFingerprint.hal实例
  • FingerprintService运行在系统进程中,处理与指纹 HAL 的通信。
  • Fingerprint HAL是 IBiometricsFingerprint HIDL 接口的 C/C++ 实现。它包含与特定于设备的硬件进行通信的特定于供应商的库。
  • Keystore API 和 Keymaster组件为安全环境(例如可信执行环境 (TEE))中的安全密钥存储提供硬件支持的加密。
指纹认证数据流
图 1.指纹认证的高级数据流

特定于供应商的 HAL 实现必须使用 TEE 所需的通信协议。原始图像和处理后的指纹特征不得在不可信内存中传递。所有此类生物识别数据都需要存储在 TEE 等安全硬件中。生根必须不能损害生物识别数据。

FingerprintServicefingerprintd通过 Fingerprint HAL 调用特定于供应商的库来注册指纹并执行其他操作。

与指纹交互
图 2.指纹守护程序与指纹供应商特定库的交互

实施指南

以下指纹 HAL 准则旨在确保指纹数据不会泄露,并且当用户从设备中删除时,指纹数据也会被删除

  • 原始指纹数据或衍生数据(例如模板)绝不能从传感器驱动程序或 TEE 外部访问。如果硬件支持 TEE,则硬件访问必须仅限于 TEE 并受 SELinux 策略保护。串行外设接口 (SPI) 通道必须只能由 TEE 访问,并且所有设备文件都必须有明确的 SELinux 策略。
  • 指纹采集、注册和识别必须在 TEE 内进行。
  • 即使文件系统本身是加密的,也只能将指纹数据的加密形式存储在文件系统上。
  • 指纹模板必须使用设备特定的私有密钥进行签名。对于高级加密标准 (AES),至少必须使用绝对文件系统路径、组和指纹 ID 来对模板进行签名,这样模板文件就无法在其他设备上操作,或者对于在该设备上注册的用户以外的任何人都无法操作。相同的设备。例如,从同一设备上的不同用户或从另一设备复制指纹数据一定行不通。
  • 实现必须使用setActiveGroup()函数提供的文件系统路径,或者提供一种在删除用户时擦除所有用户模板数据的方法。强烈建议将指纹模板文件加密存储在提供的路径中。如果由于 TEE 存储要求而无法实现,则实施者必须添加钩子以确保在删除用户时删除数据。

指纹方法

Fingerprint HIDL 接口在IBiometricsFingerprint.hal中包含以下主要方法。

方法描述
enroll()切换HAL状态机,开始指纹模板的采集和存储。注册完成后或超时后,HAL 状态机返回到空闲状态。
preEnroll()生成一个唯一的令牌来指示指纹注册的开始。向enroll函数提供令牌,以确保事先进行身份验证,例如使用密码。为了防止篡改,在确认设备凭证后会对令牌进行包装。必须在注册期间检查令牌以验证其是否仍然有效。
getAuthenticatorId()返回与当前指纹集关联的令牌。
cancel()取消挂起的注册或验证操作。 HAL状态机返回到空闲状态。
enumerate()同步调用枚举所有已知的指纹模板。
remove()删除指纹模板。
setActiveGroup()将 HAL 操作限制为属于指定组的一组指纹,由组标识符 (GID) 标识。
authenticate()验证指纹相关操作(通过操作ID标识)。
setNotify()注册一个从 HAL 接收通知的用户函数。如果 HAL 状态机处于繁忙状态,则该函数将被阻塞,直到 HAL 离开繁忙状态。
postEnroll()完成注册操作并使preEnroll()生成的质询无效。必须在多手指注册会话结束时调用此函数,以指示不能添加更多手指。

有关这些的更多详细信息,请参阅IBiometricsFingerprint.hal中的注释。