Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m01600.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD5_
7
8 #include "inc_vendor.cl"
9 #include "inc_hash_constants.h"
10 #include "inc_hash_functions.cl"
11 #include "inc_types.cl"
12 #include "inc_common.cl"
13
14 #define COMPARE_S "inc_comp_single.cl"
15 #define COMPARE_M "inc_comp_multi.cl"
16
17 #define md5apr1_magic0 0x72706124u
18 #define md5apr1_magic1 0x00002431u
19
20 void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[4])
21 {
22   u32 a = digest[0];
23   u32 b = digest[1];
24   u32 c = digest[2];
25   u32 d = digest[3];
26
27   u32 w0_t = w0[0];
28   u32 w1_t = w0[1];
29   u32 w2_t = w0[2];
30   u32 w3_t = w0[3];
31   u32 w4_t = w1[0];
32   u32 w5_t = w1[1];
33   u32 w6_t = w1[2];
34   u32 w7_t = w1[3];
35   u32 w8_t = w2[0];
36   u32 w9_t = w2[1];
37   u32 wa_t = w2[2];
38   u32 wb_t = w2[3];
39   u32 wc_t = w3[0];
40   u32 wd_t = w3[1];
41   u32 we_t = w3[2];
42   u32 wf_t = 0;
43
44   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
45   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
46   MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
47   MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
48   MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
49   MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
50   MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
51   MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
52   MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
53   MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
54   MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
55   MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
56   MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
57   MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
58   MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
59   MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
60
61   MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
62   MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
63   MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
64   MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
65   MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
66   MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
67   MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
68   MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
69   MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
70   MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
71   MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
72   MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
73   MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
74   MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
75   MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
76   MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
77
78   MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
79   MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
80   MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
81   MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
82   MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
83   MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
84   MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
85   MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
86   MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
87   MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
88   MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
89   MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
90   MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
91   MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
92   MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
93   MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
94
95   MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
96   MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
97   MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
98   MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
99   MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
100   MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
101   MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
102   MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
103   MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
104   MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
105   MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
106   MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
107   MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
108   MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
109   MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
110   MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
111
112   digest[0] += a;
113   digest[1] += b;
114   digest[2] += c;
115   digest[3] += d;
116 }
117
118 void memcat16 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 append[4])
119 {
120   u32 tmp0;
121   u32 tmp1;
122   u32 tmp2;
123   u32 tmp3;
124   u32 tmp4;
125
126   #if defined IS_AMD || defined IS_GENERIC
127
128   const int offset_minus_4 = 4 - (block_len & 3);
129
130   tmp0 = amd_bytealign (append[0],         0, offset_minus_4);
131   tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
132   tmp2 = amd_bytealign (append[2], append[1], offset_minus_4);
133   tmp3 = amd_bytealign (append[3], append[2], offset_minus_4);
134   tmp4 = amd_bytealign (        0, append[3], offset_minus_4);
135
136   const u32 mod = block_len & 3;
137
138   if (mod == 0)
139   {
140     tmp0 = tmp1;
141     tmp1 = tmp2;
142     tmp2 = tmp3;
143     tmp3 = tmp4;
144     tmp4 = 0;
145   }
146
147   #endif
148
149   #ifdef IS_NV
150
151   const int offset_minus_4 = 4 - (block_len & 3);
152
153   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
154
155   tmp0 = __byte_perm (        0, append[0], selector);
156   tmp1 = __byte_perm (append[0], append[1], selector);
157   tmp2 = __byte_perm (append[1], append[2], selector);
158   tmp3 = __byte_perm (append[2], append[3], selector);
159   tmp4 = __byte_perm (append[3],         0, selector);
160
161   #endif
162
163   const u32 div = block_len / 4;
164
165   switch (div)
166   {
167     case  0:  block0[0] |= tmp0;
168               block0[1]  = tmp1;
169               block0[2]  = tmp2;
170               block0[3]  = tmp3;
171               block1[0]  = tmp4;
172               break;
173     case  1:  block0[1] |= tmp0;
174               block0[2]  = tmp1;
175               block0[3]  = tmp2;
176               block1[0]  = tmp3;
177               block1[1]  = tmp4;
178               break;
179     case  2:  block0[2] |= tmp0;
180               block0[3]  = tmp1;
181               block1[0]  = tmp2;
182               block1[1]  = tmp3;
183               block1[2]  = tmp4;
184               break;
185     case  3:  block0[3] |= tmp0;
186               block1[0]  = tmp1;
187               block1[1]  = tmp2;
188               block1[2]  = tmp3;
189               block1[3]  = tmp4;
190               break;
191     case  4:  block1[0] |= tmp0;
192               block1[1]  = tmp1;
193               block1[2]  = tmp2;
194               block1[3]  = tmp3;
195               block2[0]  = tmp4;
196               break;
197     case  5:  block1[1] |= tmp0;
198               block1[2]  = tmp1;
199               block1[3]  = tmp2;
200               block2[0]  = tmp3;
201               block2[1]  = tmp4;
202               break;
203     case  6:  block1[2] |= tmp0;
204               block1[3]  = tmp1;
205               block2[0]  = tmp2;
206               block2[1]  = tmp3;
207               block2[2]  = tmp4;
208               break;
209     case  7:  block1[3] |= tmp0;
210               block2[0]  = tmp1;
211               block2[1]  = tmp2;
212               block2[2]  = tmp3;
213               block2[3]  = tmp4;
214               break;
215     case  8:  block2[0] |= tmp0;
216               block2[1]  = tmp1;
217               block2[2]  = tmp2;
218               block2[3]  = tmp3;
219               block3[0]  = tmp4;
220               break;
221     case  9:  block2[1] |= tmp0;
222               block2[2]  = tmp1;
223               block2[3]  = tmp2;
224               block3[0]  = tmp3;
225               block3[1]  = tmp4;
226               break;
227   }
228 }
229
230 void memcat16_x80 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 append[4])
231 {
232   u32 tmp0;
233   u32 tmp1;
234   u32 tmp2;
235   u32 tmp3;
236   u32 tmp4;
237
238   #if defined IS_AMD || defined IS_GENERIC
239
240   const int offset_minus_4 = 4 - (block_len & 3);
241
242   tmp0 = amd_bytealign (append[0],         0, offset_minus_4);
243   tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
244   tmp2 = amd_bytealign (append[2], append[1], offset_minus_4);
245   tmp3 = amd_bytealign (append[3], append[2], offset_minus_4);
246   tmp4 = amd_bytealign (     0x80, append[3], offset_minus_4);
247
248   const u32 mod = block_len & 3;
249
250   if (mod == 0)
251   {
252     tmp0 = tmp1;
253     tmp1 = tmp2;
254     tmp2 = tmp3;
255     tmp3 = tmp4;
256     tmp4 = 0x80;
257   }
258
259   #endif
260
261   #ifdef IS_NV
262
263   const int offset_minus_4 = 4 - (block_len & 3);
264
265   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
266
267   tmp0 = __byte_perm (        0, append[0], selector);
268   tmp1 = __byte_perm (append[0], append[1], selector);
269   tmp2 = __byte_perm (append[1], append[2], selector);
270   tmp3 = __byte_perm (append[2], append[3], selector);
271   tmp4 = __byte_perm (append[3],      0x80, selector);
272
273   #endif
274
275   const u32 div = block_len / 4;
276
277   switch (div)
278   {
279     case  0:  block0[0] |= tmp0;
280               block0[1]  = tmp1;
281               block0[2]  = tmp2;
282               block0[3]  = tmp3;
283               block1[0]  = tmp4;
284               break;
285     case  1:  block0[1] |= tmp0;
286               block0[2]  = tmp1;
287               block0[3]  = tmp2;
288               block1[0]  = tmp3;
289               block1[1]  = tmp4;
290               break;
291     case  2:  block0[2] |= tmp0;
292               block0[3]  = tmp1;
293               block1[0]  = tmp2;
294               block1[1]  = tmp3;
295               block1[2]  = tmp4;
296               break;
297     case  3:  block0[3] |= tmp0;
298               block1[0]  = tmp1;
299               block1[1]  = tmp2;
300               block1[2]  = tmp3;
301               block1[3]  = tmp4;
302               break;
303     case  4:  block1[0] |= tmp0;
304               block1[1]  = tmp1;
305               block1[2]  = tmp2;
306               block1[3]  = tmp3;
307               block2[0]  = tmp4;
308               break;
309     case  5:  block1[1] |= tmp0;
310               block1[2]  = tmp1;
311               block1[3]  = tmp2;
312               block2[0]  = tmp3;
313               block2[1]  = tmp4;
314               break;
315     case  6:  block1[2] |= tmp0;
316               block1[3]  = tmp1;
317               block2[0]  = tmp2;
318               block2[1]  = tmp3;
319               block2[2]  = tmp4;
320               break;
321     case  7:  block1[3] |= tmp0;
322               block2[0]  = tmp1;
323               block2[1]  = tmp2;
324               block2[2]  = tmp3;
325               block2[3]  = tmp4;
326               break;
327     case  8:  block2[0] |= tmp0;
328               block2[1]  = tmp1;
329               block2[2]  = tmp2;
330               block2[3]  = tmp3;
331               block3[0]  = tmp4;
332               break;
333     case  9:  block2[1] |= tmp0;
334               block2[2]  = tmp1;
335               block2[3]  = tmp2;
336               block3[0]  = tmp3;
337               block3[1]  = tmp4;
338               break;
339   }
340 }
341
342 void memcat8 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 append[2])
343 {
344   u32 tmp0;
345   u32 tmp1;
346   u32 tmp2;
347
348   #if defined IS_AMD || defined IS_GENERIC
349
350   const int offset_minus_4 = 4 - (block_len & 3);
351
352   tmp0 = amd_bytealign (append[0],         0, offset_minus_4);
353   tmp1 = amd_bytealign (append[1], append[0], offset_minus_4);
354   tmp2 = amd_bytealign (        0, append[1], offset_minus_4);
355
356   const u32 mod = block_len & 3;
357
358   if (mod == 0)
359   {
360     tmp0 = tmp1;
361     tmp1 = tmp2;
362     tmp2 = 0;
363   }
364
365   #endif
366
367   #ifdef IS_NV
368
369   const int offset_minus_4 = 4 - (block_len & 3);
370
371   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
372
373   tmp0 = __byte_perm (        0, append[0], selector);
374   tmp1 = __byte_perm (append[0], append[1], selector);
375   tmp2 = __byte_perm (append[1],         0, selector);
376
377   #endif
378
379   const u32 div = block_len / 4;
380
381   switch (div)
382   {
383     case  0:  block0[0] |= tmp0;
384               block0[1]  = tmp1;
385               block0[2]  = tmp2;
386               break;
387     case  1:  block0[1] |= tmp0;
388               block0[2]  = tmp1;
389               block0[3]  = tmp2;
390               break;
391     case  2:  block0[2] |= tmp0;
392               block0[3]  = tmp1;
393               block1[0]  = tmp2;
394               break;
395     case  3:  block0[3] |= tmp0;
396               block1[0]  = tmp1;
397               block1[1]  = tmp2;
398               break;
399     case  4:  block1[0] |= tmp0;
400               block1[1]  = tmp1;
401               block1[2]  = tmp2;
402               break;
403     case  5:  block1[1] |= tmp0;
404               block1[2]  = tmp1;
405               block1[3]  = tmp2;
406               break;
407     case  6:  block1[2] |= tmp0;
408               block1[3]  = tmp1;
409               block2[0]  = tmp2;
410               break;
411     case  7:  block1[3] |= tmp0;
412               block2[0]  = tmp1;
413               block2[1]  = tmp2;
414               break;
415     case  8:  block2[0] |= tmp0;
416               block2[1]  = tmp1;
417               block2[2]  = tmp2;
418               break;
419     case  9:  block2[1] |= tmp0;
420               block2[2]  = tmp1;
421               block2[3]  = tmp2;
422               break;
423     case 10:  block2[2] |= tmp0;
424               block2[3]  = tmp1;
425               block3[0]  = tmp2;
426               break;
427     case 11:  block2[3] |= tmp0;
428               block3[0]  = tmp1;
429               block3[1]  = tmp2;
430               break;
431   }
432 }
433
434 void append_sign (u32 block0[4], u32 block1[4], const u32 block_len)
435 {
436   switch (block_len)
437   {
438     case 0:
439       block0[0] = md5apr1_magic0;
440       block0[1] = md5apr1_magic1;
441       break;
442
443     case 1:
444       block0[0] = block0[0]             | md5apr1_magic0 <<  8u;
445       block0[1] = md5apr1_magic0 >> 24u | md5apr1_magic1 <<  8u;
446       block0[2] = md5apr1_magic1 >> 24u;
447       break;
448
449     case 2:
450       block0[0] = block0[0]             | md5apr1_magic0 << 16u;
451       block0[1] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u;
452       block0[2] = md5apr1_magic1 >> 16u;
453       break;
454
455     case 3:
456       block0[0] = block0[0]             | md5apr1_magic0 << 24u;
457       block0[1] = md5apr1_magic0 >>  8u | md5apr1_magic1 << 24u;
458       block0[2] = md5apr1_magic1 >>  8u;
459       break;
460
461     case 4:
462       block0[1] = md5apr1_magic0;
463       block0[2] = md5apr1_magic1;
464       break;
465
466     case 5:
467       block0[1] = block0[1]             | md5apr1_magic0 <<  8u;
468       block0[2] = md5apr1_magic0 >> 24u | md5apr1_magic1 <<  8u;
469       block0[3] = md5apr1_magic1 >> 24u;
470       break;
471
472     case 6:
473       block0[1] = block0[1]             | md5apr1_magic0 << 16u;
474       block0[2] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u;
475       block0[3] = md5apr1_magic1 >> 16u;
476       break;
477
478     case 7:
479       block0[1] = block0[1]             | md5apr1_magic0 << 24u;
480       block0[2] = md5apr1_magic0 >>  8u | md5apr1_magic1 << 24u;
481       block0[3] = md5apr1_magic1 >>  8u;
482       break;
483
484     case 8:
485       block0[2] = md5apr1_magic0;
486       block0[3] = md5apr1_magic1;
487       break;
488
489     case 9:
490       block0[2] = block0[2]             | md5apr1_magic0 <<  8u;
491       block0[3] = md5apr1_magic0 >> 24u | md5apr1_magic1 <<  8u;
492       block1[0] = md5apr1_magic1 >> 24u;
493       break;
494
495     case 10:
496       block0[2] = block0[2]             | md5apr1_magic0 << 16u;
497       block0[3] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u;
498       block1[0] = md5apr1_magic1 >> 16u;
499       break;
500
501     case 11:
502       block0[2] = block0[2]             | md5apr1_magic0 << 24u;
503       block0[3] = md5apr1_magic0 >>  8u | md5apr1_magic1 << 24u;
504       block1[0] = md5apr1_magic1 >>  8u;
505       break;
506
507     case 12:
508       block0[3] = md5apr1_magic0;
509       block1[0] = md5apr1_magic1;
510       break;
511
512     case 13:
513       block0[3] = block0[3]             | md5apr1_magic0 <<  8u;
514       block1[0] = md5apr1_magic0 >> 24u | md5apr1_magic1 <<  8u;
515       block1[1] = md5apr1_magic1 >> 24u;
516       break;
517
518     case 14:
519       block0[3] = block0[3]             | md5apr1_magic0 << 16u;
520       block1[0] = md5apr1_magic0 >> 16u | md5apr1_magic1 << 16u;
521       block1[1] = md5apr1_magic1 >> 16u;
522       break;
523
524     case 15:
525       block0[3] = block0[3]             | md5apr1_magic0 << 24u;
526       block1[0] = md5apr1_magic0 >>  8u | md5apr1_magic1 << 24u;
527       block1[1] = md5apr1_magic1 >>  8u;
528       break;
529   }
530 }
531
532 void append_1st (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const u32 block_len, const u32 append)
533 {
534   switch (block_len)
535   {
536     case 0:
537       block0[0] = append;
538       break;
539
540     case 1:
541       block0[0] = block0[0] | append <<  8;
542       break;
543
544     case 2:
545       block0[0] = block0[0] | append << 16;
546       break;
547
548     case 3:
549       block0[0] = block0[0] | append << 24;
550       break;
551
552     case 4:
553       block0[1] = append;
554       break;
555
556     case 5:
557       block0[1] = block0[1] | append <<  8;
558       break;
559
560     case 6:
561       block0[1] = block0[1] | append << 16;
562       break;
563
564     case 7:
565       block0[1] = block0[1] | append << 24;
566       break;
567
568     case 8:
569       block0[2] = append;
570       break;
571
572     case 9:
573       block0[2] = block0[2] | append <<  8;
574       break;
575
576     case 10:
577       block0[2] = block0[2] | append << 16;
578       break;
579
580     case 11:
581       block0[2] = block0[2] | append << 24;
582       break;
583
584     case 12:
585       block0[3] = append;
586       break;
587
588     case 13:
589       block0[3] = block0[3] | append <<  8;
590       break;
591
592     case 14:
593       block0[3] = block0[3] | append << 16;
594       break;
595
596     case 15:
597       block0[3] = block0[3] | append << 24;
598       break;
599
600     case 16:
601       block1[0] = append;
602       break;
603
604     case 17:
605       block1[0] = block1[0] | append <<  8;
606       break;
607
608     case 18:
609       block1[0] = block1[0] | append << 16;
610       break;
611
612     case 19:
613       block1[0] = block1[0] | append << 24;
614       break;
615
616     case 20:
617       block1[1] = append;
618       break;
619
620     case 21:
621       block1[1] = block1[1] | append <<  8;
622       break;
623
624     case 22:
625       block1[1] = block1[1] | append << 16;
626       break;
627
628     case 23:
629       block1[1] = block1[1] | append << 24;
630       break;
631
632     case 24:
633       block1[2] = append;
634       break;
635
636     case 25:
637       block1[2] = block1[2] | append <<  8;
638       break;
639
640     case 26:
641       block1[2] = block1[2] | append << 16;
642       break;
643
644     case 27:
645       block1[2] = block1[2] | append << 24;
646       break;
647
648     case 28:
649       block1[3] = append;
650       break;
651
652     case 29:
653       block1[3] = block1[3] | append <<  8;
654       break;
655
656     case 30:
657       block1[3] = block1[3] | append << 16;
658       break;
659
660     case 31:
661       block1[3] = block1[3] | append << 24;
662       break;
663
664     case 32:
665       block2[0] = append;
666       break;
667
668     case 33:
669       block2[0] = block2[0] | append <<  8;
670       break;
671
672     case 34:
673       block2[0] = block2[0] | append << 16;
674       break;
675
676     case 35:
677       block2[0] = block2[0] | append << 24;
678       break;
679
680     case 36:
681       block2[1] = append;
682       break;
683
684     case 37:
685       block2[1] = block2[1] | append <<  8;
686       break;
687
688     case 38:
689       block2[1] = block2[1] | append << 16;
690       break;
691
692     case 39:
693       block2[1] = block2[1] | append << 24;
694       break;
695
696     case 40:
697       block2[2] = append;
698       break;
699
700     case 41:
701       block2[2] = block2[2] | append <<  8;
702       break;
703
704     case 42:
705       block2[2] = block2[2] | append << 16;
706       break;
707
708     case 43:
709       block2[2] = block2[2] | append << 24;
710       break;
711
712     case 44:
713       block2[3] = append;
714       break;
715
716     case 45:
717       block2[3] = block2[3] | append <<  8;
718       break;
719
720     case 46:
721       block2[3] = block2[3] | append << 16;
722       break;
723
724     case 47:
725       block2[3] = block2[3] | append << 24;
726       break;
727
728     case 48:
729       block3[0] = append;
730       break;
731
732     case 49:
733       block3[0] = block3[0] | append <<  8;
734       break;
735
736     case 50:
737       block3[0] = block3[0] | append << 16;
738       break;
739
740     case 51:
741       block3[0] = block3[0] | append << 24;
742       break;
743
744     case 52:
745       block3[1] = append;
746       break;
747
748     case 53:
749       block3[1] = block3[1] | append <<  8;
750       break;
751
752     case 54:
753       block3[1] = block3[1] | append << 16;
754       break;
755
756     case 55:
757       block3[1] = block3[1] | append << 24;
758       break;
759
760     case 56:
761       block3[2] = append;
762       break;
763   }
764 }
765
766 __kernel void m01600_init (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
767 {
768   /**
769    * base
770    */
771
772   const u32 gid = get_global_id (0);
773
774   if (gid >= gid_max) return;
775
776   u32 w0[4];
777
778   w0[0] = pws[gid].i[0];
779   w0[1] = pws[gid].i[1];
780   w0[2] = pws[gid].i[2];
781   w0[3] = pws[gid].i[3];
782
783   const u32 pw_len = pws[gid].pw_len;
784
785   /**
786    * salt
787    */
788
789   u32 salt_buf[2];
790
791   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
792   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
793
794   const u32 salt_len = salt_bufs[salt_pos].salt_len;
795
796   /**
797    * init
798    */
799
800   //memcat16 (block0, block1, block2, block3, block_len, w0);
801   //block_len += pw_len;
802
803   u32 block_len = pw_len;
804
805   u32 block0[4];
806
807   block0[0] = w0[0];
808   block0[1] = w0[1];
809   block0[2] = w0[2];
810   block0[3] = w0[3];
811
812   u32 block1[4];
813
814   block1[0] = 0;
815   block1[1] = 0;
816   block1[2] = 0;
817   block1[3] = 0;
818
819   u32 block2[4];
820
821   block2[0] = 0;
822   block2[1] = 0;
823   block2[2] = 0;
824   block2[3] = 0;
825
826   u32 block3[4];
827
828   block3[0] = 0;
829   block3[1] = 0;
830   block3[2] = 0;
831   block3[3] = 0;
832
833   memcat8 (block0, block1, block2, block3, block_len, salt_buf);
834
835   block_len += salt_len;
836
837   memcat16 (block0, block1, block2, block3, block_len, w0);
838
839   block_len += pw_len;
840
841   append_0x80_4x4 (block0, block1, block2, block3, block_len);
842
843   block3[2] = block_len * 8;
844
845   u32 digest[4];
846
847   digest[0] = MD5M_A;
848   digest[1] = MD5M_B;
849   digest[2] = MD5M_C;
850   digest[3] = MD5M_D;
851
852   md5_transform (block0, block1, block2, block3, digest);
853
854   /* The password first, since that is what is most unknown */
855   /* Then our magic string */
856   /* Then the raw salt */
857   /* Then just as many characters of the MD5(pw,salt,pw) */
858
859   //memcat16 (block0, block1, block2, block3, block_len, w);
860   //block_len += pw_len;
861
862   block_len = pw_len;
863
864   block0[0] = w0[0];
865   block0[1] = w0[1];
866   block0[2] = w0[2];
867   block0[3] = w0[3];
868
869   block1[0] = 0;
870   block1[1] = 0;
871   block1[2] = 0;
872   block1[3] = 0;
873
874   block2[0] = 0;
875   block2[1] = 0;
876   block2[2] = 0;
877   block2[3] = 0;
878
879   block3[0] = 0;
880   block3[1] = 0;
881   block3[2] = 0;
882   block3[3] = 0;
883
884   append_sign (block0, block1, block_len);
885
886   block_len += 6;
887
888   memcat8 (block0, block1, block2, block3, block_len, salt_buf);
889
890   block_len += salt_len;
891
892   truncate_block (digest, pw_len);
893
894   memcat16 (block0, block1, block2, block3, block_len, digest);
895
896   block_len += pw_len;
897
898   /* Then something really weird... */
899
900   u32 append = block0[0] & 0xFF;
901
902   for (u32 j = pw_len; j; j >>= 1)
903   {
904     if ((j & 1) == 0)
905     {
906       append_1st (block0, block1, block2, block3, block_len, append);
907     }
908
909     block_len++;
910   }
911
912   append_0x80_4x4 (block0, block1, block2, block3, block_len);
913
914   block3[2] = block_len * 8;
915
916   digest[0] = MD5M_A;
917   digest[1] = MD5M_B;
918   digest[2] = MD5M_C;
919   digest[3] = MD5M_D;
920
921   md5_transform (block0, block1, block2, block3, digest);
922
923   tmps[gid].digest_buf[0] = digest[0];
924   tmps[gid].digest_buf[1] = digest[1];
925   tmps[gid].digest_buf[2] = digest[2];
926   tmps[gid].digest_buf[3] = digest[3];
927 }
928
929 __kernel void m01600_loop (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
930 {
931   /**
932    * base
933    */
934
935   const u32 gid = get_global_id (0);
936
937   if (gid >= gid_max) return;
938
939   u32 w0[4];
940
941   w0[0] = pws[gid].i[0];
942   w0[1] = pws[gid].i[1];
943   w0[2] = pws[gid].i[2];
944   w0[3] = pws[gid].i[3];
945
946   const u32 pw_len = pws[gid].pw_len;
947
948   u32 w0_x80[4];
949
950   w0_x80[0] = w0[0];
951   w0_x80[1] = w0[1];
952   w0_x80[2] = w0[2];
953   w0_x80[3] = w0[3];
954
955   append_0x80_1x4 (w0_x80, pw_len);
956
957   /**
958    * salt
959    */
960
961   u32 salt_buf[2];
962
963   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
964   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
965
966   const u32 salt_len = salt_bufs[salt_pos].salt_len;
967
968   /**
969    * digest
970    */
971
972   u32 digest[4];
973
974   digest[0] = tmps[gid].digest_buf[0];
975   digest[1] = tmps[gid].digest_buf[1];
976   digest[2] = tmps[gid].digest_buf[2];
977   digest[3] = tmps[gid].digest_buf[3];
978
979   /**
980    * loop
981    */
982
983   /* and now, just to make sure things don't run too fast */
984
985   u32 block_len;
986
987   u32 block0[4];
988
989   block0[0] = 0;
990   block0[1] = 0;
991   block0[2] = 0;
992   block0[3] = 0;
993
994   u32 block1[4];
995
996   block1[0] = 0;
997   block1[1] = 0;
998   block1[2] = 0;
999   block1[3] = 0;
1000
1001   u32 block2[4];
1002
1003   block2[0] = 0;
1004   block2[1] = 0;
1005   block2[2] = 0;
1006   block2[3] = 0;
1007
1008   u32 block3[4];
1009
1010   block3[0] = 0;
1011   block3[1] = 0;
1012   block3[2] = 0;
1013   block3[3] = 0;
1014
1015   for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++)
1016   {
1017     block1[0] = 0;
1018     block1[1] = 0;
1019     block1[2] = 0;
1020     block1[3] = 0;
1021     block2[0] = 0;
1022     block2[1] = 0;
1023     block2[2] = 0;
1024     block2[3] = 0;
1025     block3[0] = 0;
1026     block3[1] = 0;
1027
1028     const u32 j1 = (j & 1) ? 1 : 0;
1029     const u32 j3 = (j % 3) ? 1 : 0;
1030     const u32 j7 = (j % 7) ? 1 : 0;
1031
1032     if (j1)
1033     {
1034       block0[0] = w0[0];
1035       block0[1] = w0[1];
1036       block0[2] = w0[2];
1037       block0[3] = w0[3];
1038
1039       block_len = pw_len;
1040
1041       if (j3)
1042       {
1043         memcat8 (block0, block1, block2, block3, block_len, salt_buf);
1044
1045         block_len += salt_len;
1046       }
1047
1048       if (j7)
1049       {
1050         memcat16 (block0, block1, block2, block3, block_len, w0);
1051
1052         block_len += pw_len;
1053       }
1054
1055       memcat16_x80 (block0, block1, block2, block3, block_len, digest);
1056
1057       block_len += 16;
1058     }
1059     else
1060     {
1061       block0[0] = digest[0];
1062       block0[1] = digest[1];
1063       block0[2] = digest[2];
1064       block0[3] = digest[3];
1065
1066       block_len = 16;
1067
1068       if (j3 && j7)
1069       {
1070         block1[0] = salt_buf[0];
1071         block1[1] = salt_buf[1];
1072
1073         block_len += salt_len;
1074
1075         memcat16 (block0, block1, block2, block3, block_len, w0);
1076
1077         block_len += pw_len;
1078       }
1079       else if (j3)
1080       {
1081         block1[0] = salt_buf[0];
1082         block1[1] = salt_buf[1];
1083
1084         block_len += salt_len;
1085       }
1086       else if (j7)
1087       {
1088         block1[0] = w0[0];
1089         block1[1] = w0[1];
1090         block1[2] = w0[2];
1091         block1[3] = w0[3];
1092
1093         block_len += pw_len;
1094       }
1095
1096       memcat16 (block0, block1, block2, block3, block_len, w0_x80);
1097
1098       block_len += pw_len;
1099     }
1100
1101     block3[2] = block_len * 8;
1102
1103     digest[0] = MD5M_A;
1104     digest[1] = MD5M_B;
1105     digest[2] = MD5M_C;
1106     digest[3] = MD5M_D;
1107
1108     md5_transform (block0, block1, block2, block3, digest);
1109   }
1110
1111   tmps[gid].digest_buf[0] = digest[0];
1112   tmps[gid].digest_buf[1] = digest[1];
1113   tmps[gid].digest_buf[2] = digest[2];
1114   tmps[gid].digest_buf[3] = digest[3];
1115 }
1116
1117 __kernel void m01600_comp (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1118 {
1119   /**
1120    * modifier
1121    */
1122
1123   const u32 gid = get_global_id (0);
1124
1125   if (gid >= gid_max) return;
1126
1127   const u32 lid = get_local_id (0);
1128
1129   /**
1130    * digest
1131    */
1132
1133   const u32 r0 = tmps[gid].digest_buf[DGST_R0];
1134   const u32 r1 = tmps[gid].digest_buf[DGST_R1];
1135   const u32 r2 = tmps[gid].digest_buf[DGST_R2];
1136   const u32 r3 = tmps[gid].digest_buf[DGST_R3];
1137
1138   #define il_pos 0
1139
1140   #include COMPARE_M
1141 }