source: trunk/CrypPlugins/HMAC/HMAC.cs @ 1785

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

+ HMAC plugin
+ Sample project for HMAC plugin (HMAC-Sample.cte)

File size: 8.5 KB
Line 
1/*
2   Copyright 2009 Holger Pretzsch, University of Duisburg-Essen
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*/
16
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using Cryptool.PluginBase.Cryptography;
22using Cryptool.PluginBase.IO;
23using Cryptool.PluginBase.Miscellaneous;
24using System.Runtime.Remoting.Contexts;
25using Cryptool.PluginBase;
26using Cryptool;
27using System.IO;
28using System.Windows.Controls;
29using System.ComponentModel;
30
31namespace Cryptool.HMAC
32{
33    [Author("Holger Pretzsch", "mail@holger-pretzsch.de", "Uni Duisburg-Essen", "http://www.uni-due.de")]
34    [PluginInfo(false, "HMAC", "HMAC algorithm", "HMAC/DetailedDescription/Description.xaml", "HMAC/HMAC.png")]
35    [EncryptionType(EncryptionType.Classic)]
36    public class HMAC : ICryptographicHash
37    {
38        #region Private variables
39
40        private HMACSettings settings;
41        private CryptoolStream inputData;
42        private byte[] key;
43        private byte[] outputData;
44        private List<CryptoolStream> streamList = new List<CryptoolStream>();
45
46        #endregion
47
48        #region Public interface
49
50        public HMAC()
51        {
52            this.settings = new HMACSettings();
53        }
54
55        public ISettings Settings
56        {
57            get { return this.settings; }
58
59            set { this.settings = (HMACSettings)value; }
60        }
61
62        [PropertyInfo(Direction.InputData, "Input stream", "Input data to be processed", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
63        public CryptoolStream InputData
64        {
65
66            get
67            {
68                if (inputData != null)
69                {
70                    CryptoolStream cs = new CryptoolStream();
71                    cs.OpenRead(inputData.FileName);
72                    streamList.Add(cs);
73                    return cs;
74                }
75                return null;
76            }
77
78            set
79            {
80                this.inputData = value;
81                OnPropertyChanged("InputData");
82            }
83        }
84
85        [PropertyInfo(Direction.InputData, "Key", "Message digest key", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
86        public byte[] Key
87        {
88            get
89            {
90                return key;
91            }
92
93            set
94            {
95                this.key = value;
96                OnPropertyChanged("Key");
97            }
98        }
99
100        [PropertyInfo(Direction.OutputData, "Digested value", "Digested value as stream", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
101        public CryptoolStream OutputDataStream
102        {
103            get
104            {
105                if (outputData != null)
106                {
107                    CryptoolStream stream = new CryptoolStream();
108                    streamList.Add(stream);
109                    stream.OpenRead(outputData);
110                    GuiLogMessage("Got request for hash (Stream)...", NotificationLevel.Debug);
111                    return stream;
112                }
113                else
114                {
115                    return null;
116                }
117            }
118
119            set { } // readonly
120        }
121
122        [PropertyInfo(Direction.OutputData, "Digested value", "Digested value as byte array", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
123        public byte[] OutputData
124        {
125            get
126            {
127                return this.outputData;
128            }
129
130            set
131            {
132                outputData = value;
133                OnPropertyChanged("OutputData");
134                OnPropertyChanged("OutputDataStream");
135            }
136        }
137
138        public void Execute()
139        {
140            ProgressChanged(0.5, 1.0);
141            if (inputData != null && key != null)
142            {
143                System.Security.Cryptography.HMAC hmacAlgorithm;
144
145                switch ((HMACSettings.HashFunction)settings.SelectedHashFunction)
146                {
147                    case HMACSettings.HashFunction.MD5:
148                        hmacAlgorithm = new System.Security.Cryptography.HMACMD5();
149                        break;
150                    case HMACSettings.HashFunction.RIPEMD160:
151                        hmacAlgorithm = new System.Security.Cryptography.HMACRIPEMD160();
152                        break;
153                    case HMACSettings.HashFunction.SHA1:
154                        hmacAlgorithm = new System.Security.Cryptography.HMACSHA1();
155                        break;
156                    case HMACSettings.HashFunction.SHA256:
157                        hmacAlgorithm = new System.Security.Cryptography.HMACSHA256();
158                        break;
159                    case HMACSettings.HashFunction.SHA384:
160                        hmacAlgorithm = new System.Security.Cryptography.HMACSHA384();
161                        break;
162                    case HMACSettings.HashFunction.SHA512:
163                        hmacAlgorithm = new System.Security.Cryptography.HMACSHA512();
164                        break;
165                    default:
166                        GuiLogMessage("No hash algorithm for HMAC selected, using MD5.", NotificationLevel.Warning);
167                        hmacAlgorithm = new System.Security.Cryptography.HMACMD5();
168                        break;
169                }
170
171                hmacAlgorithm.Key = key;
172                OutputData = hmacAlgorithm.ComputeHash(inputData);
173
174                GuiLogMessage(String.Format("HMAC computed. (using hash algorithm {0}: {1})", settings.SelectedHashFunction, hmacAlgorithm.GetType().Name), NotificationLevel.Info);
175            }
176            else
177            {
178                if (inputData == null)
179                    GuiLogMessage("No input data for HMAC algorithm.", NotificationLevel.Warning);
180                if (key == null)
181                    GuiLogMessage("No key for HMAC algorithm.", NotificationLevel.Warning);
182            }
183
184            ProgressChanged(1.0, 1.0);
185        }
186
187
188        public void Initialize() { }
189
190        public void Dispose()
191        {
192            if (inputData != null)
193            {
194                inputData.Close();
195                inputData = null;
196            }
197            foreach (CryptoolStream stream in streamList)
198            {
199                stream.Close();
200            }
201        }
202        #endregion
203
204        #region IPlugin Members
205
206        public UserControl Presentation
207        {
208            get { return null; }
209        }
210
211        public UserControl QuickWatchPresentation
212        {
213            get { return null; }
214        }
215
216        public void Stop() { }
217
218        public void PostExecution()
219        {
220            Dispose();
221        }
222
223        public void PreExecution()
224        {
225            Dispose();
226        }
227
228        #endregion
229
230        #region INotifyPropertyChanged Members
231
232        public event PropertyChangedEventHandler PropertyChanged;
233
234        public void OnPropertyChanged(string name)
235        {
236            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
237        }
238
239        #endregion
240
241        #region IPlugin Members
242
243#pragma warning disable 67
244        public event StatusChangedEventHandler OnPluginStatusChanged;
245#pragma warning restore
246
247        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
248
249        private void GuiLogMessage(string message, NotificationLevel logLevel)
250        {
251            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
252        }
253
254        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
255
256        private void ProgressChanged(double value, double max)
257        {
258            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
259        }
260
261        public void Pause() { }
262
263        #endregion
264    }
265}
Note: See TracBrowser for help on using the repository browser.