22.09.2012 Aufrufe

6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr

6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr

6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

6&<strong>DUG6HUYHU</strong> 9<br />

<strong>7HFKQLVFKH</strong> <strong>'RNXPHQWDWLRQ</strong><br />

6PDUW&DUG 0DQDJHU 6&$5' ,QWHUIDFH 'HOSKL .RPSRQHQWH<br />

5HOHDVH<br />

‹ 7RZLWRNR $*<br />

- 1/1 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

,QKDOW<br />

Der SCardServer .................................................................................................................................. 3<br />

Überblick ........................................................................................................................................... 3<br />

Schnittstellen..................................................................................................................................... 4<br />

SCARD Schnittstelle - SCARD.DLL, SCARD32.DLL.................................................................... 4<br />

PC/SC Schnittstelle ....................................................................................................................... 4<br />

CT-API Schnittstelle - CTAPIW16.DLL, CTAPIW32.DLL.............................................................. 4<br />

OCF Schnittstelle – GEN_TWK.DLL ............................................................................................. 4<br />

TDEV Schnittstelle - TDEV.DLL, TDEV32.DLL............................................................................. 4<br />

Die SCARD Schnittstelle ...................................................................................................................... 5<br />

Grundlagen ....................................................................................................................................... 5<br />

DLL Funktion..................................................................................................................................... 6<br />

Kartenstatus...................................................................................................................................... 8<br />

DELPHI Komponente TSmartCard ................................................................................................. 10<br />

Betrieb mit mehreren Anwendungen .............................................................................................. 12<br />

Gobale Returncodes ....................................................................................................................... 13<br />

Kommandobereich SYSTEM .......................................................................................................... 14<br />

Kommandobereich LINKER............................................................................................................ 20<br />

Kommandobereich DEVICE ........................................................................................................... 21<br />

Kommandobereich CARD............................................................................................................... 26<br />

Kommandobereich APPS ............................................................................................................... 38<br />

Apps,TLV..................................................................................................................................... 38<br />

Apps,TWK ................................................................................................................................... 39<br />

Apps,KVK .................................................................................................................................... 40<br />

Kommandobaum............................................................................................................................. 42<br />

Weitere Informationsquellen............................................................................................................... 43<br />

© 1998-2001, Towitoko AG - 2/2 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

'HU 6&<strong>DUG6HUYHU</strong><br />

hEHUEOLFN<br />

Es gibt viele Hersteller von Chipkarten, Terminals und Treibern. Dazu kommen eine Reihe von<br />

Industrie-Standards, Kartenprotokollen und umfangreiche Normen. Wir haben es uns zum Ziel<br />

gesetzt, Ihnen die Einbindung von Chipkarten und Terminals so einfach wie möglich zu gestalten.<br />

Der SCardServer nimmt Ihnen eine Reihe von Aufgaben ab.<br />

0DQDJHPHQW GHU DQJHVFKORVVHQHQ 7HUPLQDOV<br />

• vollständige Plug&Play Unterstützung.<br />

• Verwaltung einer Liste <strong>der</strong> angeschlossenen Chipkartenterminals, ähnlich <strong>der</strong> Auswahlliste in<br />

einem Druckerdialog (z.B. "CHIPDRIVE extern an COM1").<br />

• Status zu jedem Gerät: Zustand <strong>der</strong> Chipkarte, Seriennummer, Geräteinformationen.<br />

• Die letzte Konfiguration wird in einer INI-Datei abgelegt (z.B. COM-Port Belegung).<br />

0DQDJHPHQW GHU YHUEXQGHQHQ $QZHQGXQJHQ<br />

• Verwaltung einer Liste aller Anwendungen die <strong>der</strong>zeit mit dem SCardServer verbunden sind.<br />

• Der SCardServer übergibt die Kontrolle über eine Karte immer genau an eine Anwendung.<br />

Wenn die Anwendung die Bearbeitung <strong>der</strong> Chipkarte beendet hat, übergibt <strong>der</strong> SCardServer<br />

die Karte <strong>der</strong> nächsten Anwendung. Bei einem Wechsel <strong>der</strong> Anwendung erfolgt ein Reset <strong>der</strong><br />

Chipkarte.<br />

• Der SCardServer kann in Abhängigkeit <strong>der</strong> gesteckten Karte bestimmte Anwendungen starten,<br />

wenn sich die Anwendung für diese Karte registriert hat. Dabei kann als Kriterium z.B. die Kartenapplikation<br />

(z.B. GSM o<strong>der</strong> EC-Karte) o<strong>der</strong> <strong>der</strong> AID <strong>der</strong> Karte verwendet werden.<br />

0DQDJHPHQW YRQ 0HPRU\ &KLSNDUWHQ<br />

• Automatische Erkennung des Kartentyps und verschiedener Kartenparameter inkl. notwendiger<br />

PINs, Schreibschutz und sogar <strong>der</strong> Pagegrößen für I 2 C Karten.<br />

• Automatische Erkennung <strong>der</strong> Applikationen auf <strong>der</strong> Karte.<br />

• Zugriff über einheitliche Funktionen, unabhängig vom Kartentyp, z.B. mit den Kommandos<br />

Card,MemWrite o<strong>der</strong> Card,ISOAPDU.<br />

• direkter Lesezugriff auf TLV-Fel<strong>der</strong> (Tag Length Value Codierung).<br />

• Caches für Schreib- und Lesezugriffe.<br />

• PIN-Verwaltung.<br />

• über 50 Chiptypen werden unterstützt, eine Liste finden Sie auf unserer Homepage<br />

http://www.towitoko.de.<br />

0DQDJHPHQW YRQ 3UR]HVVRU &KLSNDUWHQ<br />

• Automatische Erkennung des Kartentyps und Auswertung des ATR.<br />

• Kommandos im Transparentmode (1:1 zur Karte ohne Protokoll-Overhead).<br />

• T0 und T1 sind komplett nach ISO7816-3 implementiert inkl. Errorhandling, Chaining und<br />

allen S-Blocks.<br />

• T0 und T1 Protokollparameter werden aus dem ATR voreingestellt.<br />

• APDU alternativ nach ISO7816-4, GSM11.11 o<strong>der</strong> CT-API.<br />

=XJULII DXI 6WDQGDUGDSSOLNDWLRQHQ<br />

• deutsche Krankenversichertenkarte<br />

• deutsche Telefonwertkarte<br />

- 3/3 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

6FKQLWWVWHOOHQ<br />

Der SCardServer läuft unter Windows 3.11, 95, 98, ME, NT und 2000 als eigenständiger Task<br />

im Hintergrund. Die Applikationen können auf den SCardServer über eines <strong>der</strong> folgenden Interfaces<br />

zugreifen.<br />

6&$5' 6FKQLWWVWHOOH 6&$5' '// 6&$5' '//<br />

Die SCARD Schnittstelle kapselt die volle SCardServer Funktionalität. Dabei ist die Einbindung<br />

extrem einfach, alle Aufrufe laufen über eine DLL-Funktion, Fensterbotschaften dienen <strong>der</strong> Ereigniss-Steuerung<br />

Ihrer Anwendung. Diese Schnittstelle ist als 16- und 32 Bit Version unter<br />

Windows 3.11, 95, 98, ME, NT und 2000 nutzbar. Unter DELPHI 1/2/3/4/5 steht eine Komponente<br />

zur Verfügung, die die Einbindung weiter vereinfacht. Alle Ereignisse sind umgesetzt und<br />

diverse Listen (Terminals, Anwendungen, Terminalinformationen, Karteninformationen) stehen<br />

als Stringlisten zur Verfügung.<br />

3& 6& 6FKQLWWVWHOOH<br />

Diese Schnittstelle wurde von <strong>der</strong> PC/SC Workgroup (http://www.pcscworkgroup.com) spezifiziert<br />

und ist mittlerweile sowohl unter Windows als auch unter Linux/Unix implementiert.<br />

Zur Nutzung unter Windows 95/98/ME und NT müssen zusätzlich die PC/SC Basiskomponenten<br />

installiert werden, in Windows 2000 sind sie bereits integriert. Windows 3.11 wird nicht unterstützt.<br />

Eine vollständige Dokumentation <strong>der</strong> von Microsoft implementierten PC/SC Schnittstelle<br />

finden Sie im Microsoft Windows SDK, weitere Informationen sowie eigene Mailingliste für<br />

Softwareentwickler sind auch unter http://www.microsoft.com/smartcard. zu finden. Dort besteht<br />

auch die Möglichkeit, die Basiskomponenten herunterzuladen.<br />

Towitoko stellt eine Unit für Delphi 2/3/4/5 zur Verfügung, so daß einen Großteil <strong>der</strong> PC/SC<br />

Funktionen unter Windows auch in Delphi Programmen genutzt werden kann.<br />

Im Rahmen des MUSCLE Projektes (Movement for SmartCards in a Linux Environment) wurde<br />

PC/SC auch für Linux implementiert, weitere Informationen dazu sowie entsprechende Software<br />

und Linux-Treiber für das CHIPDRIVE finden Sie unter http://www.linuxnet.com.<br />

Bitte beachten Sie, dass Towitoko keinen technischen Support zur PC/SC Schnittstelle anbieten<br />

kann.<br />

&7 $3, 6FKQLWWVWHOOH &7$3,: '// &7$3,: '//<br />

Die CT-API Schnittstelle ist kompatibel zur CT-API V1.1 (Herausgeber: Deutsche Telekom AG /<br />

PZ Telesec, GMD Forschungszentrum Informationstechnik GmbH, TÜV Informationstechnik<br />

GmbH und TeleTrustT Deutschland e.V.) und als 16- und 32 Bit Version unter Windows 3.11,<br />

95, 98, ME, NT und 2000 nutzbar. Näheres zu diesen Spezifikationen finden Sie auch im Internet<br />

unter http://www.tuevit.de.<br />

Der Befehlssatz ist nach MKT implementiert (Multifunktionale Kartenterminals für das Gesundheitswesen,<br />

Herausgeber: GMD Arbeitsgemeinschaft "Karten im Gesundheitswesen").<br />

Diese Schnittstelle bietet nur einen Bruchteil <strong>der</strong> SCardServer Funktionalität.<br />

2&) 6FKQLWWVWHOOH ² *(1B7:. '//<br />

Mit dieser von IBM entwickelten Schnittstelle kann das CHIPDRIVE auch in Java-basierten Anwendungen<br />

genutzt werden. Weitere Informationen zum Open Card Framework (OCF) finden<br />

Sie im Internet unter http://www.opencard.org.<br />

Bitte beachten Sie, dass Towitoko keinen technischen Support zur OCF Schnittstelle anbieten<br />

kann.<br />

7'(9 6FKQLWWVWHOOH 7'(9 '// 7'(9 '//<br />

Die TDEV Schnittstelle ist aus Kompatibilitätsgründen zu früheren Version unserer Treiberunterstützung<br />

weiterhin verfügbar. Wir empfehlen die Verwendung <strong>der</strong> neuen SCARD Schnittstelle,<br />

da Sie damit vollen Zugriff auf die neuen Features des SCardServers erhalten.<br />

Als 16- und 32 Bit Version unter Windows 3.11, 95, 98, ME, NT und 2000 nutzbar<br />

© 1998-2001, Towitoko AG - 4/4 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

'LH 6&$5' 6FKQLWWVWHOOH<br />

*UXQGODJHQ<br />

Bei <strong>der</strong> Entwicklung des SCardServers war die einfache Einbindung einer <strong>der</strong> wichtigsten Punkte.<br />

Der SCardServer bietet alle Funktionalitäten des PC/SC Standards (und mehr), ist aber dennoch<br />

so aufgebaut, daß Sie auch mit einem Minimum an Aufwand sofort starten können.<br />

Um die Einbindung des SCardServers so einfach wie möglich zu gestalten, wird für jedes<br />

Kommando die gleiche Syntax verwendet. Die Selektion <strong>der</strong> Funktionen und die Übergabe evtl.<br />

notwendige Parameter werden über einen Kommandostring realisiert. Eingabe- und Ausgabedaten<br />

sind optional. Ein Kommandostring ist immer aus Schlüsselwörtern und Parametern aufgebaut,<br />

die durch Komma getrennt werden.<br />

Beispiel 1: Das Kommando gibt den aktuellen Gerätetyp aus, möglicher Returncode: 0 = "OK".<br />

Kommando: Str( "Device,Info,Type" )<br />

DataIn: nil<br />

DataOut: Str( "CHIPDRIVE extern" )<br />

Beispiel 2: Das Kommando schreibt 21 Zeichen ab Adresse 16 auf eine Memorykarte,mögliche<br />

Returncodes: 0 = "OK", 0x1009 = "Lesegerät ist gesperrt", 0x4000 = "Keine<br />

Karte im Leser".<br />

Kommando: Str( "Card,MemWrite,16,21" )<br />

DataIn: Str( "Hello SmartCard World" )<br />

DataOut: nil<br />

Um die oben genannten Beispiele auszuführen müssen Sie keine weiteren Parameter initialisieren<br />

o<strong>der</strong> an<strong>der</strong>e (administrative) Kommandos ausführen - einfach starten!<br />

Dennoch haben Sie Zugriff auf eine Vielzahl von leistungsstarken Funktionen, die beson<strong>der</strong>s<br />

professionelle Anwen<strong>der</strong> begeistern.<br />

- 5/5 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

'// )XQNWLRQ<br />

Alle Aufrufe dieser Schnittstelle werden direkt an den SCardServer weitergegeben. Die Funktion<br />

kehrt erst nach Bearbeitung des Kommandos durch den SCardServer zurück. Während das<br />

Kommando ausgeführt wird, werden weiterhin Windows-Botschaften verarbeitet. Die SCARD<br />

Schnittstelle kann rekursiv aufgerufen werden (in maximal 4 Ebenen).<br />

Beide DLLs (16 Bit: SCARD.DLL, 32 Bit: SCARD32.DLL) exportieren die folgende Funktion:<br />

Response = SCardComand (Handle,<br />

Cmd, CmdLen,<br />

DataIn, DataInLen,<br />

DataOut, DataOutLen<br />

);<br />

LPINT Handle /* Zeiger auf einen 32 Bit signed integer */<br />

LPSTR Cmd /* Zeiger auf einen null terminierten String */<br />

LPINT CmdLen /* Zeiger auf einen 32 Bit signed integer */<br />

LPSTR DataIn /* Zeiger auf ein array of byte o<strong>der</strong> einen String */<br />

LPINT DataInLen /* Zeiger auf einen 32 Bit signed integer */<br />

LPSTR DataOut /* Zeiger auf ein array of byte o<strong>der</strong> einen String */<br />

LPINT DataOutLen /* Zeiger auf einen 32 Bit signed integer */<br />

INT Response /* 32 Bit signed integer */<br />

Handle Falls mehrere Instanzen <strong>der</strong> DLL in einer Applikation benötigt werden, kann<br />

dieses Handle benutzt werden, um entsprechende Objektinstanzen zu unterscheiden.<br />

Der Wert kann auf null gesetzt werden, wenn nur eine Instanz benötigt<br />

wird, <strong>der</strong> SCardServer übernimmt die Zuordnung dann über das Threadbzw.<br />

Taskhandle Ihrer Anwendung.<br />

Cmd SCardServer Kommando (nullterminierter String).<br />

CmdLen Bei verschlüsselter Kommunikation mit dem SCardServer die Länge des Kommandostrings,<br />

bei unverschlüsselter Kommunikation muß Null übergeben werden.<br />

DataIn Zeiger auf den Puffer mit den Eingabedaten.<br />

DataInLen Länge <strong>der</strong> Eingabedaten.<br />

DataOut Zeiger auf den Puffer für die Ausgabedaten.<br />

DataOutLen Maximale Länge <strong>der</strong> Rückgabedaten, wird auf die tatsächliche Länge <strong>der</strong> Rückgabedaten<br />

gesetzt.<br />

Response globaler Returncode, bei erfolgreicher Ausführung wird Null zurückgegeben.<br />

© 1998-2001, Towitoko AG - 6/6 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

%HLVSLHO ]X 3$6&$/ '(/3+, RKQH 76PDUW&DUG .RPSRQHQWH<br />

function SCardComand ( var Handle: LongInt;<br />

Cmd: Pointer; var CmdLen: LongInt;<br />

DataIn: Pointer; var DataInLen: LongInt;<br />

DataOut: Pointer; var DataOutLen: LongInt<br />

): LongInt; stdcall; external "SCARD32.DLL";<br />

Wichtig: Unter DELPHI 1 (16-BIT Version) muss die 16 Bit Version <strong>der</strong> DLL (SCARD.DLL)<br />

eingebunden werden, das Schlüsselwort stdcall fällt weg:<br />

... ): LongInt; external "SCARD";<br />

%HLVSLHO ]XU G\QDPLVFKHQ (LQELQGXQJ XQWHU &<br />

typedef DWORD (__stdcall *SCardCmd)(LPDWORD Handle,<br />

LPCSTR Cmd, LPINT CmdLen,<br />

LPCSTR DataIn, LPINT DataInLen,<br />

LPCSTR DataOut, LPINT DataOutLen);<br />

(...)<br />

SCardCmd pSCardCommand = NULL;<br />

HANDLE hScardDLL = LoadLibrary("SCARD32.DLL");<br />

if (hSCardDLL)<br />

pSCardCommand = (SCardCmd)GetProcAddress(hScardDLL, "SCardComand");<br />

Wichtig: - Wenn Sie eine 16-Bit Version verwenden, müssen Sie auch die 16 Bit DLL<br />

einbinden: ... = LoadLibrary("SCARD.DLL");<br />

- Es existieren keine LIB-Dateien für einen statischen Import unter C, daher kann<br />

hier nur <strong>der</strong> dynamischen Import <strong>der</strong> DLL-Funktion genutzt werden.<br />

- Stringvariablen sind nur Zeiger auf einen Puffer, zusätzlich muss für diesen Puffer<br />

aber manuell noch Speicher allokiert werden<br />

%HLVSLHO ]X 9LVXDO %DVLF XQG $FFHVV 9%$<br />

