この記事を書いた動機

 結構前から指紋認証機能が linux 上で使えないということがあった。それで、とりあえず以下の2つのパッケージをインストールすることで、センサーを認識して動くところまではやっていた。

yay -Qs fprint
local/fprintd 1.94.5-1 (fprint)
    D-Bus service to access fingerprint readers
local/libfprint 1.94.9-1 (fprint)
    Library for fingerprint readers

 その時は、Gnome の設定画面にも登録画面が出てきて、とりあえず登録することはできるようになった。しかし、結局登録した指紋と一致しないと言われ、認証機能が思ったように動かないことに気づき、めんどくさくなってまた問題をしばらく放置していた。

 そして、最近になって、また linux 環境における指紋認証について調べてみたところ、問題の解決には至らなかったが、視覚的にどんな指紋が読み取られているのか確認する方法があることに気づいたので、それを記録してみようというわけです。

環境

  • Arch Linux
  • linux kernel 6.13.4-arch1-1
  • Gnome
  • XPS 13 2in1 (9365)
  • 指紋認証センサー VFS7552

libfprint をコンパイルする

 libfprint 自体に、指紋認証センサーをテストしたりできるツール群が入っているので、それを使う。もしかするとパッケージマネージャ経由でインストールできたりするかもしれないが、GitHub - iafilatov/libfprint: libfrpint driver for a family of Elantech fingerprint sensorsに合わせて、今回は自前でコンパイルすることにした。

 ちなみに、このgitリポジトリ 自体は古く、VFS7552 を検出しなかったので、現行のlibfprint / libfprint · GitLabを後にコンパイルし直した。

 一応大まかなポイントだけ、ここには記録しておこうと思う。

ツールをいれる

  • gimp # .pgm な画像を表示するために必要
  • ninja
  • git
  • python
  • libglib2.0-dev
  • libnss3-dev
  • libpixman-1-dev
  • libusb-1.0.0-dev
  • libx11-dev
  • libxv-dev
  • pkg-config

リポジトリのクローン

mkdir ~/working
cd ~/working
git clone https://gitlab.freedesktop.org/libfprint/libfprint.git

python 仮想環境の構築

# もし、anaconda が入っている場合は、事前に無効化しておく
# conda deactivate
python3 -m venv venv
. venv/bin/activate
pip install -U pip
pip install meson

 “ModuleNotFoundError: No module named ‘distutils.util’” と言われてしまう場合は、以下のモジュールもインストールしていおく。

pip install setuptools

コンパイルする

venv/bin/meson builddir_dbg
venv/bin/meson configure builddir_dbg -Ddebug_log=true
cd builddir_dbg
ninja

コンパイル後

 examples という名前のフォルダに、img-capture というプログラムがあれば、準備完了である。

# ~/working/libfprint/builddir_dbg/examples
ls
⠀clear-storage*    ⠀cpp-test.p/  ⠀finger.pgm   ⠀img-capture*    ⠀manage-prints.p/
⠀clear-storage.p/  ⠀enroll*      ⠀identify*    ⠀img-capture.p/  ⠀verify*         
⠀cpp-test*         ⠀enroll.p/    ⠀identify.p/  ⠀manage-prints*  ⠀verify.p/  

ls img-capture
⠀img-capture*

./img-capture

視覚的に指紋を見てみる

 このページには、一応個人情報ということで、指紋の画像を乗せることはしない。一応、スワイプしたときと、そうしなかったときの2通りについて、img-capture を実行し、生成される finger.pgm の中身を画像として見てみるということを、何回か試してみた。

 スワイプしたときは、ろくな指紋画像を得ることはできなかった。指紋画像の一部だけ指紋が写り、残り7割程度の領域がまっさらになってしまった。ちなみに、生成された指紋画像のサイズは、224x224であり、タッチして指紋を読み取ったときと指紋画像の大きさが変わることもなかった。

 スワイプしなかったときは、一見するとぼやけたりしていないという意味で、何も問題なさそうな鮮明な指紋画像が得られた。全体的に指紋画像が埋め尽くされており、ブランクは1割程度に満たないくらいしかなかった。

 ただ、指の指紋全体というより、指の指紋のほんの一部の領域だけが、読み取られている感じなっており、そこが気になった。

 結局のところ、確かにとにかく指紋認証センサー VFS7552 は壊れているわけでもなければ、ドライバが機能していないというわけでもない、ということは確認できた。

以後は、今までの経緯を適当に記録

 以降は、直接指紋認証の視覚化の話とは関係がないが、指紋認証がうまくいかないということについて、調べたこととか、適当に記録していこうと思います。

