Hallo Experten, seit Tagen versuche ich nun, eine Java-Anwendung zum Auslesen / Beschreiben einer Smartcard zu schreiben. Den Kartenleser kann ich problemlos ansprechen, doch egal, welchen APDU ich zur Karte sende - es kommt immer die Antwort "6E00" zurück (falsches CLA byte). Die Karte ist eine I2C-Karte, der Kartenleser unterstützt dies auch (Protokoll S=8). Das Protokoll S=8 ist in Java (javax.smartcardio) aber gar nicht verfügbar, also nehme ich T=0. Ist das der Fehler? Die Karte erwartet ja meines Wissens einen START-Befehl. Aber wie setze ich den? Macht der Kartenleser das automatisch? Ich will doch nur etwas auf diese Karte schreiben!! :-( Das einbinden der mit dem Cardreader mitgelieferten DLL hat leider gar nicht geklappt. Im Internet findet man zwar viele mit ähnlichen Problemen, aber keine Lösungen :-( Wenn jemand auch nur den geringsten Ansatz zur Lösung hat - bitte melden! Bin für jede Hilfe dankbar, da ich echt am verzweifeln bin... Gruß
Also I2C ist im SmartCardbereich eigentlich nur die Kommunikation zu nackten EEPROMs, also kein T=0 oder T=1. Du kannst dir das einfach als 24C08 im Chipcardform vorstellen. Du kannst die Karten auch mit jedem I2C-Interface ansprechen- Kontakiermöglichkeit vorausgesetzt. Das ist keine klassische SmartCard wie Telefonkarte, Geldkarte, PKI-Card etc. Ich vermute mal, da ist dein Denkfehler. Andy P.
Eine Smartcard kann nicht nur eine (EE)PROM-Karte sein (wie die Krankenversicherungskarte), sondern auch eine Prozessorkarte sein, z.B. die sog. ec-Karte, Geldkarte oder Kreditkarten.
Jede Karte jenseits eines EEproms wird nicht mehr via I2C sondern mit T=0 oder T=1 etc angesprochen. Entweder der TS hat eine I2C Karte oder er hat eine Karte mit Intelligenz. Beides zusammen geht nicht (mal von selbstgebauten PIC-Cards etc abgesehen mit ihrer Doppelbeschaltung). Hier liegt wohl der Fehler, oder der TS hat sich in den Begriffen vertan. Andy P.
Hey, danke für die Antworten - leider werde ich nicht ganz schlau draus. Das hier ist die Karte, die ich habe: http://tinyurl.com/3ancmzg Wie spreche ich die den korrekt an?? :-(
Hi, also - neue Karte, neuer Versuch. Diesmal eine SLE 5542, ohne I²C, dafür (hoffentlich) mit Intelligenz. Hat es schon jemand geschafft, diese Karte zu beschreiben? Bekomme nach senden des Apdu's "FF B0 ..." leider den Fehler 6981 ("Kommando inkompatibel zur Dateistruktur"). BITTE was mache ich denn falsch!? :-( Das Datenblatt zur Karte ist alles andere als hilfreich :-/
> Das hier ist die Karte, die ich habe: > http://tinyurl.com/3ancmzg Das ist eine klassische EEPROM-Karte, also nur Speicher ohne Prozessor, die Kontakte kann man direkt mit I2C ansprechen.
hallo stephan, danke für deine Antwort. Das mit dem I2C hat leider nicht geklappt, daher habe ich jetzt eine andere Karte ( http://tinyurl.com/39chsns ). Die Befehle sende ich direkt per javax.smartcardio als APDU. Es kommen die tollsten Fehler, hauptsächlich 6981, 6982, 6a82, 6a86. Mal passt also die Struktur der Karte nicht, mal fehlt der PIN (wie übermittle ich den denn an die Karte!?), und mal stimmen die Parameter nicht. Und nirgendwo steht, was richtig wäre! Irgendjemand muss doch schon mal so ne Karte zum laufen gebracht bekommen haben :-(
Na, hier ist einiges Durcheinander bei Dir: Bei der gezeigten Karte handelt es sich nicht um eine Smartcard, sondern um eine Speicherkarte oder, wie schon jemand schrieb, ein EEPROM im Kartenformat. Hier gibts weder T=0 oder T=1, das sind alles asynchrone Protokolle, Du brauchst ein synchrones Protokoll, ob das nun S=8 heißt, weiß ich grad nicht. Die Schnittstelle zur Karte ist häufig i2C, es gibt jedoch auch 2-Draht- und 3-Draht-Interfaces. Sofern Dein Kartenleser die Karte unterstützt, greift er automatisch mit dem richtigen Protokoll und dem richtigen Interface darauf zu. Beim Stecken der Karte und anschließendem Kartenreset wählt er nämlich anhand des empfangenen ATR (Answer to Reset) der Karte das richtige Protokoll. Zum PC hin jedoch merkst Du davon nichts, Du kannst allenfalls an der Antwort auf ResetICC unterscheiden, ob Du eine synchrone Speicherkarte (90 00) oder eine asynchrone Prozessorkarte (90 01) gesteckt hast. Das Kartenterminal jedoch spricht immer T=1 zum PC, egal was für eine Karte gesteckt ist. Wenn Du also Deine gezeigte blaue Karte gesteckt hast, aktiviere Sie mit dem Kommando 0x20 0x11 0x01 0x00 an DAD 0x01. Du erhältst dann 0x90 0x00 zurück, die Karte ist eine synchrone Speicherkarte und aktiviert. Jetzt mal mit 0x00 0xB0 0x00 0x00 0x00 an DAD 0x00 ein ReadBinary an die Karte schicken, dann sollten 256Bytes + 2 byte Returncode zurückkommen, z.B. 00 b0 00 00 00 82 13 10 91 .... 90 00 Für tieferen Einstieg mußt Du schauen, die ISO-7816-3 und -4 zu bekommen... Gruß...Maschinist
hallo maschinist! Danke für deine Antwort. Ich stand / stehe kurz vor dem Aufgeben... Aber du scheinst Ahnung davon zu haben :-) Speicherkarte, EEPROM, Prozessorkarte - was davon kommt den nun mit APDU's zurecht? Und was hab ich jetzt eigentlich? -.- Wie schicke ich denn das 0x20 0x11 0x01 0x00 zur Karte? Und wie an DAD (=Datenadresse??) 0x01? Wenn ichs als APDU schicke, kommt 6e00 (CLA Error) zurück, und ne andere Möglichkeit ist mir nicht bekannt... :-/ Danke und Gruß
Hallo smartcard, Du redest doch ausschließlich mit dem Kartenleser, der versteht natürlich APDUs, die ihm gesendet werden, sofern sie korrekt aufgebaut sind: Für seine eigene Befehle, also die er selbst ausführen kann, brauchst Du CLA=0x20 und mußt an DAD (destination adress) 1 senden. Kartenbefehle werden jedoch mit CLA=0x00 an DAD 0 gesendet. Der Kartenleser sieht an der DAD, daß es ein Befehl zur Karte ist und schickt ihn mit dem richtigen Protokoll an die Karte weiter, sodaß Du Dich, wie geschrieben, nicht um das tatsächliche Kartenprotokoll kümmern brauchst. Schreib doch mal etwas mehr zu Deiner Umgebung: Welchen Kartenleser hast Du, kommt eine CT-API zum Einsatz, wie greifst Du von Java aus auf den Leser zu? JNI? Gruß...Bert
Jetzt habe ich mir dieses javax.smartcardio mal angeschaut, tja, das basiert auf PC/SC, da geht normalerweise nichts mit Speicherkarten wie der gezeigten, deswegen heißt es ja auch _smartcard_io. Der Kartenleser ist hier fast nur die physikalische Schnittstelle zur Karte und setzt keine eigene Intelligenz in die Steuerung der Karte. Daher hast Du keine Chance festzustellen, was für eine Karte tatsächlich vorliegt. So wie ich die Doku von javax.smartcardio verstehe, unterstützt es ausschließlich Prozessorkarten über T=0 oder T=1 Protokoll. Diese Karten verstehen dank ihrer Intelligenz APDUs selbst. Also, ich fürchte, mit den bei Dir gezeigten Speicherkarten wird das so nichts. Gruß...Bert
Probier es mal mit der jni2ctapi (http://www.cardcontact.de/download/jni2ctapi/README.html). Damit habe ich den Vorgänger der SLE5542, eine SLE4442, erfolgreich ansteuern können. Wichtig ist, dass Treiber und Kartenleser den synchronen Modus unterstützen. Das war bei vielen der von mir getesteten Geräte leider nicht der Fall. Gut funktionierte es mit Reiner-SCT und Kobil-Kartenlesern.
Hallo, also, mein Kartenleser ist ein CHERRY ST-1044u ( http://www.cherry.de/deutsch/produkte/kartenlesegeraete_SmartTerminal_ST-1044U.htm ). Der sollte die Karten unterstützen, meine ich. Gut, also PC/SC fällt also aus, ebenso .smartcardio.... Schade eigentloch, war so einfach -.- Eine CT-API kam bisher noch nicht zum Einsatz. Es gibt allerdings eine, die vom Hersteller Cherry stammt. Das wird wohl dann der nächste Schritt sein. Das jni2ctapi werde ich mir heute auch mal ansehen - danke für den Tipp, draco. Die CT-Api habe ich anfangs aus dem Spiel gelassen, da ich mit dem Einbinden von dll's keine Erfahrung habe (habs auch noch nie gebraucht...) - aber ich komme wohl nicht drum herum. Mal sehen, ob das klappt :-) mfg
Ja, Du brauchst das JNI, um die ctapi.dll anzubinden. Die CT-API selbst exportiert nur drei Funktionen, CT_init(), CT_data() und CT_close(). Informationen dazu findest Du u.a. bei TÜV-IT: http://www.tuvit.de/downloads/Tuev-IT/CTAPI111.pdf Dein Kartenleser hält sich vermutlich mehr oder weniger an die MKT-Spezifikation vom Teletrust: http://www.teletrust.de/publikationen/spezifikationen/mkt/ Schau Dir auf alle Fälle den Teil 4 an, da findest Du die verfügbaren Kommandos. Ein Gotcha wird es noch geben: Das Schreiben auf eine synchrone Speicherkarte, so wie Du sie verwendest, wird von den üblichen Kartenlesern oft nicht unterstützt, da man ja so u.a. auch die Krankenversichertenkarte manipulieren könnte. Die entsprechenden Kartenbefehle WRITE_BINARY bzw. WRITE-RECORD werden dabei von der FW des Kartenlesers abgefangen und mit Fehlercode quittiert. Für eine eigene speicherkartenbasierte Anwendung hatte ich mir seinerzeit das "Zinker"-Terminal aus der c't aufgebaut, das kann alle Funktionen, die mit synchronen Speicherkarten möglich sind, unterstützt dafür aber keine Smartcards: http://www.heise.de/ct/artikel/Der-Zinker-284202.html Gruß...Bert
Hi, also, habe mich eben mal mit dem jni2ctapi beschäftigt. Das ganze läuft auch, aber der Responsecode bleibt zumeist 6E00. Draco, du hast es ja damit zum laufen bekommen - also kann es doch nicht ganz unmöglich sein -.- Im Anhang der Quelltext des Beispielprogramms von jni2ctapi. Alle Anweisungen sind an sich erfolgreich (Success) aber trotzdem kommen die o.g. Fehlercodes zurück. Draco, du hast nicht zufällig noch Codeschnipsel für mich, wie ich z.B. "12345" auf die Karte schreibe und wieder auslese? Irgendwie habe ich ja auch den Verdacht, dass das ganze im Hintergrund doch wieder mit APDU's abläuft!? Damit kommt die Karte doch nicht zurecht!? mfg
Ich hatte damals u. a. den ST-1000 UB im Test. Der war ein bischen langsam, aber der Zugriff auf die SLE 4442 mittels CT-API hat funktioniert. Evtl. könntest Du mal einen ganz alten Treiber für den Kartenleser probieren, denn viele Kartenleser-Hersteller haben beim Sprung auf den Smartcard Zug vergessen die "alten" Interfaces für synchrone Karten zu pflegen und zu testen.
Ach ja, hier ist noch ein 08/15 Code aus allerersten Tests. Es wird ein "reset icc" gesendet und dann von der Karte gelesen. Den String "towitoko" musst Du noch durch den richtigen für Deinen Treiber ersetzen.
sooo, also, wie du in deiner Antwort am 28.5., 14:28 geschrieben hast, habe ich eben mal die Kommandos an die Karte geschickt. Vorweg: Mein CLA-Byte muss immer 0xFF sein, ansonsten kommt der CLA-Error 6E00 zurück. Also: > 0x20,0x11, 0x01, 0x00 da kommt zurück: 90 01 (sieht gut aus, aber warum nicht 90 00?) dann: > 0xff,0xb0, 0x00, 0x00, 0x00 (hier das CLA 0xFF, s. o.) da kommt zurück: 6A 86 (Incorrect parameters P1-P2) - so ein Mist... Außerdem hat meine Karte ja anscheinend ihre eigenen Commands, z.B. 0x30 für Lesen, 0x38 für schreiben (Datenblatt: http://tinyurl.com/394o547 ). Wenn ich die 30 teste, kommt "File Not Found" (vielleicht normal, ist ja nix drauf...) und bei der 38 kommt 6D 00 (Falsches Command) !?!? Äußerst komisch. Irgendwie hab ich das Gefühl, wir sind dicht an der Lösung, aber irgendwas fehlt noch -.- Danke euch für eure Hilfe - wäre cool, wenn wir das noch hinbekommen :-)
@Draco: Danke, aber den Quelltext hab ich schon. An den Befehlen hängt's leider noch :-(
Hm... FF als CLA klingt für mich mehr als sonderbar. Hast Du spaßhalber mal eins der vielen C-Programme zum Testen der CTAPI ausprobiert, um evtntuelle JNI-Probleme auszuschließen? Ich meine da gibt's auch was um Memorycards zu lesen. Bzgl. der Kommandos hat mir damals das Handbuch des Kaan-Professional von Kobil sehr geholfen, da dort der Aufbau der Kommandos hinreichend beschrieben ist: http://www.kobil.com/fileadmin/download/support/download/manuals/de/handbuch-b1pro-kaanpro-v-2-3.zip http://www.kobil.com/index.php?L=1&id=47
hi, danke für die Links - werde ich mir durchlesen. Mit den C-Programmen hab ich nichts getestet - komme mit C nicht zurecht (wobei die Kompiliererei das Problem ist...) - und habe auch keine Nerven, mich damit zu befassen. Die Chipkarte beschäftigt mich schon genug -.- Habe hier http://tinyurl.com/34c2g9a auf Seite 107 gelesen, dass CLA 0xFF das Protokoll T=0 / T=1 auswählt. Will ich aber gar nicht - da die Karte das nicht kapiert, kommt daher wahrscheinlich der Fehler, dass INS falsch ist usw... Aber bei allen anderen CLA-Werten kommt 6E 00 zurück.... ach man :-(
Eventuell unterstützt der installierte Treiber keine I2C Kommunikation und meckert wenn kein T=0 oder T=1 gewählt wird. Das wäre nicht der erste Treiber bei dem das so ist. Bei den Cherry Kartenlesern hatte ich damals, glaube ich, CT-API_V4_0_1_5.exe verwendet. In dem Archiv ist auch ein Tool "KVKTool.exe". Damit könntest Du mal probieren auf die Karte zuzugreifen. Ich hab's mal angehängt.
Hi, den alten Treiber hast du nicht zufällig noch? Das KVKTool läuft nicht... :-/ mfg
smartcard schrieb: >> 0x20,0x11, 0x01, 0x00 > da kommt zurück: 90 01 (sieht gut aus, aber warum nicht 90 00?) > > dann: >> 0xff,0xb0, 0x00, 0x00, 0x00 (hier das CLA 0xFF, s. o.) > da kommt zurück: 6A 86 (Incorrect parameters P1-P2) - so ein Mist... 90 01 ist der Response für ein RequestICC bei dem eine asynchrone Smartcard zurückgemeldet wird. Scheint wohl der Fall zu sein. zu zweitem Fall: Eigentlich ist das Command INS:&HB0 das ISO Commando für ein Read Binary, welches eigentlich im CLA Register ein 0x00 zu erwarten hätte. Bin zwar mit Java nicht vertraut, aber dafür bestens mit der CTAPI. Gruß Mario
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.