Declare Function SCardComand Lib "SCARD32.DLL" (Handle As Long,<br />

ByVal Cmd As String, CmdLen As Long,<br />

ByVal DataIn As String, DataInLen As Long,<br />

ByVal DataOut As String, DataOutLen As Long<br />

) As Long<br />

Wichtig: Stringvariablen müssen unter Visual Basic initialisiert werden, benutzen Sie daher<br />

DataOut = String(255, 0) um Speicher für zurückgelieferte Werte zu reservieren.<br />

- 7/7 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.DUWHQVWDWXV<br />

Der SCardServer übernimmt das Management <strong>der</strong> Karte. Für jede Anwendung wird <strong>der</strong> Status<br />

<strong>der</strong> Karte und des Terminals wie folgt geführt:<br />

• es wird geprüft, ob das Terminal angeschlossen und ansprechbar ist. Ist das nicht <strong>der</strong> Fall,<br />

wird <strong>der</strong> Status ERROR gesetzt.<br />

• es wird geprüft, ob sich eine Karte im Leser befindet. Ist das nicht <strong>der</strong> Fall, wird <strong>der</strong> Status<br />

WAIT gesetzt.<br />

• wird eine Karte eingesteckt, beginnt die Erkennungsphase, d.h. es wird <strong>der</strong> genaue Kartentyp<br />

(Chiptyp) ermittelt und anschließend wird geprüft, ob die Karte bestimmte Applikationen enthält.<br />

Während <strong>der</strong> 'Erkennungsphase' wird <strong>der</strong> Status DETECT gesetzt. Kartenzugriffe sind<br />

noch nicht möglich (Fehlercode: 0x4000, Text: "Keine Karte im Leser").<br />

• ist die Karte nicht lesbar o<strong>der</strong> unbekannt, wird <strong>der</strong> Status INVALID gesetzt<br />

• an<strong>der</strong>nfalls wird die Karte genau einer Anwendung zugänglich gemacht. Für diese Anwendung<br />

wird <strong>der</strong> Status ACTIVE gesetzt, für alle an<strong>der</strong>en Anwendungen <strong>der</strong> Status LOCKED.<br />

• An diesem Zustand än<strong>der</strong>t sich nichts bis:<br />

a) die Karte entfernt wird. Der Status WAIT wird gesetzt.<br />

b) die aktive Anwendung das Kommando Card,Unlock aufruft.<br />

• Im Fall b) teilt <strong>der</strong> SCardServer die Karte <strong>der</strong> nächsten Anwendung zu, die wie<strong>der</strong>um die Kontrolle<br />

weitergeben kann (über Card,Unlock).<br />

• Haben alle Anwendungen die Karte wie<strong>der</strong> freigegeben, wird <strong>der</strong> Status VALID gesetzt, d.h.<br />

die Karte ist gültig und <strong>der</strong>zeit keiner Anwendung zugeordnet.<br />

• Sollte eine Anwendung die Karte erneut bearbeiten (z.B. aufgrund einer Benutzeraktion), muß<br />

die Kontrolle explizit wie<strong>der</strong> über das Kommando Card,Lock angefor<strong>der</strong>t werden. Der Status<br />

ACTIVE wird für die Anwendung, die das Kommando erfolgreich ausgeführt hat, gesetzt. Für<br />

alle an<strong>der</strong>en Anwendungen gilt <strong>der</strong> Status LOCKED.<br />

• Die aktive Anwendung kann wie<strong>der</strong>um über Card,Unlock die Kontrolle abgeben, d.h. Status<br />

VALID für alle Anwendungen.<br />

Der Status kann mit dem Kommando Card,Info,Status je<strong>der</strong>zeit abgefragt werden.<br />

:LQGRZV 0HVVDJLQJ<br />

Unter Windows ist es wesentlich vorteilhafter, Statusän<strong>der</strong>ungen über Fensterbotschaften zu<br />

übermitteln. Dies entlastet das System, da ein ständiges Pollen nicht notwendig ist.<br />

Ihre Anwendung kann über die Befehle System,AddHWndMsg und System,DelHWnd beliebig<br />

viele Fenster zum Empfang von SCardServer Botschaften registrieren bzw. wie<strong>der</strong> entfernen.<br />

Eine Botschaft wird an Ihre Anwendung in folgenden Fällen geschickt:<br />

• Im Fall einer Statusän<strong>der</strong>ung (z.B. WAIT → DETECT)<br />

• Innerhalb des Status LOCKED, wenn eine neue Anwendung die Kontrolle übernimmt<br />

Bei folgen<strong>der</strong> Statusän<strong>der</strong>ung wird keine Botschaft geschickt:<br />

• wenn Sie die Bearbeitung <strong>der</strong> Karte über Card,Lock erneut anfor<strong>der</strong>n, d.h. <strong>der</strong> Status für Ihre<br />

Anwendung von VALID auf ACTIVE wechselt, wird keine Botschaft geschickt.<br />

Für alle an<strong>der</strong>en Anwendungen wechselt <strong>der</strong> Status von VALID auf LOCKED, eine entsprechende<br />

Botschaft wird geschickt. Sinn dieser Ausnahme ist es, daß die Botschaft ACTIVE nur<br />

bei <strong>der</strong> ersten Aktivierung nach dem Einstecken gesendet wird.<br />

Die Windows Botschaft wird über die Windows API Funktion PostMessage an die übergebenen<br />

Fensterhandles geschickt. Die Message ID können Sie ebenfalls bei <strong>der</strong> Registrierung des<br />

Fensterhandles angeben (vgl. Kommando System,AddHWndMsg).<br />

© 1998-2001, Towitoko AG - 8/8 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

Der W-Parameter gibt den Botschaftstyp an:<br />

• MsgError = dezimal 100 bei Statusän<strong>der</strong>ung nach ERROR<br />

• MsgWait = dezimal 110 bei Statusän<strong>der</strong>ung nach WAIT<br />

• MsgDetect = dezimal 120 bei Statusän<strong>der</strong>ung nach DETECT<br />

• MsgInvalid = dezimal 130 bei Statusän<strong>der</strong>ung nach INVALID<br />

• MsgValid = dezimal 140 bei Statusän<strong>der</strong>ung nach VALID<br />

• MsgActive = dezimal 150 bei Statusän<strong>der</strong>ung nach ACTIVE<br />

• MsgLocked = dezimal 160 bei Statusän<strong>der</strong>ung nach LOCKED und<br />

bei jedem Wechsel <strong>der</strong> aktiven Anwendung<br />

• MsgProgress = dezimal 200 zur Fortschrittsanzeige bei Memorycard-Zugriffen<br />

• MsgDeviceList = dezimal 300 zeigt Än<strong>der</strong>ungen in <strong>der</strong> Geräteliste an<br />

• MsgDeviceSearch = dezimal 301 Fortschrittsanzeige während <strong>der</strong> Gerätesuche<br />

• MsgTaskList = dezimal 310 zeigt Än<strong>der</strong>ungen in <strong>der</strong> Taskliste an<br />

• MsgCardInfo = dezimal 320 zeigt Än<strong>der</strong>ungen <strong>der</strong> Liste CardInfo an<br />

Das nie<strong>der</strong>wertige Word des L-Parameters gibt den Index des aktiven Terminals innerhalb<br />

<strong>der</strong> Terminalliste an (mit null beginnend). Ausnahme:<br />

• MsgDeviceSearch: COM-Port, an dem gesucht wird<br />

Das höherwertige Word des L-Parameter ist botschaftsabhängig:<br />

• MsgLocked Index <strong>der</strong> aktiven Anwendung innerhalb <strong>der</strong> Taskliste (mit 0 beginnend)<br />

• MsgProgress Fortschrittswert von 0 bis 100 in Prozent<br />

• MsgDeviceSearch Fortschrittswert von 0 bis 100 in Prozent,<br />

Son<strong>der</strong>werte: 254: Gerät OK; 255: Kein Gerät gefunden<br />

0HVVDJHV GHDNWLYLHUHQ<br />

Um die Bearbeitung <strong>der</strong> Windows-Botschaften innerhalb des SCardServers abzuschalten muss<br />

die Funktion SCardComand mit den Parametern Cmd = nil, CmdLen = 0, DataIn = nil,<br />

DataInLen = 0, DataOut = nil und DataOutlen = -1 aufgerufen werden. MIt<br />

DataOutlen = -2 wird die Bearbeitung wie<strong>der</strong> eingeschaltet.<br />

Verwenden Sie z.B. folgendes unter Delphi:<br />

procedure SCardCmdNoYield (Handle: LongInt);<br />

var L,M,N: LongInt;<br />

begin<br />

L:=0;<br />

M:=0;<br />

N:=-1;<br />

SCardComand(Handle,nil,L,nil,M,nil,N);<br />

end;<br />

procedure SCardCmdDoYield (Handle: LongInt);<br />

var L,M,N: LongInt;<br />

begin<br />

L:=0;<br />

M:=0;<br />

N:=-2;<br />

SCardComand(Handle,nil,L,nil,M,nil,N);<br />

end;<br />

- 9/9 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

'(/3+, .RPSRQHQWH 76PDUW&DUG<br />

Unter DELPHI vereinfacht sich die Einbindung weiter. Im wesentlichen übernimmt die Komponente<br />

TSmartCard folgende Aufgaben:<br />

• Lädt die SCARD-Library (16 Bit: SCARD.DLL, 32 Bit: SCARD32.DLL ) dynamisch und importiert<br />

die Funktion SCardComand<br />

• Richtet eine Objektinstanz zum SCardServer ein<br />

• Erzeugt ein Fensterhandle und registriert es zum Empfang <strong>der</strong> SCardServer-Ereignisse<br />

• Führt eine neue Exception ESmartCard ein, und leitet Fehlermeldungen so weiter<br />

Im folgenden werden die Methoden, Eigenschaften und Ereignisse <strong>der</strong> Komponente TSmart-<br />

Card kurz erläutert. Näheres finden Sie im Referenzteil <strong>der</strong> SCardServer Kommandos:<br />

0HWKRGHQ<br />

function Comand (const Cmd: String;<br />

DataIn: Pointer; DataInLen: LongInt;<br />

DataOut: Pointer; DataOutMax LongInt): LongInt<br />

Die Methode kapselt die SCardComand Funktion zur Kommunikation mit dem SCardServer. In<br />

Cmd wird <strong>der</strong> Kommandostring übergeben. DataOutMax gibt die max. Größe <strong>der</strong> Datenstruktur<br />

DataOut an. Beide Zeiger können mit nil übergeben werden, wenn keine Daten benötigt werden.<br />

Der Rückgabewert enthält die Anzahl <strong>der</strong> nach DataOut kopierten Bytes. Wenn ein Fehler<br />

auftritt, wird eine ESmartCard-Exception ausgelöst.<br />

function ComandStr (const Cmd, DataIn: String): String;<br />

Entspricht Comand, benutzt aber statt Zeigern auch zur Datenübertragung Strings. Der Rückgabewert<br />

entspricht DataOut.<br />

procedure ComandList (const Cmd: String; Lines: TStrings);<br />

Entspricht Comand ohne Eingabeparameter (DataIn = nil). Das Ergebnis wird als Stringliste<br />

interpretiert und in Lines abgelegt (z.B. benutzt von DeviceList).<br />

