]> git.sesse.net Git - freerainbowtables/blob - Client Applications/rcracki_mt/sha1.cpp
339ebb966a831acd5363bb870d8d88da7239fa5e
[freerainbowtables] / Client Applications / rcracki_mt / sha1.cpp
1 //#include <stdio.h>
2 #if defined(WIN32)
3 #include <windows.h>
4 #endif
5 #include <string.h>
6
7
8
9 #define SHA1CircularShift(bits,word) (((word) << (bits)) | ((word) >> (32-(bits))))
10
11 // this rotate isn't faster with me
12 #if defined(WIN32)
13 #define ROTATE(a,n)     _lrotl(a,n)
14 #else
15 #define ROTATE(a,n)     (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
16 #endif
17
18 /* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
19 #if defined(WIN32)
20 /* 5 instructions with rotate instruction, else 9 */
21 #define Endian_Reverse32(a) \
22         { \
23         unsigned long l=(a); \
24         (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \
25         }
26 #else
27 /* 6 instructions with rotate instruction, else 8 */
28 #define Endian_Reverse32(a) \
29         { \
30         unsigned long l=(a); \
31         l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \
32         (a)=ROTATE(l,16L); \
33         }
34 #endif
35
36 #define F_00_19(b,c,d)  ((((c) ^ (d)) & (b)) ^ (d)) 
37 #define F_20_39(b,c,d)  ((b) ^ (c) ^ (d))
38 #define F_40_59(b,c,d)  (((b) & (c)) | (((b)|(c)) & (d))) 
39 #define F_60_79(b,c,d)  F_20_39(b,c,d)
40
41 #define K0 0x5A827999
42 #define K1 0x6ED9EBA1
43 #define K2 0x8F1BBCDC
44 #define K3 0xCA62C1D6
45
46 #define H0 0x67452301
47 #define H1 0xEFCDAB89
48 #define H2 0x98BADCFE
49 #define H3 0x10325476
50 #define H4 0xC3D2E1F0
51
52 typedef unsigned int UINT4;
53 #define SHA1HashSize 20
54
55 void SHA1_NEW( unsigned char * pData, int length, unsigned char * pDigest)
56 {
57         if (length > 16)
58                 return;
59
60     UINT4 Message_Block_Index    = 0;
61
62         union
63         {
64                 unsigned char Message_Block[64];
65                 UINT4 Message_Block_W[16];
66         };
67
68         Message_Block_W[0] = 0x00000000;
69         Message_Block_W[1] = 0x00000000;
70         Message_Block_W[2] = 0x00000000;
71         Message_Block_W[3] = 0x00000000;
72         Message_Block_W[4] = 0x00000000;
73
74         UINT4 Intermediate_Hash[5] = { H0, H1, H2, H3, H4 };
75         
76         memcpy(Message_Block, pData, length);
77         Message_Block_Index += length;
78
79         //padMessage
80         Message_Block[length] = 0x80;
81         
82         UINT4 W_15 = length << 3;
83         
84     int           t;                 /* Loop counter                */
85     UINT4      temp;              /* Temporary word value        */
86     UINT4      W[80];             /* Word sequence               */
87     UINT4      A, B, C, D, E;     /* Word buffers                */
88
89     /*
90      *  Initialize the first 16 words in the array W
91      */
92
93         #define INIT_OLD(x) \
94         W[x] = (Message_Block[(x) * 4] << 24) | \
95                 (Message_Block[(x) * 4 + 1] << 16) | \
96                 (Message_Block[(x) * 4 +2] << 8) | \
97                 (Message_Block[(x) * 4 +3])
98
99         #define INIT(x) W[x] = Message_Block_W[x];
100         
101         #define INIT_NULL(x) W[x] = 0;
102
103         
104         Endian_Reverse32(Message_Block_W[0]);
105         INIT(0);
106
107         #define INIT_NULL_1_14 \
108                 INIT_NULL(1);  INIT_NULL_2_14;
109
110         #define INIT_NULL_2_14 \
111                 INIT_NULL(2);  INIT_NULL_3_14;
112
113         #define INIT_NULL_3_14 \
114                 INIT_NULL(3);  INIT_NULL_4_14;
115
116         #define INIT_NULL_4_14 \
117                 INIT_NULL(4); INIT_NULL_5_14;
118
119         #define INIT_NULL_5_14 \
120                 INIT_NULL(5);  INIT_NULL(6);  INIT_NULL(7); \
121                 INIT_NULL(8);  INIT_NULL(9);  INIT_NULL(10); INIT_NULL(11); \
122                 INIT_NULL(12); INIT_NULL(13); INIT_NULL(14);
123
124         #define ROTATE1_NULL_1_14 \
125                 ROTATE1_NULL;  ROTATE1_NULL_2_14;
126
127         #define ROTATE1_NULL_2_14 \
128                 ROTATE1_NULL;  ROTATE1_NULL_3_14;
129
130         #define ROTATE1_NULL_3_14 \
131                 ROTATE1_NULL;  ROTATE1_NULL_4_14;
132
133         #define ROTATE1_NULL_4_14 \
134                 ROTATE1_NULL; ROTATE1_NULL_5_14;
135
136         #define ROTATE1_NULL_5_14 \
137                 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
138                 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
139                 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL;
140
141
142         #define EXPAND(t) \
143                 W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); \
144
145         #define EXPAND_3(t) W[t] = SHA1CircularShift(1,W[t-3]);
146         #define EXPAND_16(t) W[t] = SHA1CircularShift(1,W[t-16]);
147         #define EXPAND_3_8(t) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8]);
148
149
150         if (length < 4) {
151                 INIT_NULL_1_14;
152                 W[15] = W_15;
153                 EXPAND_16(16);
154                 W[17] = 0;
155                 W[18] = W_15<<1;
156         }
157         else if (length < 8) {
158                 Endian_Reverse32(Message_Block_W[1]);
159                 INIT(1);
160                 INIT_NULL_2_14;
161                 W[15] = W_15;
162                 EXPAND_16(16);
163                 EXPAND_16(17);
164                 W[18] = W_15<<1;
165         }
166         else {
167                 Endian_Reverse32(Message_Block_W[1]);
168                 Endian_Reverse32(Message_Block_W[2]);
169                 Endian_Reverse32(Message_Block_W[3]);
170                 Endian_Reverse32(Message_Block_W[4]);
171                 INIT(1); INIT(2); INIT(3); INIT(4); 
172                 INIT_NULL_5_14;
173                 W[15] = W_15;
174                 EXPAND(16);
175                 EXPAND(17);
176                 EXPAND(18);
177         }
178
179
180         if (length < 12) {
181                 EXPAND_3(19);
182         }
183         else {
184                 EXPAND(19);
185         }
186
187         if (length < 16) {
188                 EXPAND_3(20);
189         }
190         else {
191                 EXPAND(20);
192         }
193         EXPAND_3(21); EXPAND_3(22);
194         EXPAND(23);
195
196         EXPAND(24); EXPAND(25); EXPAND_3_8(26); EXPAND_3_8(27);
197         EXPAND(28);     EXPAND(29);     EXPAND(30);     EXPAND(31);
198         EXPAND(32);     EXPAND(33);     EXPAND(34);     EXPAND(35);
199         EXPAND(36);     EXPAND(37);     EXPAND(38);     EXPAND(39);
200         EXPAND(40);     EXPAND(41);     EXPAND(42);     EXPAND(43);
201         EXPAND(44);     EXPAND(45);     EXPAND(46);     EXPAND(47);
202         EXPAND(48);     EXPAND(49);     EXPAND(50);     EXPAND(51);
203         EXPAND(52);     EXPAND(53);     EXPAND(54);     EXPAND(55);
204         EXPAND(56);     EXPAND(57);     EXPAND(58);     EXPAND(59);
205         EXPAND(60);     EXPAND(61);     EXPAND(62);     EXPAND(63);
206         EXPAND(64);     EXPAND(65);     EXPAND(66);     EXPAND(67);
207         EXPAND(68);     EXPAND(69);     EXPAND(70);     EXPAND(71);
208         EXPAND(72);     EXPAND(73);     EXPAND(74);     EXPAND(75);
209         EXPAND(76);     EXPAND(77);     EXPAND(78);     EXPAND(79);
210
211
212         #define ROTATE1(t) \
213                         temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + W[t] + K0; \
214                         E = D; D = C; \
215                         C = SHA1CircularShift(30,B); \
216                         B = A; A = temp; \
217
218         #define ROTATE1_NEW(a, b, c, d, e, x) \
219                         e += SHA1CircularShift(5,a) + F_00_19(b,c,d) + x + K0; \
220                         b = SHA1CircularShift(30,b);
221
222         #define ROTATE1_W(w) \
223                         temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + w + K0; \
224                         E = D; D = C; \
225                         C = SHA1CircularShift(30,B); \
226                         B = A; A = temp;
227
228         #define ROTATE1_NULL \
229                         temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + K0; \
230                         E = D; D = C; \
231                         C = SHA1CircularShift(30,B); \
232                         B = A; A = temp; \
233                         
234         #define ROTATE2_NEW(a, b, c, d, e, x) \
235                         e += SHA1CircularShift(5,a) + F_20_39(b,c,d) + x + K1; \
236                         b = SHA1CircularShift(30,b);
237         
238         #define ROTATE2(t) \
239                 temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + W[t] + K1; \
240         E = D; D = C; \
241         C = SHA1CircularShift(30,B); \
242         B = A; A = temp;
243
244         #define ROTATE2_W(w) \
245                 temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + w + K1; \
246         E = D; D = C; \
247         C = SHA1CircularShift(30,B); \
248         B = A; A = temp;
249
250         #define ROTATE3(t) \
251                 temp = SHA1CircularShift(5,A) + F_40_59(B,C,D) + E + W[t] + K2; \
252         E = D; D = C; \
253         C = SHA1CircularShift(30,B); \
254         B = A; A = temp;
255
256         #define ROTATE4(t) \
257                 temp = SHA1CircularShift(5,A) + F_60_79(B,C,D) + E + W[t] + K3; \
258                 E = D; D = C; \
259                 C = SHA1CircularShift(30,B); \
260                 B = A; A = temp;
261
262         A = H0;
263     B = H1;
264     C = H2;
265     D = H3;
266     E = H4;
267
268         
269         E = H2;
270         //D = 2079550178;
271         //C = 1506887872;
272         B = 2679412915 + W[0];
273         if (length < 4) {
274                 A = SHA1CircularShift(5,B) + 1722862861;
275         }
276         else {
277                 A = SHA1CircularShift(5,B) + 1722862861 + W[1];
278         }
279
280         if (length < 8) {
281                 temp = SHA1CircularShift(5,A) + ((((1506887872) ^ (2079550178)) & (B)) ^ (2079550178)) + H2 + K0;
282         }
283         else {
284                 temp = SHA1CircularShift(5,A) + (((572662306) & (B)) ^ (2079550178)) + H2 + K0 + W[2];
285         }
286         C = SHA1CircularShift(30,B);  //SHA1CircularShift(30,(2679412915 + W[0]));
287         B = A;
288         A = temp;
289         
290         if (length < 12) {
291                 temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0;
292         }
293         else {
294                 temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0 + W[3];
295         }
296         E = 1506887872;
297         D = C;
298         C = SHA1CircularShift(30,B);
299         B = A;
300         A = temp;
301
302         if (length < 16) {
303                 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0;
304         }
305         else {
306                 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0 + W[4];
307         }
308         E = D;
309         D = C;
310         C = SHA1CircularShift(30,B);
311         B = A;
312         A = temp;
313
314         ROTATE1_NULL_5_14;
315
316         ROTATE1_NEW( A, B, C, D, E, W_15 );
317     ROTATE1_NEW( E, A, B, C, D, W[16] );
318     ROTATE1_NEW( D, E, A, B, C, W[17] );
319     ROTATE1_NEW( C, D, E, A, B, W[18] );
320     ROTATE1_NEW( B, C, D, E, A, W[19] );
321         
322     for(t = 20; t < 40; t++)
323     {
324                 if (t == 21 && length < 8) {
325                         ROTATE2_W((length<<5)); // *32
326                 }
327                 else {
328                         ROTATE2(t);
329                 }
330     }
331
332     for(t = 40; t < 60; t++)
333     {
334                 ROTATE3(t);
335     }
336
337     for(t = 60; t < 80; t++)
338     {
339                 ROTATE4(t);
340     }
341
342     Intermediate_Hash[0] += A;
343     Intermediate_Hash[1] += B;
344     Intermediate_Hash[2] += C;
345     Intermediate_Hash[3] += D;
346     Intermediate_Hash[4] += E;
347
348         Endian_Reverse32(Intermediate_Hash[0]);
349         Endian_Reverse32(Intermediate_Hash[1]);
350         Endian_Reverse32(Intermediate_Hash[2]);
351         Endian_Reverse32(Intermediate_Hash[3]);
352         Endian_Reverse32(Intermediate_Hash[4]);
353
354         memcpy(pDigest, Intermediate_Hash, 20);
355 }