Objava: Čitač elektronske lične karte za GNU/Linuks
Pored originalne Python skripte sada su dostupni i grafički program i biblioteka (API) napisani u Javi. Posetite: https://devbase.net/jfreesteel
Na kraju i nije bilo tako strašno ;) Predstavljam vam slobodan čitač elektronske karte, od milja nazvan FreeSteel. Trenutno, FreeSteel je jednostavna Python skripta koji se oslanja na pyscard i PC/SC i radi na svim poznatim platformama (Linux, Windows, MacOS X). FreeSteel je potpuno sirova beta, testiran samo sa mojom ličnom kartom. Već sam pisao da nemam uvid u specifikaciju pametne kartice, tako da ne znam da li sam ispravno rastumačio granice polja. Pozivam da probate i obavezno javite da li ispravno čita podatke i sa vaše lične karte.
Kako to izgleda? Skript se poziva iz terminala, i ispisuje informacije inače vidljive kroz besplatnu aplikaciju Čitač Elektronske Lične Karte za Windows. Sledi demo programa, a ja ću iz opreza podatke za koje nisam siguran koliko su osetljivi da zamenim zvezdicama. Sa argumentom -p program čuva sliku sa lične karte u datoteku <JMBG>.jpg, moguće je i navesti posebno ime sa -p moja_slika.jpg.
$ ./freesteel.py -p Using reader : Gemplus GemPC Twin 00 00 ATR : 3B B9 18 00 81 31 FE 9E 80 73 FF 61 40 83 00 00 00 DF Header field : 33*60*3*6*62*26**B*F*79*77*42*3* Printed number : *F*79*77*42*3* eID number : 00***5*8* Issued : *4.0*.2009 Valid : *4.0*.2014 Issuer : PU ZA GRAD BEOGRAD SRB JMBG : 2412985****** Family name : РАКИЋ First name : ГОРАН Middle name : ****** Gender : M Place od birth : BEOGRAD, SAVSKI VENAC, REPUBLIKA SRBIJA, SRB Date of birth : 24.12.1985 Street address : ************, ****** City : *******, BEOGRAD, SRB
FreeSteel možete preuzeti iz Gitorious skladišta sa adrese http://gitorious.org/freesteel naredbom:
git clone git://gitorious.org/freesteel/freesteel.git. Gitorious nudi i pregled skladišta kroz Veb, reč je o jednoj Python skripti pa je možete i ručno iskopirati.
FreeSteel je slobodan softver, izdat pod GNU Slabijom opštom javnom licencom (GNU LGPL) verzije 3 ili novije po vašem nahođenju. Program koristi pyscard omotač za PC/SC interfejs. Na GNU/Linuksu potrebno je instalirati pcsc-lite (na Ubuntu distribuciji paket pcscd) i drajvere za čitač (libccid paket dodaje podršku za većinu USB čitača, a tu su i neki drugi PC/SC drajveri u skladištu ili sa sajta proizvođača ako su kompatibilni sa novim izdanjima kernela). U ovom koraku ništa nije specifično za našu ličnu kartu tako da ima uputstava na Internetu.
Pre nego što pokrenete FreeSteel, možete da proverite da li je pcsc-lite prepoznao čitač naredbom pcsc-scan koja je deo pcsc-tools paketa. Na MacOS X pokrenite iz terminala program pcsctest koji je podrazumevano instaliran.
$ pcsc_scan -n PC/SC device scanner V 1.4.16 (c) 2001-2009, Ludovic RousseauCompiled with PC/SC lite version: 1.5.3 Scanning present readers... 0: Gemplus GemPC Twin 00 00 Mon Aug 23 04:27:04 2010 Reader 0: Gemplus GemPC Twin 00 00 Card state: Card inserted, Shared Mode, ATR: 3B B9 18 00 81 31 FE 9E 80 73 FF 61 40 83 00 00 00 DF
Windows i MacOS X dolaze uz PC/SC (jabuka koristi pcsc-lite, stiže uz sistem). Na Windowsu vam treba Python, MacOS X ga već ima instaliranog. Preostaje još instalacija pyscard omotača i FreeSteel može da radi.
U odnosu na Čelik, FreeSteel se uz očiglednu mogućnost da radi na Linuksu i Meku, razlikuje i po tome što vuče po 255 bajtova podataka sa kartice u jednom zahtevu umesto 96, ne resetuje karticu između čitanja različitih polja i ne povlači dva puta jedan blob od zanemarljivih 6 bajtova, ali eto red je da napišem i to.
Razlikuje se i što nije testiran na većem broju ličnih karti, što moguće da postoje sitne greške usled kojih će promašiti granice polja ili ispretumbati podatke, zavisno od toga da li sam uspeo da pravilno razumem kako su podaci organizovani na samoj kartici. Razlikuje se i po tome što ne uspeva da izvuče sliku iako kod koji bi trebalo da radi jeste napisan. Željko Stevanović je uočio grešku zbog koje nije radilo čuvanje slike, sada i ta opcija radi u programu. Pokretanje ./freesteel.py -p čuva sliku kao JMBG.jpg, ili se može navesti ime datoteke ./freesteel.py -p moja_slika.jpg
Ukoliko Čelik računa neki checksum da proveri verodostojnost podataka sa lične karte, FreeSteel to ne radi. Veoma je moguće da su neki od onih meni nepoznatih bajtova zapravo kontrolni.
Pametna kartica je u ISO 7816-04 formatu i za čitanje podataka koriste se instrukcije 0xA4 (SELECT FILE), 0xCA (GET DATA) i 0xB0 (READ BINARY). Pronašao sam javno dostupnu prethodnu kopiju standarda na ovoj stranici.
Podaci su smešteni u datotekama (MF) koje se biraju sa SELECT FILE nakon čega se prelazi na čitanje pomoću READ BINARY. SELECT FILE proverava potrebne dozvole i odbija pristup zaštićenim datotekama. Ne znam da rastumačim odgovor o tekućim dozvolama. Svaki odgovor završava sa dva bajta 0x90 0x00 ako je zahtev uspešan, odnosno kodom za grešku kako je definisano standardom. Omotač pyscard već radi obradu tako da FreeSteel ignoriše i preskače ove statusne bajtove u rezultatu.
Svaka datoteka se sastoji od zaglavlja veličine 6 bajtova, i sadržaja proizvoljne dužine. Dužina sadržaja zapisana je u četvrtom i petom bajtu zaglavlja kao 16bit LE int.
Koriste se četiri EF datoteke 0x0f 0x02 u kojoj su broj, datumi izdavanja i isteka i izdavalac, 0x0f 0x03 u kojoj su jmbg, ime, prezime, ime oca, pol, mesto i datum rođenja, 0x0f 0x04 u kojoj su podaci o adresi prebivališta i 0x0f 0x06 u kojoj se nalazi slika.
READ BINARY instrukcija kao prvi argument ima dvobajtni offset (16bit int LE), a potom sledi broj bajtova koji će biti pročitani (8bit int LE). Ako se kao broj bajtova dostavi 0x00 biće pročitan maksimalno dopušten broj bajtova. FreeSteel ovde ipak koristi eksplicitni broj, najviše 0xFF ili manje za manja polja.
Svi podaci su sačuvani kao ASCII/UTF-8 tekst. Sama polja sa podacima su sastavljena od jednog bajta sa labelom podatka, pa 0x06, zatim dužina polja kao 8bit LE int i 0x00 nakon čega sledi odgovarajući broj bajtova navedene dužine sa podacima.
Serijski broj čiji je heksadecimalni kod napisan na poleđini lične karte se nalazi u 16 bajtova podataka koji se čitaju sa GET DATA naredbom uz argument 0x01 0x01, počev od desetog bajta. dok ostatak tog niza bajtova ne znam da protumačim.
U datoteci u kojoj je slika podaci počinju sekvencom 10 01 BD 1B pa zatim karakteristični početak JPEG datoteke (FF D8 FF E0 00 10 4A 46 49 46). Ovo se ponavlja nekoliko puta kasnije u podacima. Prvu četvorobajtnu reč treba preskočiti, dok su ostale sastavni deo datoteke slike.
FreeSteel ima galamdžijski režim ako mu se stavi zastavica -v, --verbose kada prikazuje primljene i poslate bajtove kao heksadecimalne vrednosti. Ako program kod vas ne čita ispravno podatke, a niste voljni da sami jurite grešku, postoji i dump zastavica. Pokrenite program kao ./freesteel.py -d dump i on će u direktorijum dump istovariti binarne blobove pročitane sa lične karte. Ako mi ih dostavite privatnom poštom rado ću popraviti program, a obećavam da podatke neću da prikupljam, prodajem, ili na drugi način zloupotrebim.
Na kraju, kako i piše u zaglavlju programa, FreeSteel se isporučuje bez bilo kakve garancije, čak i one implicitne. Iako program samo čita datoteke, pa ne bi trebalo da bude problema, ne mogu da prihvatim odgovornost ako vam zapadne da morate ponovo da čekate u redu sa zahtevom za reinicijalizaicju ili za izradu nove lične karte.
15 komentara
22 mar 2013 djusee
Pozdrav. Slucajno sam nasao ovaj program, i interesuje me, dali moze to da se uradi, da kad izcita podatke odmah i da sacuva u xml formatu?
Hvala
22 mar 2013 Goran
Naravno, iskoristite Java biblioteku ili Python skript i onda samo sastavite i sačuvajte XML u vašem programu.
15 mar 2014 brkalivadic
Јел пробао неко SCard4Wine?
http://scard4wine.sourceforge.net/
Омогућава WINE-у да користи pcsc Linux-ов драјвер за Windows апликације. Firefox, Java Runtime i middleware за сертификате се успешно инсталирају под WINE-ом. Више о примени SCard4Wine:
http://forum.od.ua/s...=1#post26626240
При приступу сајту за еПорезе, читач и даље није детектован. Ево па пробајте, треба WINE да искористи Linux-ов драјвер, али му не полази за руком.
30 jun 2014 Žarko Nikšić
Poštovani gospodine Rakiću,
zanima me da li najnovija verzija programa za očitavanje podataka sa lične karte radi I na Android operativnom sistemu na tablet račubarima.
Ako radi, kako može da se dođe do nje i koliko košta. Izvinite ako je pitanje glupo ali ovde se radi o jednom prosečnom korisniku računara a nikako o nekakvom stručnjaku.
Hvala unapred.
23 avg 2010 Predrag Supurovic
Čini li mi se da za čitanje podataka uopšte nije potrebno znati PIN kartice?
23 avg 2010 Goran
Za ove „javne“ podatke, ne treba PIN. Ako pokušam nešto drugo da pročitam dobijem grešku da nemam ovlašćenja da pristupim toj datoteci.
Nemam napisan kod koji pravi sesiju i pristupa stvarima kao što su sertifikati na kartici, to ostaje za neki drugi put.
23 avg 2010 Данило
Лепо, лепо, чим узмем стари Дел Д620 лаптоп са уграђеним читачем картица ћу да испробам како ради. Знам да је тај читач радио лепо и успевао сам да извучем неке ситнице са кредитних чип картица али то је било пре једно 4-5 година.
23 avg 2010 zsteva
Evo ja probao i radi kako je ocekivano. Osim jedne sitnice. Ja zivim u kuci (nemam broj stana) pa na listi ima jedan elemenat manje.
patch: http://zsteva.ath.cx/0001-Fix-za-adresu-broj-stana-moze-da-nedostaje.patch
23 avg 2010 zsteva
Jedno pitanje, ovo samo cita podatke, gde se vrshi validiranje tih podataka?
Zar nije ideja da se po javnom nekom javnok kljucu proverava signatura?
23 avg 2010 Goran
Hvala za zakrpu, gurnuo sam je u git stablo. Drago mi je da program zaista radi. Moguće da će se pojaviti sličan problem da ni ulični broj ne postoji, ali to ćemo rešavati kada i ako se pojavi.
Sertifikati se koriste za elektronski potpis. Ako ne grešim, a ja sa ovim stvarno nemam iskustva, javni i CA sertifikat u X.509 formatu bi trebalo da može da se preuzme sa kartice iz neke df datoteke baš kao i ovi podaci.
Za samo potpisivanje kreira se sesija, validira PIN i isporučuje hash kartici koji će ona da potpiše na samoj kartici privatnim ključem. Onda se to prilaže uz javni sertifikat i tako čuva.
Nije mi poznato da se ove javne informacije negde proveravaju. Moguće da na kartici postoji negde CA sertifikatom MUP-a potpisan checksum, ali ja to ne vidim. Ako naiđeš na to reci, pa ćemo lako da ubacimo proveru podaci su ispravni i podaci nisu ispravni. Eto, moguće da je to onaj nepoznati deo iz zaglavlja koje se dobija sa GET DATA pozivom.
23 avg 2010 zsteva
http://zsteva.ath.cx/0002-Fix-za-ocitavanje-fajla.patch
I sad sve radi ;)
Ocisti samo malo kod. Bug je bio gore u ucitavoanju fajla.
23 avg 2010 Goran
Jao, pa offset je dva bajta, razumljivo. Ne pazim na času. Primenio sam i ispravku za 0x90 0x00 stripping bug koji sam ispravio u međuvremenu, treba odseći dva bajta po svakom prenosu, a ne samo na kraju.
Odlično!
23 avg 2010 zsteva
hm, negde dve nashe izmene su donele dobru sliku, ali vidim sad da fale po 2 slova sa kraja podataka, ali da ne pravim zbrku oko mergovanja cekam da dignesh sve izmene :)
23 avg 2010 Goran
Malo me git zbunjuje, treba mi neka knjižica za to. Sada bi trebalo da je sve ok.
Promenio sam i Street address/city u Residence. Ako ima manje od tri polja ispisuje u jednom, inače u dva reda mada mi sada nešto čudno izgleda tako.
23 avg 2010 zsteva
obudzi izmene vec nekako, i gurni na javni repo. Ja cu posle srediti moj repo.