source: trunk/CrypPlugins/SZ42/Lorenz.cs @ 1941

Last change on this file since 1941 was 1941, checked in by Wilmer Andres Daza Gomez, 11 years ago

Begin of the plugin SZ42 German Lorenz Machine
until now the plugin works fine but need to be test it

File size: 9.4 KB
Line 
1/* HOWTO: Change year, author name and organization.
2   Copyright 2010 Your Name, University of Duckburg
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16using System;
17using System.Collections.Generic;
18using System.Linq;
19using System.Text;
20using Cryptool.PluginBase;
21using System.ComponentModel;
22using Cryptool.PluginBase.IO;
23using Cryptool.PluginBase.Miscellaneous;
24using System.Windows.Controls;
25using Cryptool.PluginBase.Cryptography;
26using System.IO;
27using System.Runtime.Serialization.Formatters.Binary;
28
29namespace Cryptool.Plugins.SZ42
30{
31    [Author("Wilmer Daza", "mr.wadg@gmail.com", "University of Magdalena", "http://www.unimagdalena.edu.co")]
32    //[PluginInfo(false, "Lorenz SZ42", "Represents the SZ42 Lorenz machine", null, "CrypWin/images/default.png")]
33    //[PluginInfo(false, "Lorenz SZ42", "Represents the SZ42 Lorenz machine", "SZ42/DetailedDescription/Description.xaml", "SZ42/Images/sz42.png")]
34    [PluginInfo(false, "Lorenz SZ42", "Represents the SZ42 Lorenz machine", "", "SZ42/Images/sz42.png")]
35    [EncryptionType(EncryptionType.Classic)]
36   
37    public class Lorenz : IEncryption
38    {
39        #region Private Variables
40
41        private readonly LorenzSettings settings;
42        private string inputString;
43        private string outputString;
44        private string parsedString;
45        private bool first = true;
46        private bool isPlayMode = false;
47        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
48        private SZ42 sz42Encrypt, sz42Decrypt, reset;
49        private BinaryFormatter bf;
50        private MemoryStream ms;
51
52        #endregion
53
54        #region Public Interface
55
56        public Lorenz() 
57        {
58            settings = new LorenzSettings();
59
60            reset = new SZ42();
61
62            //ConfigMachine(reset);
63
64            settings.LogMessage += Lorenz_LogMessage;
65            settings.ReExecute += Lorenz_ReExecute;
66        }
67
68        #endregion
69
70        #region Data Properties
71
72        [PropertyInfo(Direction.InputData, "Text Input", "Input a string to be processed by the SZ42 cipher", null, false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
73        public string InputString
74        {
75            get { return this.inputString; }
76            set
77            {
78                if (value != inputString)
79                {
80                    this.inputString = value;
81                    OnPropertyChanged("InputString");
82                }
83            }
84        }
85
86        [PropertyInfo(Direction.OutputData, "Text output", "The string after processing with the SZ42 cipher", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
87        public string OutputString
88        {
89            get { return this.outputString; }
90            set
91            {
92                this.outputString = value;
93                OnPropertyChanged("OutputString");
94            }
95        }
96
97        #endregion
98
99        #region IPlugin Members
100
101        public ISettings Settings
102        {
103            get { return settings; }
104        }
105
106        /// <summary>
107        /// HOWTO: You can provide a custom (tabbed) presentation to visualize your algorithm.
108        /// Return null if you don't provide one.
109        /// </summary>
110        public UserControl Presentation
111        {
112            get { return null; }
113        }
114
115        /// <summary>
116        /// HOWTO: You can provide custom (quickwatch) presentation to visualize your algorithm.
117        /// Return null if you don't provide one.
118        /// </summary>
119        public UserControl QuickWatchPresentation
120        {
121            get { return null; }
122        }
123
124        public void PreExecution()
125        {
126            Dispose();
127        }
128
129        public void Execute()
130        {
131            if (first)
132            {
133                ConfigMachine(reset);
134                first = false;
135            }
136
137            isPlayMode = true;
138
139            if (!string.IsNullOrEmpty(inputString))
140            {
141                if (settings.Action == 0)
142                {
143                    Lorenz_LogMessage("encrypting", NotificationLevel.Info);
144                    sz42Encrypt = ResetMachine();
145                    Encrypt();
146                }
147                else if (settings.Action == 1)
148                {
149                    Lorenz_LogMessage("decrypting", NotificationLevel.Info);
150                    sz42Decrypt = ResetMachine();
151                    Decrypt();
152                }
153
154                OnPropertyChanged("OutputString");
155            }
156        }
157
158        private void Encrypt() 
159        {
160            if (settings.Limitation == 1)
161                sz42Encrypt.TheresLimitation = false;
162            else
163                sz42Encrypt.TheresLimitation = true;
164
165            sz42Encrypt.Trace.Clear();
166
167            if (settings.InputParsed)
168                parsedString = inputString;
169            else
170                parsedString = sz42Encrypt.ParseInput(inputString);
171
172            outputString = sz42Encrypt.ActionMachine(parsedString);
173        }
174
175        private void Decrypt() 
176        {
177            if (settings.Limitation == 1)
178                sz42Decrypt.TheresLimitation = false;
179            else
180                sz42Decrypt.TheresLimitation = true;
181
182            sz42Decrypt.Trace.Clear();
183
184            parsedString = sz42Decrypt.ActionMachine(inputString);
185
186            if (settings.OutputParsed)
187                outputString = parsedString;
188            else
189                outputString = sz42Decrypt.ParseOutput(parsedString);
190        }
191
192        private SZ42 ResetMachine() 
193        {
194            ms = new MemoryStream();
195            bf = new BinaryFormatter();
196            bf.Serialize(ms, reset);
197            ms.Position = 0;
198            SZ42 sz42 = (SZ42)bf.Deserialize(ms);
199            ms.Close();
200            return sz42;
201        }
202
203        private void ConfigMachine(SZ42 machine)
204        {
205            string[] positions, patterns;
206            int i = 0;
207
208            positions = settings.Position.Split(new string[] { "," }, 12, StringSplitOptions.None);
209
210            patterns = settings.Pattern.Split(new string[] { "," }, 12, StringSplitOptions.None);
211
212            foreach (Wheel wheel in machine.ChiWheels)
213            {
214                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
215                wheel.Pattern = patterns[i].ToCharArray();
216                i++;
217            }
218
219            foreach (Wheel wheel in machine.PsiWheels)
220            {
221                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
222                wheel.Pattern = patterns[i].ToCharArray();
223                i++;
224            }
225
226            foreach (Wheel wheel in machine.MuWheels)
227            {
228                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
229                wheel.Pattern = patterns[i].ToCharArray();
230                i++;
231            }
232        }
233
234        /// <summary>
235        /// Handles re-execution events from settings class
236        /// </summary>
237        private void Lorenz_ReExecute()
238        {
239            if (isPlayMode)
240                Execute();
241        }
242
243        /// <summary>
244        /// Handles log messages from the settings class
245        /// </summary>
246        private void Lorenz_LogMessage(string msg, NotificationLevel loglevel)
247        {
248            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(msg, this, loglevel));
249        }
250
251        public void PostExecution()
252        {
253            isPlayMode = false;
254            Dispose();
255        }
256
257        public void Pause()
258        {
259        }
260
261        public void Stop()
262        {
263        }
264
265        public void Initialize()
266        {
267        }
268
269        public void Dispose()
270        {
271            foreach (CryptoolStream stream in listCryptoolStreamsOut)
272                stream.Close();
273           
274            listCryptoolStreamsOut.Clear();
275        }
276
277        #endregion
278
279        #region Event Handling
280
281        public event StatusChangedEventHandler OnPluginStatusChanged;
282
283        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
284
285        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
286
287        public event PropertyChangedEventHandler PropertyChanged;
288
289        private void GuiLogMessage(string message, NotificationLevel logLevel)
290        {
291            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
292        }
293
294        private void OnPropertyChanged(string name)
295        {
296            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
297        }
298
299        private void ProgressChanged(double value, double max)
300        {
301            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
302        }
303
304        #endregion
305    }
306}
Note: See TracBrowser for help on using the repository browser.