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