{
  "added_at": "2026-11-09",
  "additional_evidence_urls": [
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/spec.md",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/prototype/README.md",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/prototype/Makefile",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/prototype/main.c",
    "https://github.com/nmikhailov/Validity90/tree/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/prototype/test",
    "https://github.com/nmikhailov/Validity90/tree/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/prototype/logs",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/dissector.lua",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/dbg/attach.sh",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/.gitmodules",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/libfprint/.gitrepo",
    "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/COPYING"
  ],
  "category": "reconstruction-cases",
  "class": "hardware",
  "description_en": "Reverse engineers the USB protocol of the Validity/Synaptics laptop fingerprint readers 138a:0090, 138a:0094, 138a:0097, 06cb:0081 and 06cb:009a, aiming at a written specification and a free libfprint driver. The repository holds a draft specification of the initialization sequence and of the modified TLS 1.2 handshake the readers use, a Wireshark Lua dissector that decrypts traffic after the key exchange, and a standalone C prototype that talks to a reader over libusb. The README calls the prototype extremely ugly code to be rewritten for the driver, and marks the integrated libfprint driver as not ready.",
  "description_zh": "逆向分析 Validity/Synaptics 笔记本指纹读取器 138a:0090、138a:0094、138a:0097、06cb:0081 和 06cb:009a 的 USB 协议，目标是写出协议规范和自由的 libfprint 驱动。仓库包含初始化流程及这些读取器所用改版 TLS 1.2 握手的规范草稿、一个在密钥交换后解密通信的 Wireshark Lua 解析器，以及一个通过 libusb 与读取器通信的独立 C 原型。README 称原型代码非常粗糙，编写驱动时会完全重写，并注明集成到 libfprint 的驱动尚未就绪。",
  "entry_url": "https://awesomerea.org/resources/validity90-fingerprint-protocol-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/validity90-fingerprint-protocol-case/",
  "evidence_url": "https://github.com/nmikhailov/Validity90/blob/8b80cfeae15487d5e13ff5ff3ab4f282eac765be/README.md",
  "group": "cases",
  "id": "validity90-fingerprint-protocol-case",
  "json_url": "https://awesomerea.org/resources/validity90-fingerprint-protocol-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/validity90-fingerprint-protocol-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/validity90-fingerprint-protocol-case/index.md",
  "name": "Validity90: reverse engineering a Validity/Synaptics fingerprint-reader protocol",
  "name_zh": "Validity90：逆向分析 Validity/Synaptics 指纹读取器协议",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "The README reports prototype scanning and image output for 138a:0090, scanning for 138a:0097, and initialization and LEDs without scanning for 06cb:009a. The integrated libfprint driver is not ready; configuration, pre-TLS key exchange, device operations and image format remain in progress.",
    "The prototype needs a listed USB reader and read access to the machine DMI product serial for its session key. Its Makefile permissions target uses sudo. On Linux it builds against NSS, OpenSSL, libgcrypt, libusb-1.0, libpng and GLib. The dissector needs Wireshark Lua and lua-lockbox.",
    "make test checks utility functions and one initialization-response parse. Device results are recorded in the README status table and prototype logs.",
    "License: LGPL-2.1-or-later for the project code; the libfprint copy and submodule retain their own notices. The published specification and prototype contain recovered keys and byte sequences."
  ],
  "requirements_zh": [
    "README 报告原型在 138a:0090 上可扫描并输出图像，在 138a:0097 上可扫描，在 06cb:009a 上可初始化并控制 LED，但无法扫描。集成的 libfprint 驱动尚未就绪；配置、TLS 前密钥交换、设备操作和图像格式仍在完善。",
    "原型需要列出的 USB 读取器及机器 DMI 产品序列号的读取权限，以生成会话密钥。Makefile 的权限目标使用 sudo。Linux 构建依赖 NSS、OpenSSL、libgcrypt、libusb-1.0、libpng 与 GLib。解析器需要 Wireshark Lua 与 lua-lockbox。",
    "make test 检查实用函数和一个初始化响应的解析。设备结果记录在 README 状态表及原型日志中。",
    "许可证：项目代码为 LGPL-2.1-or-later；libfprint 副本及子模块保留各自许可声明。公开的规范和原型包含恢复出的密钥及字节序列。"
  ],
  "targets": [
    "protocol"
  ],
  "url": "https://github.com/nmikhailov/Validity90",
  "verification": "source-reviewed",
  "verified_at": "2026-10-20"
}
