TLDR: The sensor uses TLS-PSK over USB. We overwrite the PSK and are able to read images.
Scan of not-my-finger.
I recently got a new Laptop ( Lenovo Ideapad 5 - 15are05 ). Linux compatibility is quite good, as documented in the Arch Wiki. One part that is not working is the fingerprint reader. In this blog post I describe my approach to reverse engineering the fingerprint reader's windows driver and USB protocol. This results in a python script, capable of streaming images from the sensor at around 15 FPS. Fingerprint recognition, as implemented by for example libfprint, is not available yet. More recently, a Discord community was formed, with the goal to support all kinds of Goodix devices in libfprint.
All code can be found in my GitHub Repository tlambertz/goodix-fingerprint-reversing.
Contents
Getting an overview of the device.
The first step is figuring out what sensor I have. It is USB based, as lsusb shows:
Bus 003 Device 005: ID 27c6:55a2 Shenzhen Goodix Technology Co.,Ltd. Goodix FingerPrint Device
A Goodix sensor with the device id 27c6:55a2 . As the main driver for fingerprint scanner support on Linux is libfprint , I check there first. Unfortunately, my device is listed on the Unsupported Devices List. There is not much other information about this specific product id to be found online.
I later found a very helpful libfprint issue for a similar device, but only once I had some more keywords to google. @jjjollyjim had already done very similar work, but did not publish his implementation of the protocol. He did however publish a partial wireshark dissector, which came in handy.
... continue reading