Upgrade kernel to support dynamic local work sizes
[hashcat.git] / OpenCL / m11400_a1.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 3
13 #define DGST_R2 2
14 #define DGST_R3 1
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 uint_to_hex_lower8(i) l_bin2asc[(i)]
24
25 static u32 memcat32 (u32 block0[16], u32 block1[16], const u32 block_len, const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 append3[4], const u32 append_len)
26 {
27   const u32 mod = block_len & 3;
28   const u32 div = block_len / 4;
29
30   #if defined IS_AMD || defined IS_GENERIC
31   const int offset_minus_4 = 4 - mod;
32
33   u32 append0_t[4];
34
35   append0_t[0] = amd_bytealign (append0[0],          0, offset_minus_4);
36   append0_t[1] = amd_bytealign (append0[1], append0[0], offset_minus_4);
37   append0_t[2] = amd_bytealign (append0[2], append0[1], offset_minus_4);
38   append0_t[3] = amd_bytealign (append0[3], append0[2], offset_minus_4);
39
40   u32 append1_t[4];
41
42   append1_t[0] = amd_bytealign (append1[0], append0[3], offset_minus_4);
43   append1_t[1] = amd_bytealign (append1[1], append1[0], offset_minus_4);
44   append1_t[2] = amd_bytealign (append1[2], append1[1], offset_minus_4);
45   append1_t[3] = amd_bytealign (append1[3], append1[2], offset_minus_4);
46
47   u32 append2_t[4];
48
49   append2_t[0] = amd_bytealign (append2[0], append1[3], offset_minus_4);
50   append2_t[1] = amd_bytealign (append2[1], append2[0], offset_minus_4);
51   append2_t[2] = amd_bytealign (append2[2], append2[1], offset_minus_4);
52   append2_t[3] = amd_bytealign (append2[3], append2[2], offset_minus_4);
53
54   u32 append3_t[4];
55
56   append3_t[0] = amd_bytealign (append3[0], append2[3], offset_minus_4);
57   append3_t[1] = amd_bytealign (append3[1], append3[0], offset_minus_4);
58   append3_t[2] = amd_bytealign (append3[2], append3[1], offset_minus_4);
59   append3_t[3] = amd_bytealign (append3[3], append3[2], offset_minus_4);
60
61   u32 append4_t[4];
62
63   append4_t[0] = amd_bytealign (         0, append3[3], offset_minus_4);
64   append4_t[1] = 0;
65   append4_t[2] = 0;
66   append4_t[3] = 0;
67
68   if (mod == 0)
69   {
70     append0_t[0] = append0[0];
71     append0_t[1] = append0[1];
72     append0_t[2] = append0[2];
73     append0_t[3] = append0[3];
74
75     append1_t[0] = append1[0];
76     append1_t[1] = append1[1];
77     append1_t[2] = append1[2];
78     append1_t[3] = append1[3];
79
80     append2_t[0] = append2[0];
81     append2_t[1] = append2[1];
82     append2_t[2] = append2[2];
83     append2_t[3] = append2[3];
84
85     append3_t[0] = append3[0];
86     append3_t[1] = append3[1];
87     append3_t[2] = append3[2];
88     append3_t[3] = append3[3];
89
90     append4_t[0] = 0;
91     append4_t[1] = 0;
92     append4_t[2] = 0;
93     append4_t[3] = 0;
94   }
95   #endif
96
97   #ifdef IS_NV
98
99   const int offset_minus_4 = 4 - mod;
100
101   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
102
103   u32 append0_t[4];
104
105   append0_t[0] = __byte_perm (         0, append0[0], selector);
106   append0_t[1] = __byte_perm (append0[0], append0[1], selector);
107   append0_t[2] = __byte_perm (append0[1], append0[2], selector);
108   append0_t[3] = __byte_perm (append0[2], append0[3], selector);
109
110   u32 append1_t[4];
111
112   append1_t[0] = __byte_perm (append0[3], append1[0], selector);
113   append1_t[1] = __byte_perm (append1[0], append1[1], selector);
114   append1_t[2] = __byte_perm (append1[1], append1[2], selector);
115   append1_t[3] = __byte_perm (append1[2], append1[3], selector);
116
117   u32 append2_t[4];
118
119   append2_t[0] = __byte_perm (append1[3], append2[0], selector);
120   append2_t[1] = __byte_perm (append2[0], append2[1], selector);
121   append2_t[2] = __byte_perm (append2[1], append2[2], selector);
122   append2_t[3] = __byte_perm (append2[2], append2[3], selector);
123
124   u32 append3_t[4];
125
126   append3_t[0] = __byte_perm (append2[3], append3[0], selector);
127   append3_t[1] = __byte_perm (append3[0], append3[1], selector);
128   append3_t[2] = __byte_perm (append3[1], append3[2], selector);
129   append3_t[3] = __byte_perm (append3[2], append3[3], selector);
130
131   u32 append4_t[4];
132
133   append4_t[0] = __byte_perm (append3[3],          0, selector);
134   append4_t[1] = 0;
135   append4_t[2] = 0;
136   append4_t[3] = 0;
137   #endif
138
139   switch (div)
140   {
141     case  0:  block0[ 0] |= append0_t[0];
142               block0[ 1]  = append0_t[1];
143               block0[ 2]  = append0_t[2];
144               block0[ 3]  = append0_t[3];
145
146               block0[ 4]  = append1_t[0];
147               block0[ 5]  = append1_t[1];
148               block0[ 6]  = append1_t[2];
149               block0[ 7]  = append1_t[3];
150
151               block0[ 8]  = append2_t[0];
152               block0[ 9]  = append2_t[1];
153               block0[10]  = append2_t[2];
154               block0[11]  = append2_t[3];
155
156               block0[12]  = append3_t[0];
157               block0[13]  = append3_t[1];
158               block0[14]  = append3_t[2];
159               block0[15]  = append3_t[3];
160
161               block1[ 0]  = append4_t[0];
162               block1[ 1]  = append4_t[1];
163               block1[ 2]  = append4_t[2];
164               block1[ 3]  = append4_t[3];
165               break;
166
167     case  1:  block0[ 1] |= append0_t[0];
168               block0[ 2]  = append0_t[1];
169               block0[ 3]  = append0_t[2];
170               block0[ 4]  = append0_t[3];
171
172               block0[ 5]  = append1_t[0];
173               block0[ 6]  = append1_t[1];
174               block0[ 7]  = append1_t[2];
175               block0[ 8]  = append1_t[3];
176
177               block0[ 9]  = append2_t[0];
178               block0[10]  = append2_t[1];
179               block0[11]  = append2_t[2];
180               block0[12]  = append2_t[3];
181
182               block0[13]  = append3_t[0];
183               block0[14]  = append3_t[1];
184               block0[15]  = append3_t[2];
185               block1[ 0]  = append3_t[3];
186
187               block1[ 1]  = append4_t[0];
188               block1[ 2]  = append4_t[1];
189               block1[ 3]  = append4_t[2];
190               block1[ 4]  = append4_t[3];
191               break;
192
193     case  2:  block0[ 2] |= append0_t[0];
194               block0[ 3]  = append0_t[1];
195               block0[ 4]  = append0_t[2];
196               block0[ 5]  = append0_t[3];
197
198               block0[ 6]  = append1_t[0];
199               block0[ 7]  = append1_t[1];
200               block0[ 8]  = append1_t[2];
201               block0[ 9]  = append1_t[3];
202
203               block0[10]  = append2_t[0];
204               block0[11]  = append2_t[1];
205               block0[12]  = append2_t[2];
206               block0[13]  = append2_t[3];
207
208               block0[14]  = append3_t[0];
209               block0[15]  = append3_t[1];
210               block1[ 0]  = append3_t[2];
211               block1[ 1]  = append3_t[3];
212
213               block1[ 2]  = append4_t[0];
214               block1[ 3]  = append4_t[1];
215               block1[ 4]  = append4_t[2];
216               block1[ 5]  = append4_t[3];
217               break;
218
219     case  3:  block0[ 3] |= append0_t[0];
220               block0[ 4]  = append0_t[1];
221               block0[ 5]  = append0_t[2];
222               block0[ 6]  = append0_t[3];
223
224               block0[ 7]  = append1_t[0];
225               block0[ 8]  = append1_t[1];
226               block0[ 9]  = append1_t[2];
227               block0[10]  = append1_t[3];
228
229               block0[11]  = append2_t[0];
230               block0[12]  = append2_t[1];
231               block0[13]  = append2_t[2];
232               block0[14]  = append2_t[3];
233
234               block0[15]  = append3_t[0];
235               block1[ 0]  = append3_t[1];
236               block1[ 1]  = append3_t[2];
237               block1[ 2]  = append3_t[3];
238
239               block1[ 3]  = append4_t[0];
240               block1[ 4]  = append4_t[1];
241               block1[ 5]  = append4_t[2];
242               block1[ 6]  = append4_t[3];
243               break;
244
245     case  4:  block0[ 4] |= append0_t[0];
246               block0[ 5]  = append0_t[1];
247               block0[ 6]  = append0_t[2];
248               block0[ 7]  = append0_t[3];
249
250               block0[ 8]  = append1_t[0];
251               block0[ 9]  = append1_t[1];
252               block0[10]  = append1_t[2];
253               block0[11]  = append1_t[3];
254
255               block0[12]  = append2_t[0];
256               block0[13]  = append2_t[1];
257               block0[14]  = append2_t[2];
258               block0[15]  = append2_t[3];
259
260               block1[ 0]  = append3_t[0];
261               block1[ 1]  = append3_t[1];
262               block1[ 2]  = append3_t[2];
263               block1[ 3]  = append3_t[3];
264
265               block1[ 4]  = append4_t[0];
266               block1[ 5]  = append4_t[1];
267               block1[ 6]  = append4_t[2];
268               block1[ 7]  = append4_t[3];
269               break;
270
271     case  5:  block0[ 5] |= append0_t[0];
272               block0[ 6]  = append0_t[1];
273               block0[ 7]  = append0_t[2];
274               block0[ 8]  = append0_t[3];
275
276               block0[ 9]  = append1_t[0];
277               block0[10]  = append1_t[1];
278               block0[11]  = append1_t[2];
279               block0[12]  = append1_t[3];
280
281               block0[13]  = append2_t[0];
282               block0[14]  = append2_t[1];
283               block0[15]  = append2_t[2];
284               block1[ 0]  = append2_t[3];
285
286               block1[ 1]  = append3_t[0];
287               block1[ 2]  = append3_t[1];
288               block1[ 3]  = append3_t[2];
289               block1[ 4]  = append3_t[3];
290
291               block1[ 5]  = append4_t[0];
292               block1[ 6]  = append4_t[1];
293               block1[ 7]  = append4_t[2];
294               block1[ 8]  = append4_t[3];
295               break;
296
297     case  6:  block0[ 6] |= append0_t[0];
298               block0[ 7]  = append0_t[1];
299               block0[ 8]  = append0_t[2];
300               block0[ 9]  = append0_t[3];
301
302               block0[10]  = append1_t[0];
303               block0[11]  = append1_t[1];
304               block0[12]  = append1_t[2];
305               block0[13]  = append1_t[3];
306
307               block0[14]  = append2_t[0];
308               block0[15]  = append2_t[1];
309               block1[ 0]  = append2_t[2];
310               block1[ 1]  = append2_t[3];
311
312               block1[ 2]  = append3_t[0];
313               block1[ 3]  = append3_t[1];
314               block1[ 4]  = append3_t[2];
315               block1[ 5]  = append3_t[3];
316
317               block1[ 6]  = append4_t[0];
318               block1[ 7]  = append4_t[1];
319               block1[ 8]  = append4_t[2];
320               block1[ 9]  = append4_t[3];
321               break;
322
323     case  7:  block0[ 7] |= append0_t[0];
324               block0[ 8]  = append0_t[1];
325               block0[ 9]  = append0_t[2];
326               block0[10]  = append0_t[3];
327
328               block0[11]  = append1_t[0];
329               block0[12]  = append1_t[1];
330               block0[13]  = append1_t[2];
331               block0[14]  = append1_t[3];
332
333               block0[15]  = append2_t[0];
334               block1[ 0]  = append2_t[1];
335               block1[ 1]  = append2_t[2];
336               block1[ 2]  = append2_t[3];
337
338               block1[ 3]  = append3_t[0];
339               block1[ 4]  = append3_t[1];
340               block1[ 5]  = append3_t[2];
341               block1[ 6]  = append3_t[3];
342
343               block1[ 7]  = append4_t[0];
344               block1[ 8]  = append4_t[1];
345               block1[ 9]  = append4_t[2];
346               block1[10]  = append4_t[3];
347               break;
348
349     case  8:  block0[ 8] |= append0_t[0];
350               block0[ 9]  = append0_t[1];
351               block0[10]  = append0_t[2];
352               block0[11]  = append0_t[3];
353
354               block0[12]  = append1_t[0];
355               block0[13]  = append1_t[1];
356               block0[14]  = append1_t[2];
357               block0[15]  = append1_t[3];
358
359               block1[ 0]  = append2_t[0];
360               block1[ 1]  = append2_t[1];
361               block1[ 2]  = append2_t[2];
362               block1[ 3]  = append2_t[3];
363
364               block1[ 4]  = append3_t[0];
365               block1[ 5]  = append3_t[1];
366               block1[ 6]  = append3_t[2];
367               block1[ 7]  = append3_t[3];
368
369               block1[ 8]  = append4_t[0];
370               block1[ 9]  = append4_t[1];
371               block1[10]  = append4_t[2];
372               block1[11]  = append4_t[3];
373               break;
374
375     case  9:  block0[ 9] |= append0_t[0];
376               block0[10]  = append0_t[1];
377               block0[11]  = append0_t[2];
378               block0[12]  = append0_t[3];
379
380               block0[13]  = append1_t[0];
381               block0[14]  = append1_t[1];
382               block0[15]  = append1_t[2];
383               block1[ 0]  = append1_t[3];
384
385               block1[ 1]  = append2_t[0];
386               block1[ 2]  = append2_t[1];
387               block1[ 3]  = append2_t[2];
388               block1[ 4]  = append2_t[3];
389
390               block1[ 5]  = append3_t[0];
391               block1[ 6]  = append3_t[1];
392               block1[ 7]  = append3_t[2];
393               block1[ 8]  = append3_t[3];
394
395               block1[ 9]  = append4_t[0];
396               block1[10]  = append4_t[1];
397               block1[11]  = append4_t[2];
398               block1[12]  = append4_t[3];
399               break;
400
401     case 10:  block0[10] |= append0_t[0];
402               block0[11]  = append0_t[1];
403               block0[12]  = append0_t[2];
404               block0[13]  = append0_t[3];
405
406               block0[14]  = append1_t[0];
407               block0[15]  = append1_t[1];
408               block1[ 0]  = append1_t[2];
409               block1[ 1]  = append1_t[3];
410
411               block1[ 2]  = append2_t[0];
412               block1[ 3]  = append2_t[1];
413               block1[ 4]  = append2_t[2];
414               block1[ 5]  = append2_t[3];
415
416               block1[ 6]  = append3_t[0];
417               block1[ 7]  = append3_t[1];
418               block1[ 8]  = append3_t[2];
419               block1[ 9]  = append3_t[3];
420
421               block1[10]  = append4_t[0];
422               block1[11]  = append4_t[1];
423               block1[12]  = append4_t[2];
424               block1[13]  = append4_t[3];
425               break;
426
427     case 11:  block0[11] |= append0_t[0];
428               block0[12]  = append0_t[1];
429               block0[13]  = append0_t[2];
430               block0[14]  = append0_t[3];
431
432               block0[15]  = append1_t[0];
433               block1[ 0]  = append1_t[1];
434               block1[ 1]  = append1_t[2];
435               block1[ 2]  = append1_t[3];
436
437               block1[ 3]  = append2_t[0];
438               block1[ 4]  = append2_t[1];
439               block1[ 5]  = append2_t[2];
440               block1[ 6]  = append2_t[3];
441
442               block1[ 7]  = append3_t[0];
443               block1[ 8]  = append3_t[1];
444               block1[ 9]  = append3_t[2];
445               block1[10]  = append3_t[3];
446
447               block1[11]  = append4_t[0];
448               block1[12]  = append4_t[1];
449               block1[13]  = append4_t[2];
450               block1[14]  = append4_t[3];
451               break;
452
453     case 12:  block0[12] |= append0_t[0];
454               block0[13]  = append0_t[1];
455               block0[14]  = append0_t[2];
456               block0[15]  = append0_t[3];
457
458               block1[ 0]  = append1_t[0];
459               block1[ 1]  = append1_t[1];
460               block1[ 2]  = append1_t[2];
461               block1[ 3]  = append1_t[3];
462
463               block1[ 4]  = append2_t[0];
464               block1[ 5]  = append2_t[1];
465               block1[ 6]  = append2_t[2];
466               block1[ 7]  = append2_t[3];
467
468               block1[ 8]  = append3_t[0];
469               block1[ 9]  = append3_t[1];
470               block1[10]  = append3_t[2];
471               block1[11]  = append3_t[3];
472
473               block1[12]  = append4_t[0];
474               block1[13]  = append4_t[1];
475               block1[14]  = append4_t[2];
476               block1[15]  = append4_t[3];
477               break;
478
479     case 13:  block0[13] |= append0_t[0];
480               block0[14]  = append0_t[1];
481               block0[15]  = append0_t[2];
482               block1[ 0]  = append0_t[3];
483
484               block1[ 1]  = append1_t[0];
485               block1[ 2]  = append1_t[1];
486               block1[ 3]  = append1_t[2];
487               block1[ 4]  = append1_t[3];
488
489               block1[ 5]  = append2_t[0];
490               block1[ 6]  = append2_t[1];
491               block1[ 7]  = append2_t[2];
492               block1[ 8]  = append2_t[3];
493
494               block1[ 9]  = append3_t[0];
495               block1[10]  = append3_t[1];
496               block1[11]  = append3_t[2];
497               block1[12]  = append3_t[3];
498
499               block1[13]  = append4_t[0];
500               block1[14]  = append4_t[1];
501               block1[15]  = append4_t[2];
502               break;
503
504     case 14:  block0[14] |= append0_t[0];
505               block0[15]  = append0_t[1];
506               block1[ 0]  = append0_t[2];
507               block1[ 1]  = append0_t[3];
508
509               block1[ 2]  = append1_t[0];
510               block1[ 3]  = append1_t[1];
511               block1[ 4]  = append1_t[2];
512               block1[ 5]  = append1_t[3];
513
514               block1[ 6]  = append2_t[0];
515               block1[ 7]  = append2_t[1];
516               block1[ 8]  = append2_t[2];
517               block1[ 9]  = append2_t[3];
518
519               block1[10]  = append3_t[0];
520               block1[11]  = append3_t[1];
521               block1[12]  = append3_t[2];
522               block1[13]  = append3_t[3];
523
524               block1[14]  = append4_t[0];
525               block1[15]  = append4_t[1];
526               break;
527
528     case 15:  block0[15] |= append0_t[0];
529               block1[ 0]  = append0_t[1];
530               block1[ 1]  = append0_t[2];
531               block1[ 2]  = append0_t[3];
532
533               block1[ 3]  = append1_t[1];
534               block1[ 4]  = append1_t[2];
535               block1[ 5]  = append1_t[3];
536               block1[ 6]  = append1_t[0];
537
538               block1[ 7]  = append2_t[0];
539               block1[ 8]  = append2_t[1];
540               block1[ 9]  = append2_t[2];
541               block1[10]  = append2_t[3];
542
543               block1[11]  = append3_t[0];
544               block1[12]  = append3_t[1];
545               block1[13]  = append3_t[2];
546               block1[14]  = append3_t[3];
547
548               block1[15]  = append4_t[0];
549               break;
550
551     case 16:  block1[ 0] |= append0_t[0];
552               block1[ 1]  = append0_t[1];
553               block1[ 2]  = append0_t[2];
554               block1[ 3]  = append0_t[3];
555
556               block1[ 4]  = append1_t[0];
557               block1[ 5]  = append1_t[1];
558               block1[ 6]  = append1_t[2];
559               block1[ 7]  = append1_t[3];
560
561               block1[ 8]  = append2_t[0];
562               block1[ 9]  = append2_t[1];
563               block1[10]  = append2_t[2];
564               block1[11]  = append2_t[3];
565
566               block1[12]  = append3_t[0];
567               block1[13]  = append3_t[1];
568               block1[14]  = append3_t[2];
569               block1[15]  = append3_t[3];
570               break;
571
572     case 17:  block1[ 1] |= append0_t[0];
573               block1[ 2]  = append0_t[1];
574               block1[ 3]  = append0_t[2];
575               block1[ 4]  = append0_t[3];
576
577               block1[ 5]  = append1_t[0];
578               block1[ 6]  = append1_t[1];
579               block1[ 7]  = append1_t[2];
580               block1[ 8]  = append1_t[3];
581
582               block1[ 9]  = append2_t[0];
583               block1[10]  = append2_t[1];
584               block1[11]  = append2_t[2];
585               block1[12]  = append2_t[3];
586
587               block1[13]  = append3_t[0];
588               block1[14]  = append3_t[1];
589               block1[15]  = append3_t[2];
590               break;
591
592     case 18:  block1[ 2] |= append0_t[0];
593               block1[ 3]  = append0_t[1];
594               block1[ 4]  = append0_t[2];
595               block1[ 5]  = append0_t[3];
596
597               block1[ 6]  = append1_t[0];
598               block1[ 7]  = append1_t[1];
599               block1[ 8]  = append1_t[2];
600               block1[ 9]  = append1_t[3];
601
602               block1[10]  = append2_t[0];
603               block1[11]  = append2_t[1];
604               block1[12]  = append2_t[2];
605               block1[13]  = append2_t[3];
606
607               block1[14]  = append3_t[0];
608               block1[15]  = append3_t[1];
609               break;
610
611     case 19:  block1[ 3] |= append0_t[0];
612               block1[ 4]  = append0_t[1];
613               block1[ 5]  = append0_t[2];
614               block1[ 6]  = append0_t[3];
615
616               block1[ 7]  = append1_t[0];
617               block1[ 8]  = append1_t[1];
618               block1[ 9]  = append1_t[2];
619               block1[10]  = append1_t[3];
620
621               block1[11]  = append2_t[0];
622               block1[12]  = append2_t[1];
623               block1[13]  = append2_t[2];
624               block1[14]  = append2_t[3];
625
626               block1[15]  = append3_t[0];
627               break;
628
629     case 20:  block1[ 4] |= append0_t[0];
630               block1[ 5]  = append0_t[1];
631               block1[ 6]  = append0_t[2];
632               block1[ 7]  = append0_t[3];
633
634               block1[ 8]  = append1_t[0];
635               block1[ 9]  = append1_t[1];
636               block1[10]  = append1_t[2];
637               block1[11]  = append1_t[3];
638
639               block1[12]  = append2_t[0];
640               block1[13]  = append2_t[1];
641               block1[14]  = append2_t[2];
642               block1[15]  = append2_t[3];
643               break;
644
645     case 21:  block1[ 5] |= append0_t[0];
646               block1[ 6]  = append0_t[1];
647               block1[ 7]  = append0_t[2];
648               block1[ 8]  = append0_t[3];
649
650               block1[ 9]  = append1_t[0];
651               block1[10]  = append1_t[1];
652               block1[11]  = append1_t[2];
653               block1[12]  = append1_t[3];
654
655               block1[13]  = append2_t[0];
656               block1[14]  = append2_t[1];
657               block1[15]  = append2_t[2];
658               break;
659
660     case 22:  block1[ 6] |= append0_t[0];
661               block1[ 7]  = append0_t[1];
662               block1[ 8]  = append0_t[2];
663               block1[ 9]  = append0_t[3];
664
665               block1[10]  = append1_t[0];
666               block1[11]  = append1_t[1];
667               block1[12]  = append1_t[2];
668               block1[13]  = append1_t[3];
669
670               block1[14]  = append2_t[0];
671               block1[15]  = append2_t[1];
672               break;
673
674     case 23:  block1[ 7] |= append0_t[0];
675               block1[ 8]  = append0_t[1];
676               block1[ 9]  = append0_t[2];
677               block1[10]  = append0_t[3];
678
679               block1[11]  = append1_t[0];
680               block1[12]  = append1_t[1];
681               block1[13]  = append1_t[2];
682               block1[14]  = append1_t[3];
683
684               block1[15]  = append2_t[0];
685               break;
686
687     case 24:  block1[ 8] |= append0_t[0];
688               block1[ 9]  = append0_t[1];
689               block1[10]  = append0_t[2];
690               block1[11]  = append0_t[3];
691
692               block1[12]  = append1_t[0];
693               block1[13]  = append1_t[1];
694               block1[14]  = append1_t[2];
695               block1[15]  = append1_t[3];
696               break;
697
698     case 25:  block1[ 9] |= append0_t[0];
699               block1[10]  = append0_t[1];
700               block1[11]  = append0_t[2];
701               block1[12]  = append0_t[3];
702
703               block1[13]  = append1_t[0];
704               block1[14]  = append1_t[1];
705               block1[15]  = append1_t[2];
706               break;
707
708     case 26:  block1[10] |= append0_t[0];
709               block1[11]  = append0_t[1];
710               block1[12]  = append0_t[2];
711               block1[13]  = append0_t[3];
712
713               block1[14]  = append1_t[0];
714               block1[15]  = append1_t[1];
715               break;
716
717     case 27:  block1[11] |= append0_t[0];
718               block1[12]  = append0_t[1];
719               block1[13]  = append0_t[2];
720               block1[14]  = append0_t[3];
721
722               block1[15]  = append1_t[0];
723               break;
724
725     case 28:  block1[12] |= append0_t[0];
726               block1[13]  = append0_t[1];
727               block1[14]  = append0_t[2];
728               block1[15]  = append0_t[3];
729               break;
730
731     case 29:  block1[13] |= append0_t[0];
732               block1[14]  = append0_t[1];
733               block1[15]  = append0_t[2];
734               break;
735
736     case 30:  block1[14] |= append0_t[0];
737               block1[15]  = append0_t[1];
738               break;
739   }
740
741   u32 new_len = block_len + append_len;
742
743   return new_len;
744 }
745
746 __kernel void m11400_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
747 {
748   /**
749    * modifier
750    */
751
752   const u32 gid = get_global_id (0);
753   const u32 lid = get_local_id (0);
754   const u32 lsz = get_local_size (0);
755
756   /**
757    * bin2asc table
758    */
759
760   __local u32 l_bin2asc[256];
761
762   for (u32 i = lid; i < 256; i += lsz)
763   {
764     const u32 i0 = (i >> 0) & 15;
765     const u32 i1 = (i >> 4) & 15;
766
767     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
768                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
769   }
770
771   barrier (CLK_LOCAL_MEM_FENCE);
772
773   if (gid >= gid_max) return;
774
775   /**
776    * base
777    */
778
779   u32 wordl0[4];
780
781   wordl0[0] = pws[gid].i[ 0];
782   wordl0[1] = pws[gid].i[ 1];
783   wordl0[2] = pws[gid].i[ 2];
784   wordl0[3] = pws[gid].i[ 3];
785
786   u32 wordl1[4];
787
788   wordl1[0] = pws[gid].i[ 4];
789   wordl1[1] = pws[gid].i[ 5];
790   wordl1[2] = pws[gid].i[ 6];
791   wordl1[3] = pws[gid].i[ 7];
792
793   u32 wordl2[4];
794
795   wordl2[0] = 0;
796   wordl2[1] = 0;
797   wordl2[2] = 0;
798   wordl2[3] = 0;
799
800   u32 wordl3[4];
801
802   wordl3[0] = 0;
803   wordl3[1] = 0;
804   wordl3[2] = 0;
805   wordl3[3] = 0;
806
807   const u32 pw_l_len = pws[gid].pw_len;
808
809   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
810   {
811     append_0x80_2x4 (wordl0, wordl1, pw_l_len);
812
813     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
814   }
815
816   /**
817    * salt
818    */
819
820   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
821
822   u32 salt_buf0[16];
823
824   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
825   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
826   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
827   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
828   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
829   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
830   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
831   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
832   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
833   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
834   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
835   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
836   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
837   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
838   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
839   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
840
841   u32 salt_buf1[16];
842
843   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
844   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
845   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
846   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
847   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
848   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
849   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
850   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
851   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
852   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
853   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
854   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
855   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
856   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
857   salt_buf1[14] = 0;
858   salt_buf1[15] = 0;
859
860   /**
861    * esalt
862    */
863
864   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
865
866   u32 esalt_buf0[16];
867
868   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
869   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
870   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
871   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
872   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
873   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
874   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
875   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
876   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
877   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
878   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
879   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
880   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
881   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
882   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
883   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
884
885   u32 esalt_buf1[16];
886
887   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
888   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
889   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
890   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
891   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
892   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
893   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
894   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
895   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
896   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
897   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
898   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
899   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
900   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
901   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
902   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
903
904   u32 esalt_buf2[16];
905
906   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
907   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
908   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
909   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
910   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
911   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
912   esalt_buf2[ 6] = 0;
913   esalt_buf2[ 7] = 0;
914   esalt_buf2[ 8] = 0;
915   esalt_buf2[ 9] = 0;
916   esalt_buf2[10] = 0;
917   esalt_buf2[11] = 0;
918   esalt_buf2[12] = 0;
919   esalt_buf2[13] = 0;
920   esalt_buf2[14] = 0;
921   esalt_buf2[15] = 0;
922
923   const u32 digest_esalt_len = 32 + esalt_len;
924   const u32 remaining_bytes  = digest_esalt_len + 1 - 64; // substract previous block
925
926   /**
927    * loop
928    */
929
930   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
931   {
932     const u32 pw_r_len = combs_buf[il_pos].pw_len;
933
934     const u32 pw_len = pw_l_len + pw_r_len;
935
936     u32 wordr0[4];
937
938     wordr0[0] = combs_buf[il_pos].i[0];
939     wordr0[1] = combs_buf[il_pos].i[1];
940     wordr0[2] = combs_buf[il_pos].i[2];
941     wordr0[3] = combs_buf[il_pos].i[3];
942
943     u32 wordr1[4];
944
945     wordr1[0] = combs_buf[il_pos].i[4];
946     wordr1[1] = combs_buf[il_pos].i[5];
947     wordr1[2] = combs_buf[il_pos].i[6];
948     wordr1[3] = combs_buf[il_pos].i[7];
949
950     u32 wordr2[4];
951
952     wordr2[0] = 0;
953     wordr2[1] = 0;
954     wordr2[2] = 0;
955     wordr2[3] = 0;
956
957     u32 wordr3[4];
958
959     wordr3[0] = 0;
960     wordr3[1] = 0;
961     wordr3[2] = 0;
962     wordr3[3] = 0;
963
964     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
965     {
966       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
967     }
968
969     u32 w0[4];
970
971     w0[0] = wordl0[0] | wordr0[0];
972     w0[1] = wordl0[1] | wordr0[1];
973     w0[2] = wordl0[2] | wordr0[2];
974     w0[3] = wordl0[3] | wordr0[3];
975
976     u32 w1[4];
977
978     w1[0] = wordl1[0] | wordr1[0];
979     w1[1] = wordl1[1] | wordr1[1];
980     w1[2] = wordl1[2] | wordr1[2];
981     w1[3] = wordl1[3] | wordr1[3];
982
983     u32 w2[4];
984
985     w2[0] = wordl2[0] | wordr2[0];
986     w2[1] = wordl2[1] | wordr2[1];
987     w2[2] = wordl2[2] | wordr2[2];
988     w2[3] = wordl2[3] | wordr2[3];
989
990     u32 w3[4];
991
992     w3[0] = wordl3[0] | wordr3[0];
993     w3[1] = wordl3[1] | wordr3[1];
994     w3[2] = wordl3[2] | wordr3[2];
995     w3[3] = wordl3[3] | wordr3[3];
996
997     const u32 pw_salt_len = salt_len + pw_len;
998
999     /*
1000      * HA1 = md5 ($salt . $pass)
1001      */
1002
1003     // append the pass to the salt
1004
1005     u32 block0[16];
1006
1007     block0[ 0] = salt_buf0[ 0];
1008     block0[ 1] = salt_buf0[ 1];
1009     block0[ 2] = salt_buf0[ 2];
1010     block0[ 3] = salt_buf0[ 3];
1011     block0[ 4] = salt_buf0[ 4];
1012     block0[ 5] = salt_buf0[ 5];
1013     block0[ 6] = salt_buf0[ 6];
1014     block0[ 7] = salt_buf0[ 7];
1015     block0[ 8] = salt_buf0[ 8];
1016     block0[ 9] = salt_buf0[ 9];
1017     block0[10] = salt_buf0[10];
1018     block0[11] = salt_buf0[11];
1019     block0[12] = salt_buf0[12];
1020     block0[13] = salt_buf0[13];
1021     block0[14] = salt_buf0[14];
1022     block0[15] = salt_buf0[15];
1023
1024     u32 block1[16];
1025
1026     block1[ 0] = salt_buf1[ 0];
1027     block1[ 1] = salt_buf1[ 1];
1028     block1[ 2] = salt_buf1[ 2];
1029     block1[ 3] = salt_buf1[ 3];
1030     block1[ 4] = salt_buf1[ 4];
1031     block1[ 5] = salt_buf1[ 5];
1032     block1[ 6] = salt_buf1[ 6];
1033     block1[ 7] = salt_buf1[ 7];
1034     block1[ 8] = salt_buf1[ 8];
1035     block1[ 9] = salt_buf1[ 9];
1036     block1[10] = salt_buf1[10];
1037     block1[11] = salt_buf1[11];
1038     block1[12] = salt_buf1[12];
1039     block1[13] = salt_buf1[13];
1040     block1[14] = salt_buf1[14];
1041     block1[15] = salt_buf1[15];
1042
1043     u32 block_len = 0;
1044
1045     block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1046
1047     u32 w0_t[4];
1048
1049     w0_t[0] = block0[ 0];
1050     w0_t[1] = block0[ 1];
1051     w0_t[2] = block0[ 2];
1052     w0_t[3] = block0[ 3];
1053
1054     u32 w1_t[4];
1055
1056     w1_t[0] = block0[ 4];
1057     w1_t[1] = block0[ 5];
1058     w1_t[2] = block0[ 6];
1059     w1_t[3] = block0[ 7];
1060
1061     u32 w2_t[4];
1062
1063     w2_t[0] = block0[ 8];
1064     w2_t[1] = block0[ 9];
1065     w2_t[2] = block0[10];
1066     w2_t[3] = block0[11];
1067
1068     u32 w3_t[4];
1069
1070     w3_t[0] = block0[12];
1071     w3_t[1] = block0[13];
1072     w3_t[2] = block0[14];
1073     w3_t[3] = block0[15];
1074
1075     if (block_len < 56)
1076     {
1077       w3_t[2] = pw_salt_len * 8;
1078     }
1079
1080     // md5
1081
1082     u32 tmp2;
1083
1084     u32 a = MD5M_A;
1085     u32 b = MD5M_B;
1086     u32 c = MD5M_C;
1087     u32 d = MD5M_D;
1088
1089     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1090     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1091     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1092     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1093     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1094     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1095     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1096     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1097     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1098     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1099     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1100     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1101     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1102     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1103     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1104     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1105
1106     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1107     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1108     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1109     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1110     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1111     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1112     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1113     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1114     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1115     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1116     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1117     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1118     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1119     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1120     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1121     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1122
1123     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1124     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1125     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1126     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1127     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1128     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1129     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1130     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1131     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1132     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1133     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1134     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1135     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1136     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1137     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1138     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1139
1140     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1141     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1142     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1143     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1144     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1145     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1146     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1147     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1148     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1149     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1150     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1151     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1152     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1153     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1154     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1155     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1156
1157     a += MD5M_A;
1158     b += MD5M_B;
1159     c += MD5M_C;
1160     d += MD5M_D;
1161
1162     if (block_len > 55)
1163     {
1164       u32 r_a = a;
1165       u32 r_b = b;
1166       u32 r_c = c;
1167       u32 r_d = d;
1168
1169       w0_t[0] = block1[ 0];
1170       w0_t[1] = block1[ 1];
1171       w0_t[2] = block1[ 2];
1172       w0_t[3] = block1[ 3];
1173
1174       w1_t[0] = block1[ 4];
1175       w1_t[1] = block1[ 5];
1176       w1_t[2] = block1[ 6];
1177       w1_t[3] = block1[ 7];
1178
1179       w2_t[0] = block1[ 8];
1180       w2_t[1] = block1[ 9];
1181       w2_t[2] = block1[10];
1182       w2_t[3] = block1[11];
1183
1184       w3_t[0] = block1[12];
1185       w3_t[1] = block1[13];
1186       w3_t[2] = pw_salt_len * 8;
1187       w3_t[3] = 0;
1188
1189       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1190       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1191       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1192       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1193       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1194       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1195       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1196       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1197       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1198       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1199       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1200       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1201       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1202       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1203       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1204       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1205
1206       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1207       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1208       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1209       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1210       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1211       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1212       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1213       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1214       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1215       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1216       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1217       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1218       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1219       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1220       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1221       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1222
1223       MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1224       MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1225       MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1226       MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1227       MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1228       MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1229       MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1230       MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1231       MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1232       MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1233       MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1234       MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1235       MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1236       MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1237       MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1238       MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1239
1240       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1241       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1242       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1243       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1244       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1245       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1246       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1247       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1248       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1249       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1250       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1251       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1252       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1253       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1254       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1255       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1256
1257       a += r_a;
1258       b += r_b;
1259       c += r_c;
1260       d += r_d;
1261     }
1262
1263     /*
1264      * final = md5 ($HA1 . $esalt)
1265      * we have at least 2 MD5 blocks/transformations, but we might need 3
1266      */
1267
1268     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1269             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1270     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1271             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1272     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1273             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1274     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1275             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1276     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1277             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1278     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1279             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1280     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1281             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1282     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1283             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1284
1285     w2_t[0] = esalt_buf0[0];
1286     w2_t[1] = esalt_buf0[1];
1287     w2_t[2] = esalt_buf0[2];
1288     w2_t[3] = esalt_buf0[3];
1289
1290     w3_t[0] = esalt_buf0[4];
1291     w3_t[1] = esalt_buf0[5];
1292     w3_t[2] = esalt_buf0[6];
1293     w3_t[3] = esalt_buf0[7];
1294
1295     // md5
1296     // 1st transform
1297
1298     a = MD5M_A;
1299     b = MD5M_B;
1300     c = MD5M_C;
1301     d = MD5M_D;
1302
1303     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1304     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1305     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1306     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1307     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1308     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1309     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1310     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1311     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1312     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1313     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1314     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1315     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1316     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1317     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1318     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1319
1320     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1321     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1322     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1323     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1324     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1325     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1326     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1327     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1328     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1329     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1330     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1331     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1332     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1333     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1334     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1335     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1336
1337     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1338     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1339     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1340     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1341     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1342     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1343     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1344     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1345     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1346     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1347     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1348     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1349     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1350     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1351     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1352     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1353
1354     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1355     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1356     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1357     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1358     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1359     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1360     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1361     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1362     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1363     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1364     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1365     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1366     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1367     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1368     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1369     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1370
1371     a += MD5M_A;
1372     b += MD5M_B;
1373     c += MD5M_C;
1374     d += MD5M_D;
1375
1376     u32 r_a = a;
1377     u32 r_b = b;
1378     u32 r_c = c;
1379     u32 r_d = d;
1380
1381     // 2nd transform
1382
1383     w0_t[0] = esalt_buf0[ 8];
1384     w0_t[1] = esalt_buf0[ 9];
1385     w0_t[2] = esalt_buf0[10];
1386     w0_t[3] = esalt_buf0[11];
1387
1388     w1_t[0] = esalt_buf0[12];
1389     w1_t[1] = esalt_buf0[13];
1390     w1_t[2] = esalt_buf0[14];
1391     w1_t[3] = esalt_buf0[15];
1392
1393     w2_t[0] = esalt_buf1[ 0];
1394     w2_t[1] = esalt_buf1[ 1];
1395     w2_t[2] = esalt_buf1[ 2];
1396     w2_t[3] = esalt_buf1[ 3];
1397
1398     w3_t[0] = esalt_buf1[ 4];
1399     w3_t[1] = esalt_buf1[ 5];
1400     w3_t[2] = esalt_buf1[ 6];
1401     w3_t[3] = esalt_buf1[ 7];
1402
1403     // it is the final block when no more than 55 bytes left
1404
1405     if (remaining_bytes < 56)
1406     {
1407       // it is the last block !
1408
1409       w3_t[2] = digest_esalt_len * 8;
1410     }
1411
1412     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1413     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1414     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1415     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1416     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1417     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1418     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1419     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1420     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1421     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1422     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1423     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1424     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1425     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1426     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1427     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1428
1429     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1430     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1431     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1432     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1433     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1434     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1435     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1436     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1437     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1438     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1439     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1440     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1441     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1442     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1443     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1444     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1445
1446     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1447     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1448     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1449     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1450     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1451     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1452     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1453     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1454     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1455     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1456     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1457     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1458     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1459     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1460     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1461     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1462
1463     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1464     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1465     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1466     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1467     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1468     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1469     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1470     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1471     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1472     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1473     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1474     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1475     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1476     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1477     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1478     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1479
1480     // sometimes (not rare at all) we need a third block :(
1481
1482     if (remaining_bytes > 55)
1483     {
1484       // this is for sure the final block
1485
1486       a += r_a;
1487       b += r_b;
1488       c += r_c;
1489       d += r_d;
1490
1491       r_a = a;
1492       r_b = b;
1493       r_c = c;
1494       r_d = d;
1495
1496       w0_t[0] = esalt_buf1[ 8];
1497       w0_t[1] = esalt_buf1[ 9];
1498       w0_t[2] = esalt_buf1[10];
1499       w0_t[3] = esalt_buf1[11];
1500
1501       w1_t[0] = esalt_buf1[12];
1502       w1_t[1] = esalt_buf1[13];
1503       w1_t[2] = esalt_buf1[14];
1504       w1_t[3] = esalt_buf1[15];
1505
1506       w2_t[0] = esalt_buf2[ 0];
1507       w2_t[1] = esalt_buf2[ 1];
1508       w2_t[2] = esalt_buf2[ 2];
1509       w2_t[3] = esalt_buf2[ 3];
1510
1511       w3_t[0] = esalt_buf2[ 4];
1512       w3_t[1] = esalt_buf2[ 5];
1513       w3_t[2] = digest_esalt_len * 8;
1514       w3_t[3] = 0;
1515
1516       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1517       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1518       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1519       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1520       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1521       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1522       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1523       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1524       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1525       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1526       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1527       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1528       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1529       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1530       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1531       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1532
1533       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1534       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1535       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1536       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1537       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1538       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1539       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1540       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1541       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1542       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1543       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1544       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1545       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1546       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1547       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1548       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1549
1550       MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1551       MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1552       MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1553       MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1554       MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1555       MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1556       MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1557       MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1558       MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1559       MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1560       MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1561       MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1562       MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1563       MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1564       MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1565       MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1566
1567       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1568       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1569       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1570       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1571       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1572       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1573       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1574       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1575       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1576       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1577       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1578       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1579       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1580       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1581       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1582       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1583     }
1584
1585     a += r_a;
1586     b += r_b;
1587     c += r_c;
1588     d += r_d;
1589
1590     const u32 r0 = a;
1591     const u32 r1 = d;
1592     const u32 r2 = c;
1593     const u32 r3 = b;
1594
1595     #include COMPARE_M
1596   }
1597 }
1598
1599 __kernel void m11400_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1600 {
1601 }
1602
1603 __kernel void m11400_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1604 {
1605 }
1606
1607 __kernel void m11400_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1608 {
1609   /**
1610    * modifier
1611    */
1612
1613   const u32 gid = get_global_id (0);
1614   const u32 lid = get_local_id (0);
1615   const u32 lsz = get_local_size (0);
1616
1617   /**
1618    * bin2asc table
1619    */
1620
1621   __local u32 l_bin2asc[256];
1622
1623   for (u32 i = lid; i < 256; i += lsz)
1624   {
1625     const u32 i0 = (i >> 0) & 15;
1626     const u32 i1 = (i >> 4) & 15;
1627
1628     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
1629                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
1630   }
1631
1632   barrier (CLK_LOCAL_MEM_FENCE);
1633
1634   if (gid >= gid_max) return;
1635
1636   /**
1637    * base
1638    */
1639
1640   u32 wordl0[4];
1641
1642   wordl0[0] = pws[gid].i[ 0];
1643   wordl0[1] = pws[gid].i[ 1];
1644   wordl0[2] = pws[gid].i[ 2];
1645   wordl0[3] = pws[gid].i[ 3];
1646
1647   u32 wordl1[4];
1648
1649   wordl1[0] = pws[gid].i[ 4];
1650   wordl1[1] = pws[gid].i[ 5];
1651   wordl1[2] = pws[gid].i[ 6];
1652   wordl1[3] = pws[gid].i[ 7];
1653
1654   u32 wordl2[4];
1655
1656   wordl2[0] = 0;
1657   wordl2[1] = 0;
1658   wordl2[2] = 0;
1659   wordl2[3] = 0;
1660
1661   u32 wordl3[4];
1662
1663   wordl3[0] = 0;
1664   wordl3[1] = 0;
1665   wordl3[2] = 0;
1666   wordl3[3] = 0;
1667
1668   const u32 pw_l_len = pws[gid].pw_len;
1669
1670   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
1671   {
1672     append_0x80_2x4 (wordl0, wordl1, pw_l_len);
1673
1674     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
1675   }
1676
1677   /**
1678    * salt
1679    */
1680
1681   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1682
1683   u32 salt_buf0[16];
1684
1685   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1686   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1687   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1688   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1689   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1690   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1691   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1692   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1693   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1694   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1695   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1696   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1697   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1698   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1699   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1700   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1701
1702   u32 salt_buf1[16];
1703
1704   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1705   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1706   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1707   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1708   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1709   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1710   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1711   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1712   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1713   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1714   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1715   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1716   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1717   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1718   salt_buf1[14] = 0;
1719   salt_buf1[15] = 0;
1720
1721   /**
1722    * esalt
1723    */
1724
1725   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1726
1727   u32 esalt_buf0[16];
1728
1729   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1730   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1731   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1732   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1733   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1734   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1735   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1736   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1737   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1738   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1739   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1740   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1741   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1742   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1743   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1744   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1745
1746   u32 esalt_buf1[16];
1747
1748   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1749   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1750   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1751   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1752   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1753   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1754   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1755   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1756   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1757   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1758   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1759   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1760   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1761   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1762   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1763   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1764
1765   u32 esalt_buf2[16];
1766
1767   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1768   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1769   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1770   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1771   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1772   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1773   esalt_buf2[ 6] = 0;
1774   esalt_buf2[ 7] = 0;
1775   esalt_buf2[ 8] = 0;
1776   esalt_buf2[ 9] = 0;
1777   esalt_buf2[10] = 0;
1778   esalt_buf2[11] = 0;
1779   esalt_buf2[12] = 0;
1780   esalt_buf2[13] = 0;
1781   esalt_buf2[14] = 0;
1782   esalt_buf2[15] = 0;
1783
1784   const u32 digest_esalt_len = 32 + esalt_len;
1785   const u32 remaining_bytes  = digest_esalt_len + 1 - 64; // substract previous block
1786
1787   /**
1788    * digest
1789    */
1790
1791   const u32 search[4] =
1792   {
1793     digests_buf[digests_offset].digest_buf[DGST_R0],
1794     digests_buf[digests_offset].digest_buf[DGST_R1],
1795     digests_buf[digests_offset].digest_buf[DGST_R2],
1796     digests_buf[digests_offset].digest_buf[DGST_R3]
1797   };
1798
1799   /**
1800    * loop
1801    */
1802
1803   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
1804   {
1805     const u32 pw_r_len = combs_buf[il_pos].pw_len;
1806
1807     const u32 pw_len = pw_l_len + pw_r_len;
1808
1809     u32 wordr0[4];
1810
1811     wordr0[0] = combs_buf[il_pos].i[0];
1812     wordr0[1] = combs_buf[il_pos].i[1];
1813     wordr0[2] = combs_buf[il_pos].i[2];
1814     wordr0[3] = combs_buf[il_pos].i[3];
1815
1816     u32 wordr1[4];
1817
1818     wordr1[0] = combs_buf[il_pos].i[4];
1819     wordr1[1] = combs_buf[il_pos].i[5];
1820     wordr1[2] = combs_buf[il_pos].i[6];
1821     wordr1[3] = combs_buf[il_pos].i[7];
1822
1823     u32 wordr2[4];
1824
1825     wordr2[0] = 0;
1826     wordr2[1] = 0;
1827     wordr2[2] = 0;
1828     wordr2[3] = 0;
1829
1830     u32 wordr3[4];
1831
1832     wordr3[0] = 0;
1833     wordr3[1] = 0;
1834     wordr3[2] = 0;
1835     wordr3[3] = 0;
1836
1837     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1838     {
1839       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1840     }
1841
1842     u32 w0[4];
1843
1844     w0[0] = wordl0[0] | wordr0[0];
1845     w0[1] = wordl0[1] | wordr0[1];
1846     w0[2] = wordl0[2] | wordr0[2];
1847     w0[3] = wordl0[3] | wordr0[3];
1848
1849     u32 w1[4];
1850
1851     w1[0] = wordl1[0] | wordr1[0];
1852     w1[1] = wordl1[1] | wordr1[1];
1853     w1[2] = wordl1[2] | wordr1[2];
1854     w1[3] = wordl1[3] | wordr1[3];
1855
1856     u32 w2[4];
1857
1858     w2[0] = wordl2[0] | wordr2[0];
1859     w2[1] = wordl2[1] | wordr2[1];
1860     w2[2] = wordl2[2] | wordr2[2];
1861     w2[3] = wordl2[3] | wordr2[3];
1862
1863     u32 w3[4];
1864
1865     w3[0] = wordl3[0] | wordr3[0];
1866     w3[1] = wordl3[1] | wordr3[1];
1867     w3[2] = wordl3[2] | wordr3[2];
1868     w3[3] = wordl3[3] | wordr3[3];
1869
1870     const u32 pw_salt_len = salt_len + pw_len;
1871
1872     /*
1873      * HA1 = md5 ($salt . $pass)
1874      */
1875
1876     // append the pass to the salt
1877
1878     u32 block0[16];
1879
1880     block0[ 0] = salt_buf0[ 0];
1881     block0[ 1] = salt_buf0[ 1];
1882     block0[ 2] = salt_buf0[ 2];
1883     block0[ 3] = salt_buf0[ 3];
1884     block0[ 4] = salt_buf0[ 4];
1885     block0[ 5] = salt_buf0[ 5];
1886     block0[ 6] = salt_buf0[ 6];
1887     block0[ 7] = salt_buf0[ 7];
1888     block0[ 8] = salt_buf0[ 8];
1889     block0[ 9] = salt_buf0[ 9];
1890     block0[10] = salt_buf0[10];
1891     block0[11] = salt_buf0[11];
1892     block0[12] = salt_buf0[12];
1893     block0[13] = salt_buf0[13];
1894     block0[14] = salt_buf0[14];
1895     block0[15] = salt_buf0[15];
1896
1897     u32 block1[16];
1898
1899     block1[ 0] = salt_buf1[ 0];
1900     block1[ 1] = salt_buf1[ 1];
1901     block1[ 2] = salt_buf1[ 2];
1902     block1[ 3] = salt_buf1[ 3];
1903     block1[ 4] = salt_buf1[ 4];
1904     block1[ 5] = salt_buf1[ 5];
1905     block1[ 6] = salt_buf1[ 6];
1906     block1[ 7] = salt_buf1[ 7];
1907     block1[ 8] = salt_buf1[ 8];
1908     block1[ 9] = salt_buf1[ 9];
1909     block1[10] = salt_buf1[10];
1910     block1[11] = salt_buf1[11];
1911     block1[12] = salt_buf1[12];
1912     block1[13] = salt_buf1[13];
1913     block1[14] = salt_buf1[14];
1914     block1[15] = salt_buf1[15];
1915
1916     u32 block_len = 0;
1917
1918     block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1919
1920     u32 w0_t[4];
1921
1922     w0_t[0] = block0[ 0];
1923     w0_t[1] = block0[ 1];
1924     w0_t[2] = block0[ 2];
1925     w0_t[3] = block0[ 3];
1926
1927     u32 w1_t[4];
1928
1929     w1_t[0] = block0[ 4];
1930     w1_t[1] = block0[ 5];
1931     w1_t[2] = block0[ 6];
1932     w1_t[3] = block0[ 7];
1933
1934     u32 w2_t[4];
1935
1936     w2_t[0] = block0[ 8];
1937     w2_t[1] = block0[ 9];
1938     w2_t[2] = block0[10];
1939     w2_t[3] = block0[11];
1940
1941     u32 w3_t[4];
1942
1943     w3_t[0] = block0[12];
1944     w3_t[1] = block0[13];
1945     w3_t[2] = block0[14];
1946     w3_t[3] = block0[15];
1947
1948     if (block_len < 56)
1949     {
1950       w3_t[2] = pw_salt_len * 8;
1951     }
1952
1953     // md5
1954
1955     u32 tmp2;
1956
1957     u32 a = MD5M_A;
1958     u32 b = MD5M_B;
1959     u32 c = MD5M_C;
1960     u32 d = MD5M_D;
1961
1962     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1963     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1964     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1965     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1966     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1967     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1968     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1969     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1970     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1971     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1972     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1973     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1974     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1975     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1976     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1977     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1978
1979     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1980     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1981     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1982     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1983     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1984     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1985     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1986     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1987     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1988     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1989     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1990     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1991     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1992     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1993     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1994     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1995
1996     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1997     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1998     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1999     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2000     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2001     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2002     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2003     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2004     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2005     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2006     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2007     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2008     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2009     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2010     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2011     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2012
2013     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2014     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2015     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2016     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2017     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2018     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2019     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2020     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2021     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2022     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2023     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2024     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2025     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2026     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2027     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2028     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2029
2030     a += MD5M_A;
2031     b += MD5M_B;
2032     c += MD5M_C;
2033     d += MD5M_D;
2034
2035     if (block_len > 55)
2036     {
2037       u32 r_a = a;
2038       u32 r_b = b;
2039       u32 r_c = c;
2040       u32 r_d = d;
2041
2042       w0_t[0] = block1[ 0];
2043       w0_t[1] = block1[ 1];
2044       w0_t[2] = block1[ 2];
2045       w0_t[3] = block1[ 3];
2046
2047       w1_t[0] = block1[ 4];
2048       w1_t[1] = block1[ 5];
2049       w1_t[2] = block1[ 6];
2050       w1_t[3] = block1[ 7];
2051
2052       w2_t[0] = block1[ 8];
2053       w2_t[1] = block1[ 9];
2054       w2_t[2] = block1[10];
2055       w2_t[3] = block1[11];
2056
2057       w3_t[0] = block1[12];
2058       w3_t[1] = block1[13];
2059       w3_t[2] = pw_salt_len * 8;
2060       w3_t[3] = 0;
2061
2062       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2063       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2064       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2065       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2066       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2067       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2068       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2069       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2070       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2071       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2072       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2073       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2074       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2075       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2076       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2077       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2078
2079       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2080       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2081       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2082       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2083       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2084       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2085       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2086       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2087       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2088       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2089       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2090       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2091       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2092       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2093       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2094       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2095
2096       MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2097       MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2098       MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2099       MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2100       MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2101       MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2102       MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2103       MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2104       MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2105       MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2106       MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2107       MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2108       MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2109       MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2110       MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2111       MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2112
2113       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2114       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2115       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2116       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2117       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2118       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2119       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2120       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2121       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2122       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2123       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2124       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2125       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2126       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2127       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2128       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2129
2130       a += r_a;
2131       b += r_b;
2132       c += r_c;
2133       d += r_d;
2134     }
2135
2136     /*
2137      * final = md5 ($HA1 . $esalt)
2138      * we have at least 2 MD5 blocks/transformations, but we might need 3
2139      */
2140
2141     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2142             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2143     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2144             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2145     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2146             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2147     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2148             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2149     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2150             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2151     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2152             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2153     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2154             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2155     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2156             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2157
2158     w2_t[0] = esalt_buf0[0];
2159     w2_t[1] = esalt_buf0[1];
2160     w2_t[2] = esalt_buf0[2];
2161     w2_t[3] = esalt_buf0[3];
2162
2163     w3_t[0] = esalt_buf0[4];
2164     w3_t[1] = esalt_buf0[5];
2165     w3_t[2] = esalt_buf0[6];
2166     w3_t[3] = esalt_buf0[7];
2167
2168     // md5
2169     // 1st transform
2170
2171     a = MD5M_A;
2172     b = MD5M_B;
2173     c = MD5M_C;
2174     d = MD5M_D;
2175
2176     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2177     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2178     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2179     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2180     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2181     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2182     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2183     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2184     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2185     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2186     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2187     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2188     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2189     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2190     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2191     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2192
2193     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2194     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2195     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2196     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2197     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2198     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2199     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2200     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2201     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2202     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2203     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2204     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2205     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2206     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2207     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2208     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2209
2210     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2211     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2212     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2213     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2214     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2215     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2216     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2217     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2218     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2219     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2220     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2221     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2222     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2223     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2224     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2225     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2226
2227     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2228     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2229     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2230     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2231     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2232     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2233     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2234     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2235     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2236     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2237     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2238     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2239     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2240     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2241     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2242     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2243
2244     a += MD5M_A;
2245     b += MD5M_B;
2246     c += MD5M_C;
2247     d += MD5M_D;
2248
2249     u32 r_a = a;
2250     u32 r_b = b;
2251     u32 r_c = c;
2252     u32 r_d = d;
2253
2254     // 2nd transform
2255
2256     w0_t[0] = esalt_buf0[ 8];
2257     w0_t[1] = esalt_buf0[ 9];
2258     w0_t[2] = esalt_buf0[10];
2259     w0_t[3] = esalt_buf0[11];
2260
2261     w1_t[0] = esalt_buf0[12];
2262     w1_t[1] = esalt_buf0[13];
2263     w1_t[2] = esalt_buf0[14];
2264     w1_t[3] = esalt_buf0[15];
2265
2266     w2_t[0] = esalt_buf1[ 0];
2267     w2_t[1] = esalt_buf1[ 1];
2268     w2_t[2] = esalt_buf1[ 2];
2269     w2_t[3] = esalt_buf1[ 3];
2270
2271     w3_t[0] = esalt_buf1[ 4];
2272     w3_t[1] = esalt_buf1[ 5];
2273     w3_t[2] = esalt_buf1[ 6];
2274     w3_t[3] = esalt_buf1[ 7];
2275
2276     // it is the final block when no more than 55 bytes left
2277
2278     if (remaining_bytes < 56)
2279     {
2280       // it is the last block !
2281
2282       w3_t[2] = digest_esalt_len * 8;
2283     }
2284
2285     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2286     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2287     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2288     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2289     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2290     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2291     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2292     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2293     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2294     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2295     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2296     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2297     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2298     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2299     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2300     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2301
2302     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2303     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2304     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2305     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2306     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2307     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2308     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2309     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2310     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2311     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2312     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2313     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2314     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2315     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2316     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2317     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2318
2319     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2320     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2321     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2322     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2323     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2324     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2325     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2326     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2327     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2328     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2329     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2330     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2331     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2332     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2333     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2334     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2335
2336     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2337     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2338     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2339     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2340     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2341     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2342     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2343     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2344     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2345     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2346     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2347     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2348     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2349     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2350     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2351     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2352
2353     // sometimes (not rare at all) we need a third block :(
2354
2355     if (remaining_bytes > 55)
2356     {
2357       // this is for sure the final block
2358
2359       a += r_a;
2360       b += r_b;
2361       c += r_c;
2362       d += r_d;
2363
2364       r_a = a;
2365       r_b = b;
2366       r_c = c;
2367       r_d = d;
2368
2369       w0_t[0] = esalt_buf1[ 8];
2370       w0_t[1] = esalt_buf1[ 9];
2371       w0_t[2] = esalt_buf1[10];
2372       w0_t[3] = esalt_buf1[11];
2373
2374       w1_t[0] = esalt_buf1[12];
2375       w1_t[1] = esalt_buf1[13];
2376       w1_t[2] = esalt_buf1[14];
2377       w1_t[3] = esalt_buf1[15];
2378
2379       w2_t[0] = esalt_buf2[ 0];
2380       w2_t[1] = esalt_buf2[ 1];
2381       w2_t[2] = esalt_buf2[ 2];
2382       w2_t[3] = esalt_buf2[ 3];
2383
2384       w3_t[0] = esalt_buf2[ 4];
2385       w3_t[1] = esalt_buf2[ 5];
2386       w3_t[2] = digest_esalt_len * 8;
2387       w3_t[3] = 0;
2388
2389       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2390       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2391       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2392       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2393       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2394       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2395       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2396       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2397       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2398       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2399       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2400       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2401       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2402       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2403       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2404       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2405
2406       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2407       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2408       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2409       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2410       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2411       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2412       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2413       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2414       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2415       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2416       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2417       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2418       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2419       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2420       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2421       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2422
2423       MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2424       MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2425       MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2426       MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2427       MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2428       MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2429       MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2430       MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2431       MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2432       MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2433       MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2434       MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2435       MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2436       MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2437       MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2438       MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2439
2440       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2441       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2442       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2443       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2444       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2445       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2446       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2447       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2448       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2449       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2450       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2451       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2452       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2453       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2454       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2455       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2456     }
2457
2458     a += r_a;
2459     b += r_b;
2460     c += r_c;
2461     d += r_d;
2462
2463     const u32 r0 = a;
2464     const u32 r1 = d;
2465     const u32 r2 = c;
2466     const u32 r3 = b;
2467
2468     #include COMPARE_S
2469   }
2470 }
2471
2472 __kernel void m11400_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
2473 {
2474 }
2475
2476 __kernel void m11400_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 sip_t *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
2477 {
2478 }