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

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

o MD5Collider: Adjusted prefix input name and tooltip

File size: 7.1 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
52        private byte[] outputData1;
53        [PropertyInfo(Direction.OutputData, "First colliding data block", "First colliding data block as byte array", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
54        public byte[] OutputData1
55        {
56            get { return this.outputData1; }
57            set
58            {
59                outputData1 = value;
60                OnPropertyChanged("OutputData1");
61                OnPropertyChanged("OutputDataStream1");
62            }
63        }
64
65        [PropertyInfo(Direction.OutputData, "First colliding data block", "First colliding data block as Stream", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
66        public CryptoolStream OutputDataStream1
67        {
68            get
69            {
70                if (outputData1 != null)
71                {
72                    CryptoolStream stream = new CryptoolStream();
73                    listCryptoolStreamsOut.Add(stream);
74                    stream.OpenRead(outputData1);
75                    return stream;
76                }
77                else
78                    return null; ;
79            }
80        }
81
82        private byte[] outputData2;
83        [PropertyInfo(Direction.OutputData, "Second colliding data block", "Second colliding data block as byte array", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
84        public byte[] OutputData2
85        {
86            get { return this.outputData2; }
87            set
88            {
89                outputData2 = value;
90                OnPropertyChanged("OutputData2");
91                OnPropertyChanged("OutputDataStream2");
92            }
93        }
94
95        [PropertyInfo(Direction.OutputData, "Second colliding data block", "Second colliding data block as Stream", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
96        public CryptoolStream OutputDataStream2
97        {
98            get
99            {
100                if (outputData2 != null)
101                {
102                    CryptoolStream stream = new CryptoolStream();
103                    listCryptoolStreamsOut.Add(stream);
104                    stream.OpenRead(outputData2);
105                    return stream;
106                }
107                else
108                    return null; ;
109            }
110        }
111
112        private byte[] randomSeed;
113        [PropertyInfo(Direction.InputData, "Random seed", "Data used for initialization of RNG", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
114        public byte[] RandomSeed
115        {
116            get { return randomSeed; }
117            set { this.randomSeed = value; OnPropertyChanged("RandomSeed"); }
118        }
119
120        private byte[] prefix;
121        [PropertyInfo(Direction.InputData, "Prefix", "Common prefix for colliding blocks", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
122        public byte[] Prefix
123        {
124            get { return prefix; }
125            set { this.prefix = value; OnPropertyChanged("Prefix"); }
126        }
127
128        public static bool testRun = true;
129
130        public void Execute()
131        {
132            // TODO: EXTREMELY DIRTY IMPROVEME!
133            // This exists to prevent the plugin from frezzing Cryptool when test-running at startup
134            if (testRun)
135            {
136                testRun = false;
137                return;
138            }
139
140            ProgressChanged(0.5, 1.0);
141
142            Collider.RandomSeed = RandomSeed;
143
144            if (Prefix != null)
145            {
146                if (Prefix.Length % 64 != 0)
147                {
148                    GuiLogMessage("Prefix bytes must be a multiple of 64 bytes long!", NotificationLevel.Error);
149                    return;
150                }
151
152                Collider.IHV = new IHVCalculator(Prefix).GetIHV();
153            }
154
155            Collider.FindCollision();
156
157            OutputData1 = Collider.FirstCollidingData;
158            OutputData2 = Collider.SecondCollidingData;
159
160            ProgressChanged(1.0, 1.0);
161        }
162
163        private void GuiLogMessage(string message, NotificationLevel logLevel)
164        {
165            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
166        }
167
168        public void OnPropertyChanged(string name)
169        {
170            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
171        }
172
173        public void Dispose()
174        {
175            foreach (CryptoolStream stream in listCryptoolStreamsOut)
176                stream.Close();
177            listCryptoolStreamsOut.Clear();
178        }
179
180        private void ProgressChanged(double value, double max)
181        {
182            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
183        }
184    }
185}
Note: See TracBrowser for help on using the repository browser.