mlintangmz2765/libfprint-elan-04f3-0c90

GitHub: mlintangmz2765/libfprint-elan-04f3-0c90

为 libfprint 的 elanmoc 驱动添加 ELAN 04f3:0c90 片上匹配指纹传感器支持的补丁,解决了 ASUS Vivobook X1404ZA 在 Linux 下指纹录入与识别不可用的问题。

Stars: 0 | Forks: 0

# libfprint 对 ELAN 04f3:0c90 的支持 为 libfprint 的 `elanmoc` 驱动程序添加了对 ELAN 片上匹配(match-on-chip)指纹传感器 `04f3:0c90` 的支持。 见于 ASUS Vivobook X1404ZA (A1404ZA)。已在 Ubuntu 24.04 和 libfprint 1.94.100 上进行了测试。 **状态:录入(enroll)和识别(identify)均可正常工作。** ## 为什么仅靠 PID 是不够的 `elanmoc` 是正确的驱动系列——该传感器使用该协议——但 `04f3:0c90` 并未实现驱动假定存在的三个命令,并且在两个值上与驱动存在分歧: | | 上游 (upstream) | 04f3:0c90 | |---|---|---| | set mode 参数 | `0x03` | `0x00` | | 录入步骤 (enroll steps) | 9 | 11 | | 重新录入检查 (re-enroll check) | `40 ff 22` | 未实现 | | 获取用户 ID (get user id) | `43 21 ` | `40 ff 12 ` | | 验证 (verify) | `40 ff 73` | `40 ff 03` | set-mode 的值是真正阻止匹配的原因:在 `0x03` 模式下,传感器会检测手指并报告图像质量,但从不将它们与模板进行比对。 `40 ff 12` 在其 payload 之前还多带有一个字节,这导致用户 ID 长度字段发生了偏移。 有关完整的发现,请参阅 [docs/PROTOCOL.md](docs/PROTOCOL.md)。 ## 已知限制 此传感器未实现 `43 21`(获取用户 ID),因此 libfprint 无法枚举或删除片上存储。STORAGE 功能已被移除,指纹元数据改为保留在主机上。 模板仍会被发送到芯片上,该芯片共有 **9 个槽位(slots)**,而在 Linux 中没有任何方法可以释放它们。反复录入最终会填满传感器;目前要清除它只能使用 Windows Hello。 `40 ff 12 ` 可以通过索引读取任何槽位,因此后续可以在其基础上构建列表功能。删除(`0x13`)和清除(`0x98`)尚未在此设备上经过验证。 ## 构建 ``` git clone https://gitlab.freedesktop.org/libfprint/libfprint.git cd libfprint git am /path/to/patches/0001-elanmoc-Add-support-for-ELAN-04f3-0c90.patch meson setup build ninja -C build ``` `patches/0002-*` 是可选的,且**不**适用于上游:它会记录每次回复的原始字节,并添加了一个 `ELANMOC_MODE` 环境变量覆盖。 在将其适配到不同的 ELAN PID 时非常有用。 然后,在停止 `fprintd` 的情况下: ``` sudo ./build/examples/enroll sudo ./build/examples/identify ``` 或者使用脚本,这些脚本会停止 `fprintd`,从可写目录中运行,并将每次会话记录到日志中: ``` scripts/build.sh # clone, apply the patch, build sudo scripts/enroll.sh # 11 touches sudo scripts/identify.sh # run twice: enrolled finger, then a different one ``` `WITH_DEBUG=1 scripts/build.sh` 也会应用补丁 0002。 ## 将此适配到其他 ELAN 传感器 也应用 `patches/0002-*`。它会记录每次回复的原始字节: ``` elanmoc RX 2 B : 40 03 elanmoc RX 64 B: 40 00 00 00 00 1c 46 50 31 2d ... ``` 并且允许 `ELANMOC_MODE=3` 在无需重新构建的情况下覆盖 set-mode 参数,这就是此处隔离出模式差异的方法。 首先检查您的传感器是否完全支持 `40 ff 73` 和 `43 21`。如果支持,除了 `id_table` 条目外,它可能不需要其他任何更改。 ## 上游 有关此功能是如何提交给 libfprint 的,请参阅 [docs/UPSTREAM.md](docs/UPSTREAM.md)。 ## 发现过程 通过使用 USBPcap 在同一台机器上对 Windows 驱动程序进行的 USB 抓取,以及对传感器进行的实验。没有对任何驱动二进制文件进行反汇编,此处也不包含任何供应商代码。 抓包本身并未公开:其中包含指纹会话数据。 ## 许可证 该补丁是 libfprint 的衍生作品,因此采用与 libfprint 相同的 **LGPL-2.1-or-later** 许可证。本仓库中的文档和脚本均在相同条款下发布。
标签:C2日志可视化, libfprint, Linux硬件支持, 指纹识别, 生物识别, 网络安全监控, 驱动开发