
Grow R503 センサー + Arduino + Rust 製 fprintd 置き換えデーモンを使った Linux デスクトップ指紋ログイン
部品から組み立てる Linux デスクトップ向け USB 指紋リーダーです。部品の合計コストは 15 ドル未満。アップストリームの fprintd のドロップイン代替品で、PAM、KDE 設定、GNOME 設定、fprintd-verify、指での sudo、指での画面ロック解除がすべて動作します。
fw=1.0 / r503d 1.0.0 の時点で、Arduino↔ホスト間の配線は認証されます。すべてのコマンドとレスポンスには、EEPROM 内の TOFU ペアリング済みシークレットを鍵とする SipHash-2-4 MAC が付与されます。USB シリアルリンクに対するリプレイ攻撃とホットスワップ攻撃はブロックされます。脅威モデルがカバーしない内容を含む完全な設計については、SPEC.md §13 を参照してください。

3Dプリンターがあればなあ…``` ┌──────────┐ UART ┌─────────────┐ USB-CDC ┌──────────────────┐ │ Grow │ 57600 8N1│ Arduino │ /dev/r503 │ r503d daemon │ │ R503 │◀─────────▶│ (firmware) │◀──────────▶│ net.reactivated │ │ sensor │ 3.3V TTL │ │ framed, │ .Fprint on D-Bus│ └──────────┘ └─────────────┘ MAC'd └──────────────────┘ │ ▼ PAM, KDE, GNOME, fprintd-verify, …
## なぜ
Linux向けのハードウェアUSB指紋リーダーは希少で高価であり、既存のもの(Validity、Synapticsなど)は、ベンダーのファームウェア更新で壊れる不安定なlibfprintドライバーを通じてリバースエンジニアリングされています。Grow R503のプロトコルは**公開**されており、Arduino側は自作のコードで、libfprint互換レイヤーは単なるD-Busです。
さらに、ソースを上から下まで読める指紋リーダーが手に入ります。
## 部品リスト
| 部品 | メモ | 参考価格 |
|------|-------|------|
| Grow R503 静電容量式指紋センサー | RGBリング付きの丸型 | 約$10 |
| Arduino Uno R3 / Nano / Mega / 任意のATmega328ボード | SoftwareSerialが動作するもの | $5–$25 |
| ジャンパーワイヤー4〜6本 | Dupont / ブレッドボード | 些細なもの |
これだけです。**レベルシフターも分圧器も不要** — その理由は [`SPEC.md` §3.1](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md) を参照(R503のRXラインは実際には5Vトレラントで、データシートは嘘をついています)。```
R503 Arduino (Uno R3 / Nano / etc.)
---- ------------------------------
Red (VCC) 3V3
White (3.3VT) 3V3 (touch-IC supply; shares rail with red)
Black (GND) GND
Yellow (TXD) D2 ── SoftwareSerial RX
Brown (RXD) D3 ── SoftwareSerial TX (direct — no divider!)
Blue (WAKEUP) D4 (optional; not used by firmware yet)
If your R503 ships with the JST-SH connector, snip a 6-pin JST-SH-to-Dupont pigtail to break the wires out. Brown is sometimes green depending on the seller — verify against the wire that goes into the RXD pin of the JST header, not the colour.
Fedora 44 KDEでテスト済み。fprintd、pam_fprintd、および最新のRustツールチェーンを備えたsystemdベースのディストリビューションであれば動作するはずです。
システムパッケージ:
| ディストリビューション | ビルド | ランタイム |
|---|---|---|
| Fedora / RHEL | rust cargo arduino-cli tpm2-tss-devel | fprintd pam fprintd-pam tpm2-tss |
| Debian / Ubuntu | rustc cargo arduino-cli libtss2-dev | fprintd libpam-fprintd libtss2-esys-3.0.2-0 |
tss-esapiパッケージは、--pair --seal-tpm(SPEC §13.12)を使用する予定がある場合にのみ必要です。それ以外の場合、デーモンはTPMなしでもビルドおよび実行できます。tss-esapiはビルド時の必須依存関係ですが、実行時の任意依存関係です(コードパスは/var/lib/r503d/key.tpmが存在する場合にのみ実行されます)。
Rust 1.95+、arduino-cliが$PATHに含まれていること。
TPM2はありますか?```bash ls /dev/tpmrm0 && tpm2_pcrread sha256:7 | head -3
両方が成功した場合、ホストはシールドキーパスを使用できます。`/dev/tpmrm0` が
ない場合 (古いハードウェア、BIOSでTPMが無効、または仮想TPMを持たないVM)、
デフォルトの平文キーフローを使用してください。
## ビルドとインストール
### 1. ファームウェアを書き込む
Arduino IDE で `firmware/r503fp/r503fp.ino` を開き、アップロードします。または
`arduino-cli` を使う:```bash
# Uno R3:
arduino-cli compile --fqbn arduino:avr:uno firmware/r503fp/
arduino-cli upload --fqbn arduino:avr:uno --port /dev/ttyACM0 firmware/r503fp/
# Nano (modern Optiboot, including most Elegoo / WAVGAT clones):
arduino-cli compile --fqbn arduino:avr:nano:cpu=atmega328 firmware/r503fp/
arduino-cli upload --fqbn arduino:avr:nano:cpu=atmega328 --port /dev/ttyUSB0 firmware/r503fp/
# Nano with legacy 57600-baud bootloader (older clones):
# replace `cpu=atmega328` with `cpu=atmega328old`
ファームウェアは Adafruit_Fingerprint を使用します。IDE はそれをインストールする
よう初回コンパイル時に提案します。
arduino-cli upload が not in sync: resp=0x7e で失敗した場合、ブートローダーは
もう一方のバリアントです — atmega328 ↔ atmega328old を入れ替えて再試行してください。両方
動作します。違いはブートローダーのボーレートだけです。
Rust 1.95+ が必要です。```bash cd pcside/daemon cargo build --release
### 3. インストール```bash
sudo bash pcside/daemon/dist/install.sh
そのスクリプト:
target/release/r503d を /usr/local/bin/r503d にインストールします/var/lib/r503d/(モード 0700 root:root)を鍵、状態、および
ユーザースロットレジストリ用に作成します/dev/r503 として公開する udev ルールを書き込み、デバイスノードを
root:root 0600 にロックします(root として実行されているデーモンだけがそれを必要とします;
これによりデフォルトの 0660 root:dialout パスが閉じられ、他のローカルユーザーが
ポートを開けなくなります — セキュリティ監査 2026-05-28 / H1)。結果: インストール後、
/dev/r503 に対する手動の arduino-cli/serial-monitor コマンドには
sudo が必要です。/etc/systemd/system/r503d.service)をインストールしますnet.reactivated.Fprint の D-Bus 自動起動エントリをオーバーライドします/usr/share/polkit-1/actions/net.reactivated.fprint.device.r503d.policy)
これは呼び出し元識別ゲートによって使用されます/etc/dbus-1/system.d/net.reactivated.Fprint.conf)— root と wheel メンバーのみが
デーモンと通信できます; それ以外の全員は、ブローカーで AccessDenied になり、
デーモンが呼び出しを確認する前に拒否されますfprintd.service を停止してマスクしますr503d.service を起動しますこれは冪等です — cargo build --release のたびに再実行して、
新しいバイナリを再デプロイします。
書き込み直後の Nano はペアリングされていません — デーモンは通信しようとしますが、 ファームウェアはすべてのフレーム化コマンドを拒否します。以下の2つのフローの いずれかを選択してください; どちらもペアリング済みの Nano と動作するデーモンで終わります。 ホストに TPM2 がある場合(簡単な確認方法は前提条件を参照)は、TPM でシールドされた フローが推奨されます。
両方のフローで使用されるオプトインファイル(/etc/r503d/allow-pair)は、
自分の Nano を持ってあなたの机に駆け寄る攻撃者を阻止するために存在します —
root なしでのペアリングは不可能です。r503d --pair は、Nano に鍵を送信する
前にマーカーを削除します: ホストが Nano 側のコミットとホスト側の永続化の間に
クラッシュした場合、ゲートは既に閉じているため、次のペアリング試行には
管理者がマーカーを再度 touch する必要があります。送信前の早期終了
(マーカーがない、または「すでにペアリング済み」)は、再試行のためにマーカーをそのまま残します。
TPM2 デバイスがない場合、またはオフラインディスク攻撃への耐性が必要ない場合は、 これを使用します。```bash sudo systemctl stop r503d sudo mkdir -p /etc/r503d sudo touch /etc/r503d/allow-pair # opt-in (see SPEC §13.5) sudo r503d --pair # 128-bit key → /var/lib/r503d/key sudo systemctl start r503d
I notice you've provided instructions but the actual content to translate appears to be missing after "INPUT:".
Could you please provide the chunk content you'd like me to translate? I'm ready to translate it to Japanese (ja) following your rules once the source text is provided.```bash
sudo r503d --status
# port: /dev/r503
# firmware: fw=1.1 fmt=2
# firmware paired: true
# firmware counter: 42
# host key.tpm: (absent)
# host key: /var/lib/r503d/key
# host key.bak: /var/lib/r503d/key.bak
# tpm device: (absent)
# allow-pair: (absent)