source: trunk/CrypPlugins/SmartInterpreter/SmartInterpreter.cs @ 1709

Last change on this file since 1709 was 419, checked in by Thomas Schmid, 12 years ago
  • merged IControl branch to trunk
  • added KeySearcher sample: KeySearcher-Sample
  • changed some plugins to work with new enumeration
  • new bins
File size: 8.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase.IO;
6using Cryptool.PluginBase;
7using System.ComponentModel;
8using Cryptool.PluginBase.Miscellaneous;
9using System.Windows.Controls;
10using Cryptool.PluginBase.Cryptography;
11
12namespace SmartInterpreter
13{
14  [Author("Malte Gronau", "malte.gronau@web.de", "", "")]
15  [PluginInfo(false, "SmartInterpreter", "SmartCard Script Interpreter.", "", "SmartInterpreter/Images/SmartInterpreter.png")]
16  public class SmartInterpreter : IThroughput
17  {
18    # region private variables
19    private SmartInterpreterSettings settings = new SmartInterpreterSettings();
20    // Input data string
21    private String dataInput;
22    // Command string - array
23    private String[] Commands = null;
24    // last statusword received
25    private byte[] statusWord = null;
26    // last response data received
27    private byte[] response = null;
28    // current string command output
29    private String apdustring;
30    // internal command sequence counter
31    // resetting to 0 after getting new dataInput
32    // increasing by 1 calling Execute()
33    private int CommandCounter = 0;
34    # endregion
35
36    #region events
37    public event StatusChangedEventHandler OnPluginStatusChanged;
38    private void PluginStatusChanged(int imageNumber)
39    {
40      if (OnPluginStatusChanged != null)
41      {
42        OnPluginStatusChanged(this, new StatusEventArgs(StatusChangedMode.ImageUpdate, imageNumber));
43      }
44    }
45
46    public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
47    private void GuiLogMessage(string message, NotificationLevel logLevel)
48    {
49      EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
50    }
51
52    public event PluginProgressChangedEventHandler OnPluginProgressChanged;
53    private void ProgressChanged(double value, double max)
54    {
55        EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
56    }
57    # endregion events
58
59    # region constructor
60    public SmartInterpreter()
61    {
62      settings.OnGuiLogNotificationOccured += settings_OnGuiLogNotificationOccured;
63    }
64
65    void settings_OnGuiLogNotificationOccured(IPlugin sender, GuiLogEventArgs args)
66    {
67      GuiLogMessage(args.Message, args.NotificationLevel);
68    }
69    # endregion
70
71    #region IO
72
73    [PropertyInfo(Direction.InputData, "Data Input", "The input data as readable Hex String.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
74    public String DataInput
75    {
76        get
77        {
78            return dataInput;
79        }
80        set
81        {
82            // reset sequence counter after getting new data
83            CommandCounter = 0;
84
85            // remove formatting symbols from dataInput
86            dataInput = value;
87            dataInput = dataInput.Replace("\r", "");
88            dataInput = dataInput.Replace("\n", "");
89            dataInput = dataInput.Replace(" ", "");
90
91            // getting command sequence from dataInput
92            Commands = dataInput.Split(';');
93            if (Commands.Length == 0)
94            {
95                Commands = new String[1];
96                Commands[0] = dataInput;
97            }
98           
99            // command sequence not validated !!!
100            OnPropertyChanged("DataInput");
101        }
102    }
103
104    [PropertyInfo(Direction.InputData, "Response Input", "The response input of the card reader.", "", false, true, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
105    public byte[] Response
106    {
107        get {
108            if (this.statusWord != null)
109            {
110                if (this.response == null)
111                {
112                    // return only statusword
113                    return this.statusWord;
114                }
115                else
116                {
117                    // return response data + status word
118                    byte[] aReturn = new byte[this.response.Length + this.statusWord.Length];
119
120                    this.response.CopyTo(aReturn, 0);
121                    this.statusWord.CopyTo(aReturn, this.response.Length);
122
123                    return aReturn;
124                }
125            }
126            else { return null; }
127        }
128        set
129        {
130            if (value == null)
131            {
132                // call after no smartcard operation
133                // leave variable states
134                OnPropertyChanged("Response");
135                return;
136            }
137
138            if (value.Length < 2)
139            {
140                // length of response at least 2 bytes statusword
141                GuiLogMessage("Invalid Response data!", NotificationLevel.Error);
142                this.statusWord = null;
143                this.response = null;
144                OnPropertyChanged("Response");
145                return;
146            }
147
148            // structure response data
149            this.statusWord = new byte[2];
150            this.statusWord[0] = value[value.Length - 2];
151            this.statusWord[1] = value[value.Length - 1];
152            this.response = new byte[value.Length - 2];
153            for (int i = 0; i < value.Length - 2; i++)
154            {
155                this.response[i] = value[i];
156            }
157
158            OnPropertyChanged("Response");
159        }
160    }
161
162    [PropertyInfo(Direction.OutputData, "Command Output", "Command output for smartcard", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
163    public String APDUString
164    {
165        get
166        {
167            return apdustring;
168        }
169        set
170        {
171            apdustring = value;
172            OnPropertyChanged("APDUString");
173        }
174    }
175
176    #endregion
177     
178    # region IPlugin-Methods
179    public ISettings Settings
180    {
181      get { return settings; }
182    }
183
184    public UserControl Presentation
185    {
186      get { return null; }
187    }
188
189    public UserControl QuickWatchPresentation
190    {
191      get { return null; }
192    }
193
194    public void PreExecution()
195    {
196    }
197
198    public void Execute()
199    {
200        // Execute first called by getting input from TextInput box,
201        // then called by getting input from response input
202        GuiLogMessage("Executing SmartInterpreter plugin.", NotificationLevel.Debug);
203
204        if ((Commands == null) || (Commands.Length <= CommandCounter) || (Commands[CommandCounter] == null))
205        {
206            GuiLogMessage("No commands.", NotificationLevel.Debug);
207            return;
208        }
209       
210        GuiLogMessage("Command Counter: " + CommandCounter, NotificationLevel.Debug);
211
212        if (CommandCounter < Commands.Length)
213        {
214            // first increasing CommandCounter
215            CommandCounter++;
216
217            // select command
218            if (Commands[CommandCounter - 1].ToUpper().IndexOf("SEND") == 0)
219            {
220                this.statusWord = null;
221                // logging and sending command
222                GuiLogMessage("Executing Send command: " + Commands[CommandCounter-1], NotificationLevel.Debug);
223                APDUString = Commands[CommandCounter-1].Substring(4);
224            } else
225                if (Commands[CommandCounter - 1].ToUpper().IndexOf("//") == 0)
226                {
227                    GuiLogMessage("Comment: " + Commands[CommandCounter - 1], NotificationLevel.Debug);
228                    // execute myself without sending command to smartcard
229                    this.Response = null;
230                }
231                else
232                {
233                    GuiLogMessage("Invalid command string: " + Commands[CommandCounter - 1], NotificationLevel.Error);
234                }
235        }
236
237        ProgressChanged(CommandCounter, Commands.Length);
238    }
239
240    public void PostExecution()
241    {
242    }
243
244    public void Pause()
245    {
246    }
247
248    public void Stop()
249    {
250        // resetting command counter
251        this.CommandCounter = 0;
252        // last statusword received
253        this.statusWord = null;
254        // last response data received
255        this.response = null;
256    }
257
258    public void Initialize()
259    {
260
261    }
262
263    public void Dispose()
264    {
265    }
266
267    #endregion IPlugin-Methods
268
269    #region INotifyPropertyChanged Members
270
271    public event PropertyChangedEventHandler PropertyChanged;
272
273    protected void OnPropertyChanged(string name)
274    {
275      EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
276    }
277
278    #endregion
279
280  }
281}
Note: See TracBrowser for help on using the repository browser.