
लिनक्स डेस्कटॉप फिंगरप्रिंट लॉगिन एक Grow R503 सेंसर + Arduino + एक Rust fprintd-replacement डेमॉन का उपयोग करके
लिनक्स डेस्कटॉप के लिए एक पार्ट्स-से-बना USB फिंगरप्रिंट रीडर। कुल पार्ट्स की लागत $15 से कम। अपस्ट्रीम fprintd के लिए ड्रॉप-इन रिप्लेसमेंट — PAM, KDE Settings, GNOME Settings, fprintd-verify, फिंगर से sudo, फिंगर से स्क्रीन-अनलॉक सब काम करते हैं।
fw=1.0 / r503d 1.0.0 के अनुसार Arduino↔होस्ट वायर प्रमाणित है: हर कमांड और प्रतिक्रिया में एक SipHash-2-4 MAC होता है जो EEPROM में TOFU-युग्मित रहस्य से कुंजीबद्ध होता है। 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)
यदि आपका R503 JST-SH कनेक्टर के साथ आता है, तो 6-पिन JST-SH-से-Dupont पिगटेल को काटकर तारों को अलग करें। ब्राउन कभी-कभी ग्रीन होता है (विक्रेता पर निर्भर करता है) — JST हेडर के RXD पिन में जाने वाले तार के अनुसार जांचें, रंग के अनुसार नहीं।
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. फर्मवेयर फ्लैश करें
`firmware/r503fp/r503fp.ino` को Arduino IDE में खोलें और अपलोड करें। या फिर `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 के रूप में प्रकट करता है और डिवाइस नोड को 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 के लिए/usr/share/polkit-1/actions/net.reactivated.fprint.device.r503d.policy) जिसका उपयोग कॉलर-आइडेंटिटी गेट द्वारा किया जाता है/etc/dbus-1/system.d/net.reactivated.Fprint.conf) — केवल root और wheel सदस्य डेमॉन से बात कर सकते हैं; बाकी सभी को ब्रोकर पर AccessDenied मिलता है, इससे पहले कि डेमॉन कॉल देखेfprintd.servicer503d.serviceयह आइडेम्पोटेंट है — हर cargo build --release के बाद इसे पुनः चलाएँ नए बाइनरी को पुनः तैनात करने के लिए।
ताज़ा-फ्लैश किया गया नैनो अनपेयर्ड है — डेमॉन उससे बात करेगा लेकिन फर्मवेयर हर फ्रेम किए गए कमांड को अस्वीकार कर देगा। नीचे दिए गए दो प्रवाहों में से एक चुनें; दोनों एक जोड़े गए नैनो और एक काम करने वाले डेमॉन के साथ समाप्त होते हैं। TPM-सील किया गया प्रवाह अनुशंसित है यदि आपके होस्ट में TPM2 है (त्वरित जांच के लिए पूर्वापेक्षाएँ देखें)।