Wie ATR einer Smartcard richtig auslesen & andere Serielle fragen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Dplus.

    Wie ATR einer Smartcard richtig auslesen & andere Serielle fragen

    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:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim TheHex As Object
    3. Dim a As Object
    4. Dim Final As Object
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. 'Schnitstelle öffnen, Buttons freigeben und ATR auswerfen
    7. Try
    8. SerialPort1.PortName = TextBox28.Text
    9. SerialPort1.BaudRate = TextBox31.Text
    10. SerialPort1.Open()
    11. Button1.Enabled = False
    12. Button2.Enabled = True
    13. Button3.Enabled = True
    14. Button4.Enabled = True
    15. Button4.Enabled = True
    16. Button5.Enabled = True
    17. Button6.Enabled = True
    18. Button7.Enabled = True
    19. Catch ex As Exception
    20. MsgBox("Verbindung zum Reader konnte nicht hergestellt werden")
    21. End Try
    22. SerialPort1.RtsEnable = True
    23. SerialPort1.RtsEnable = False
    24. SerialPort1.DtrEnable = True
    25. SerialPort1.RtsEnable = False
    26. a = SerialPort1.ReadExisting()
    27. Final = ""
    28. For i = 1 To Len(a)
    29. TheHex = (Hex(Asc(Mid(a, i, 1))))
    30. If Len(TheHex) = 1 Then TheHex = "0" & TheHex
    31. Final = Final & TheHex + " "
    32. Next i
    33. TextBox1.Text = ("ATR: " + Final)
    34. End Sub
    35. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    36. ' Beenden und Schnittstelle schließen fals offen
    37. If SerialPort1.IsOpen = True Then
    38. SerialPort1.Close()
    39. End If
    40. End Sub
    41. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    42. ' CMD test
    43. SerialPort1.Write(Chr(&H0) + Chr(&H1) + Chr(&H2) + Chr(&H3) + Chr(&H4) + Chr(&H5) + Chr(&H6))
    44. a = SerialPort1.ReadExisting()
    45. Final = ""
    46. For i = 1 To Len(a)
    47. TheHex = (Hex(Asc(Mid(a, i, 1))))
    48. If Len(TheHex) = 1 Then TheHex = "0" & TheHex
    49. Final = Final & TheHex + " "
    50. Next i
    51. TextBox14.Text = ("RX: " + Final)
    52. End Sub
    53. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    54. ' Schnittstelle schließen und Buttons sperren
    55. SerialPort1.Close()
    56. Button1.Enabled = True
    57. Button2.Enabled = False
    58. Button3.Enabled = False
    59. Button4.Enabled = False
    60. Button4.Enabled = False
    61. Button5.Enabled = False
    62. Button6.Enabled = False
    63. Button7.Enabled = False
    64. End Sub
    65. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    66. ' Reset
    67. a = SerialPort1.ReadExisting()
    68. Final = SerialPort1.ReadExisting()
    69. For i = 1 To Len(a)
    70. TheHex = (Hex(Asc(Mid(a, i, 1))))
    71. If Len(TheHex) = 1 Then TheHex = "0" + TheHex
    72. Final = Final + TheHex + " "
    73. Next i
    74. SerialPort1.RtsEnable = True
    75. SerialPort1.RtsEnable = False
    76. SerialPort1.DtrEnable = True
    77. SerialPort1.RtsEnable = False
    78. TextBox1.Text = Final
    79. End Sub
    80. 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



    VB.NET-Quellcode

    1. Dim meCheckSum As Byte = &H3F ' Constant for CheckSum
    2. Dim Loop
    3. As Integer
    4. Dim sCScmd As New System.Text.StringBuilder
    5. For Loop = 1 To cmd.Length Step 3
    6. meCheckSum = CByte(meCheckSum Xor CByte("&H" & Mid(cmd, Loop, 2)))
    7. sCScmd.Append(Chr(CInt("&h" & Mid(cmd, Loop, 2))))
    8. Next




    Mache ich das später so?


    VB.NET-Quellcode

    1. SerialPort1.Write(Chr(&H0) + Chr(&H2) + Chr(&H3) + Chr(&H4) + Chr(&H5) + Chr(&H6) + meCheckSum)
    So bin nun wieder ein kleines Stückchen weiter^^



    Die Strings werden nun komplett und richtig angezeigt.



    Naja meistens ^^

    Ich konvertiere den String nun so um:



    VB.NET-Quellcode

    1. Private Function ByteToHex(ByVal comByte As Byte()) As String
    2. Dim builder As New StringBuilder(comByte.Length * 3)
    3. For Each data As Byte In comByte
    4. builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c).PadRight(3, " "c))
    5. Next
    6. Return builder.ToString().ToUpper()
    7. End Function

    VB.NET-Quellcode

    1. Dim bytes As Integer = SerialPort1.BytesToRead
    2. Dim comBuffer As Byte() = New Byte(bytes - 1) {}
    3. SerialPort1.Read(comBuffer, 0, bytes)
    4. Threading.Thread.Sleep(60)
    5. Final = ByteToHex(comBuffer) + ""
    6. TextBox1.Text = (Final)