tsteppy/egistec-eh576-libfprint
GitHub: tsteppy/egistec-eh576-libfprint
为不被上游支持的 EgisTec EH576 指纹传感器提供 Linux libfprint 驱动,实现指纹录入、验证及系统登录。
Stars: 0 | Forks: 0
# EgisTec EH576 (USB `1c7a:0576`) 的 Linux 指纹驱动
一个可用的 **libfprint 驱动**,专为 EgisTec EH576 指纹传感器打造。上游 libfprint
将其列为不支持。如果你的笔记本指纹读取器
在 Linux 上毫无反应,并且 `lsusb` 显示为 `1c7a:0576`,这就是为你准备的。
已在运行 Linux Mint 22.2 的 **Lenovo Yoga 7 16IRL8 (82YN)** 上确认可用:
包括录入、验证、`sudo` 以及使用手指解锁锁屏。
其他笔记本电脑也可能配备了此传感器——欢迎反馈,请参阅
[请求帮助](#help-wanted)。
```
lsusb | grep 1c7a:0576 # if this prints something, this driver is for you
```
## 真实的状态
**它可以工作,但这是一个个人的逆向工程项目,而不是经过认证的生物识别产品。**
这句话的两部分同等重要。
已验证的内容:协议、图像采集、录入、匹配,以及完整的
fprintd/PAM 登录路径(在一台传感器上)。
数据依据:在**一台设备、一个人**身上进行的两次标记测试会话——
10 次真实按压和 16 次冒充按压。在默认的阈值下,
错误接受率为 **0%**,错误拒绝率约为 **10%**(被拒绝后重新按压即可)。
这足以证明该驱动程序可以工作,但远不足以作为
安全规范来引用。更多测试人员是任何人能做出的最
有用的贡献。
将其用于便利——解锁你自己的笔记本电脑,无需输入
长密码即可使用 `sudo`。**保持你的密码有效**,这里的 PAM 设置
在设计上就保证了这一点。如果你的机器存储了一旦泄露会
造成真正伤害的数据,请将密码视为真正的防线。
## 安装说明
需要 Debian/Ubuntu 系列发行版(在 Linux Mint 22.2 上测试过)。构建
依赖项:
```
sudo apt install meson ninja-build gcc pkg-config libglib2.0-dev \
libgusb-dev libnss3-dev libgudev-1.0-dev git
```
然后:
```
git clone https://github.com/tsteppy/egistec-eh576-libfprint.git
cd egistec-eh576-libfprint
./install.sh
```
该脚本会获取 libfprint,添加此驱动,进行构建,并安装到
`/usr/local` —— 该路径在链接器搜索路径中位于 `/usr/lib` 之前,因此它
会优先于你发行版的 libfprint **而不会覆盖任何
打包的文件**。然后它会检查链接器是否确实优先加载了它。
撤销所有操作:`./install.sh --uninstall`
## 录入指纹
```
fprintd-enroll
```
**在八次按压之间,有意识地移动你的手指**:居中、向指尖、
向指关节、左、右、向左翻转、向右翻转、再次居中。
这不是随口一说。该传感器成像区域约为 5x4 毫米——只是你
指尖的一小部分——因此只有当按压落在你
录入过的皮肤区域时才会匹配成功。
在同一个舒适位置录入八次按压测得的
错误拒绝率高达 **60%**;而同样八次按压
分散在整个指尖上测得的错误拒绝率为
**10%**。`fprintd-enroll` 不会给出位置提示,因此这全靠你自己。
然后进行测试:
```
fprintd-verify
```
## 指纹登录
验证成功后:
```
sudo pam-auth-update --enable fprintd
```
这会将指纹身份验证置于登录、
锁屏和 `sudo` 的密码提示之前,**将密码保留为后备方案**——这
很重要,因为落在已录入区域之外的按压会被拒绝,而
你会希望直接输入密码,而不是跟传感器较劲。
在信任它之前先进行测试。在一个备用的终端中保持打开一个 root shell
(`sudo -i`),然后在一个*新*终端中:
```
sudo -k && sudo true
```
你应该会看到一个指纹提示;忽略它十秒钟应该会
自动切换到密码提示。一旦两种路径都能正常工作,锁屏就可以
正常使用了,无需进一步配置。
禁用方法:`sudo pam-auth-update --disable fprintd`
## 运行原理
完整的技术细节请参阅 [`driver/README.md`](driver/README.md)。简短的
版本如下:
- **不是 `FpImageDevice`。** libfprint 通常的流程会将图像交给 NBIS
细节特征匹配器,这**在这里行不通**:在细节特征低于 10 个时,bozorth3 拒绝计算,
而该传感器采集的 70x57 帧物理上
只包含约 7 个特征。厂商自己的 Windows 驱动程序也不
使用细节特征匹配。
- **匹配过程在宿主机上的驱动程序中进行**,通过将增强后的
指纹纹理结构与已录入的帧进行关联。录入时会存储 8 个原始帧;
验证时会对探测帧与每一帧进行评分,并取最高分。
- **幽灵帧保护。** 此传感器会间歇性地重新发送
来自之前按压的陈旧帧,并带有新的噪声,因此校验和无法识别它。
如果不加防范,这将是一种身份验证绕过手段——按压任何手指,
偶尔也能通过验证。每次采集都会与同一次按压的第二帧进行
比对检查。
匹配器位于双函数接口(`driver/egis_match.h` 中的 `em_frame_compute` /
`em_match`)之后,因此可以在不触及
任何 USB 或状态机代码的情况下对其进行替换。
## 已知限制
- **约 10% 的真实按压会被拒绝**并且需要重试,通常
是因为按压落在了已录入皮肤的区域之外。重新录入时
扩大覆盖范围会有所帮助。
- **数据仅来自一台传感器和一个人。**请参阅
[请求帮助](#help-wanted)。
- **目前仅限 Debian/Ubuntu 系列** —— 除了
库路径和软件包名称外,没有任何内容是特定于发行版的,因此移植应该很容易。
- 除了 libfprint 的默认设置外,**没有挂起/恢复处理**。
### 硬件警告
- **切勿 USB 重置此传感器**(`usbreset`,pyusb `dev.reset()`)。否则
固件会挂起,设备会从总线上消失,直到完全**断电**——
重启是不够的。
- 在不重新复位的情况下发起第二次图像请求会返回空白帧。请将
全零帧视为无效采集,千万不要当成“无手指”。
## 请求帮助
最有价值的贡献是**来自其他硬件的数据**。如果你有
EH576:
1. 安装、录入并运行 `python3 tools/test_matching.py`。它会按名称
提示进行每次按压,对每一帧进行标记,并打印评分表。
2. 附上你的**笔记本型号、发行版和评分表**来提交一个 issue。
**切勿上传原始指纹图像。**它们是你的生物识别特征,无法
重新颁发,本项目也不需要它们。只需提供分数、型号和
日志——该测试工具的设计初衷就是仅凭这些数字就能派上用场。
同样有用的有:向其他发行版的移植、替换用的匹配器(该接口
特意设计得很小),以及任何希望将其正式推送到 libfprint
上游的人。
## 致谢
基于
[Pengu601/EgisTec-EH576](https://github.com/Pengu601/EgisTec-EH576) 中的逆向工程工作构建——
初始化/重复命令序列以及基于方差的指纹检测均来自
该项目,该项目也是建立在早期的
[Animeshz/EgisTec-EH575](https://github.com/Animeshz/EgisTec-EH575) 工作之上的。
其他协议细节(增益寄存器、厂商的图像
预处理和质量指标)则是从 EgisTec 的 Windows
驱动程序中还原出来的。
驱动程序结构遵循 libfprint 的 `egis0570` 和 `egismoc` 驱动。
## 许可证
LGPL-2.1-or-later,与 libfprint 保持一致。请参阅 [LICENSE](LICENSE)。
标签:C2日志可视化, libfprint, Linux驱动, 客户端加密, 指纹识别, 生物识别, 硬件适配, 预握手