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