ATR einer Smartcard richtig auslesen
-
Donnerstag, 17. März 2011 14:57
Ich habe vor ein paar Tagen mit Visual Basic 2010 angefangen
Ich dachte mir für den Anfang ein wenig mit meinem CardReader und ein paar SmartCards zu spielen.
Soweit so gut^^
Habe auch schon erste Erfolge verzeichnen können.
Das Ansteuern der seriellen Schnittstelle geht gut.Nun zu meinem eigentlichen Problem und zu ein paar Fragen^^
Wenn ich über einen Reset der Karte den ATR angezeigt bekommen möchte stimmt noch etwas nicht
Es werden noch ein paar bytes falsch angezeigt.
Man sagte mir nun ich soll das mit einem Timer lösen.
Bekomme es nur nicht hin.Hier mal mein Code:
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Schnitstelle öffnen, Buttons freigeben und ATR auswerfen Dim TheHex As Object Dim a As Object Dim Final As Object Try SerialPort1.PortName = TextBox28.Text SerialPort1.BaudRate = TextBox31.Text SerialPort1.Open() Button1.Enabled = False Button2.Enabled = True Button3.Enabled = True Button4.Enabled = True Button4.Enabled = True Button5.Enabled = True Button6.Enabled = True Button7.Enabled = True Catch ex As Exception MsgBox("Verbindung zum Reader konnte nicht hergestellt werden" ) End Try SerialPort1.RtsEnable = True SerialPort1.RtsEnable = False SerialPort1.DtrEnable = True SerialPort1.RtsEnable = False a = SerialPort1.ReadExisting() Final = "" For i = 1 To Len(a) TheHex = (Hex(Asc(Mid(a, i, 1)))) If Len(TheHex) = 1 Then TheHex = "0" & TheHex Final = Final & TheHex + " " Next i TextBox1.Text = ("ATR: " + Final) End Sub Private Sub Form1_FormClosing(ByVal sender As Object , ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me .FormClosing ' Beenden und Schnittstelle schließen fals offen If SerialPort1.IsOpen = True Then SerialPort1.Close() End If End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click ' CMD test Dim TheHex As Object Dim a As Object Dim Final As Object SerialPort1.Write(Chr(&H0) + Chr(&H1) + Chr(&H2) + Chr(&H3) + Chr(&H0) + Chr(&H0) + Chr(&H3D)) a = SerialPort1.ReadExisting() Final = "" For i = 1 To Len(a) TheHex = (Hex(Asc(Mid(a, i, 1)))) If Len(TheHex) = 1 Then TheHex = "0" & TheHex Final = Final & TheHex + " " Next i TextBox14.Text = ("RX: " + Final) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' Schnittstelle schließen udn Buttons sperren SerialPort1.Close() Button1.Enabled = True Button2.Enabled = False Button3.Enabled = False Button4.Enabled = False Button4.Enabled = False Button5.Enabled = False Button6.Enabled = False Button7.Enabled = False End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click ' Reset Dim TheHex As Object Dim a As Object Dim Final As Object a = SerialPort1.ReadExisting() Final = SerialPort1.ReadExisting() For i = 1 To Len(a) TheHex = (Hex(Asc(Mid(a, i, 1)))) If Len(TheHex) = 1 Then TheHex = "0" + TheHex Final = Final + TheHex + " " Next i SerialPort1.RtsEnable = True SerialPort1.RtsEnable = False SerialPort1.DtrEnable = True SerialPort1.RtsEnable = False TextBox1.Text = ("ATR: " + Final) End Sub End Class
Ja ich weiß die Buttons und Textfelder muss ich noch besser beschriften^^
Wie gesagt ich bekomme was angezeigt, aber beim ATR sind ein paar bytes falsch und bei fast jedem Reset werden immer ein paar bytes angezeigt, also es kommt auch nicht immer das gleiche Ergebnis.
Ich muss wohl einen Zwischen ReadExisting und der Umrechnung in HEX machen.
Auch wenn ich ein CMD an die Karte senden möchte ist die erwartetet Antwort nicht die, die kommen müsste und sie ist zu kurz.Aber ich habe keinen Schimmer wie.
So dann noch eine Frage:
Wie lasse ich mir später aus einer Kartenanwort nur bestimmt Sachen anzeigen?Mal als Beispiel wenn sie mit 01 12 23 45 56 78 89 0A 0B 0C 0E 0F antwortet möchte ich sagen wir mal nur: 35689ABCD angezeigt bekommen
Und nun die vorerst letzte Frage^^
Hier wird eine Checksum berechnet die am Ende jedes Strings mit zur Karte gesendet werden soll
Dim meCheckSum As Byte = &H3F ' Constant for CheckSum Dim Loop As Integer Dim sCScmd As New System.Text.StringBuilder For Loop = 1 To cmd.Length Step 3 meCheckSum = CByte(meCheckSum Xor CByte("&H" & Mid(cmd, Loop, 2))) sCScmd.Append(Chr(CInt("&h" & Mid(cmd, Loop, 2)))) NextMache ich das später so?
SerialPort1.Write(Chr(&H0) + Chr(&H2) + Chr(&H3) + Chr(&H4) + Chr(&H5) + Chr(&H6) + meCheckSum)<br/>
Danke schon mal für eure Tipps ;)