(LJHQVFKDIWHQ<br />

Active: Boolean<br />

Lässt die Komponente die SCARD Library laden und startet damit den SCardServer bzw. bewirkt<br />

das Entladen <strong>der</strong> Library.<br />

AutoUnlock: Boolean<br />

Ermöglicht die automatische Freigabe <strong>der</strong> Karte (siehe Kommandos Card,Unlock) nachdem<br />

das Ereignis OnActiveCard beendet wurde.<br />

CardInfo: TStringList<br />

Liste <strong>der</strong> Informationen über die eingesteckte Karte.<br />

ConfigMaxPort: Integer<br />

Anzahl <strong>der</strong> zur Auswahl stehenden COM-Ports unter ConfigMenuItem/ConfigPopupMenu.<br />

ConfigMenuItem: TMenuItem<br />

ConfigPopupMenu: TPopupMenu<br />

Entwe<strong>der</strong> kann ConfigMenuItem ein Menüeintrag o<strong>der</strong> ConfigPopupMenu ein Popupmenü<br />

zugewiesen werden. Die Komponente trägt dann die erfor<strong>der</strong>lichen Einträge zur Terminalauswahl<br />

und Konfiguration des SCardServers automatisch ein. Es kann jeweils nur eine dieser beiden<br />

Eigenschaften gesetzt werden.<br />

DeviceInfo: TStringList<br />

Liste <strong>der</strong> Terminalinformationen des aktuell gewählten Terminals.<br />

DeviceList: TStringList<br />

Liste <strong>der</strong> verfügbaren Terminals.<br />

© 1998-2001, Towitoko AG - 10/10 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

Enabled: Boolean<br />

Sperrt alle Ereignissroutinen. Die Library wird nicht ge- o<strong>der</strong> entladen. Wenn <strong>der</strong> SCardServer<br />

<strong>der</strong> Komponente die Karte zuteilt, wird sofort das Kommando Card,Unlock aufgerufen, um die<br />

Bearbeitung an die nächste Anwendung bzw. die nächste Delphi Komponente in Ihrer Anwendung<br />

weiterzugeben (unabhängig von <strong>der</strong> Eigenschaft AutoUnlock).<br />

Language: TLanguage = (lngCustom, lngEnglish, lngDeutsch)<br />

LanguageText: TStringList<br />

Setzt die Sprache <strong>der</strong> Statusmeldungen. Für lngEnglish or lngDeutsch füllt die Komponente<br />

automatisch die Stringliste "LanguageText" aus, bei lngCustom kann die Liste manuell mit<br />

Texten einer beliebigen Sprache gefüllt werden. Die Einstellung gilt nur für die Komponente, um<br />

die Sprache im SCardServer selber zu än<strong>der</strong>n dient das Kommando System.SetLng.<br />

StatusLabel: TLabel<br />

Hier kann ein Label angegeben werden, in dem die Statusmeldugnen des SCardServers automatisch<br />

angezeigt werden.<br />

StatusText: String<br />

Hier wird die aktuelle Statusmeldung des SCardServer gespeichert. Der jeweilige Text kommt<br />

aus <strong>der</strong> Stringliste "LanguageText".<br />

TaskList: TStringList<br />

Liste <strong>der</strong> mit dem SCardServer verbundenen Applikationen/Tasks.<br />

Tag: Longint<br />

wird nicht verwendet und kann frei genutzt werden.<br />

(UHLJQLVVH<br />

OnCardActive: TCardEvent<br />

Die Karte wurde erkannt und aktiviert. Die Karte kann jetzt bearbeiten werden.<br />

OnCardDetect: TCardEvent<br />

Eine Karte wurde ins Terminal gesteckt. Die Karte kann noch nicht bearbeitet werden!<br />

OnCardInfoChange: TNotifyEvent<br />

Ereignis zur Anzeige neuer Daten in <strong>der</strong> Liste "CardInfo"<br />

OnCardInvalid: TCardEvent<br />

Die Erkennung ist fehlgeschlagen / keine gültige Karte!<br />

OnCardLock: TCardLockEvent<br />

Eine an<strong>der</strong>e Applikation hat die Bearbeitung <strong>der</strong> Karte begonnen<br />

OnCardValid: TCardEvent<br />

Alle Applikationen haben die Bearbeitung <strong>der</strong> Karte abgeschlossen (über das Kommando<br />

Card,Unlock). Es ist jetzt wie<strong>der</strong> möglich die Karte erneut zu bearbeiten.<br />

OnCardWait: TCardEvent<br />

Es ist keine Karte im Terminal / die Karte wurde aus dem Terminal genommen<br />

OnDeviceError: TCardEvent<br />

Das Terminal ist ausgefallen / die Verbindung zum PC wurde getrennt!<br />

OnDeviceListChange: TNotifyEvent<br />

Ereignis zur Anzeige neuer Daten in <strong>der</strong> Liste "DeviceList"<br />

OnDeviceSearch: TSearchEvent<br />

Ereignis zur Fortschrittsanzeige während <strong>der</strong> Suche nach einem Terminal (über Kommando<br />

Device,SearchComPort o<strong>der</strong> beim ersten Start des SCardServers)<br />

OnProgress: TProgressEvent<br />

Ereignis zur Fortschrittsanzeige bei Memorykartenzugriffe<br />

OnTaskListChange: TNotifyEvent<br />

Ereignis zur Anzeige neuer Daten in <strong>der</strong> Liste "TaskList"<br />

- 11/11 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

%HWULHE PLW PHKUHUHQ $QZHQGXQJHQ<br />

Bei je<strong>der</strong> Übergabe <strong>der</strong> Karte von einer Anwendung zur nächsten wird ein Reset durchgeführt,<br />

(vgl. Kommando Card,Reset) somit werden alle erworbenen Zugriffsrechte gelöscht.<br />

5HLKHQIROJH GHU $NWLYLHUXQJ YRQ $QZHQGXQJHQ<br />

Der SCardServer bestimmt die Reihenfolge, in <strong>der</strong> den Anwendungen die Karte zugeteilt wird.<br />

Die Priorität wird nach den folgenden Kriterien, in <strong>der</strong> Reihenfolge <strong>der</strong> Listung, festgelegt.<br />

Es wird untersucht, ob<br />

• eine Anwendung sich für eine bestimmte Kartenapplikation registriert hat (z.B. SIM-Surf für<br />

GSM-Karten).<br />

• eine Prozessorkarte die Selektion über einen <strong>der</strong> registrierten Namen zuläßt (ISO7816-4).<br />

• eine Memorykarte einer registrierten Maske (byte-weiser Vergleich beliebiger Speicherbereiche)<br />

entspricht<br />

• eine Anwendung einen AID registriert hat (in den Historybytes des ATR von Prozessorkarten,<br />

o<strong>der</strong> im ATR (TLV-Kodierung) einer Memorykarte<br />

Ergibt sich keine eindeutige Zuordnung, d.h. haben mehrere Anwendungen gleichrangige Kriterien<br />

erfüllt, o<strong>der</strong> wurden keine Kriterien erfüllt, entscheidet die Tabulatorreihenfolge des Windows-Desktops<br />

über die Aktivierung.<br />

5HJHOQ ]XP HLQZDQGIUHLHQ %HWULHE PLW PHKUHUHQ $QZHQGXQJHQ<br />

Die automatische Auswahl <strong>der</strong> passenden Anwendung und v.a. die Weitergabe <strong>der</strong> Aktivierung<br />

an die nächste Anwendung können Sie optimieren. Beachten Sie dazu folgende Punkte:<br />

• Registrieren Sie zuverlässige Kriterien<br />

• Erlauben Sie dem SCardServer Ihre Anwendung bei Bedarf zu starten<br />

• Öffnen Sie keine modalen Dialogboxen, solange Ihre Anwendung nicht die aktive Anwendung<br />

ist. Es könnten sonst gleichzeitig mehrere modale Dialoge geöffnet werden!<br />

• Nutzen Sie insbeson<strong>der</strong>e das Ereignis DETECT nicht, um Dialoge o<strong>der</strong> Fenster zu öffnen, son<strong>der</strong>n<br />

blenden Sie besser einen Text in einer Statuszeile ein, z.B. "Karte wird untersucht,<br />

bitte warten".<br />

• Nutzen Sie das Ereignis INVALID (ungültige Karte) nicht für modale Dialoge!<br />

• Rufen Sie die Funktion Card,Unlock auf, wenn Sie die Karte nicht bearbeiten können o<strong>der</strong><br />

die Bearbeitung abgeschlossen haben.<br />

• Führen Sie vor dem Befehl Card,Unlock den Befehl Card,Reset aus, wenn Sie erworbene<br />

Kartenrechte löschen möchten. Sie sollten an<strong>der</strong>e Möglichkeiten <strong>der</strong> Karte vorziehen, da auch<br />

alle Caches des SCardServers gelöscht werden.<br />

• Unsere Empfehlung zur Terminalauswahl ist ein Windowsmenü mit folgenden Einträgen:<br />

- "COM1" bis "COM8"<br />

- Trennlinie,<br />

- "automatische Terminalwahl"<br />

- Trennlinie<br />

- Auflistung <strong>der</strong> angeschlossenen Terminals (Device,List).<br />

Auf diese Weise kann <strong>der</strong> Benutzer auf übersichtliche Weise:<br />

a) neue Terminals anmelden - (Device,SearchComPort,)<br />

b) die automatische Terminalwahl aktivieren (Device,Select,-1)<br />

c) explizit ein Terminal bestimmen (Device,Select,)<br />

© 1998-2001, Towitoko AG - 12/12 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

*REDOH 5HWXUQFRGHV<br />

Ein wesentliches Merkmal des SCardServers ist seine einheitliche Fehlerbehandlung über die<br />

globalen Returncodes. In <strong>der</strong> Datei SCARD.ERR sind alle Werte mit entsprechenden Texten gelistet.<br />

Übersetzungen sind einfach möglich, erweitern Sie dazu die Datei entsprechend dem INI-<br />

Format. Im Folgenden sind die Fehlercodes in hexadezimaler Schreibweise angegeben:<br />

0x0000 "OK"<br />

(Kommando erfolgreich ausgeführt)<br />

0x1001 "Serielle Schnittstelle ist nicht verfügbar"<br />

(die Suche an dem gewählten COM-Port ist nicht möglich, weil die Schnittstelle unter<br />

Windows nicht verfügbar ist. Der COM-Port muß unter Systemsteuerung, Anschlüsse<br />

bzw. mit dem Gerätemanager eingerichtet werden)<br />

0x1002 "Serielle Schnittstelle ist von einer an<strong>der</strong>en Anwendung belegt"<br />

(<strong>der</strong> COM-Port wird von einer an<strong>der</strong>en Anwendung genutzt, z.B. <strong>der</strong> Maus o<strong>der</strong> einem<br />

Modem)<br />

0x1008 "Kein Lesegerät am Anschluß gefunden"<br />

(<strong>der</strong> COM-Port ist richtig installiert, aber es wurde kein Terminal gefunden, Verbindung<br />

prüfen)<br />

0x1009 "Lesegerät ist gesperrt von X"<br />

(im Moment ist <strong>der</strong> Zugriff auf das Terminal nicht möglich, weil eine an<strong>der</strong>e Anwendung<br />

die Karte bearbeitet o<strong>der</strong> noch nicht freigegeben hat. “X“ wird dabei durch den<br />

Namen <strong>der</strong> Anwendung ersetzt)<br />

0x4000 "Keine Karte im Lesegerät"<br />

0x4001 "Karte wurde während des Zugriffs entfernt"<br />

0x4002 "Ungültige Karte im Lesegerät"<br />

0x4004 "Karte konnte nicht ausgeworfen werden"<br />

(reserviert für zukünftige Lesegeräte mit automatischem Kartenauswurf)<br />

0x1200 "Befehl unbekannt"<br />

(<strong>der</strong> Kommandostring konnte nicht interpretiert werden)<br />

0x1201 "Befehl mit dieser Karte nicht möglich"<br />

(nicht alle Kommandos sind mit allen Karten kompatibel, insbeson<strong>der</strong>e solche für<br />

Memory- und Prozessorkarten)<br />

0x1202 "Befehl mit diesem Terminal nicht möglich"<br />

(wird z.B. von Terminals ohne Prozessorkartenunterstützung ausgelöst, wenn ein T0<br />

Kommando geschickt wird)<br />

0x1203 "Befehlsparameter ungültig"<br />

(z.B. ungültiger Adressbereich bei dem Kommando Card,MemRead)<br />

0x1310 "Kartenzugriff fehlgeschlagen"<br />

(nicht reparabler Fehler bei <strong>der</strong> Kommunikation mit <strong>der</strong> Chipkarte)<br />

0x1311 "PIN-Fehler! Noch X Versuch(e) "<br />

(PIN-Fehler bei Memorykarten; “X“ wird durch die Anzahl <strong>der</strong> restlichen Versuche<br />

ersetzt, wenn <strong>der</strong> Fehlertext abgerufen wird)<br />

0x2000 "Server nicht verfügbar"<br />

(<strong>der</strong> SCardServer konnte nicht gestartet werden)<br />

- 13/13 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.RPPDQGREHUHLFK 6


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

6\VWHP &RPDQGV<br />

