Fingerprint HAL

概要
如果一个设备有fingerprint sensor,那用户可以录入一个或多个指纹。使用指纹解锁设备或执行其他任务。
android系统使用Fingerprint HAL层和vendor-specific library和fingerprint sensor。

为了实现fingerprint HAL,

        你必须在vendor-specific library里实现fingerprint.h(/hardware/libhardware/include/hardware/fingerprint.h) 里定义的函数。

 指纹匹配流程
设备的指纹传感器通常处于闲置状态。但为了响应对authenticate或enroll函数的调用,指纹传感器会监听触摸操作(并且屏幕可能会在用户触摸指纹传感器时被唤醒)。
指纹匹配的概要流程包括以下步骤:
    用户将手指放在指纹传感器上。
    供应商专用库会根据当前的已注册模板集判断是否匹配。
    匹配结果会传递到 Fingerprint HAL,后者会将指纹身份验证结果通知给fingerprintd(Fingerprint 守护进程)。

该流程假设设备上已经注册了一个指纹,即供应商专用库已为该指纹注册了一个模板。

注意:设备上存储的指纹模板越多,进行指纹匹配所需的时间就越长。

指纹架构
Fingerprint HAL和下面组件通信:
FingerprintManager API:在一个app进程里给app提供API,每个app有一个FingerprintManager实例。
FingerprintService:运行在system server进程里的单例服务。
fingerprintd:fingerprintd 运行在自己的进程里和封装Fingerprint HAL vendor-specific library。

        Fingerprint HAL vendor-specific library:Fingerprint HAL的硬件厂商实现。

        Keystore API和Keymaster:提供基于硬件的加解密技术,在TEE中存储安全秘钥。


指纹原始图像和已处理的指纹特征必须保存在sensor硬件或trusted memory(TEE内的存储是trusted memory,TEE外部的被认为是untrusted)。

Rooting也不能破解生物数据。

如下图所示:fingerprintd通过Fingerprint HAL调用到vendor-specific library来执行录入操作或其他操作。



指纹实现准则

Fingerprint HAL 实现准则旨在确保指纹数据不会被泄露,并在从设备中移除用户时,一并移除指纹数据:
1:必须要确保在任何情况下都无法从传感器驱动程序或 TEE 以外访问原始指纹数据或衍生内容(例如模板)。如果硬件支持它,则只能将硬件访问权限授予 TEE,并且必须通过 SELinux 政策对硬件访问权限加以保护。 串行外设接口 (SPI) 通道必须只能供 TEE 访问,并且必须有针对所有设备文件的明确 SELinux 政策。
2:指纹采集、注册和识别必须在 TEE 内部进行。
3:只有加密形式的指纹数据可以存储在文件系统中(即使文件系统本身已加密)。
4:指纹模板必须采用设备专用私钥进行签名。 对于高级加密标准 (AES),模板必须至少通过绝对文件系统路径、群组和指纹 ID 进行签名,这样一来,相应模板文件便无法在其他设备上使用,并且无法用于在同一设备上注册的任何其他用户。例如,您将无法复制同一设备上其他用户的指纹数据,也无法从其他设备复制指纹数据。

5:HAL实现必须使用set_active_group()函数提供的文件系统路径,或提供一种能够在移除用户时一并清空所有用户模板数据的方法。强烈建议将指纹模板文件以加密形式存储在提供的路径中。如果因 TEE 存储要求导致这种做法不可行,实现人员必须添加一些钩子,以确保在移除用户时一并移除相关数据

Fingerprint HAL 函数
Fingerprint HAL 在/hardware/libhardware/include/hardware/fingerprint.h中包含以下主要函数:

enroll:将 HAL 状态机切换到开始收集和存储指纹模板的状态。注册完成后或超时后,HAL 状态机会立即返回到闲置状态。

pre_enroll:生成一个独一无二的令牌,以指明一次指纹注册的开始。确保先前已经过身份验证(例如使用密码)后,为enroll函数传入令牌。确认设备凭据后,为了防止被篡改,便会开始封装令牌并对其进行相应的处理(例如进行 HMAC 处理),在注册期间必须检查令牌,以确认令牌仍然有效。

get_authenticator_id:返回与当前指纹集关联的令牌。

cancel:取消待处理的注册或身份验证操作。 HAL 状态机会返回到闲置状态。

enumerate:同步调用,用于枚举所有已知指纹模板。

remove:删除指纹模板。

set_active_group:限定只能对属于指定群组(通过群组标识符 (GID) 来标识)的指纹集执行某项 HAL 操作。其他GID的用户没有权限执行HAL操作。不同的用户,加密的指纹模板集保存在不同的文件系统路径下。

authenticate:验证与指纹相关的操作(通过操作 ID 来标识)。

set_notify:注册用户回调函数。 HAL通过此回调函数向上层通知消息。如果 HAL 状态机处于繁忙状态,该函数会被屏蔽,直到 HAL 不再处于繁忙状态为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值