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.
$ ./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). Ovo 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:
$ pcsc_scan -n
PC/SC device scanner
V 1.4.16 (c) 2001-2009, Ludovic Rousseau
Compiled 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 imaju dolaze uz PC/SC (Jabuka takođe koristi pcsc-lite na ovom nivou) tako da instalacijom pyscard omotača FreeSteel može da radi.
U odnosu na Čelik, FreeSteel se uz očiglednu mogućnost da radi na Linuksu i Meku, razlikuje se i š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 blog od zanemarljivih 6 bajtova, ali eto red je da napišem i to.
Razlikuje se i po tome što nije testiran na većem broju kartica, što moguće da postoje sitne greške koje ć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. Pogledajte KNOWN BUGS sekciju u README datoteci za više informacija, ako znate da čitate JPEG možda možete da pomognete i kažete u čemu grešim.
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. 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 datoteke 0x02 0x0f 0x02 u kojoj su broj, datumi izdavanja i isteka i izdavalac, 0x02 0x0f 0x03 u kojoj su jmbg, ime, prezime, ime oca, pol, mesto i datum rođenja, 0x02 0x0f 0x04 u kojoj su podaci o adresi prebivališta i 0x02 0x0f 0x06 u kojoj se nalazi slika.
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 pojavluje se nekoliko karakterističnih početaka JPEG datoteke (FF D8 FF E0 00 10 4A 46 49 46), razdvojeni sa 10 01 BD 1B. Kod mene šest gotovo identičnih komadića veličine 254 bajta, i potom jedan veličine 5607 bajtova. Kada se taj veći otvori u pregledaču (Eye of Gnome) veličina slike deluje dobro, ali na slici se vidi samo šum. Pokušao sam da uporedim u hekseditoru ovu sliku sa provereno ispravnim JPEG slikama, ali ne vidim neku očiglednu razliku, a format ne poznajem da bih ga čitao.
FreeSteel ima galamdžijski režim ako mu se stavi zastavica -v 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.