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