Frage ATR einer Smartcard richtig auslesen

  • Donnerstag, 17. März 2011 14:57
     
      Enthält Code

     

    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))))
    
    Next

     

    Mache 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 ;)