6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr
6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr
6&DUG6HUYHU 9 7HFKQLVFKH 'RNXPHQWDWLRQ - der HTL Steyr
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 -