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