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


Anmelden zum Antworten