libfprint bajok (meg egy patch)

 ( TCH | 2018. november 6., kedd - 15:16 )

A cégnél most szeretnénk foglalkozni egy kicsit az ujjlenyomat alapú azonosítással mind windows, mind Linux alatt. A kiválasztott olvasó a DigitalPersona U.are.U 4500.

Először Linux alá kerestem ujjlenyomatolvasó szoftvert, így találtam rá a libfprint-re. A cucc alapvetően tudta kezelni az eszközt, csak a Debian 8-as repoban található 0.5.1-esben az fp_dev_img_capture az broken, ha meghívom, akkor elszáll az egész. Van benne ugyan enroll, verify, meg identify, de ezek arra valóak, hogy a saját belső bankjába mentegessen, meg ahhoz komparáljon. Mindenesetre, mivel az ezekkel konvertált fingerprinteket ki lehetett menteni és be lehetett tölteni kézzel, így végül össze bírtam rakni egy libet, amivel illeszteni lehet a rendszerünkhöz.

Ezután derült ki, hogy windows alatt is meg kéne csinálni, viszont a libfprint Linux only, úgyhogy keresnem kellett valamit windows alá is.

Én nem találtam konkrétan semmit, de miután feltettem a kérdést itt, lett windowsos driver és SDK is. Kis doksiolvasgatás után össze is állt, hogy hogyan kell berántani egy ujjlenyomatot és hogyan kell összehasonlítani, valamint tárolni. Az egész sokkal ésszerűbb és idomíthatóbb volt, mint a libfprint, viszont arról gőzöm nem volt, hogy hogy fogom a kettőt összehangolni, mert a DP féle SDK vagy ANSI INSITS 381-2004 formátumban vagy ISO IEC 19794-4-2005 formátumban tud dolgozni, a libfprint-nek meg valami saját szarja van.

Kis kotorászás után végül megtaláltam ugyanezt az SDK-t Linux alá is. A probléma csak az volt, hogy BASIC működni a szó legszorosabb értelmében. A dpfpdd_query_devices() bullshitet ad vissza, így nem lehet kapcsolódni az eszközhöz. Felvettem a gyártóval a kapcsolatot és közölték, hogy az az SDK elavult (És akkor már nem kell, hogy működjön? Régen hogy dolgoztak vele?), úgyhogy vegyem meg a v3-ast potom 149 dollárért. (Nesze neked hardware támogatás.)

