Smartcard Zugriff per X#

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

Post Reply
lagraf
Posts: 530
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Smartcard Zugriff per X#

Post by lagraf »

Hallo,
ich habe mir vor Jahren eine X# DLL zusammengebaut, indem ich aus einer C# DLL die benötigte Klasse und Methoden extrahiert und nach X# umgeschrieben habe. Die X# DLL behandelt die CardOSVersionen 4.0, 5.0 und 5.3. Nun gibt es aber nur mehr Karten mit neuen Chips mit der Version ACOS 4.1.

Hat jemand Erfahrung mit solchen Smartcards wie sie für die RKSV (RegistrierKassenSicherheitsVerordnung) verwendet werden?
Angeblich sollte nur der SELECT zu ändern sein, habe ich schon gemacht, hat aber nicht geholfen.

LG Franz
lagraf
Posts: 530
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Re: Smartcard Zugriff per X#

Post by lagraf »

GESUCHT:
Programmierer der gegen Bezahlung entweder meine C# oder X# Testapp um das ACOS 4.1 Protokoll erweitert, X# preferred.
Doku von Globaltrust vorhanden.
Smartcard könnte auch gestellt werden.
LG
lagraf
Posts: 530
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Re: Smartcard Zugriff per X#

Post by lagraf »

Hallo,
wenn ich beim Zugriff auf die SmartCard eine alte Karte mit der CardOS Version 5.3 verwende, dann kommt in TransmitApduBytes korrekt retVal 9000 zurück und alles funktioniert. Verwende ich jedoch eine Karte mit der neuen ACOS Version 4.1, dann bringt TransmitApduBytes retVal 6700, was laut www "length incorrect" bedeutet. Ich habe keine Ahnung welche Länge damit gemeint ist und wie ich das beheben kann. Vielleicht kann mir jemand weiterhelfen.
LG Franz

Code: Select all

PUBLIC METHOD GetSerialNumber(readerName AS STRING , response OUT STRING ) AS LOGIC
	LOCAL retVal AS STRING
	LOCAL response2 AS BYTE[]
	LOCAL response3 AS BYTE[]
	//
	TRY
		retVal := ""
		response2 := NULL
		IF SELF:Connect(readerName)
			SELF:ExecuteCommand(readerName, "00a40000021fff":ToByteArray(), OUT response2)	// 4.1
			IF SELF:TransmitApduBytes("00ca018108":ToByteArray(), OUT response3, OUT retVal)
				response := response3:ToHexString()
				RETURN TRUE
			ENDIF
			response := ""
			RETURN FALSE
		ENDIF
		response := ""
		RETURN FALSE

	CATCH 
		response := ""
		RETURN FALSE
	END TRY

PUBLIC METHOD TransmitApduBytes(apdu AS BYTE[] , response OUT BYTE[] , retVal OUT STRING ) AS LOGIC
	LOCAL receiveBuffer AS BYTE[]
	LOCAL sCardError AS SCardError
	LOCAL num AS LONG
	//
	IF SELF:m_Pci == IntPtr.Zero
		response := NULL
		retVal := "reader not initialized"
		RETURN FALSE
	ENDIF
	receiveBuffer := BYTE[]{ 512 }
	sCardError := SELF:m_Reader:Transmit(SELF:m_Pci, apdu, REF receiveBuffer)
	IF sCardError != 0
		retVal := SCardHelper.StringifyError(sCardError)
		response := NULL
		RETURN FALSE
	ENDIF
	num := receiveBuffer:Length
	retVal := receiveBuffer:Skip(num - 2):Take(2):ToArray():ToHexString()
	IF retVal:Equals("9000")
		response := receiveBuffer:Take(num - 2):ToArray()
		RETURN TRUE
	ENDIF
	response := receiveBuffer:Take(num):ToArray()
	RETURN FALSE
lagraf
Posts: 530
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Re: Smartcard Zugriff per X#

Post by lagraf »

Ich habe inzwischen die Testapp mit den Erweiterungen für die a-trust ACOS-ID 4.1 Smartcards in C# zum Laufen gebracht und diese danach nach X# konvertiert. Der nächste Schritt ist, die Erweiterungen für a-trust ACOS-ID 4.1 in meine X# RKSV DLL zu übertragen, die ich dann in meine Kassenprogramme einbinde.

Globaltrust ACOS-ID 4.1 Smartcards verwenden leider eigene Codes für die Zugriffe. Die Doku ist sehr mau, besteht aus einem A4 Blatt mit einer Reihe Codes ohne nähere Erläuterung für welchen Zweck. Deshalb habe ich diese Routinen noch nicht geschafft. Emails mit Bitte um Hilfe werden nicht beantwortet.

Aber solange wenigstens a-trust Smartcards funktionieren, reicht das aus. Meine Kunden müssen halt dann a-trust Smartcards kaufen, Globaltrust braucht anscheindend meine Kunden nicht.

LG
Post Reply