Forum: Mikrocontroller und Digitale Elektronik Smartcard antwortet immer mit 6E00 (I2C)


von smartcard (Gast)


Lesenswert?

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ß

von Andy P. (bakaroo)


Lesenswert?

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.

von stephan_ (Gast)


Lesenswert?

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.

von Andy P. (bakaroo)


Lesenswert?

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.

von smartcard (Gast)


Lesenswert?

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?? :-(

von smartcard (Gast)


Lesenswert?

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 :-/

von stephan_ (Gast)


Lesenswert?

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

von smartcard (Gast)


Lesenswert?

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 :-(

von Bert 0. (maschinist)


Lesenswert?

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

von smartcard (Gast)


Lesenswert?

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ß

von Bert 0. (maschinist)


Lesenswert?

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

von Bert 0. (maschinist)


Lesenswert?

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

von Draco (Gast)


Lesenswert?

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.

von smartcard (Gast)


Lesenswert?

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

von Bert 0. (maschinist)


Lesenswert?

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

von smartcard (Gast)


Angehängte Dateien:

Lesenswert?

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

von Draco (Gast)


Lesenswert?

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.

von Draco (Gast)


Angehängte Dateien:

Lesenswert?

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.

von smartcard (Gast)


Lesenswert?

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 :-)

von smartcard (Gast)


Lesenswert?

@Draco:
Danke, aber den Quelltext hab ich schon. An den Befehlen hängt's leider 
noch :-(

von Draco (Gast)


Lesenswert?

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

von smartcard (Gast)


Lesenswert?

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 :-(

von Draco (Gast)


Angehängte Dateien:

Lesenswert?

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.

von smartcard (Gast)


Lesenswert?

Hi,

den alten Treiber hast du nicht zufällig noch?
Das KVKTool läuft nicht... :-/

mfg

von Mario M. (Firma: ProScan Elektronische Systeme) (proscan)


Lesenswert?

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
Noch kein Account? Hier anmelden.