Így aztán maradt a libfprint. Mivel a DP féle SDK tud olyat, hogy nyers képet ad, meg tud nyers képből a saját formátumaira konvertálni komparálás céljára, így maradt az, hogy megpróbálom összehozni ezt libfprint alatt is. Ez ugye onnan indult, hogy a 0.5.1-ben törött a capture. Hát, akkor forgassuk le a legújabbat, hátha. Természetesen csupa olyan cucc kellett hozzá (persze majd' mindenből latest), ami Debian 8 alatt már nem elérhető csak úgy, de végül egy délutánnyi szopás után rájöttem, hogy hogyan lehet felvarázsolni a gépre.

Egyébként így lehet:
cd /tmp
wget http://cz.archive.ubuntu.com/ubuntu/pool/universe/p/python-pip/python-pip-whl_8.1.1-2_all.deb
dpkg -i python-pip-whl_8.1.1-2_all.deb
rm python-pip-whl_8.1.1-2_all.deb
echo "deb http://ppa.launchpad.net/jonathonf/python-3.6/ubuntu trusty main" >> /etc/apt/sources.list
apt-get update
apt-get install python3.6 python3.6-venv libpython3.6
rm /usr/bin/python3
ln -s /usr/bin/python3.6 /usr/bin/python3
python3 -m venv install pip3
mv pip3 /usr/local/
ln -s /usr/local/pip3/bin/pip3 /usr/local/bin/pip3
pip3 install wheel
pip3 install --user meson
git clone git://github.com/ninja-build/ninja.git
cd ninja
git checkout release
./configure.py --bootstrap
cp ninja /usr/local/bin/
cd ..
rm -rf ninja
wget https://github.com/freedesktop/libfprint/archive/V_0_8_2.tar.gz
tar xzf V_0_8_2.tar.gz
wget http://oscomp.hu/depot/fuck_libfprint.diff
patch -p0 < fuck_libfprint.diff
rm fuck_libfprint.diff
cd libfprint-V_0_8_2
export PYTHONPATH=/root/.local/lib/python3.6/site-packages/
~/.local/bin/meson builddir
cd builddir
ninja
ninja install
cd ../..
rm -rf libfprint-V_0_8_2

Így már működött a fp_dev_img_capture, viszont kiderült, hogy ebben a szarban nincsen olyan, hogy nyers képekkel is tudjon dolgozni, azaz ahogy a DP-nél, átalakítsa őket a saját formátumára, hogy össze lehessen őket hasonlítani. Sőt igazából olyan sincs, hogy két saját formátumú ujjlenyomatot összehasonlítson. (Azaz van, de "belül", nem férsz hozzá.) A saját image struktúrájából, amivel a fp_dev_img_capture dolgozik, abból tud ugyan printet csinálni, viszont abba a struktúrába te be nem töltesz raw adatot, mert el van rejtve előled a struktúra felépítése, pedig az van amúgy benne. (Az, hogy pointerrel belehakkolom, szóba se jöhetett, nem akartam gányolni.)

Ennél a pontnál már elkerülhetetlen volt, hogy bele kelljen nyúlni a libfprint-be. Miután kivezettem a két komparátorfüggvényt és írtam egy harmadikat, ami raw képből csinál libfprint féle fingerprintet, azt hittem, hogy túl vagyok a nehezén, mert immár ez is tudja azt, amit a DP - azaz nyers képeket összehasonlítani (még ha több lépésben is) - de tévedtem. (Patch egyébként itt: http://oscomp.hu/depot/libfprint_raw2print_n_compare_prints.diff)

Mint kiderült, hogy hiába ugyanaz a hardware, a két library két eltérő képet produkál (a blurt én raktam rá):

DP SDK:

libfprint:

És most jön a vicces rész: miután a két kép egyikét újramintavételeztem, a DP féle SDK gond nélkül összehasonlította őket és egyezést adott (vicces módon, ha a Linuxost méreteztem át az övére, akkor 54 hibapontot adott (még mindig jó), ha meg a sajátját a Linuxos méretére, akkor meg 0-át, azaz tökéletes egyezést), viszont a libfprint a match threshold alatti értékeket adott vissza. Nem, nincs elkúrva semmi, ha két azonosat adok neki, akkor match van libfprint alatt is, egyszerűen ennyivel gyengébb a komparátora a DP-énál.

Próbálkoztam többféle mérettel, hogy hátha lesz egy közös nevező, de nem. Próbálkoztam azzal is, hogy a libfprint féle képen a kontrasztot felhúzom, amivel valamennyivel több pontot kaptam, de még mindig túl keveset.

Úgyhogy most itt tartok. Gondoltam megosztom a problémát, hátha van erre valami bevett mód, amit én nem ismerek. (Meg megosztom a patchet is, ha már megírtam.)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Tök jó, mostmár nem kell levágni az ujjadat, hogy be tudjanak lépni helyetted :-)

Hova? Én nem vagyok benne egyik kuncsaft rendszerében sem, meg még készen sincsen a cucc...

Meg direkt elhomályosítottam a képet. Vagy nem eléggé?

Hat 100EUR-ert (amennyibe ez az ujjlenyomatolvaso kerul) kapsz egy mobilt, ahol alkalmazasbol elerheted a szkennert:)))

Ha sok szabadidom lenne en a telegram passporttal jatszanek. (mekkora kiralysag lenne AD-t kivaltani windowson:)
https://core.telegram.org/passport

---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

100? Jó az feleannyinak (~56 EUR) is, ugyanis csak a chipset ugyanaz, a készüléket kínai cég gyártja.