Changeset 186


Ignore:
Timestamp:
Jan 7, 2009, 12:30:53 AM (13 years ago)
Author:
Thomas Schmid
Message:
  • added new SmartCard plugins provided by Mr. Gronau
Location:
trunk
Files:
15 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/SmartCard/SmartCard.cs

    r163 r186  
    1818    # region private variables
    1919    private SmartCardSettings settings = new SmartCardSettings();
    20     private byte[] dataInput;
     20    // smartcard command input as hex-text
     21    private String dataInput;
     22    // apdu data to send to card
     23    private byte[] APDUData = null;
     24    // rapdu data receiving from card
    2125    private byte[] response = null;
    22     private byte[] statusWord = { 0x90, 0x00 };
     26    // log string output
     27    private String logString;
    2328    # endregion
    2429
     
    4146
    4247    public event PluginProgressChangedEventHandler OnPluginProgressChanged;
     48    private void ProgressEnd()
     49    {
     50        EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(1, 1));
     51    }
     52
     53    private void ProgressStart()
     54    {
     55        EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(0, 1));
     56    }
     57
    4358    # endregion events
    4459
     
    5772    #region IO
    5873
    59     [PropertyInfo(Direction.Input, "Data Input", "The input of the card reader.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    60     public byte[] DataInput
    61     {
    62       get { return dataInput; }
    63       set
    64       {
    65         dataInput = value;
    66         OnPropertyChanged("DataInput");
    67       }
     74    [PropertyInfo(Direction.Input, "Data Input", "The input as readable Hex String.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     75    public String DataInput
     76    {
     77        get
     78        {
     79            return dataInput;
     80        }
     81        set
     82        {
     83            dataInput = value;
     84            APDUData = HexStringToByte(dataInput);
     85            // HexStringToByte returns null if conversion failed
     86            if (APDUData == null)
     87            {
     88                GuiLogMessage("InputData is not valid hex data.", NotificationLevel.Error);
     89            }
     90            OnPropertyChanged("DataInput");
     91        }
     92    }
     93
     94    [PropertyInfo(Direction.Output, "Logging Output", "Logging output of APDU/RAPDU", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     95    public String LogString
     96    {
     97        get
     98        {
     99            return logString;
     100        }
     101        set
     102        {
     103            logString = value;
     104            OnPropertyChanged("LogString");
     105        }
    68106    }
    69107
     
    72110    {
    73111      get { return response; }
    74       set { OnPropertyChanged("Response"); }
    75     }
    76 
    77     [PropertyInfo(Direction.Output, "StatusWord", "The response SW of the card reader.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    78     public byte[] StatusWord
    79     {
    80       get { return statusWord; }
    81       set { OnPropertyChanged("StatusWord"); }
    82     }
     112        set
     113        {
     114          this.response = value;
     115          OnPropertyChanged("Response");
     116        }
     117    }
    83118    #endregion
    84119
     
    105140    public void Execute()
    106141    {
    107       this.Response = null;
    108       this.StatusWord = null;
    109       GuiLogMessage("Executed.", NotificationLevel.Info);
     142        ProgressStart();
     143        GuiLogMessage("Executing smartcard plugin.", NotificationLevel.Debug);
     144
     145        // data to send ?
     146        if (this.APDUData == null)
     147        {
     148            GuiLogMessage("No data to send.", NotificationLevel.Error);
     149            return;
     150        }
     151       
     152        // APDU >= 4 !!
     153        if (this.APDUData.Length < 4)
     154        {
     155            GuiLogMessage("Invalid APDU.", NotificationLevel.Error);
     156            return;
     157        }
     158
     159
     160      // just virtual reader ??  -> response = 0x9000
     161        if (settings.Collection[settings.CardReader] == SmartCardSettings.VirtualReader)
     162        {
     163            byte[] bResponse = new byte[2];
     164            bResponse[0] = 0x64;
     165            bResponse[1] = 0xA1;
     166
     167            // output response data
     168            this.Response = bResponse;
     169
     170            // create logging output
     171            this.LogString = "APDU:\n" +
     172                             dataInput +
     173                             "\n" +
     174                             "RAPDU:\n" +
     175                             HexValuesToHexString(bResponse) +
     176                             "\n----------------------------";
     177        }
     178        else
     179        {
     180            int Context = pcscWrapper.EstablishContext();
     181            if (Context == pcscWrapper.INVALID_HANDLE)
     182            {
     183                GuiLogMessage("Could not establish PC/SC Context.", NotificationLevel.Error);
     184                return;
     185            }
     186
     187            int hCard = pcscWrapper.Connect(Context, settings.Collection[settings.CardReader]);
     188            if (hCard == pcscWrapper.INVALID_HANDLE)
     189            {
     190                GuiLogMessage("Could not establish connection to reader: " + settings.Collection[settings.CardReader], NotificationLevel.Error);
     191                return;
     192            }
     193
     194            byte[] tmpResponse = pcscWrapper.Transmit(hCard, APDUData);
     195            if (tmpResponse == null)
     196            {
     197                GuiLogMessage("Transmission of APDU failed.", NotificationLevel.Error);
     198                return;
     199            }
     200
     201            if (tmpResponse.Length < 2)
     202            {
     203                GuiLogMessage("invalid response data: " + HexValuesToHexString(tmpResponse), NotificationLevel.Error);
     204                return;
     205            }
     206
     207            // output response data
     208            this.Response = tmpResponse;
     209
     210            // create logging output
     211            this.LogString = "APDU:\n" +
     212                             dataInput +
     213                             "\n" +
     214                             "RAPDU:\n" +
     215                             HexValuesToHexString(this.response) +
     216                             "\n----------------------------";
     217
     218
     219            // disconnect reader and release PC/SC context
     220            if (pcscWrapper.Disconnect(hCard, pcscWrapper.SCARD_LEAVE_CARD) != pcscWrapper.SCARD_S_SUCCESS)
     221            {
     222                GuiLogMessage("Disconnection failed.", NotificationLevel.Error);
     223                return;
     224            }
     225            if (pcscWrapper.ReleaseContext(Context) != pcscWrapper.SCARD_S_SUCCESS)
     226            {
     227                GuiLogMessage("Release context failed.", NotificationLevel.Error);
     228                return;
     229            }
     230        }
     231
     232      GuiLogMessage("Execution of smartcard command succeeded.", NotificationLevel.Debug);
     233      ProgressEnd();
    110234    }
    111235
     
    143267
    144268    #endregion
     269
     270      #region Hilfsmethoden
     271
     272    private static String HexValuesToHexString(byte[] bytes)
     273    {
     274        String sTemp = "";
     275
     276        for (int i = 0; i < bytes.Length; i++)
     277        {
     278            sTemp += bytes[i].ToString("X2");
     279        }
     280
     281        return sTemp;
     282    }
     283
     284    private byte[] HexStringToByte(String hexString)
     285    {
     286        // String in bytes konvertieren
     287        if (hexString == null)
     288            return null;
     289
     290        if (hexString.Length % 2 == 1)
     291            hexString = '0' + hexString; // Up to you whether to pad the first or last byte
     292
     293        byte[] data = new byte[hexString.Length / 2];
     294
     295        for (int i = 0; i < data.Length; i++)
     296        {
     297            try
     298            {
     299                data[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
     300            }
     301            catch (System.OverflowException)
     302            {
     303                GuiLogMessage("Conversion from string to byte overflowed.", NotificationLevel.Error);
     304                return null;
     305            }
     306            catch (System.FormatException)
     307            {
     308                GuiLogMessage("The string is not formatted as a byte.", NotificationLevel.Error);
     309                return null;
     310            }
     311            catch (System.ArgumentNullException)
     312            {
     313                GuiLogMessage("The string is null.", NotificationLevel.Error);
     314                return null;
     315            }
     316        }
     317
     318        return data;
     319    }
     320
     321      #endregion
    145322  }
    146323}
  • trunk/CrypPlugins/SmartCard/SmartCard.csproj

    r163 r186  
    44    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    55    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    6     <ProductVersion>9.0.30729</ProductVersion>
     6    <ProductVersion>9.0.21022</ProductVersion>
    77    <SchemaVersion>2.0</SchemaVersion>
    88    <ProjectGuid>{4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}</ProjectGuid>
     
    5757  </ItemGroup>
    5858  <ItemGroup>
     59    <Compile Include="pcscWrapper\pcscConstants.cs" />
     60    <Compile Include="pcscWrapper\pcscImports.cs" />
     61    <Compile Include="pcscWrapper\pcscStructures.cs" />
     62    <Compile Include="pcscWrapper\pcscWrapper.cs" />
    5963    <Compile Include="SmartCard.cs" />
    6064    <Compile Include="Properties\AssemblyInfo.cs" />
  • trunk/CrypPlugins/SmartCard/SmartCardSettings.cs

    r163 r186  
    1313  {
    1414    private ObservableCollection<string> collection = new ObservableCollection<string>();
     15
     16    public static string VirtualReader = "Virtual Cardreader";
    1517
    1618    #region ISettings Members
     
    3638    public SmartCardSettings()
    3739    {
    38       collection.Add("Virtual Cardreader");
    39       collection.Add("Cardreader1");
    40       Collection = collection;
     40        this.SearchCardReaders();
    4141    }
    4242
     
    5656    public void SearchCardReaders()
    5757    {
    58       GuiLogMessage("found N new readers", NotificationLevel.Info);
    59       collection.Clear();
    60       collection.Add("Cardreader2");
     58        int hContext = pcscWrapper.EstablishContext();
     59        String[] sReaders = pcscWrapper.ListReaders(hContext);
     60
     61        collection.Clear();
     62
     63        collection.Add(VirtualReader);
     64
     65        if (sReaders != null)
     66        {
     67            foreach (String sReader in sReaders)
     68            {
     69                pcscWrapper.READERSTATE rState = pcscWrapper.getReaderState(hContext, sReader);
     70
     71                GuiLogMessage("Reader found : " + sReader, NotificationLevel.Info);
     72
     73                // Debug Messages
     74                GuiLogMessage("Reader Status: 0x" + System.Convert.ToString(rState.dwEventState, 16), NotificationLevel.Debug);
     75                if ((rState.dwEventState & (UInt32)pcscWrapper.CardState.PRESENT) == 0)
     76                {
     77                    GuiLogMessage("Reader is empty.", NotificationLevel.Debug);
     78                }
     79                else
     80                {
     81                    // ATR aufbereiten
     82                    StringBuilder ATRHex = new StringBuilder();
     83                    for (int i = 0; i < rState.cbAtr; i++)
     84                    {
     85                        ATRHex.Append(" 0x" + rState.rgbAtr[i].ToString("X2"));
     86                    }
     87                    GuiLogMessage("smartcard's ATR:" + ATRHex.ToString(), NotificationLevel.Debug);
     88                    if ((rState.dwEventState & (UInt32)pcscWrapper.CardState.EXCLUSIVE) != 0)
     89                    {
     90                        GuiLogMessage("Reader is exclusively used by another application.", NotificationLevel.Debug);
     91                    }
     92                }
     93                collection.Add(sReader);
     94            }
     95        }
     96        else
     97        {
     98            GuiLogMessage("No reader found.", NotificationLevel.Info);
     99        }
     100
     101      pcscWrapper.ReleaseContext(hContext);
     102
    61103      Collection = collection;
    62104      CardReader = 0;
  • trunk/CrypTool 2.0.sln

    r165 r186  
    109109EndProject
    110110Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SSCext", "SSCext\SSCext.csproj", "{E46A6AA6-56EE-4AE5-8725-DCD07DC95527}"
     111EndProject
     112Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartCard", "CrypPlugins\SmartCard\SmartCard.csproj", "{4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}"
     113EndProject
     114Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartInterpreter", "CrypPlugins\SmartInterpreter\SmartInterpreter.csproj", "{7520A48F-E118-44C7-935F-2FC9A80D1181}"
    111115EndProject
    112116Global
     
    646650                {E46A6AA6-56EE-4AE5-8725-DCD07DC95527}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
    647651                {E46A6AA6-56EE-4AE5-8725-DCD07DC95527}.Release|Mixed Platforms.Build.0 = Release|Any CPU
     652                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Debug|.NET.ActiveCfg = Debug|Any CPU
     653                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
     654                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
     655                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
     656                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
     657                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Release|.NET.ActiveCfg = Release|Any CPU
     658                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
     659                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Release|Any CPU.Build.0 = Release|Any CPU
     660                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
     661                {4E2D7D54-2C6B-46E2-ACFA-BDA517679AE1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
     662                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Debug|.NET.ActiveCfg = Debug|Any CPU
     663                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
     664                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Debug|Any CPU.Build.0 = Debug|Any CPU
     665                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
     666                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
     667                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Release|.NET.ActiveCfg = Release|Any CPU
     668                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Release|Any CPU.ActiveCfg = Release|Any CPU
     669                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Release|Any CPU.Build.0 = Release|Any CPU
     670                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
     671                {7520A48F-E118-44C7-935F-2FC9A80D1181}.Release|Mixed Platforms.Build.0 = Release|Any CPU
    648672        EndGlobalSection
    649673        GlobalSection(SolutionProperties) = preSolution
Note: See TracChangeset for help on using the changeset viewer.