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