HansHoogerwerf/synaptics-00e7-fpdrv
GitHub: HansHoogerwerf/synaptics-00e7-fpdrv
从零编写的 Synaptics 06cb:00e7 指纹传感器 Linux 用户空间驱动,以 libfprint TOD 模块形式为 fprintd 和 PAM 提供芯片端匹配指纹认证支持。
Stars: 0 | Forks: 0
# fpdrv — 适用于 Linux 的 Synaptics 06cb:00e7 指纹驱动
这是一款从零开始编写的用户空间驱动,专为 **Synaptics 06cb:00e7** 芯片端匹配(match-on-chip)指纹传感器打造,使用 C 语言编写。它作为一个 [libfprint TOD](https://fprint.freedesktop.org/) 模块发布,使得 `fprintd`、PAM 和你的显示管理器能够使用该传感器进行指纹登录——此外还提供了一个独立的 `fpdrv` CLI,用于配对、诊断和芯片端模板管理。
该传感器采用加密的、类似 TLS 的协议进行通信,并支持芯片端匹配和基于主机的配对。本驱动直接实现了该协议;它**没有**重新链接任何 Windows 驱动,也没有包含任何专有固件。
## 工作原理
`fprintd`(一个系统 D-Bus 服务)会加载 libfprint,而 libfprint 会为 `06cb:00e7` 加载本驱动(`libfpdrv_00e7_tod.so`)。驱动和 `fpdrv` CLI 共享同一个协议实现(`src/`):
- **配对身份** — 每个主机生成一次的 EC 密钥对 + PSK("pairdata")。驱动在每次会话中重放已签名的配对请求并运行完整的类 TLS 握手;传感器会验证签名,因此不需要在传感器上对主机进行注册。
- **芯片端匹配** — 注册和验证都在传感器内部进行。指纹模板永远不会离开设备,只有匹配结果会输出。
## 环境要求
- 一个 `06cb:00e7` 传感器(通过 `lsusb | grep 06cb:00e7` 查看)。
- 支持 TOD 的 libfprint(`libfprint-2-tod`)、`fprintd` 和 `pam_fprintd` —— 在大多数现代桌面发行版中均为标配。
- 构建工具和开发头文件:
sudo apt install build-essential pkg-config \
libusb-1.0-0-dev libssl-dev libfprint-2-tod-dev \
libgusb-dev libglib2.0-dev libjson-glib-dev
## 构建
```
make # builds the fpdrv CLI
make -C tod # builds the libfprint TOD driver (libfpdrv_00e7_tod.so)
```
## 安装
```
sudo make install # installs fpdrv to /usr/local/bin + the udev rule
sudo make -C tod install # installs the driver into libfprint's TOD dir
```
udev 规则(`60-synaptics-fp.rules`)授予 `plugdev` 组对传感器的读写权限,这样你就可以在非 root 权限下运行 `fpdrv` CLI。请确保你的用户位于 `plugdev` 组中(通过 `groups | grep plugdev` 查看),然后拔下/重新插上设备或重启系统以使其生效。`fprintd` 本身以 root 身份运行,因此不需要该规则。
### 避免驱动冲突
只能有一个驱动接管 `06cb:00e7`。如果在 TOD 目录中存在其他的 libfprint TOD 模块(例如 `libtudor_tod.so`),它们将会争夺设备控制权——请将其移走:
```
ls /usr/lib/x86_64-linux-gnu/libfprint-2/tod-1/
# 将此目录下任何其他匹配 06cb:00e7 的 *_tod.so 移走
```
## 设置配对
生成当前主机的配对身份,并将其部署到以 root 运行的 `fprintd` 能够读取的位置:
```
./scripts/setup-pairing.sh
```
上述操作会运行 `fpdrv pair-init`(写入 `~/.local/state/fpdrv/pairdata`),将其复制到 `/var/lib/fpdrv/pairdata`,并重启 `fprintd`。如果你想手动执行:
```
./fpdrv pair-init
sudo install -D -m 0600 ~/.local/state/fpdrv/pairdata /var/lib/fpdrv/pairdata
sudo systemctl restart fprintd
```
## 注册并启用登录
```
fprintd-enroll # enroll a finger (follow the prompts)
fprintd-verify # confirm it matches
sudo pam-auth-update --enable fprintd # enable fingerprint for PAM login
```
指纹认证现在可以在登录界面和锁屏界面正常使用,并且你的密码依然可作为备用选项。如果你想关闭此功能:
`sudo pam-auth-update --disable fprintd`。
## 故障排除
- **释放时报错 `Device 06cb:00e7 has not been opened`,或者设备似乎卡死了** —— 请重启该服务:`sudo systemctl restart fprintd`。
- **从挂起状态恢复后立即验证失败** —— 加密会话无法在 S3 周期中保留;任何正在进行的验证都会在挂起时中止。只需在恢复后再次按压即可;下一次会话会重新进行干净的握手。
- **没有任何反应 / 加载了错误的驱动** —— 确认 libfprint 加载的是本驱动而不是其他驱动(参见*避免驱动冲突*),并确保 `/var/lib/fpdrv/pairdata` 存在。
- **检查或重置芯片端状态**(请先停止 `fprintd` 以释放设备):
sudo systemctl stop fprintd
./fpdrv proto-list # 查看传感器上存储了多少个模板
./fpdrv proto-clear # 清除所有芯片端模板
sudo systemctl start fprintd
## `fpdrv` CLI
`fpdrv` 主要用于诊断和驱动引导。与日常使用相关的命令如下:
| 命令 | 用途 |
|---|---|
| `pair-init` | 生成新的主机配对身份。 |
| `pair-show` | 摘要显示当前的 pairdata(不会泄露机密信息)。 |
| `proto-open` | 建立安全会话并退出(用于连接性检查)。 |
| `proto-enroll [finger]` | 通过共享的协议代码注册指纹。 |
| `proto-id` | 捕获一帧并在芯片端进行匹配。 |
| `proto-list` | 列出已注册的模板。 |
| `proto-clear` | 删除所有已注册的模板。 |
| `selftest` | 运行加密自测(无需设备)。 |
运行不带参数的 `fpdrv` 可查看完整列表。部分额外的子命令是逆向工程期间使用的捕获重放工具,需要使用未包含在此发布版本中的捕获文件。
## 仓库结构
```
src/ Shared protocol implementation + the fpdrv CLI (main.c)
tod/ The libfprint TOD driver (.so) — shares src/, adds the gusb transport
scripts/ setup-pairing.sh
protocol-notes.md Notes on the 06cb:00e7 wire protocol
USB-CAPTURE-GUIDE.md How to capture the sensor's USB traffic for RE
synaTudor-00e7.patch Fallback: patches against the synaTudor relinking project
```
## 范围与合法性
这是开发者为了使其在 Linux 上可用,对自己拥有的传感器进行的互操作性逆向工程。本仓库不包含任何专有固件、捕获的流量或提取的密钥;每个主机都在本地生成自己的配对身份。
## 许可证
GPL-3.0。请参阅 [LICENSE](LICENSE)。
## 致谢
本项目基于来自 libfprint 项目的协议知识、[python-validity](https://github.com/uunicorn/python-validity) 参考实现,以及 [synaTudor](https://github.com/Popax21/synaTudor) 重链接项目构建而成。
标签:C2日志可视化, libfprint, Linux驱动, 安全测试工具, 客户端加密, 指纹识别, 生物识别, 硬件交互