Gibt eine Liste aller verfügbaren Kommandos, jewels durch die Zeichen CR+LF (=#13#10) getrennt,<br />

aus. Der Kommandobaum kann mit diesem Kommando rekursiv gelistet werden, dazu<br />

wird <strong>der</strong> Kommandostring jeweils um weitere Schlüsselwörter erweitert wird.<br />

Kommando: Str( "System,Commands[,]" )<br />

DataIn: nil<br />

DataOut: Str("#13#10[#13#10[...]]")<br />

optional, nur Kommandos aus diesem Bereich auslisten.<br />

verfügbare Kommandos.<br />

Beispiel 1: Haupdkommandos auflisten.<br />

Kommando: Str( "System,Comands" )<br />

DataIn: nil<br />

DataOut: Str( " System<br />

Linker<br />

Device<br />

Card<br />

Apps " )<br />

Beispiel 2: Kommandos aus dem Bereich Apps,TWK auflisten.<br />

Kommando: Str( "System,Comands,Apps,TWK" )<br />

DataIn: nil<br />

DataOut: Str( " Seriennummer<br />

Hersteller<br />

Datum<br />

Orginalwert<br />

Restwert<br />

Chipcode<br />

ChipHersteller<br />

Betreiber" )<br />

6\VWHP 6HW/QJ<br />

Legt die Sprache für die aktuelle Anwendung fest. Die Fehlermeldungstexte werden aus <strong>der</strong> Datei<br />

SCARD.ERR geladen, die Sie einfach erweitern/übersetzen können.<br />

Kommando: Str( "System,SetLng," )<br />

DataIn: nil<br />

DataOut: nil<br />

Sprache (= Sektionstring in <strong>der</strong> Datei SCARD.ERR).<br />

Beispiel: Fehlermeldungen sollen in englisch erscheinen.<br />

Kommando: Str( "System,SetLng,ENGLISH" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 15/15 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

6\VWHP &RQYHUW(UU&RGH<br />

Gibt zu einem Fehlercode den entsprechenden Text zurück:<br />

Kommando: Str( "System,ConvertErrCode," )<br />

DataIn: nil<br />

DataOut: Str( "" )<br />

hexadezimaler Fehlercode des SCardServers.<br />

zugehöriger Text in <strong>der</strong> aktuell gesetzen Sprache aus <strong>der</strong> Datei SCARD.ERR.<br />

Beispiel: Die aktuelle gesetzte Sprache ist Deutsch, es soll <strong>der</strong> zu dem hexadezimalen Fehlercode<br />

0x4002 gehörende Text zurückgegeben werden.<br />

Kommando: Str( "System,ConvertErrCode,4002" )<br />

DataIn: nil<br />

DataOut: Str( "Ungültige Karte im Lesegerät" )<br />

6\VWHP &UHDWH<br />

Der SCardServer erzeugt für jede verbundene Anwendung eine Instanz. Dazu wird das<br />

Taskhandle <strong>der</strong> Applikation benutzt. Es ist also nicht notwendig, eine Objektinstanz zu erzeugen,<br />

wenn nur eine Instanz benötigt wird. Wenn mehrere Instanzen in einer Anwendung benötigt<br />

werden, müssen diese über dieses Kommando eingerichtet werden.<br />

Wichtig: Beim Aufruf muß <strong>der</strong> Parameter Handle des DLL Funktion SCardComand auf -1<br />

gesetzt werden, deswegen kann dieses Kommandos nicht über die Delphi Komponente<br />

genutzt werden. Hier ist es aber wesentlich leichter, wenn einfach mehrere<br />

TSmartCard Objekte erzeugt werden, falls mehrere Instanzen benötigt werden.<br />

Beispiel: Kommando: Str( "System,Create" )<br />

DataIn: nil<br />

DataOut: Str( "Handle=5" )<br />

6\VWHP 'HVWUR\<br />

Gibt eine Objektinstanz, die mit System,Create erzeugt wurde, wie<strong>der</strong> frei. Der SCardServer<br />

führt diese Funktion auch selbsttätig aus, sobald das Taskhandle <strong>der</strong> Anwendung ungültig wird,<br />

d.h. Ihre Anwendung beendet wurde.<br />

Kommando: Str( "System,Destroy," )<br />

DataIn: nil<br />

DataOut: nil<br />

freizugebendes Handle.<br />

Beispiel: Das Handle 3 freigeben.<br />

Kommando: Str( "System,Destroy,3" )<br />

DataIn: nil<br />

DataOut: nil<br />

© 1998-2001, Towitoko AG - 16/16 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

6\VWHP 7DVN/LVW<br />

Gibt die Liste <strong>der</strong> aktuell mit dem SCardServer verbundenen Applikationen sowie das <strong>der</strong> jeweiligen<br />

Applikation aktuell zugeordnete Gerät zurück. Die Anwendungen sind dabei durch die Zeichen<br />

CR+LF (= #13#10) getrennt.<br />

Kommando: Str( "System,TaskList" )<br />

DataIn: nil<br />

DataOut: Str( ",#13#10[,#13#10[...]]" )<br />

Name <strong>der</strong> Anwendung.<br />

Name des Terminals, Port und ggf. Nummer an diesem Port (vgl. auch Kommando<br />

Device,Info,Port).<br />

Beispiel: Kommando: Str( " System,TaskList" )<br />

DataIn: nil<br />

DataOut: Str( " SCard Test Tool,'CHIPDRIVE extern I' an COM1<br />

SmartCard Demo,'CHIPDRIVE twin Slot 1' an COM2<br />

SIM-surf profi, CHIPDRIVE twin Slot 2' an COM2" )<br />

6\VWHP 7DVN7LWOH<br />

Mit diesem Kommando läßt sich explizit <strong>der</strong> Name <strong>der</strong> Anwendung setzen, welcher dann z.B. in<br />

von dem Kommando System,TaskList erzeugten Liste erscheint. Wird keine Titel gesetzt, so<br />

wird <strong>der</strong> Text aus <strong>der</strong> Titelzeile des Hauptfensters <strong>der</strong> Anwendung verwendet.<br />

Kommando: Str( "System,TaskTitle," )<br />

DataIn: nil<br />

DataOut: nil<br />

Name <strong>der</strong> Anwendung (Leerzeichen sind erlaubt, jedoch keine Kommas o<strong>der</strong><br />

Son<strong>der</strong>zeichen).<br />

Beispiel: Namen „Hello SmartCard World“ setzten.<br />

Kommando: Str( "System,TaskTitle,Hello SmartCard World" )<br />

DataIn: nil<br />

DataOut: nil<br />

6\VWHP 7DVN3DWK<br />

Dieses Kommando ist für den internen Gebrauch reserviert.<br />

6\VWHP 8SJUDGH 6\VWHP 2HP5HJLVWHU<br />

Diese Kommandos haben keine Funktion mehr und sind nur noch aus Gründen <strong>der</strong> Kompatibilität<br />

mit älteren Anwendungen vorhanden.<br />

- 17/17 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

6\VWHP $GG+:QG0VJ<br />

Registriert ein Fensterhandle und einen Messagewert zur Benachrichtigung Ihrer Anwendung<br />

bei Statusän<strong>der</strong>ungen. Es können bis zu 8 Fenster eingetragen werden.<br />

Kommando: Str( "System,AddHWndMsg,," )<br />

DataIn: nil<br />

DataOut: nil<br />

Fensterhandle an das die Nachrichten geschickt werden (dezimal).<br />

Botschaftswert für die Benachrichtigungen (Message ID, dezimal), <strong>der</strong> Wert<br />

sollte grösser o<strong>der</strong> gleich als WM_USER (=0x400) sein, da dieser Bereich für<br />

anwendungsspezifische Nachrichten vorgesehen ist.<br />

Beispiel: Das Hauptfensters <strong>der</strong> Anwendung hat das hexadezimale Handle 0x148B4896<br />

(=344672406 dezimal). Es soll die Nachrichten des SCardServers unter <strong>der</strong> ID<br />

WM_USER+0x500 (=0x900,entspricht dezimal 1524) bekommen.<br />

Kommando: Str( "System,AddHWndMsg,344672406,1524" )<br />

DataIn: nil<br />

DataOut: nil<br />

6\VWHP 'HO+:QG<br />

Löscht ein Fensterhandle aus <strong>der</strong> Liste.<br />

Kommando Str( "System,DelHWnd," )<br />

DataIn: nil<br />

DataOut: nil<br />

registriertes Fensterhandle für die Nachrichten (dezimal).<br />

Beispiel: das Nachrichtenfenster mit dem hexadezimale Handle 0x148B4896 (dezimal<br />

344672406) soll gelöscht werden.<br />

Kommando: Str( "System,DelHWnd,344672406" )<br />

DataIn nil<br />

DataOut nil<br />

6\VWHP 6HW0DLQ+:QG<br />

Sobald das Hauptfenster einer Anwendung nicht mehr existiert, wird davon ausgegangen, dass<br />

die Anwendung beendet wurde. Daher löscht <strong>der</strong> SCardServer auch das entsprechende Handle.<br />

Normalerweise wird das Hauptfenster einer Anwendung automatisch erkannt, in Einzelfällen<br />

kann es jedoch vorkommen, dass ein nur zeitweise bestehendes Fenster (Hilfe, About, Tool,<br />

Passwort etc.) als Hauptfenster interpretiert wird; in diesem Fall muß das Fenster-Handle des<br />

Hauptfenster mit diesem Kommando explizit gesetzt werden.<br />

Kommando: Str( "System,SetMainWnd," )<br />

DataIn: nil<br />

DataOut: nil<br />

Handle des Hauptfensters <strong>der</strong> Anwendung (dezimal).<br />

Beispiel: Hauptfenster hat das dem hexadezimale Handle 0x148B4896 (dezimal 344672406).<br />

Kommando: Str( "System,SetMainWnd,344672406" )<br />

DataIn: nil<br />

DataOut: nil<br />

© 1998-2001, Towitoko AG - 18/18 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

6\VWHP &U\SW.H\<br />

Hiermit wird die verschlüsselte Kommunikation mit dem SCardServer aktiviert. Nach erfolgreicher<br />

Ausführung dieses Kommandos können Kommandostring und DataIn nur noch verschlüsselt<br />

übergeben werden, DataOut wird vom SCardServer verschlüsselt zurückgegeben. Bei diesem<br />

Kommando handelt es sich we<strong>der</strong> um eine Funktion zur Verschlüsselung von Daten, noch<br />

werden die Daten selber verschlüsselt auf <strong>der</strong> Karte abgelegt. Nur die Kommunikation zwischen<br />

Anwendung und SCardServer läuft verschlüsselt ab, wobei die Anwendung selbst des Ver- und<br />

Entschlüsseln <strong>der</strong> Daten übernehmen muss.<br />

Wichtig: Da die Länge <strong>der</strong> Daten beim DES Verfahren immer ein Vielfaches von 8 ist, beachten<br />

Sie bitte folgende Punkte:<br />

1. Kommando, DataIn und DataOut haben immer eine durch 8 teilbare Länge, ggf.<br />

müssen sie mit Dummy-Füllzeichen (nicht 0x00) aufgefüllt werden.<br />

2. Das Kommando muß mit einem Nullzeichen abgeschlossen werden, bevor es<br />

verschlüsselt wird.<br />

3. DataIn und DataOut wird ein 16 Bit Integer vorangestellt, <strong>der</strong> die tatsächliche<br />

Länge <strong>der</strong> Daten ohne die Füllzeichen angibt.<br />

Kommando: Str( "System,CryptKey," )<br />

DataIn: <br />

DataOut nil<br />

"DES" für einen Standard DES Algorithmus ("CDES" und "NIL" sind für den<br />

internen Gerbauch reserviert).<br />

8 Byte lande KeyID. Der DES-Schlüssel wird nicht direkt, son<strong>der</strong>n in<br />

verschlüsselter Form übergeben. Näheres zur Generierung <strong>der</strong> ID finden Sie<br />

unter dem Kommando System,GenCryptKey.<br />

Beispiel: Es wurde die KeyID 0x2F 0x83 0xFC 0x5C 0x4F 0x0D 0xBE 0x48 generiert<br />

mit <strong>der</strong> jetzt die verschlüsselte Kommunikation aktivieren werden soll.<br />

Kommando: Str( "System,CryptKey,DES" )<br />

DataIn: 0x2F 0x83 0xFC 0x5C 0x4F 0x0D 0xBE 0x48<br />

DataOut nil<br />

6\VWHP *HQ&U\SW.H\<br />

Natürlich macht die Verschlüsselung <strong>der</strong> Kommunikation nur Sinn, wenn <strong>der</strong> Schlüssel selbst<br />

nicht übertragen wird. Daher muß in gesicherter Umgebung mit Hilfe dieses Kommandos eine<br />

KeyID berechnet werden, die dann in <strong>der</strong> Anwendungsphase dazu dient, den tatsächlichen<br />

DES-Schlüssel zu verbergen. Mit dem Kommando System.CryptKey wird diese erzeugte<br />

KeyID von <strong>der</strong> Anwendung übergeben und so die verschlüsselte Kommunikation aktiviert.<br />

Kommando: Str( "System,GenCryptKey," )<br />

DataIn: <br />

DataOut <br />

"DES" für einen Standard DES Algorithmus ("CDES" und "NIL" sind für den<br />

internen Gerbauch reserviert).<br />

8 Byte langer DES-Schlüssel, mit dem die Daten letztlich tatsächlich<br />

verschlüsselt werden.<br />

Die vom SCardServers ermittelte KeyID.<br />

Beispiel: Für den DES Key 0x4D 0x59 0x4B 0x45 0x59 0x49 0x53 0x42 soll ein Key-<br />

ID generiert werden.<br />

Kommando: Str( "System,CryptKey,DES" )<br />

DataIn: 0x4D 0x59 0x4B 0x45 0x59 0x49 0x53 0x42<br />

DataOut 0x2F 0x83 0xFC 0x5C 0x4F 0x0D 0xBE 0x48<br />

- 19/19 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.RPPDQGREHUHLFK /,1.(5<br />

Diese Kommandos sind für den internen Gebrauch reserviert.<br />

© 1998-2001, Towitoko AG - 20/20 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

.RPPDQGREHUHLFK '(9,&(<br />

'HYLFH ,QIR<br />

Gibt eine Liste aller Geräteparameter aus. Die Informationen beziehen sich auf das Terminal,<br />

das <strong>der</strong> Anwendung <strong>der</strong>zeit zugeordnet ist (vgl. Kommando Device,Select).<br />

Kommando: Str( "Device,Info[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]]" )<br />

optional, nur die Daten eines des folgenden Fel<strong>der</strong>:<br />

"Status" gibt den Gerätestatus an:<br />

"error" Terminal nicht ansprechbar.<br />

"valid" Terminal bereit.<br />

"Port" COM-Port des Terminals und ggf Nummer bei Kaskadierung, z.B.:<br />

"COM1" COM 1<br />

"COM2-2" COM 2, driites Terminal bei Kaskadierung<br />

"Type", "ShortName" Gerätetyp und Kurzname nach folgen<strong>der</strong> Liste:<br />

"CHIPDRIVE micro", "CDM"<br />

"CHIPDRIVE extern I", "CDX"<br />

"CHIPDRIVE extern II", "CDD"<br />

"CHIPDRIVE intern", "CDI"<br />

"CHIPDRIVE twin Slot 1", "CDT1"<br />

"CHIPDRIVE twin Slot 2", "CDT2"<br />

"KartenZwerg" ,"KTZ" (OEM Version)<br />

"CardRea<strong>der</strong>", "CCR" (OEM Version)<br />

"Index" Index des Terminals in <strong>der</strong> Liste <strong>der</strong> Geräte (siehe auch<br />

Kommando Device,List).<br />

"Version" Hardware-Version.<br />

"Serial","LotNr" Los- und Seriennummer des Gerätes. Für Geräte <strong>der</strong><br />

Hardwareversion 4.3 wird eine feste ROM-Maske verwendet,<br />

daher haben diese Geräte keine eindeutige Los- o<strong>der</strong><br />

Seriennummer mehr und die in diesem Fall zurückgelieferten<br />

Werte lassen daher keinen Rückschluß auf ein einzelnes Gerät zu.<br />

"Baudrate" aktuelle COM-Port Übertragungsrate bzw. Baudrate des Gerätes.<br />

"MaxBaudrate" maximale Baudrate des Gerätes (nicht <strong>der</strong> Karte!).<br />

"Led" Statusanzeige (vgl Kommando Device,SetLed)<br />

"Caps" unterstützten Karten (kommagetrennter String):<br />

"MEM" Memorykarten.<br />

"CPU" Prozessorkarten.<br />

"Mode" Auswahlmodus für das Gerät:<br />

"AUTO" automatisch vom SCardServer zugewiesen.<br />

"SELECTED" explizit ausgewählt (siehe Device,Select).<br />

"MouseDetect" Status <strong>der</strong> Mausweiche:<br />

"1" Maus angeschlossen.<br />

(leer) keine Maus angeschlossen.<br />

"PowerFail" Anzahl <strong>der</strong> Fehler in <strong>der</strong> Spannungsversorgung <strong>der</strong> Karte (vgl.<br />

Kommando Device,CheckPowerFail).<br />

die entsprechenden Daten.<br />

- 21/21 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

Beispiel 1: Device,Info liefert alle Werte zurück, diese sind jeweils getrennt durch die Zeichen<br />

CR+LF (= #13#10).<br />

Kommando Str( "Device,Info" )<br />

DataIn: nil<br />

DataOut: Str(" Status=valid<br />

Port=COM2<br />

Type=CHIPDRIVE micro<br />

(...)<br />

MouseDetect=1" )<br />

Beispiel 2: Wird <strong>der</strong> Kommandostring um einen <strong>der</strong> oben angegebenen Feldbezeichner erweitert,<br />

so wird nur <strong>der</strong> entsprechende Parameter zurückgegeben, z.B. nur <strong>der</strong> Gerätetyp.<br />

Kommando: Str( "Device,Info,Type" )<br />

DataIn: nil<br />

DataOut: Str("CHIPDRIVE micro" )<br />

'HYLFH ,QIR'HYLFH,'<br />

Dieses Kommando ist dem Kommando Device,Info ähnlich, jedoch können hier die Informationen<br />

eines beliebigen Terminals aus <strong>der</strong> Liste (vgl. Kommando Device,List) abgefragt<br />

werden ohne dass dieses speziell ausgewählt werden muss. Dies kann z.B. nötig sein, wenn<br />

das Terminal von einer an<strong>der</strong>en Anwendung benutzt wird.<br />

Kommando: Str( "Device,InfoDeviceID,[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[... ]]" )<br />

Terminalindex (0 = erster Eintrag).<br />

optional, analog zu beim Kommando Device,Info.<br />

analog zu beim Kommando Device,Info.<br />

Beispiel: Kommando: Str( "Device,InfoDeviceID,1,Port" )<br />

DataIn: nil<br />

DataOut: Str( "COM1" )<br />

'HYLFH ,QIR'HYLFH,'&DUG<br />

Dieses Kommandos ist dem Kommando Card,Info ähnlich, jedoch können hier die Informationen<br />

einer Karte in einem beliebigen Terminals aus <strong>der</strong> Liste (vgl. Kommando Device,List)<br />

abgefragt werden ohne dass diese speziell ausgewählt werden muss. Dies kann z.B. nötig sein,<br />

wenn das Terminal von einer an<strong>der</strong>en Anwendung benutzt wird.<br />

Kommando: Str( "Device,InfoDeviceIDCard,[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]]" )<br />

Terminalindex (0 = erster Eintrag).<br />

optional, analog zu beim Kommando Card,Info.<br />

analog zu beim Kommando Card,Info.<br />

Beispiel: Kartentyp im Terminal 1 wird benötigt.<br />

Kommando: Str( "Device,InfoDeviceIDCard,1,Type" )<br />

DataIn: nil<br />

DataOut: Str( "SLE4428" )<br />

© 1998-2001, Towitoko AG - 22/22 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

'HYLFH /LVW<br />

Gibt die Liste <strong>der</strong> aktuell mit dem SCardServer verbundenen Terminals zurück. Die Eintrage<br />

sind dabei durch die Zeichen CR+LF (=#10#13) getrennt.<br />

Kommando: Str( "Device,List" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]] " )<br />

Name und Port des Gerätes sowie ggf. Nummer bei Kaskadierung<br />

Beispiel: Kommando: Str( "Device,List" )<br />

DataIn: nil<br />

DataOut: Str( " 'CHIPDRIVE micro' an COM2<br />

'CHIPDRIVE exten I' an COM2-1<br />

'CHIPDRIVE twin Slot1' an COM3<br />

'CHIPDRIVE twin Slot2' an COM3" )<br />

'HYLFH 5HIUHVK<br />

Aktualisiert die Geräteliste, sucht jedoch nicht nach neuen Geräten.<br />

Kommando: Str( "Device,Refresh" )<br />

DataIn: nil<br />

DataOut: nil<br />

'HYLFH 6HOHFW<br />

Mit diesem Kommando selektieren Sie ein spezielles Terminal aus <strong>der</strong> Liste (vgl. Kommando<br />

Device,List) o<strong>der</strong> aktivieren die automatische Terminalauswahl.<br />

Kommando: Str( "Device,Select[,]" )<br />

DataIn: nil<br />

DataOut: nil<br />

optional, folgende Angaben sind mögich:<br />

"-1" automatische Terminalauswahl.<br />

Index in <strong>der</strong> Terminalliste (z.B. "0" = erster Eintrag).<br />

vgl. Liste unter Device,Info,Type).<br />

vgl. Liste unter Device,Info,ShortName.<br />

Port und ggf Nummer (z.B. "COM3" o<strong>der</strong> "COM2-1").<br />

außerdem die Kombinationen und <br />

Wird ein Kriterium bei <strong>der</strong> Auswahl angegeben, das nicht eindeutig ist (z.B. COM-Port beim<br />

CHIPDRIVE twin o<strong>der</strong> nur <strong>der</strong> Kurzname bei mehreren gleichen Terminals), so wird das erste<br />

passende Gerät in <strong>der</strong> Terminalliste verwendet. Die Anordnung in <strong>der</strong> Liste entspricht jedoch<br />

nicht zwingend <strong>der</strong> Reihenfolge <strong>der</strong> COM-Ports. Die automatische Auswahl des Terminals erfolgt<br />

nach folgenden Kriterien:<br />

- sind keine gültigen, aktiven Karten vorhanden, wird das erste gültige Terminal in <strong>der</strong> Liste<br />

ausgewählt,<br />

- sobald eine gültige Karte in einem <strong>der</strong> Terminals steckt, wird dieses Terminal zum aktiven<br />

Terminal <strong>der</strong> Anwendung und bleibt solange zugeordnet, bis die Karte wie<strong>der</strong> abgezogen<br />

wird.<br />

Beispiel: CHIPDRIVE micro an COM1 auswählen.<br />

Kommando: Str( "Device,Select,CHIPDRIVE micro COM1" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 23/23 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

'HYLFH 6HDUFK&RP3RUW<br />

Über dieses Kommando veranlassen Sie die Suche nach einem Terminal am angegebenen<br />

COM-Port. Da alle Geräte Plug&Play fähig sind sollte dieses Kommando nur in Ausnahmefällen<br />

verwendet werden, z. B wenn die Plug&Play Erkennung versagt o<strong>der</strong> die Terminalliste mit dem<br />

Kommandos Device,Remove verän<strong>der</strong>t wurde. Wird ein Terminal von diesem Kommando gefunden,<br />

ermittelt <strong>der</strong> SCardServer alle zugehörigen Daten wie z.B. Gerätetyp und Seriennummer.<br />

Betriebsbereite Geräte werden in <strong>der</strong> INI-Datei des SCardServers dauerhaft gespeichert<br />

und beim nächsten Start des SCardServers automatisch wie<strong>der</strong> gesucht und installiert.<br />

Kommando: Str( "Device,SeachComPort[,]" )<br />

DataIn: nil<br />

DataOut: nil<br />

optional, Nummer des COM-Ports, an dem nach einem Terminal gesucht<br />

werden soll. Wenn <strong>der</strong> Parameter nicht angegeben wird, sucht <strong>der</strong><br />

SCardServer an allen freien COM-Ports.<br />

Beispiel: Gerät an COM1 suchen.<br />

Kommando: Str( "Device,SearchComPort,1" )<br />

DataIn: nil<br />

DataOut: nil<br />

'HYLFH 5HPRYH<br />

Mit diesem Kommando entfernen Sie ein Terminal aus <strong>der</strong> Terminalliste, d.h. <strong>der</strong> zugehörige<br />

COM-Port wird wie<strong>der</strong> freigegeben. Über das Kommandos Device,SearchComPort kann das<br />

Terminal wie<strong>der</strong> eingerichtet werden.<br />

Das Abstecken eines Terminals von <strong>der</strong> seriellen Schnittstelle wird vom SCardServer erkannt<br />

und <strong>der</strong> Port nach einiger Zeit freigegeben. Der SCardServer wartet jedoch mindestens 30 Sekunden,<br />

falls das Terminal innerhalb dieser Zeitspanne wie<strong>der</strong> erscheint, wird es automatisch in<br />

<strong>der</strong> Liste <strong>der</strong> verfügbaren Terminals aufgenommen.<br />

Kommando: Str( "Device,Remove," )<br />

DataIn: nil<br />

DataOut: nil<br />

Terminalindex ("0" = erster Eintrag!)<br />

Beispiel: Terminal mit dem Index 1 löschen.<br />

Kommando: Str( "Device,Remove,1" )<br />

DataIn: nil<br />

DataOut: nil<br />

'HYLFH 6HW0RGH<br />

für internen Gebrauch reserviert.<br />

© 1998-2001, Towitoko AG - 24/24 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

'HYLFH &KHFN3RZHU)DLO<br />

Mit diesem Kommando kann aktiv geprüft werden, ob genügend Spannung für die Karte zur<br />

Verfügung steht. Steht nicht genügend Spannung zur Verfügung so kann die Kommunikation<br />

mit <strong>der</strong> Karte gestört werden o<strong>der</strong> zusammenbrechen, auch eine Sperrung o<strong>der</strong> sogar Beschädigung<br />

durch falsche o<strong>der</strong> abgeschnittene Komandos ist theoretisch möglich. Falls ein Kartenkommando<br />

fehl schlägt sollte u. a. dieser Zähler überprüft werden und ggf. eine Meldung angezeigt<br />

werden, dass <strong>der</strong> Akku des CHIPDRIVEs aufgeladen werden sollte. Dazu wird das Gerät<br />

ca. 60 Minuten am laufenden PC angesteckt ohne dass es benutzt wird.<br />

Kommando: Str( "Device,CheckPowerFail" )<br />

DataIn: nil<br />

DataOut: Str( "" )<br />

Fehlerzähler, <strong>der</strong> bei einem Fehler <strong>der</strong> Spannungsversorgung <strong>der</strong> Karte erhöht<br />

wird.<br />

Beispiel: Kommando: Str( "Device,CheckPowerFail" )<br />

DataIn: nil<br />

DataOut: Str( "0" )<br />

'HYLFH 6HW/HG<br />

Ermöglicht das manuelle setzen <strong>der</strong> Status-LED des Terminals, welches momentan <strong>der</strong> Anwendung<br />

zugeordnet ist. Die Steuerung kann nicht permanent von eine Anwendung übernommen<br />

werden, son<strong>der</strong>n nur solange, wie eine Karte eingesteckt bleibt bzw. bis <strong>der</strong> SCardServer<br />

auf Grund von gewissen Kartenkommandos eine an<strong>der</strong>e Einstellung setzt. Generell sollte die<br />

manuelle LED-Steuerung immer nur in Ausnahmefällen erfolgen und ansonsten dem SCard-<br />

Server überlassen werden.<br />

Kommando: Str( "Device,SetLed,"" )<br />

DataIn: nil<br />

DataOut: nil<br />

maximal 8 Zeichen, wobei folgende Farbzuordnung gilt:<br />

"0" = aus, "1" = rot, "2" = grün, "3" = gelb.<br />

Beispiel1: langsames rotes Blinken.<br />

Kommando: Str( "Device,SetLed,0011" )<br />

DataIn: nil<br />

DataOut: nil<br />

Beispiel2: grünes Dauersignal.<br />

Kommando: Str( "Device,SetLed,2" )<br />

DataIn: nil<br />

DataOut: nil<br />

Beispiel3: rot grün gelb blinken im Wechsel.<br />

Kommando: Str( "Device,SetLed,123" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 25/25 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.RPPDQGREHUHLFK &$5'<br />

&DUG ,QIR<br />

Gibt eine Liste an Informationen über die eingesteckte Karte zurück.<br />

Kommando: Str( "Card,Info[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]]" )<br />

optional, nur die Daten eines des folgenden Fel<strong>der</strong>:<br />

"Status" Gibt den Status <strong>der</strong> Karte an:<br />

"error" Terminal nicht ansprechbar.<br />

"wait" Keine Karte im Terminal.<br />

"detect" Karte wurde eingesteckt und wird untersucht.<br />

"invalid" Karte ungültig bzw. Karte wurde nicht erkannt.<br />

"valid" Karte gültig und von keine Anwendung belegt.<br />

"active" Karte gültig und von Ihrer Anwendung belegt.<br />

"locked" Karte gültig, aber von an<strong>der</strong>er Anwendung belegt.<br />

"LockedBy" Index und Name <strong>der</strong> aktiven Anwendung innerhalb <strong>der</strong> Liste als<br />

kommagetrennter String (vgl. System,Tasklist).<br />

"LinkerApps" für internen Gebrauch reserviert.<br />

"LinkerCards" für internen Gebrauch reserviert.<br />

"PtsAuto" für internen Gebrauch reserviert.<br />

"PtsBinary" die vier Zeichen PTSS, PTS0, PTS01 und PCK <strong>der</strong> PTS (PTS2 und<br />

PTS3 werden nicht verwendet und daher weggelassen), nur nach<br />

Ausführung einer PTS verfügbar.<br />

"PtsBinaryLen" siehe PtsBinary.<br />

"Baudrate" aktuelle Baudrate <strong>der</strong> Karte.<br />

"CardCount" Anzahl <strong>der</strong> erkannten Karten seit dem letzten Neustart.<br />

"CardPower" Status <strong>der</strong> momentan eingesteckte Karte. Eine Memorykarte wird<br />

ca. 2 Sekunden nach dem letzten Zugriff wie<strong>der</strong> deaktiviert, eine<br />

CPU Karte bleibt aktiviert<br />

"0" Karte deaktiviert.<br />

"1" Karte aktiviert.<br />

"Type" genaue Chipbezeichnung unterstützter Memorykarten, eine aktuelle<br />

Liste finden Sie auf unserer Homepage http://www.towitoko.de.<br />

"Protocol" gibt das gewählte Protokoll <strong>der</strong> Karte an:<br />

"ATR" Karten mit speziellen Bitprotokollen (z.B. 4406/4436).<br />

"2W" 2-Wire Protokoll.<br />

"3W" 3-Wire Protokoll.<br />

"I2C" I2C-Bus Protokoll.<br />

"I2CX" I2C-Bus Protokoll mit 2 Byte Adressierung.<br />

"XC... " Spezielle I2C-Bus Protokolle für XICOR Chips.<br />

"T0", "T1" Prozessorkartenprotokolle.<br />

"Apps" Liste <strong>der</strong> gefundenen Applikationsmodule, durch Komma getrennt:<br />

"KVK" gültige deutsche Krankenversichertenkarte.<br />

"TWK" deutsche Telefonwertkarte.<br />

"TLV" gültige TLV Struktur.<br />

"MemSize" nur Memorykarten: Größe des nutzbaren Datenspeichers in Byte.<br />

"PinSize" nur Memorykarten: Größe des PINs in Byte.<br />

"PinCnt" nur Memorykarten: Anzahl <strong>der</strong> verbleibenden PIN Eingabe.<br />

"PageSize" nur Memorykarten I2C: Pagegröße für Schreibbefehle.<br />

"ErrMem" nur Memorykarten: Fehlerzähler fur Schreib- und Verifyzugriffe.<br />

© 1998-2001, Towitoko AG - 26/26 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

"ErrMemPB" nur Memorykarten: Fehlerzähler fur Schreib- und Verifyzugriffe<br />

auf die Protection Bits.<br />

"AtrBinary" ATR in binärer Form (nicht bei allen Memorykarten vorhanden).<br />

"AtrBinarySize" siehe AtrBinary.<br />

"AtrHistory" nur Prozessorkarten: Historybytes nach ISO7813-3.<br />

"AtrHistorySize" siehe AtrHistory.<br />

"TS", "T0",<br />

"TA1".."TD8" aufgeschlüsselter ATR entsprechend ISO7816-3.<br />

"SAD", "DAD" nur Prozessorkarten T1: Source- und Destinationadress.<br />

"IFSC", "IFSD" nur Prozessorkarten T1: Puffergrößen <strong>der</strong> Karte und des Terminals.<br />

"CWT", "BWT" nur Prozessorkarten: Character und Block Waiting Time.<br />

die entsprechenden Daten.<br />

Beispiel1: Card,Info liefert alle Werte, getrennt durch die Zeichen CR+LF (= #13#10).<br />

Kommando: Str( " Card,Info" )<br />

DataIn: nil<br />

DataOut: Str(" Status=active<br />

LockedBy=1,Value Card Station<br />

Type=CPU<br />

Protocol=T1<br />

CardCount=4<br />

CardPower=0<br />

Baudrate=9600<br />

(....)" )<br />

Beispiel2: Wird zusätzlich ein Feldbezeichner angegeben, so wird nur <strong>der</strong> entsprechende Parameter<br />

zurückgegeben, z.B. nur <strong>der</strong> ATR in binärer Form.<br />

Kommando: Str( "Card,Info,ATRHistroy" )<br />

DataIn: nil<br />

DataOut: 0x65 0x63 0x06 0x03 0x14 0x02 0x50 0x00 0x06 0x51<br />

0x04 0xB7 0x3E 0x01 0x41<br />

&DUG /RFN<br />

Sperrt eine Karte für Zugriffe durch an<strong>der</strong>e Anwendungen. Das Kommando kann nur ausgeführt<br />

werden, wenn sich eine gültige Karte im Terminal befindet, die <strong>der</strong>zeit von keiner an<strong>der</strong>en Anwendung<br />

bearbeitet wird (Card,Info,Status = "VALID"). Das Kommando muß nur aufgerufen<br />

werden, wenn die Karte erneut bearbeitet werden soll, nachdem Sie bereits über das Kommandos<br />

Card,Unlock für an<strong>der</strong>e Anwendungen freigegeben wurden.<br />

Kommando: Str( "Card,Lock" )<br />

DataIn: nil<br />

DataOut: nil<br />

&DUG 8QORFN<br />

Das Kommando gibt die Karte nach <strong>der</strong> Bearbeitung durch Ihre Anwendung wie<strong>der</strong> frei. Der<br />

SCardServer teilt die Karte <strong>der</strong> nächsten Anwendungen zu.<br />

Kommando: Str( "Card,Unlock" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 27/27 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

&DUG 0HP'LVDEOH&DFKH &DUG 0HP(QDEOH&DFKH<br />

Aktiviert bzw. Deaktiviert die Cache-Funktion für Memorykarten, d.h. auch bereits gelesene Bereiche<br />

werden ggf. wie<strong>der</strong>holt gelesen. Der Cache ist normalerweise immer aktiviert.<br />

Kommandos: Str( "Card,MemDisableCache" )<br />

Str( "Card,MemEnableCache" )<br />

DataIn: nil<br />

DataOut: nil<br />

&DUG ,QLW%ZW&ZW &DUG ,QLW6DG'DG &DUG ,QLW,IVG,IVF<br />

Die Blockwartezeit (Block Waiting Time, Timeout des ersten Zeichens) und die Zeichenwartezeit<br />

(Character Waiting Time, Timeout <strong>der</strong> folgenden Zeichen) können überschrieben bzw. manuell<br />

gesetzt werden. Die Initialwerte werden dem ATR <strong>der</strong> Karte entnommen.<br />

Bei T=1 Karten können außerdem die Quelladresse (Source Address, initial 0) und die Ziel–<br />

adresse (Destination Address, initial 0), sowie die Puffergröße des Terminal (IFSD, initial aus<br />

ATR) und die Puffergröße <strong>der</strong> Chipkarte (IFSC, initial aus ATR) ebenfalls manuell gesetzt werden.<br />

Kommandos: Str( "Card,InitBwtCwt,," )<br />

Str( "Card,InitSadDad,," )<br />

Str( "Card,InitIfsdIfsc,," )<br />

DataIn: nil<br />

DataOut: nil<br />

Blockwartezeit (dezimal 0 - 60.000, entspricht 1 ms bis 60 Sekunden).<br />

Zeichenwartezeit (dezimal 0 - 60.000, entspricht 1 ms bis 60 Sekunden).<br />

Quelladresse (dezimal, 0 bis 255).<br />

Zieladresse (dezimal, 0 bis 255).<br />

Puffergröße des Terminal (dezimal, 0 bis 255).<br />

Puffergröße <strong>der</strong> Chipkarte (dezimal, 0 bis 255).<br />

Beispiel: Blockwartezeit von 1600ms und Zeichenwartezeit von 4ms setzen.<br />

Kommando: Str( "Card,InitBwtCwt,1600,4" )<br />

DataIn: nil<br />

DataOut: nil<br />

&DUG 5HVHW<br />

Das Kommando führt einen Hardwarereset <strong>der</strong> Karte durch, eventuell erworbene Rechte werden<br />

gelöscht. Dieser Reset wird auch bei <strong>der</strong> Übergabe <strong>der</strong> Karte von einer Anwendung zu eine<br />

an<strong>der</strong>en durchgeführt.<br />

Kommando: Str( "Card,Reset" )<br />

DataIn: nil<br />

DataOut: nil<br />

© 1998-2001, Towitoko AG - 28/28 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

&DUG $3'8<br />

Schickt ein APDU zur Karte und empfängt die Antwort. Die Umsetzung auf das T0- bzw. T1-<br />

Protokoll wird nach ISO7816-4 vorgenommen. Die Returncodes 9Fxx (GSM Response data),<br />

61xx und 6Cxx werden jedoch nicht interpretiert, dies entspricht <strong>der</strong> CT-API Spezifikation eines<br />

APDUs und ist nicht konform zur ISO7816-4.<br />

Kommando: Str( "Card,APDU" )<br />

DataIn: [][]<br />

DataOut: []<br />

Class und Instruction, je ein Byte.<br />

Parameter 1 und 2, je ein Byte.<br />

optional, (ein Byte) gibt die Anzahl <strong>der</strong> zur Karte zu übertragenden Datenbytes<br />

an, die Datenbytes selbst.<br />

optional, ein Byte, erwartete Länge von in Byte.<br />

Kartenantwort (Status Word), Byte 1 und 2.<br />

optional, Rückgabedaten <strong>der</strong> Karte ( gibt Länge vor).<br />

Folgende Fälle werden unterstützt, die maximale Datenlänge ist dabei 254 Byte:<br />

• ISO CASE 1: Kommando ohne Daten.<br />

DataIn: <br />

DataOut: <br />

Beispiel: DataIn: 0x00 0x42 0x05 0x01<br />

DataOut: 0x90 0x00<br />

• ISO CASE 2 short: Kommando mit Datenblock von <strong>der</strong> Karte (: 0x00 – 0xFF).<br />

DataIn: <br />

DataOut: <br />

Beispiel: DataIn: 0x00 0x42 0x05 0x02 0x03<br />

DataOut: 0x90 0x00 0x54 0x57 0x4B<br />

• ISO CASE 3 short: Kommando mit Datenblock zur Karte (: 0x01 – 0xFF).<br />

DataIn: <br />

DataOut: <br />

Beispiel: DataIn: 0x00 0x42 0x05 0x03 0x03 0x54 0x57 0x4B<br />

DataOut: 0x90 0x00<br />

• ISO CASE 4 short: Kommando mit Datenblock zur und von <strong>der</strong> Karte (: 0x01 – 0xFF).<br />

DataIn: <br />

DataOut: <br />

Beispiel: DataIn: 0x00 0x42 0x05 0x04 0x03 0x54 0x57 0x4B 00x4<br />

DataOut: 0x90 0x00 0x4A 0x55 0x50 0x21<br />

- 29/29 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

&DUG ,62$3'8<br />

Entspricht dem Kommando Card,APDU, jedoch werden die Returncodes 61xx und 6Cxx<br />

interpretiert. Sie führen zum GetResponse Kommando, d.h. T0- und T1-Karten verhalten sich<br />

auf APDU Ebene identisch. Dies entspricht <strong>der</strong> exakten ISO7816-4 Vorgabe und ermöglicht ein<br />

T0/T1 unabhängiges APDU.<br />

Wichtig: GSM-Karten arbeiten mit dem T0-Protokoll, sind aber in Hinsicht auf das APDU<br />

nicht kompatibel mit dem ISO-Standard (lei<strong>der</strong>), da <strong>der</strong> Returncode 9Fxx statt 61xx<br />

benutzt wird.<br />

&DUG ,62$3'8(;77 &DUG ,62$3'8(;77<br />

Entspricht dem Kommando Card,APDU, jedoch werden hier für T=0 und T=1 Karten auch erweitere<br />

APDUs mit mehr als 256 Bytes im Datenblock unterstützt. Momentan wird diese Funktion<br />

jedoch nur von sehr wenigen Karten unterstützt. Weitere Informationen zum Aufbau von<br />

sogenannten “Extended APDUs“ finden Sie in ISO 7816-4.<br />

&DUG 7<br />

Führt ein T1-Kommando aus (inkl. Chaining falls erfor<strong>der</strong>lich). Dabei werden die Eingabedaten<br />

im Gegensatz zum Kommandos Card,APDU völlig transparent zur Karte geschickt. Dies kann<br />

z.B bei verschlüsselter Kommunikation nötig sein.<br />

Kommando: Str( "Card,APDU" )<br />

DataIn: [][]<br />

DataOut: []<br />

Class und Instruction, je ein Byte<br />

Parameter 1 und 2, je ein Byte<br />

optional, (1 Byte) gibt die Anzahl <strong>der</strong> zur Karte zu übertragenden Datenbytes<br />

an, die Datenbytes selbst.<br />

optional, erwartete Länge Rückgabedaten <strong>der</strong> Karten in Byte, ein Byte<br />

Kartenantwort (Status Word), Byte 1 und 2.<br />

optional falls gesetzt, Rückgabedaten <strong>der</strong> Karten, gibt Länge vor.<br />

Die Bezeichnungen (, ...) entsprechen <strong>der</strong> Norm ISO7816-3. und <br />

sind entsprechend <strong>der</strong> "Cases 1 bis 4" <strong>der</strong> ISO7816-4 kodiert, bzw. <strong>der</strong> Spezifikation <strong>der</strong> Karte<br />

zu entnehmen.<br />

Beispiel: analog zu Card,APDU.<br />

&DUG 7 7;<br />

Schickt ein T0-Kommando inkl. Daten zur Karte:<br />

Kommando: Str( "Card,T0TX" )<br />

DataIn: <br />

DataOut: <br />

Class und Instruction, je ein Byte.<br />

Parameter 1, 2 und 3, je ein Byte.<br />

Kartenantwort (Status Word), Byte 1 und 2.<br />

Beispiel: analog zu Card,APDU<br />

© 1998-2001, Towitoko AG - 30/30 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

&DUG 7 5;<br />

Schickt ein T0-Kommando zur Karte und empfängt Daten von <strong>der</strong> Karte:<br />

Kommando: Str( "Card,T0RX" )<br />

DataIn: <br />

DataOut: <br />

Class und Instruction, je ein Byte.<br />

Parameter 1, 2 und 3, je ein Byte.<br />

Kartenantwort (Status Word), Byte 1 und 2.<br />

Rückgabedaten <strong>der</strong> Karten, die Länge hängt vom Kommando ab.<br />

Beispiel: analog zu Card,APDU<br />

&DUG 7VS7[5[/HQ<br />

Schickt einen String zur Karte und empfängt eine vorgegebene Zahl an Zeichen von <strong>der</strong> Karte.<br />

Das Kommando umgeht alle Protokolle, d.h. schickt und empfängt absolut transparent auf Zeichenebene.<br />

Die Timeout CWT und BWT gelten auch hier.<br />

Kommando: Str( "Card,TspRxLen," )<br />

DataIn: <br />

DataOut: <br />

Anzahl <strong>der</strong> erwarteten Antwortbytes <strong>der</strong> Karte an (dezimal).<br />

zu senden Daten<br />

Antwort <strong>der</strong> Karte<br />

Beispiel: analog zu Card,APDU.<br />

&DUG 376<br />

Setzt das Protokoll und die Geschwindigkeit, soweit dies von <strong>der</strong> Chipkarte unterstützt wird. Die<br />

PTS (Protocol Type Selection) besteht aus den folgenden 6 Zeichen: PTSS (PTS-Kennung),<br />

PTS0-PTS3 und PCK (Prüfzeichen), wobei die Zeichen PTS2 und PTS3 nicht genutzt werden.<br />

Kommando: Str( "Card,PTS," )<br />

DataIn: nil<br />

DataOut: nil<br />

Protokoll (Bits 0-3 von PTS0, "0" = T0 und "1" = T1 sind zulässig)<br />

Taktratenkonvertierungsfaktor FI (Bits 4-7 von PTS1, "0" bis "F")<br />

Bitratenanpassungsfaktor DI (Bits 0-3 von PTS1, "0" bis "F")<br />

N2 und N3 (FI und DI) werden benötigt, um die Übertragungsgeschwindigkeit <strong>der</strong> Chipkarte zu<br />

än<strong>der</strong>n. Die Standardwerte können dem Zeichen TA1 aus dem ATR entnommen werden. Weitere<br />

Kombinationen und die damit erreichbaren Übertragungsgeschwindigkeiten sind in <strong>der</strong> ISO<br />

7816-3 definiert, bzw. in <strong>der</strong> Dokumentation des genutzten Chipkarten-OS beschrieben.<br />

Beispiel: Protokoll T0, FI = 1, DI = 1<br />

Kommando Str( "Card,PTS,011" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 31/31 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

&DUG 0HP5HDG<br />

Liest einen Bereich aus dem Datenspeicher einer Memorykarte, unabhängig vom Chiptyp.<br />

Kommando: Str( "Card,MemRead,," )<br />

DataIn: nil<br />

DataOut: <br />

Offset, ab dem gelesen werden soll (0 = erstes Byte des Kartenspeichers) .<br />

Anzahl <strong>der</strong> zu lesenden Bytes.<br />

gelesende Daten.<br />

Beispiel: 21 Zeichen ab dem Offset 16 lesen.<br />

Kommando: Str( "Card,MemRead,16,21" )<br />

DataIn: nil<br />

DataOut: 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x53 0x6D 0x61 0x72<br />

0x74 0x43 0x61 0x72 0x64 0x20 0x57 0x6F 0x72 0x6C<br />

0x64 (String "Hello SmartCard World")<br />

&DUG 0HP:ULWH<br />

Beschreibt einen Bereich des Datenspeicher einer Memorykarte, unabhängig vom Chiptyp.<br />

Kommando: Str( "Card,MemWrite,," )<br />

DataIn: <br />

DataOut: nil<br />

Offset ab dem geschrieben werden soll (0 = erstes Byte des Kartenspeichers).<br />

Anzahl <strong>der</strong> zu schreibenden Bytes.<br />

Wichtig: Einem Schreibzugiff folgt (intern) immer ein Verify-Kommando. Sie können daher<br />

z.B. bei einem Fehler über das Kommando Card,MemReadStatus das bytegenaue<br />

Ergebnis des Schreibzugriffs abfragen. Wenn die Cache-Funktion aktiv<br />

ist (Standardeinstellung) und <strong>der</strong> Bereich bereits gelesen wurde, werden nur<br />

Datenbytes geschrieben, die sich tatsächlich geän<strong>der</strong>t haben<br />

Beispiel: "Hello SmartCard World" (21 Zeichen) ab dem Offset 16 schrieben.<br />

Kommando: Str( "Card,MemWrite,16,21" )<br />

DataIn: 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x53 0x6D 0x61 0x72<br />

0x74 0x43 0x61 0x72 0x64 0x20 0x57 0x6F 0x72 0x6C<br />

0x64 (als String "Hello SmartCard World")<br />

DataOut: nil<br />

© 1998-2001, Towitoko AG - 32/32 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

&DUG 0HP9HULI\<br />

Führt einen byte-weisen Vergleich zwischen den übergebenen Daten und dem Datenspeicher<br />

<strong>der</strong> Chipkarte durch. Die Anzahl <strong>der</strong> Fehler an Datenbytes und Schreibschutzbits kann über das<br />

Kommando Card,Info abgefragt werden. Tritt ein Verifyfehler auf wird <strong>der</strong> Fehlercode 0x1310<br />

("Kartenzugriff fehlgeschlagen") zurückgegeben. Über Card,MemReadStatus kann das bytegenaue<br />

Ergebnis des Vergleichs abgefragt werden.<br />

Kommando: Str( "Card,MemVerify,," )<br />

DataIn: <br />

DataOut: nil<br />

Offset ab dem gelesen werden soll (0 = erstes Byte des Kartenspeichers).<br />

Anzahl <strong>der</strong> zu lesenden Bytes.<br />

Datenbytes, die mit denen <strong>der</strong> Chipkarte verglichen werden sollen.<br />

Beispiel: "Hello SmartCard World" (21 Zeichen) ab dem Offset 16 überprüfen.<br />

Kommando: Str( "Card,MemVerify,16,21" )<br />

DataIn: 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x53 0x6D 0x61 0x72<br />

0x74 0x43 0x61 0x72 0x64 0x20 0x57 0x6F 0x72 0x6C<br />

0x64 (als String "Hello SmartCard World")<br />

DataOut: nil<br />

&DUG 0HP5HDG3% &DUG 0HP:ULWH3% &DUG 0HP9HULI\3%<br />

Die drei Kommandos entsprechen in Funktion und Syntax auf die vorangegangenen Kommandos<br />

Card,MemRead / Card,MemWrite und Card,MemVerify, jedoch beziehen sie sich auf<br />

den Speicher für die Schreibschutzinformation <strong>der</strong> Karte. Einige Karten erlauben die Aktivierung<br />

des Schreibschutz für jedes (o<strong>der</strong> einen Teil) <strong>der</strong> Bytes im Adressraum <strong>der</strong> Karte.<br />

Wichtig: Ein einmal gesetzter Schreibschutz kann bei vielen Kanrten (z.B. SLE4428 o<strong>der</strong><br />

SLE4442) nie mehr zurückgesetzt werden.<br />

Jedes Byte, das Sie in DataIn übergeben bzw. über DataOut empfangen, entspricht <strong>der</strong> Information<br />

über den Schreibschutz von einem Byte im Datenspeicher <strong>der</strong> Karte. Folgende Werte<br />

sind definiert:<br />

0x00: Schreibschutz nicht aktiviert.<br />

0x01: Schreibschutz aktiviert.<br />

&DUG 0HP6HW3%<br />

Aktiviert den Schreibschutz innerhalb eines Adressbereichs <strong>der</strong> Karte. Die selbe Funktion können<br />

Sie auch über Card,MemWritePB erzielen, wenn Sie einen entsprechenden Datenbereich<br />

übergeben. Dieses Kommando ist einfacher anzuwenden.<br />

Kommando: Str( "Card,MemVerify,," )<br />

DataIn: nil<br />

DataOut: nil<br />

Offset, ab dem Schreibschutzbytes gesetzt werden sollen (0 = erstes Byte)<br />

Anzahl <strong>der</strong> zu lesenden Bytes.<br />

Beispiel: Ab dem Offset 16 die folgenden 21 Bytes schützen.<br />

Kommando: Str( "Card,MemSetPB,16,21" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 33/33 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

&DUG 0HP5HDG6WDWXV<br />

Liest Statusinformationen zum Cache, Schreibschutz und Verifyfehlern.<br />

Kommando: Str( "Card,MemReadStatus,," )<br />

DataIn: nil<br />

DataOut: <br />

Offset, ab dem die Informationen gelesen werden sollen (0 = erstes Byte des<br />

Kartenspeichers).<br />

Anzahl <strong>der</strong> zu lesenden Bytes.<br />

Die Statusinformationen für jedes Byte sind wie folgt codiert:<br />

Bit 7 (0x80, MSB): Verifyfehler des Datenbytes..<br />

Bit 6 (0x40): Verifyfehler des Schreibschutzbits.<br />

Bit 3 (0x08): Datenbyte ist bereits im Cache.<br />

Bit 2 (0x04): Schreibschutzbit ist bereits im Cache.<br />

Bit 0 (0x01, LSB): Schreibschutz des Datenbytes aktiv.<br />

Beispiel: Für die 21 Bytes ab dem Offset 16 die Statusinformationen auslesen. Es sind für<br />

jedes dieser Byte die Daten- und Schreibschutzbits im Cache, ausserdem sind die<br />

ersten 5 Bytes schreibgeschützt.<br />

Kommando: Str( "Card,MemReadStatus,16,21" )<br />

DataIn: nil<br />

DataOut: 0x0D 0x0D 0x0D 0x0D 0x0D 0x0C 0x0C 0x0C 0x0C 0x0C<br />

0x0C 0x0C 0x0C 0x0C 0x0C 0x0C 0x0C 0x0C 0x0C 0x0C<br />

0x0C<br />

© 1998-2001, Towitoko AG - 34/34 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

&DUG 0HP9HULI\3LQ<br />

Führt einen PIN-Test <strong>der</strong> Karte aus, <strong>der</strong> u.U. vor Schreib- bzw. Lesezugriffen nötig ist. Die PIN<br />

wird als Klartext-String angegeben, gültig sind die Zeichen "0" bis "9" sowie "A" bis "F".<br />

Kommando: Str( "Card,MemVerifyPin, [,]" )<br />

DataIn: nil<br />

DataOut: nil<br />

die PIN.<br />

optional, Nummer <strong>der</strong> PIN, falls eine Karte mehrere PINs unterstützt.<br />

Wichtig: Wird die PIN mehrmals falsch angegeben kann die Karte ggf. unwie<strong>der</strong>bringlich gesperrt<br />

werden und damit unbrauchbar sein.<br />

Beispiel1: PIN-Test mit dem PIN "1234" ausführen.<br />

Kommando: Str( "Card,MemVerifyPin,1234" )<br />

DataIn: nil<br />

DataOut: nil<br />

Beispiel2: PIN-Test mit dem PIN Nummer 4 und "89ABCD" ausführen.<br />

Kommando: Str( "Card,MemVerifyPin,98ABCD,4" )<br />

DataIn: nil<br />

DataOut: nil<br />

&DUG 0HP&KDQJH3LQ<br />

Än<strong>der</strong>t die PIN <strong>der</strong> Karte. Die PIN wird als Klartext-String angegeben, gültig sind die Zeichen "0"<br />

bis "9" sowie "A" bis "F".<br />

Kommando: Str( "Card,MemChangePin,,[,]" )<br />

DataIn: nil<br />

DataOut: nil<br />

die aktuelle PIN.<br />

die neue PIN.<br />

optional, Nummer <strong>der</strong> PIN, falls eine Karte mehrere PINs unterstützt.<br />

Wichtig: Wird die PIN mehrmals falsch angegeben kann die Karte ggf. unwie<strong>der</strong>bringlich gesperrt<br />

werden und damit unbrauchbar sein.<br />

Beispiel1: PIN von "AB34" auf "5678" än<strong>der</strong>n<br />

Kommando: Str( "Card,MemChangePin,AB34,5678" )<br />

DataIn: nil<br />

DataOut: nil<br />

Beispiel2: PIN Nummer 2 von "987F" auf "CD12" än<strong>der</strong>n<br />

Kommando: Str( "Card,MemChangePin,987F,CD12,2" )<br />

DataIn: nil<br />

DataOut: nil<br />

- 35/35 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

&DUG 0HP6SHFLDO<br />

Gibt eine Liste von speziellen Kommandos zurück, die von <strong>der</strong> momentan aktivierten Chipkarte<br />

unterstützt werden. Solche Kommandos sind bisher für die Chiptypen SLE4404, SLE4406 und<br />

SLE4436 implementiert.<br />

Kommando: Str( "Card,MemSpecial" )<br />

DataIn: nil<br />

DataOut: Str( "[,[...]]"<br />

spezielles Kommando<br />

Beispiel: Kommandos für eine SLE4436<br />

Kommando: Str( "Card,MemSpecial" )<br />

DataIn: nil<br />

DataOut: Str( "Deduct,ProgUser,ProgAuxData")<br />

Warnung: Durch die Verwendung <strong>der</strong> folgenden Kommandos kann eine Karte unter Umständen<br />

gesperrt o<strong>der</strong> unbrauchbar gemacht werden. Auf genauen Funktionen wird im<br />

folgenden nicht näher eingegangen, eine ausführliche Beschreibung ist in den jeweiligen<br />

Datenblättern zu finden. Towitoko kann Ihnen diese Datenblätter aber we<strong>der</strong><br />

zur Verfügung stellen, noch in irgendeiner Weise Support zur Nutzung <strong>der</strong> Kommandos<br />

anbieten.<br />

Bei den folgenden Kommandos ist die Cache-Funktion gundsätzlich deaktiviert. In DataIn immer<br />

<strong>der</strong> komplette Kartenspeicher mit den entsprechenden Än<strong>der</strong>ungen bzw. Einstellungen übergeben,<br />

DataOut ist leer (nil).<br />

Das erste Bytes des Kartenspeichers hat den Offset 0x00. Jedes Byte wird so interpretiert, dass<br />

das nie<strong>der</strong>wertigste Bit zuerst und das höchstwertige zuletzt kommt, z.B. wird 1100 1010 als<br />

0x53 dargestellt.<br />

Das Setzen eines Bits von 1 auf 0 gilt als Schreibvorgang, analog dazu gilt das Setzten von 0<br />

auf 1 als Löschvorgang. Das Löschen eines Bits ist jedoch im Allgemeinen nicht möglich.<br />

SLE4404: Voraussetzung für das Ausführen <strong>der</strong> folgenden SLE4404-Kommandos ist, dass <strong>der</strong><br />

korrekte User Code vorher einmal über Card,MemVerifyPin verifiziert wurde.<br />

Dabei wird außerdem <strong>der</strong> Fehlerzähler <strong>der</strong> Karte wie<strong>der</strong> gelöscht.<br />

&DUG 0HP6SHFLDO 3URJ,VVXHU$UHD (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n <strong>der</strong> Issuer Area (Offset 0x02-0x07), solange die Fuse <strong>der</strong> Karte noch<br />

nicht durchgebrannt wurde.<br />

&DUG 0HP6SHFLDO 3URJ8VHU&RGH (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n des User Codes (Offset 0x08-0x09). Das gleiche ist aber auch über das<br />

Kommando Card,MemChangePin möglich.<br />

&DUG 0HP6SHFLDO 3URJ(UURU&RXQWHU (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n des Fehlerzählers (Offset 0x0A-0x0B). Der eigentliche Fehlerzähler liegt<br />

in den ersten vier Bit an Offset 0x0A, die restlichen 12 Bit sind ungenutzt. Sobald die ersten vier<br />

Bit jeweils 0 sind, ist die Karte gesperrt.<br />

&DUG 0HP6SHFLDO 3URJ6FUDWFK3DG0HPRU\ (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n des ScratchPad Memory Bereichs (Offset 0x0C-0x0D).<br />

© 1998-2001, Towitoko AG - 36/36 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

&DUG 0HP6SHFLDO 3URJ8VHU0HPRU\ (SLE4404)<br />

Erlaubt das Beschreiben des User Memory Bereichs (Offset 0x0E-0x27). Bits können aber nur<br />

von 1 auf 0 gesetzt werden, <strong>der</strong> Schreibzugriff ist bei durchgebrannter Fuse außerdem noch<br />

abhängig von diversen Statusbits.<br />

&DUG 0HP6SHFLDO 3URJ0HPRU\&RGH (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n des Memory Codes (Offset 0x28-0x2B), solange die Fuse noch nicht<br />

durchgebrannt wurde. Bei durchgebrannter Fuse wird über dieses Kommando <strong>der</strong> Memory Code<br />

eingegeben, damit dann <strong>der</strong> User Memory Bereich gelöscht werden kann.<br />

&DUG 0HP6SHFLDO 3URJ0HPRU\&RXQWHU (SLE4404)<br />

Erlaubt das Verän<strong>der</strong>n des Memory Counter Bereichs (Offset 0x2C-0x34). Wenn die Fuse <strong>der</strong><br />

Karte noch nicht durchgebrannt wurde kann <strong>der</strong> Bereich beschrieben und gelöscht werden, ansonsten<br />

können einzelne Bits nur geschrieben, also von 1 auf 0 gesetzt werden.<br />

&DUG 0HP6SHFLDO (UDVH8VHU0HPRU\ (SLE4404)<br />

Nachdem <strong>der</strong> korrekte Memory Code über Card,MemSpecial,ProgMemoryCode angegeben<br />

wurde, kann mit diesem Kommando <strong>der</strong> User Memory Bereich komplett gelöscht werden. Bei<br />

jedem Versuch, diesen Bereich zu löschen, wird außerdem automatisch im Memory Counter<br />

Bereich ein Bit von 1 auf 0 gesetzt. Ist dort keine Bit mehr übrig, kann <strong>der</strong> User Memory Bereich<br />

nicht mehr gelöscht werden.<br />

&DUG 0HP6SHFLDO 3URJ)XVH (SLE4404)<br />

Erlaubt das Durchbrennen <strong>der</strong> Fuse des Chips. Dazu muß an Offset 0x3E das Bit 5 auf 0 gesetzt<br />

werden (Wert 0xEF). Nach dem Durchbrennen <strong>der</strong> Fuse sind gewisse Speicherbereiche<br />

endgültig vor dem Verän<strong>der</strong>n geschützt, dieser Vorgang kann auch nicht mehr rückgängig gemacht<br />

werden.<br />

&DUG 0HP6SHFLDO 'HGXFW (SLE4406, SLE4436))<br />

Erlaubt das Beschreiben <strong>der</strong> Counter Area (Offset 0x08- 0x0C). Bits können nur von 1 auf 0<br />

gesetzt werden, mit Ausnahme von Überträgen. Diese werden ggf. erkannt und behandelt.<br />

&DUG 0HP6SHFLDO 3URJ8VHU (SLE4436)<br />

Erlaubt das Beschreiben des User Memory Bereichs (Offset 0x28-0x2F), falls überhaupt<br />

möglich. Bits können nur von 1 auf 0 gesetzt werden.<br />

&DUG 0HP6SHFLDO 3URJ$X['DWD (SLE4436)<br />

Erlaubt das Beschreien des Auxilary Data Bereichs (Offset 0x0E-0x0F), Bits können nur von 1<br />

auf 0 gesetzt werden<br />

- 37/37 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.RPPDQGREHUHLFK $336<br />

In diesem Bereich sind Module zu finden, die einen einfache Zugriff auf häufig gebrauchte<br />

Funktionen bieten.<br />

$SSV 7/9<br />

Dieses Modul bietet einfachen Zugriff auf Memorykarten mit einer Tag-Length-Value (TLV)<br />

Stuktur. Bei dieser Speichermethode gibt das erste Byte das Tag bzw. den Namen an, das<br />

zweite Byte die Länge <strong>der</strong> Daten und ab dem dritten Byte folgen schließlich die Daten. Ist in<br />

dem Tag bzw. Name das Bit 5 (0x40) gesetzt, so bildet <strong>der</strong> Datenteil dieses Tags wie<strong>der</strong>um eine<br />

TLV-Struktur, ist also mit einem Unterverzeichnis zu vergleichen.<br />

$SSV 7/9 /LVW<br />

Dieses Kommandos gibt ein Verzeichnis aller TLV Tags mit vollständigem Pfad zurück. Der<br />

Ausgabestring listet alle Tags <strong>der</strong> Karte (getrennt durch CR+LF = #13#10) auf. Jede Zeile<br />

enthält durch Komma getrennt das Tag in hexadezimaler und und dessen Länge in dezimaler<br />

Schreibweise. Jedem Tag ist ggf. sein Pfad vorangestellt.<br />

Kommando: Str( "Apps,TLV,List" )<br />

DataIn: nil<br />

DataOut: Str( ",#13#10[,#13#10[...]]" )<br />

Bezeichnung des Tags.<br />

Länge <strong>der</strong> Daten dieses Tags.<br />

Beispiel: In dem Tag 0x61 mit <strong>der</strong> Länge 10 gibt es zwei Unter-Tags, 0x4F mit <strong>der</strong> 5 Bytes<br />

Daten und und 0x53 mit 1 Byte Daten.<br />

Kommando Str( " Apps,TLV,List" )<br />

DataIn nil<br />

DataOut Str(" 61,10<br />

614f,5<br />

6153,1" )<br />

$SSV 7/9 5HDG7DJ<br />

Dieses Kommando liest den Inhalt eines Tags.<br />

Kommando: Str( " Apps,TLV,ReadTag, " )<br />

DataIn: nil<br />

DataOut: <br />

Pfad und Name des Tags in hexadezimaler Schreibweise.<br />

Dateninhalt des Tags.<br />

Beispiel: Tag 0x61 auslesen, es enthält ein Unterverzeichnis mit den Tags 0x4F (5 Bytes<br />

Daten) und 0x53 (1 Byte Daten).<br />

Kommando: Str( "Apps,TLV,ReadTag,61" )<br />

DataIn: nil<br />

DataOut: 0x4F 0x05 0x01 0x02 0x03 0x04 0x05 0x53 0x01 0x01<br />

$SSV 7/9 :ULWH7DJ<br />

Dieses Kommando ist bisher nicht implementiert<br />

© 1998-2001, Towitoko AG - 38/38 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

$SSV 7:.<br />

Stellt die Datenfel<strong>der</strong> einer Telefonwertkarte <strong>der</strong> deutschen Telekom in dekodierter Form bereit.<br />

Kommando: Str( "Apps,TWK[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]]" )<br />

Datenfeld, folgende Namen sind gültig: "Seriennummer", "Hersteller",<br />

"Datum", "Orginalwert". "Restwert", "Chipcode", "ChipHersteller",<br />

"Betreiber"<br />

Die entsprechenden Daten.<br />

Hinweis: Von <strong>der</strong> 9- o<strong>der</strong> 11 stellige Seriennummer <strong>der</strong> Karte sind die letzten zwei Stellen nur<br />

auf <strong>der</strong> Karte aufgedruckt, jedoch nicht auf dem Chip selbst gespeichert. Somit<br />

existieren immer 100 gleiche Karten.<br />

Beispiel 1: Das Kommando Apps,TWK liefert alle Werte durch die Zeichen CR+LF = #13#10<br />

getrennt zurück.<br />

Kommando: Str( "Apps,TWK" )<br />

DataIn nil<br />

DataOut Str( " Seriennummer=131212752<br />

Hersteller=Giesecke & Devrient, München<br />

Datum=DEZ 19x3<br />

Orginalwert=50,00 DM<br />

Restwert=0,00 DM<br />

Chipcode=1304<br />

ChipHersteller=THOMSON<br />

Betreiber=Deutsche Telekom AG" )<br />

Beispiel 2: Wird <strong>der</strong> Kommandostring um einen <strong>der</strong> Feldbezeichner erweitert, wird nur <strong>der</strong> entsprechende<br />

Parameter zurückgegeben.<br />

Kommando Str( "Apps,TWK,Restwert" )<br />

DataIn nil<br />

DataOut Str( "0,00 DM" )<br />

- 39/39 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

$SSV .9.<br />

Stellt die Datenfel<strong>der</strong> einer deutschen Krankenversichertenkarte in dekodierter und geprüfter<br />

Form bereit.<br />

Kommando: Str( "Apps,KVK[,]" )<br />

DataIn: nil<br />

DataOut: Str( "#13#10[#13#10[...]]" )<br />

Datenfeld, folgende Namen sind gültig: "Krankenkasse", "KNummer",<br />

"VkNr", "VNummer","Status, "StatusExt", "Titel", "Vorname",<br />

"Zusatz", "Name", "GebDatum", "Strasse", "Land", "PLZ", "Ort",<br />

"Gultigkeit"<br />

Die entsprechenden Daten.<br />

Beispiel 1: Das Kommando Apps,KVK liefert alle Werte durch die Zeichen CR/LF = #13#10<br />

getrennt zurück.<br />

Kommando: Str( "Apps,TWK" )<br />

DataIn nil<br />

DataOut Str( " Krankenkasse=Bundesknappschaft<br />

KNummer=9905003<br />

VkNr=74701<br />

VNummer=1234567801<br />

Status=1000<br />

StatusExt=1<br />

Titel=Dr.<br />

Vorname=Martin<br />

Zusatz=Baron<br />

Name=Mustermann<br />

GebDatum=12031960<br />

Strasse=Alte Holstenstraße 46<br />

Land=D<br />

PLZ=21031<br />

Ort=Hamburg<br />

Gultigkeit=1201" )<br />

Beispiel 2: Wird <strong>der</strong> Kommandostring um einen <strong>der</strong> Feldbezeichner erweitert, wird nur <strong>der</strong> entsprechende<br />

Parameter zurückgegeben.<br />

Kommando Str( "Apps,TWK,Gultigkeit" )<br />

DataIn nil<br />

DataOut Str( "1201" )<br />

© 1998-2001, Towitoko AG - 40/40 -


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

$SSV ,62 $SSV (&% $SSV *60 $SSV 753 $SSV 3$<<br />

Dieses Kommandos werden vorerst nicht implementiert.<br />

- 41/41 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

.RPPDQGREDXP<br />

Im folgenden finden Sie eine Aufstellung <strong>der</strong> SCardServer Kommandos im Baumform:<br />

System Info ErrCode<br />

ErrText<br />

Handle<br />

Lng<br />

UsedMemHeap<br />

UsedMemTotal<br />

VersionCode<br />

VersionText<br />

TaskList<br />

Create<br />

Destroy<br />

TaskTitele<br />

TaskPath<br />

AddHWndMsg<br />

DelHWnd<br />

SetMainHWnd<br />

SetLng<br />

ConvertErrCode<br />

Comands<br />

CryptKey DES<br />

GenCryptKey DES<br />

Device Info Status<br />

Port<br />

Type<br />

ShortName<br />

Index<br />

Version<br />

Serial<br />

LotNr<br />

Baudrate<br />

MaxBaudrate<br />

Led"<br />

Caps<br />

Mode<br />

MouseDetect<br />

PowerFail<br />

CheckPowerFail<br />

List<br />

Refresh<br />

Select<br />

SearchComPort<br />

Remove<br />

InfoDeviceID<br />

InfoDeviceIDCard<br />

SetLed<br />

SetMode<br />

Card Info Status<br />

LockedBy<br />

LinkerApps<br />

LinkerCards<br />

PtsAuto<br />

PtsBinary<br />

PtsBinaryLen<br />

Baudrate<br />

CardCount<br />

CardPower<br />

Type<br />

Protocol<br />

ATR<br />

Apps<br />

MemSize<br />

PinSize<br />

PinCnt<br />

PageSize<br />

ErrMem<br />

ErrMemPB<br />

AtrBinary<br />

AtrBinarySize<br />

AtrHistory<br />

AtrHistorySize<br />

TS, T0, TA1..TD8<br />

SAD<br />

DAD<br />

IFSC<br />

IFSD<br />

CWT<br />

BWT<br />

Lock<br />

Unlock<br />

APDU<br />

ISOAPDU<br />

Reset<br />

T0TX<br />

T0RX<br />

T1<br />

PTS<br />

TspTxRxLen<br />

InitBwtCwt<br />

InitSadDad<br />

InitIfsdIfsc<br />

MemDisableCache<br />

MemEnableCache<br />

MemRead<br />

MemWrite<br />

MemVerify<br />

MemReadPB<br />

MemWritePB<br />

MemVerifyPB<br />

MemSetPB<br />

MemReadStatus<br />

MemVerifyPin<br />

MemChangePin<br />

MemSpecial<br />

Deduct<br />

ProgUser<br />

ProgAuxData<br />

© 1998-2001, Towitoko AG - 42/42 -<br />

Apps TLV List<br />

ReadTag<br />

WriteTag<br />

TWK Seriennummer<br />

Hersteller<br />

Datum<br />

Orginalwert<br />

Restwert<br />

Chipcode<br />

ChipHersteller<br />

Betreiber<br />

KVK Krankenkasse<br />

KNummer<br />

VkNr<br />

VNummer<br />

Status<br />

StatusExt<br />

Titel<br />

Vorname<br />

Zusatz<br />

Name<br />

GebDatum<br />

Strasse<br />

Land<br />

PLZ<br />

Ort<br />

Gultigkeit


SCardServer Dokumentation - Release 2001-05-31 SCardServer V2.14<br />

:HLWHUH ,QIRUPDWLRQVTXHOOHQ<br />

,QWHUQHW 6HLWHQ<br />

Chipkartenhersteller:<br />

Atmel http://www.atmel.com<br />

Giesecke & Devrient http://www.gdm.de<br />

Hitachi http://semiconductor.hitachi.com<br />

Infineon (Siemens) http://www.infineon.com<br />

Motorola http://www.mot-sps.com<br />

Philips http://www.semiconductors.philips.com<br />

Samsung: http://www.samsungsemi.com<br />

ST Microelectronics (SGS Thomson) http://www.st.com<br />

Texas Instruments http://www.ti.com<br />

XICOR http://www.xicor.com<br />

Weitere Links zu Herstellern, Schnittstellen etc. finden Sie auf unserer Homepage<br />

http://www.towitoko.de o<strong>der</strong> unter http://www.scdk.com<br />

/LWHUDWXU<br />

Wolfgang Rankl, Wolfgang Effing: Handbuch <strong>der</strong> Chipkarten<br />

3. Auflage, März 1999, Carl Hanser, München, ISBN 3-446-21115-2<br />

Francesco P. Volpe, Safinaz Volpe: Chipkarten. Grundlagen, Technik, Anwendungen<br />

1996, Heinz Heise Verlag, Hannover, ISBN: 388229065X<br />

Stefan Schütt, Bert Kohlgraf: Chipkarten<br />

April 1996, R. Oldenbourg, München, ISBN 3-486-23738-1<br />

Yahya Haghiri, Thomas Tarantino: Vom Plastik zur Chipkarte<br />

November 1999, Carl Hanser, München, ISBN 3-446-21249-3<br />

Patrick Horster: Chipkarten<br />

1998, Vieweg, Wiesbaden, ISBN: 3528056673<br />

Scott Guthery: Smart Card Developer´s Kit<br />

Dezember 1997, Macmillan, ISBN 1-57870-027-2<br />

Mike Hendry: Smart Card Security and Applications<br />

September1997, Artech House Publishers; ISBN 0-89006-953-0<br />

Dreifus Henry: Smart Cards: A Guide to Building and Managing Smart Card Applications<br />

Dezember 1997, John Wiley & Sons, ISBN: 0471157481<br />

- 43/43 - ©1998-2001, Towitoko AG


SCardServer V2.14 SCardServer Dokumentation - Release 2001-05-31<br />

KartenZwerg ® und CHIPDRIVE sind Warenzeichen <strong>der</strong> Towitoko AG.<br />

Delphi ® ist ein Warenzeichen <strong>der</strong> Inprise Corporation.<br />

Windows 3.1 ® , Windows 95 ® , Windows 98 ® , Windows ME ® , Windows NT ® und Windows 2000 ® sind<br />

Warenzeichen <strong>der</strong> Microsoft Corporation<br />

© 1998-2001, Towitoko AG - 44/44 -

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!