source: trunk/CrypPlugins/MD5Collider/MD5Collider.cs @ 1171

Last change on this file since 1171 was 1171, checked in by pretzsch, 12 years ago

+ MD5Collider: Added quick watch presentation

File size: 6.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase.Cryptography;
6using Cryptool.PluginBase;
7using Cryptool.PluginBase.IO;
8using Cryptool.PluginBase.Miscellaneous;
9using System.ComponentModel;
10using Cryptool.Plugins.MD5Collider.Algorithm;
11using Cryptool.Plugins.MD5Collider.Presentation;
12using System.Windows.Controls;
13
14namespace Cryptool.Plugins.MD5Collider
15{
16    [Author("Holger Pretzsch", "mail@holger-pretzsch.de", "Uni Duisburg-Essen", "http://www.uni-due.de")]
17    [PluginInfo(false, "MD5Collider", "MD5 hash collider", "MD5Collider/DetailedDescription/Description.xaml", "MD5Collider/MD5Collider.png")]
18    class MD5Collider : ICryptographicHash
19    {
20        private MD5ColliderSettings settings = new MD5ColliderSettings();
21        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
22        private QuickWatchPresentationContainer quickWatchPresentation = new QuickWatchPresentationContainer();
23
24        private IMD5ColliderAlgorithm _collider;
25        private IMD5ColliderAlgorithm Collider
26        {
27            get { return _collider; }
28            set { _collider = value; quickWatchPresentation.Collider = value; }
29        }
30
31        public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
32        public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
33        public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
34        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
35
36        public Cryptool.PluginBase.ISettings Settings { get { return settings; } }
37        public System.Windows.Controls.UserControl Presentation { get { return null; } }
38        public System.Windows.Controls.UserControl QuickWatchPresentation { get { return quickWatchPresentation; } }
39
40        public void PreExecution() { Dispose(); }
41        public void PostExecution() { Dispose(); }
42        public void Pause() { }
43        public void Stop() { Collider.Stop(); }
44        public void Initialize() { }
45
46        public MD5Collider()
47        {
48            Collider = new StevensCollider();
49            Collider.Status = "Waiting";
50
51            worker = new BackgroundWorker();
52            worker.DoWork += DoWork;
53        }
54
55        private byte[] outputData1;
56        [PropertyInfo(Direction.OutputData, "First colliding data block", "First colliding data block as byte array", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
57        public byte[] OutputData1
58        {
59            get { return this.outputData1; }
60            set
61            {
62                outputData1 = value;
63                OnPropertyChanged("OutputData1");
64                OnPropertyChanged("OutputDataStream1");
65            }
66        }
67
68        [PropertyInfo(Direction.OutputData, "First colliding data block", "First colliding data block as Stream", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
69        public CryptoolStream OutputDataStream1
70        {
71            get
72            {
73                if (outputData1 != null)
74                {
75                    CryptoolStream stream = new CryptoolStream();
76                    listCryptoolStreamsOut.Add(stream);
77                    stream.OpenRead(outputData1);
78                    return stream;
79                }
80                else
81                    return null; ;
82            }
83        }
84
85        private byte[] outputData2;
86        [PropertyInfo(Direction.OutputData, "Second colliding data block", "Second colliding data block as byte array", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
87        public byte[] OutputData2
88        {
89            get { return this.outputData2; }
90            set
91            {
92                outputData2 = value;
93                OnPropertyChanged("OutputData2");
94                OnPropertyChanged("OutputDataStream2");
95            }
96        }
97
98        [PropertyInfo(Direction.OutputData, "Second colliding data block", "Second colliding data block as Stream", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
99        public CryptoolStream OutputDataStream2
100        {
101            get
102            {
103                if (outputData2 != null)
104                {
105                    CryptoolStream stream = new CryptoolStream();
106                    listCryptoolStreamsOut.Add(stream);
107                    stream.OpenRead(outputData2);
108                    return stream;
109                }
110                else
111                    return null; ;
112            }
113        }
114
115        private byte[] randomSeed;
116        [PropertyInfo(Direction.InputData, "Random seed", "Data used for initialization of RNG", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
117        public byte[] RandomSeed
118        {
119            get { return randomSeed; }
120            set
121            {
122                this.randomSeed = value;
123                OnPropertyChanged("RandomSeed");
124            }
125        }
126       
127        BackgroundWorker worker;
128
129        public void Execute()
130        {
131            DoWork(this, null);
132            return;
133
134            if (worker.IsBusy)
135                return;
136
137            worker.RunWorkerAsync();
138        }
139
140        private void GuiLogMessage(string message, NotificationLevel logLevel)
141        {
142            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
143        }
144
145        public void DoWork(object o, EventArgs e)
146        {
147            GuiLogMessage("DoWork()", NotificationLevel.Debug);
148            Collider.Status = "Executing";
149
150            if (RandomSeed == null)
151                return;
152
153            ProgressChanged(0.5, 1.0);
154
155            Collider.RandomSeed = RandomSeed;
156            Collider.FindCollision();
157
158            OutputData1 = Collider.FirstCollidingData;
159            OutputData2 = Collider.SecondCollidingData;
160
161            ProgressChanged(1.0, 1.0);
162
163            Collider.Status = "Finished";
164        }
165
166        public void OnPropertyChanged(string name)
167        {
168            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
169        }
170
171        public void Dispose()
172        {
173            foreach (CryptoolStream stream in listCryptoolStreamsOut)
174                stream.Close();
175            listCryptoolStreamsOut.Clear();
176        }
177
178        private void ProgressChanged(double value, double max)
179        {
180            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
181        }
182    }
183}
Note: See TracBrowser for help on using the repository browser.