どんな指紋認証センサーがついている?

 指紋認証センサーは基本的にUSB経由でつながっているっぽいので、lsplug で調べてみると以下のようになる。“VFS7552 Touch Fingerprint Sensor"と出てくる。

# yay -S lsplug

lsplug
USB 1-2  [8087:0a2b] Intel Corp. Bluetooth wireless interface
USB 1-7  [138a:0091] Validity Sensors, Inc. VFS7552 Touch Fingerprint Sensor [4d2d94863514]
USB 1-9  [0bda:58c8] Realtek Semiconductor Corp. Integrated Webcam HD [200901010001]

登録はできるが、認証は失敗する

 まず、Gnome 標準の設定画面から試してみると、とりあえず以下のように指紋を登録することはできる。

設定画面
とりあえず登録はできる

 そして、ログイン画面にも、指紋認証ができる旨が表示される。しかし、何度やっても通らない。。。。

指紋認証自体は受け付けている
指紋認証に失敗する

 そこで、コマンドライン経由で、指紋認証を試みてみるも、“verify-no-match (done)“と言われ、これもだめだった。

# 登録はできる
sudo fprintd-enroll
[sudo] username のパスワード:
Using device /net/reactivated/Fprint/Device/0
Enrolling right-index-finger finger.
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-completed

# 認証は失敗する
fprintd-verify main
Using device /net/reactivated/Fprint/Device/0
Listing enrolled fingers:
 - #0: right-index-finger
Verify started!
Verifying: right-index-finger
Verify result: verify-no-match (done)

 ちなみに、fprintd は動いており、なんかエラーを吐いている。詳しいことは今のところわかっていない。

systemctl status fprintd

● fprintd.service - Fingerprint Authentication Daemon
     Loaded: loaded (/usr/lib/systemd/system/fprintd.service; static)
     Active: active (running) since Fri 2025-03-14 10:35:22 JST; 7min ago
 Invocation: aa0078b3ce1c4ebc8611892e7bbf9b4b
       Docs: man:fprintd(1)
   Main PID: 51816 (fprintd)
      Tasks: 6 (limit: 629145)
     Memory: 9M (peak: 10M)
        CPU: 1min 9.152s
     CGroup: /system.slice/fprintd.service
             └─51816 /usr/lib/fprintd

 3月 14 10:36:15 hostname fprintd[51816]: Driver reported session error, but device is inactive.
 3月 14 10:36:15 hostname fprintd[51816]: fpi_device_action_error: assertion 'priv->current_action != FPI_DEVICE_ACTION_NONE' failed
 3月 14 10:39:03 hostname fprintd[51816]: Deactivating image device while it is not idle, this should not happen.
 3月 14 10:39:03 hostname fprintd[51816]: Failed to capture data
 3月 14 10:39:03 hostname fprintd[51816]: Driver reported session error, but device is inactive.
 3月 14 10:39:03 hostname fprintd[51816]: Translating to activation failure!
 3月 14 10:39:03 hostname fprintd[51816]: fpi_image_device_activate_complete: assertion 'priv->state == FPI_IMAGE_DEVICE_STATE_ACTIVATING' failed
 3月 14 10:40:04 hostname fprintd[51816]: Deactivating image device while it is not idle, this should not happen.
 3月 14 10:40:04 hostname fprintd[51816]: Driver reported session error, but device is inactive.
 3月 14 10:40:04 hostname fprintd[51816]: fpi_device_action_error: assertion 'priv->current_action != FPI_DEVICE_ACTION_NONE' failed

タッチじゃなくてスワイプしないといけない?

 VFS7552 の指紋認証機能が機能しないと、適当にgoogleを漁ったりしていたところ、GitHub - iafilatov/libfprint: libfrpint driver for a family of Elantech fingerprint sensorsのページに以下のような記述があった。

common-problems

The algorithm which libfprint uses to match fingerprints doesn’t like small images like the ones these drivers produce.
…
To get bigger images the driver expects you to swipe the finger over the reader.
…

 「センサー次第では、生成する指紋画像の大きさが小さすぎて、 libfprint の認証がうまくできないことがある。スワイプすれば、大きな指紋画像が得られて、認証がうまく通るようになる。」ということっぽい。

 ただ、結局のところ、「視覚的に指紋を見てみる 」でも書いたように、スワイプしてもうまくいかなかった。Windows 11 のときはそもそも、何も設定しなくても標準でドライバが入ってたし、スワイプなんてしなくても動いていたので、今回の場合はなんか別のところに理由がありそうである。

参考にしたサイトとか