Chipkartenleser mit CT-API unter Linux
-
Hallo,
ich habe mal wieder ein Problem, klar sonst würde ich hier nicht posten
Mein Problem ist folgendes: Ich habe mir den 5€ Chipkartenterminal von
Pollin zugelegt. Diesen möchte ich jetzt unter Linux mithilfe der CT-API
ansteuern. Eine entsprechende CT-API linux library gibt es von Kobil.
Im Internet gibt es mehrere Dokumente die die drei Funktionen der CT-API beschreiben. Diese drei Funktionen sind auch in der Linux
Library vorhanden.
Ich habe mir mal ein kleines Testprogramm in C geschrieben das den Leser
initialisiert, ein Kommando an die Chipkarte schickt und dann den Leser
wieder beendet. Komischerweise klappt das Initalisieren und das Beenden
des Lesers einwandfrei (Die LED am Leser geht an und aus) nur beim
senden des Kommandos tut sich nichts, kein Response rein garnichts.Das hier ist mein Testprogramm:
... #include <ct_api.h> int main() { unsigned char response[300]; char res; unsigned short int ctn,lenr; unsigned char sad, dad; unsigned char command[300]; unsigned int lenc; unsigned short int lengthresponse = 500; unsigned short int lengthdata = 500; lenc = 5; command[0]=0x20; command[1]=0x12; command[2]=0x01; command[3]=0x00; command[4]=0x00; CT_init(1,1); ctn = 1; lenr = 300; sad = 0x00; dad = 0x02; res=CT_data(1, &dad, &sad, lengthdata, "Data", &lengthresponse, response); CT_close(1); printf("\nRESPONSE:\n%s",response); printf("\nRES:%c",res); }
Zum kompilieren benutze ich folgenden Befehl:
$ gcc -Iinclude -Llib -o smarti smarti.c -lct -lm
Die Lib heißt libct.so
Laut der Header datei müsste die Funktion CT_data einen Wert
zurückgeben,
OK oder ein Error. Doch leider ist der Rückgabewert res nur ein paar
kryptische zeichen, die sich in jedem Durchlauf ändern. Auch response
ist nur nicht verwertbarer Müll.Ich hoffe ihr könnt mir helfen.
Grüße
Alex
-
Dein CT_init(), sollte man(n/frau) nach Ausführung prüfen.
Anschließend solltest du einen vollständigen Reset auf das CT ausführen.
(s. MKT Spez. Teil 4, Kapitel 5.1)lt. deinem Code, führst du ein RequestICC auf der
Karte durch, ohne vorab dein CT zu reseten...dieser ist zudem auch noch falsch kodiert, da die Destination Adress (dad) dein
Card Terminal sein muß und nicht die SmartCard. Ergo -> dad = 0x01, wenn du
ein RequestICC beabsichtigst !!!command[3] würde ich übrigens so kodieren 0x01, da in diesem Fall der vollständige ATR der Smartcard übergeben wird.
Die Kodierung von command[3] = 0x00 ist eigentlich NIE gut, da in diesem Fall
keine Rückschlüsse auf den ATR gezogen werden können.Im Fachtürkisch.... woher du wissen welche Karte drinne ?
Richtig wäre der Ablauf eigent so...
1.) Zuweisung der CTN + PN
2.) CT_init ausführen
3.) Reset CT ausführen, das Instruction Byte INS = command[1] hat den Wert 0x11 ! Nicht 0x12
4.) RequestICC so wie oben aufgeführt.Damit sollte es eigentlich funktionieren.
So ist zumindestens der Ablauf innerhalb meiner SmartCard-Komponenten.MfG.
ProScan