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 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 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.

serbian-eid-celik.png

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.