Fix for -m 1500, -m 3000: Missing "defined" keyword
[hashcat.git] / OpenCL / m11400_a3.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 static void m11400m_0_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
747 {
748   /**
749    * modifier
750    */
751
752   const u32 gid = get_global_id (0);
753   const u32 lid = get_local_id (0);
754
755   /**
756    * digest
757    */
758
759   const u32 search[4] =
760   {
761     digests_buf[digests_offset].digest_buf[DGST_R0],
762     digests_buf[digests_offset].digest_buf[DGST_R1],
763     digests_buf[digests_offset].digest_buf[DGST_R2],
764     digests_buf[digests_offset].digest_buf[DGST_R3]
765   };
766
767   /**
768    * salt
769    */
770
771   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
772
773   const u32 pw_salt_len = salt_len + pw_len;
774
775   u32 salt_buf0[16];
776
777   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
778   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
779   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
780   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
781   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
782   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
783   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
784   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
785   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
786   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
787   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
788   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
789   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
790   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
791   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
792   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
793
794   u32 salt_buf1[16];
795
796   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
797   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
798   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
799   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
800   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
801   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
802   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
803   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
804   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
805   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
806   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
807   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
808   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
809   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
810   salt_buf1[14] = 0;
811   salt_buf1[15] = 0;
812
813   /**
814    * esalt
815    */
816
817   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
818
819   u32 esalt_buf0[16];
820
821   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
822   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
823   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
824   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
825   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
826   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
827   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
828   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
829   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
830   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
831   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
832   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
833   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
834   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
835   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
836   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
837
838   u32 esalt_buf1[16];
839
840   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
841   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
842   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
843   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
844   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
845   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
846   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
847   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
848   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
849   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
850   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
851   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
852   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
853   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
854   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
855   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
856
857   const u32 digest_esalt_len = 32 + esalt_len;
858
859   /**
860    * loop
861    */
862
863   u32 w0l = w0[0];
864
865   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
866   {
867     const u32 w0r = bfs_buf[il_pos].i;
868
869     w0[0] = w0l | w0r;
870
871     /*
872      * HA1 = md5 ($salt . $pass)
873      */
874
875     // append the pass to the salt
876
877     u32 block0[16];
878
879     block0[ 0] = salt_buf0[ 0];
880     block0[ 1] = salt_buf0[ 1];
881     block0[ 2] = salt_buf0[ 2];
882     block0[ 3] = salt_buf0[ 3];
883     block0[ 4] = salt_buf0[ 4];
884     block0[ 5] = salt_buf0[ 5];
885     block0[ 6] = salt_buf0[ 6];
886     block0[ 7] = salt_buf0[ 7];
887     block0[ 8] = salt_buf0[ 8];
888     block0[ 9] = salt_buf0[ 9];
889     block0[10] = salt_buf0[10];
890     block0[11] = salt_buf0[11];
891     block0[12] = salt_buf0[12];
892     block0[13] = salt_buf0[13];
893     block0[14] = salt_buf0[14];
894     block0[15] = salt_buf0[15];
895
896     u32 block1[16];
897
898     block1[ 0] = salt_buf1[ 0];
899     block1[ 1] = salt_buf1[ 1];
900     block1[ 2] = salt_buf1[ 2];
901     block1[ 3] = salt_buf1[ 3];
902     block1[ 4] = salt_buf1[ 4];
903     block1[ 5] = salt_buf1[ 5];
904     block1[ 6] = salt_buf1[ 6];
905     block1[ 7] = salt_buf1[ 7];
906     block1[ 8] = salt_buf1[ 8];
907     block1[ 9] = salt_buf1[ 9];
908     block1[10] = salt_buf1[10];
909     block1[11] = salt_buf1[11];
910     block1[12] = salt_buf1[12];
911     block1[13] = salt_buf1[13];
912     block1[14] = salt_buf1[14];
913     block1[15] = salt_buf1[15];
914
915     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
916
917     u32 w0_t[4];
918
919     w0_t[0] = block0[ 0];
920     w0_t[1] = block0[ 1];
921     w0_t[2] = block0[ 2];
922     w0_t[3] = block0[ 3];
923
924     u32 w1_t[4];
925
926     w1_t[0] = block0[ 4];
927     w1_t[1] = block0[ 5];
928     w1_t[2] = block0[ 6];
929     w1_t[3] = block0[ 7];
930
931     u32 w2_t[4];
932
933     w2_t[0] = block0[ 8];
934     w2_t[1] = block0[ 9];
935     w2_t[2] = block0[10];
936     w2_t[3] = block0[11];
937
938     u32 w3_t[4];
939
940     w3_t[0] = block0[12];
941     w3_t[1] = block0[13];
942     w3_t[2] = pw_salt_len * 8;
943     w3_t[3] = 0;
944
945     // md5
946
947     u32 tmp2;
948
949     u32 a = MD5M_A;
950     u32 b = MD5M_B;
951     u32 c = MD5M_C;
952     u32 d = MD5M_D;
953
954     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
955     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
956     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
957     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
958     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
959     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
960     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
961     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
962     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
963     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
964     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
965     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
966     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
967     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
968     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
969     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
970
971     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
972     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
973     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
974     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
975     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
976     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
977     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
978     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
979     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
980     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
981     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
982     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
983     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
984     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
985     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
986     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
987
988     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
989     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
990     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
991     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
992     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
993     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
994     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
995     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
996     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
997     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
998     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
999     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1000     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1001     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1002     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1003     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1004
1005     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1006     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1007     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1008     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1009     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1010     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1011     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1012     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1013     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1014     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1015     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1016     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1017     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1018     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1019     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1020     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1021
1022     a += MD5M_A;
1023     b += MD5M_B;
1024     c += MD5M_C;
1025     d += MD5M_D;
1026
1027     /*
1028      * final = md5 ($HA1 . $esalt)
1029      * we have at least 2 MD5 blocks/transformations, but we might need 3
1030      */
1031
1032     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1033             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1034     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1035             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1036     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1037             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1038     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1039             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1040     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1041             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1042     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1043             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1044     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1045             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1046     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1047             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1048
1049     w2_t[0] = esalt_buf0[0];
1050     w2_t[1] = esalt_buf0[1];
1051     w2_t[2] = esalt_buf0[2];
1052     w2_t[3] = esalt_buf0[3];
1053
1054     w3_t[0] = esalt_buf0[4];
1055     w3_t[1] = esalt_buf0[5];
1056     w3_t[2] = esalt_buf0[6];
1057     w3_t[3] = esalt_buf0[7];
1058
1059     // md5
1060     // 1st transform
1061
1062     a = MD5M_A;
1063     b = MD5M_B;
1064     c = MD5M_C;
1065     d = MD5M_D;
1066
1067     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1068     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1069     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1070     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1071     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1072     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1073     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1074     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1075     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1076     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1077     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1078     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1079     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1080     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1081     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1082     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1083
1084     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1085     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1086     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1087     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1088     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1089     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1090     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1091     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1092     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1093     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1094     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1095     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1096     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1097     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1098     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1099     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1100
1101     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1102     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1103     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1104     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1105     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1106     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1107     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1108     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1109     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1110     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1111     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1112     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1113     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1114     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1115     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1116     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1117
1118     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1119     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1120     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1121     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1122     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1123     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1124     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1125     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1126     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1127     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1128     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1129     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1130     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1131     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1132     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1133     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1134
1135     a += MD5M_A;
1136     b += MD5M_B;
1137     c += MD5M_C;
1138     d += MD5M_D;
1139
1140     u32 r_a = a;
1141     u32 r_b = b;
1142     u32 r_c = c;
1143     u32 r_d = d;
1144
1145     // 2nd transform
1146
1147     w0_t[0] = esalt_buf0[ 8];
1148     w0_t[1] = esalt_buf0[ 9];
1149     w0_t[2] = esalt_buf0[10];
1150     w0_t[3] = esalt_buf0[11];
1151
1152     w1_t[0] = esalt_buf0[12];
1153     w1_t[1] = esalt_buf0[13];
1154     w1_t[2] = esalt_buf0[14];
1155     w1_t[3] = esalt_buf0[15];
1156
1157     w2_t[0] = esalt_buf1[ 0];
1158     w2_t[1] = esalt_buf1[ 1];
1159     w2_t[2] = esalt_buf1[ 2];
1160     w2_t[3] = esalt_buf1[ 3];
1161
1162     w3_t[0] = esalt_buf1[ 4];
1163     w3_t[1] = esalt_buf1[ 5];
1164     w3_t[2] = digest_esalt_len * 8;
1165     w3_t[3] = 0;
1166
1167     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1168     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1169     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1170     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1171     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1172     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1173     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1174     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1175     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1176     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1177     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1178     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1179     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1180     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1181     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1182     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1183
1184     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1185     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1186     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1187     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1188     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1189     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1190     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1191     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1192     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1193     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1194     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1195     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1196     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1197     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1198     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1199     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1200
1201     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1202     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1203     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1204     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1205     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1206     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1207     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1208     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1209     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1210     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1211     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1212     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1213     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1214     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1215     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1216     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1217
1218     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1219     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1220     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1221     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1222     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1223     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1224     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1225     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1226     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1227     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1228     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1229     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1230     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1231     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1232     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1233     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1234
1235     a += r_a;
1236     b += r_b;
1237     c += r_c;
1238     d += r_d;
1239
1240     const u32 r0 = a;
1241     const u32 r1 = d;
1242     const u32 r2 = c;
1243     const u32 r3 = b;
1244
1245     #include COMPARE_S
1246   }
1247 }
1248
1249 static void m11400m_0_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
1250 {
1251   /**
1252    * modifier
1253    */
1254
1255   const u32 gid = get_global_id (0);
1256   const u32 lid = get_local_id (0);
1257
1258   /**
1259    * digest
1260    */
1261
1262   const u32 search[4] =
1263   {
1264     digests_buf[digests_offset].digest_buf[DGST_R0],
1265     digests_buf[digests_offset].digest_buf[DGST_R1],
1266     digests_buf[digests_offset].digest_buf[DGST_R2],
1267     digests_buf[digests_offset].digest_buf[DGST_R3]
1268   };
1269
1270   /**
1271    * salt
1272    */
1273
1274   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1275
1276   const u32 pw_salt_len = salt_len + pw_len;
1277
1278   u32 salt_buf0[16];
1279
1280   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1281   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1282   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1283   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1284   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1285   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1286   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1287   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1288   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1289   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1290   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1291   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1292   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1293   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1294   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1295   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1296
1297   u32 salt_buf1[16];
1298
1299   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1300   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1301   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1302   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1303   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1304   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1305   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1306   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1307   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1308   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1309   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1310   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1311   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1312   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1313   salt_buf1[14] = 0;
1314   salt_buf1[15] = 0;
1315
1316   /**
1317    * esalt
1318    */
1319
1320   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1321
1322   u32 esalt_buf0[16];
1323
1324   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1325   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1326   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1327   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1328   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1329   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1330   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1331   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1332   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1333   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1334   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1335   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1336   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1337   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1338   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1339   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1340
1341   u32 esalt_buf1[16];
1342
1343   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1344   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1345   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1346   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1347   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1348   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1349   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1350   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1351   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1352   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1353   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1354   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1355   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1356   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1357   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1358   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1359
1360   u32 esalt_buf2[16];
1361
1362   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1363   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1364   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1365   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1366   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1367   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1368   esalt_buf2[ 6] = 0;
1369   esalt_buf2[ 7] = 0;
1370   esalt_buf2[ 8] = 0;
1371   esalt_buf2[ 9] = 0;
1372   esalt_buf2[10] = 0;
1373   esalt_buf2[11] = 0;
1374   esalt_buf2[12] = 0;
1375   esalt_buf2[13] = 0;
1376   esalt_buf2[14] = 0;
1377   esalt_buf2[15] = 0;
1378
1379   const u32 digest_esalt_len = 32 + esalt_len;
1380
1381   /**
1382    * loop
1383    */
1384
1385   u32 w0l = w0[0];
1386
1387   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
1388   {
1389     const u32 w0r = bfs_buf[il_pos].i;
1390
1391     w0[0] = w0l | w0r;
1392
1393     /*
1394      * HA1 = md5 ($salt . $pass)
1395      */
1396
1397     // append the pass to the salt
1398
1399     u32 block0[16];
1400
1401     block0[ 0] = salt_buf0[ 0];
1402     block0[ 1] = salt_buf0[ 1];
1403     block0[ 2] = salt_buf0[ 2];
1404     block0[ 3] = salt_buf0[ 3];
1405     block0[ 4] = salt_buf0[ 4];
1406     block0[ 5] = salt_buf0[ 5];
1407     block0[ 6] = salt_buf0[ 6];
1408     block0[ 7] = salt_buf0[ 7];
1409     block0[ 8] = salt_buf0[ 8];
1410     block0[ 9] = salt_buf0[ 9];
1411     block0[10] = salt_buf0[10];
1412     block0[11] = salt_buf0[11];
1413     block0[12] = salt_buf0[12];
1414     block0[13] = salt_buf0[13];
1415     block0[14] = salt_buf0[14];
1416     block0[15] = salt_buf0[15];
1417
1418     u32 block1[16];
1419
1420     block1[ 0] = salt_buf1[ 0];
1421     block1[ 1] = salt_buf1[ 1];
1422     block1[ 2] = salt_buf1[ 2];
1423     block1[ 3] = salt_buf1[ 3];
1424     block1[ 4] = salt_buf1[ 4];
1425     block1[ 5] = salt_buf1[ 5];
1426     block1[ 6] = salt_buf1[ 6];
1427     block1[ 7] = salt_buf1[ 7];
1428     block1[ 8] = salt_buf1[ 8];
1429     block1[ 9] = salt_buf1[ 9];
1430     block1[10] = salt_buf1[10];
1431     block1[11] = salt_buf1[11];
1432     block1[12] = salt_buf1[12];
1433     block1[13] = salt_buf1[13];
1434     block1[14] = salt_buf1[14];
1435     block1[15] = salt_buf1[15];
1436
1437     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1438
1439     u32 w0_t[4];
1440
1441     w0_t[0] = block0[ 0];
1442     w0_t[1] = block0[ 1];
1443     w0_t[2] = block0[ 2];
1444     w0_t[3] = block0[ 3];
1445
1446     u32 w1_t[4];
1447
1448     w1_t[0] = block0[ 4];
1449     w1_t[1] = block0[ 5];
1450     w1_t[2] = block0[ 6];
1451     w1_t[3] = block0[ 7];
1452
1453     u32 w2_t[4];
1454
1455     w2_t[0] = block0[ 8];
1456     w2_t[1] = block0[ 9];
1457     w2_t[2] = block0[10];
1458     w2_t[3] = block0[11];
1459
1460     u32 w3_t[4];
1461
1462     w3_t[0] = block0[12];
1463     w3_t[1] = block0[13];
1464     w3_t[2] = pw_salt_len * 8;
1465     w3_t[3] = 0;
1466
1467     // md5
1468
1469     u32 tmp2;
1470
1471     u32 a = MD5M_A;
1472     u32 b = MD5M_B;
1473     u32 c = MD5M_C;
1474     u32 d = MD5M_D;
1475
1476     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1477     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1478     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1479     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1480     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1481     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1482     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1483     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1484     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1485     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1486     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1487     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1488     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1489     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1490     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1491     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1492
1493     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1494     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1495     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1496     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1497     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1498     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1499     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1500     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1501     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1502     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1503     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1504     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1505     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1506     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1507     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1508     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1509
1510     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1511     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1512     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1513     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1514     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1515     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1516     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1517     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1518     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1519     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1520     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1521     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1522     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1523     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1524     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1525     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1526
1527     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1528     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1529     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1530     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1531     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1532     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1533     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1534     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1535     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1536     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1537     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1538     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1539     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1540     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1541     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1542     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1543
1544     a += MD5M_A;
1545     b += MD5M_B;
1546     c += MD5M_C;
1547     d += MD5M_D;
1548
1549     /*
1550      * final = md5 ($HA1 . $esalt)
1551      * we have at least 2 MD5 blocks/transformations, but we might need 3
1552      */
1553
1554     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1555             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1556     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1557             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1558     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1559             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1560     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1561             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1562     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1563             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1564     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1565             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1566     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1567             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1568     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1569             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1570
1571     w2_t[0] = esalt_buf0[0];
1572     w2_t[1] = esalt_buf0[1];
1573     w2_t[2] = esalt_buf0[2];
1574     w2_t[3] = esalt_buf0[3];
1575
1576     w3_t[0] = esalt_buf0[4];
1577     w3_t[1] = esalt_buf0[5];
1578     w3_t[2] = esalt_buf0[6];
1579     w3_t[3] = esalt_buf0[7];
1580
1581     // md5
1582     // 1st transform
1583
1584     a = MD5M_A;
1585     b = MD5M_B;
1586     c = MD5M_C;
1587     d = MD5M_D;
1588
1589     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1590     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1591     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1592     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1593     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1594     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1595     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1596     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1597     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1598     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1599     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1600     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1601     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1602     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1603     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1604     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1605
1606     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1607     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1608     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1609     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1610     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1611     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1612     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1613     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1614     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1615     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1616     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1617     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1618     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1619     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1620     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1621     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1622
1623     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1624     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1625     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1626     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1627     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1628     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1629     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1630     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1631     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1632     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1633     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1634     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1635     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1636     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1637     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1638     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1639
1640     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1641     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1642     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1643     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1644     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1645     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1646     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1647     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1648     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1649     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1650     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1651     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1652     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1653     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1654     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1655     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1656
1657     a += MD5M_A;
1658     b += MD5M_B;
1659     c += MD5M_C;
1660     d += MD5M_D;
1661
1662     u32 r_a = a;
1663     u32 r_b = b;
1664     u32 r_c = c;
1665     u32 r_d = d;
1666
1667     // 2nd transform
1668
1669     w0_t[0] = esalt_buf0[ 8];
1670     w0_t[1] = esalt_buf0[ 9];
1671     w0_t[2] = esalt_buf0[10];
1672     w0_t[3] = esalt_buf0[11];
1673
1674     w1_t[0] = esalt_buf0[12];
1675     w1_t[1] = esalt_buf0[13];
1676     w1_t[2] = esalt_buf0[14];
1677     w1_t[3] = esalt_buf0[15];
1678
1679     w2_t[0] = esalt_buf1[ 0];
1680     w2_t[1] = esalt_buf1[ 1];
1681     w2_t[2] = esalt_buf1[ 2];
1682     w2_t[3] = esalt_buf1[ 3];
1683
1684     w3_t[0] = esalt_buf1[ 4];
1685     w3_t[1] = esalt_buf1[ 5];
1686     w3_t[2] = esalt_buf1[ 6];
1687     w3_t[3] = esalt_buf1[ 7];
1688
1689     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1690     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1691     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1692     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1693     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1694     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1695     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1696     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1697     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1698     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1699     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1700     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1701     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1702     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1703     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1704     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1705
1706     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1707     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1708     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1709     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1710     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1711     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1712     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1713     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1714     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1715     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1716     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1717     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1718     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1719     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1720     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1721     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1722
1723     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1724     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1725     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1726     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1727     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1728     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1729     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1730     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1731     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1732     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1733     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1734     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1735     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1736     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1737     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1738     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1739
1740     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1741     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1742     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1743     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1744     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1745     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1746     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1747     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1748     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1749     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1750     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1751     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1752     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1753     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1754     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1755     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1756
1757     // this is for sure the final block
1758
1759     a += r_a;
1760     b += r_b;
1761     c += r_c;
1762     d += r_d;
1763
1764     r_a = a;
1765     r_b = b;
1766     r_c = c;
1767     r_d = d;
1768
1769     w0_t[0] = esalt_buf1[ 8];
1770     w0_t[1] = esalt_buf1[ 9];
1771     w0_t[2] = esalt_buf1[10];
1772     w0_t[3] = esalt_buf1[11];
1773
1774     w1_t[0] = esalt_buf1[12];
1775     w1_t[1] = esalt_buf1[13];
1776     w1_t[2] = esalt_buf1[14];
1777     w1_t[3] = esalt_buf1[15];
1778
1779     w2_t[0] = esalt_buf2[ 0];
1780     w2_t[1] = esalt_buf2[ 1];
1781     w2_t[2] = esalt_buf2[ 2];
1782     w2_t[3] = esalt_buf2[ 3];
1783
1784     w3_t[0] = esalt_buf2[ 4];
1785     w3_t[1] = esalt_buf2[ 5];
1786     w3_t[2] = digest_esalt_len * 8;
1787     w3_t[3] = 0;
1788
1789     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1790     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1791     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1792     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1793     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1794     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1795     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1796     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1797     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1798     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1799     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1800     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1801     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1802     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1803     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1804     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1805
1806     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1807     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1808     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1809     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1810     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1811     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1812     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1813     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1814     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1815     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1816     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1817     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1818     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1819     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1820     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1821     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1822
1823     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1824     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1825     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1826     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1827     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1828     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1829     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1830     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1831     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1832     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1833     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1834     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1835     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1836     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1837     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1838     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1839
1840     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1841     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1842     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1843     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1844     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1845     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1846     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1847     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1848     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1849     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1850     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1851     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1852     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1853     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1854     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1855     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1856
1857     a += r_a;
1858     b += r_b;
1859     c += r_c;
1860     d += r_d;
1861
1862     const u32 r0 = a;
1863     const u32 r1 = d;
1864     const u32 r2 = c;
1865     const u32 r3 = b;
1866
1867     #include COMPARE_S
1868   }
1869 }
1870
1871 static void m11400m_1_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
1872 {
1873   /**
1874    * modifier
1875    */
1876
1877   const u32 gid = get_global_id (0);
1878   const u32 lid = get_local_id (0);
1879
1880   /**
1881    * digest
1882    */
1883
1884   const u32 search[4] =
1885   {
1886     digests_buf[digests_offset].digest_buf[DGST_R0],
1887     digests_buf[digests_offset].digest_buf[DGST_R1],
1888     digests_buf[digests_offset].digest_buf[DGST_R2],
1889     digests_buf[digests_offset].digest_buf[DGST_R3]
1890   };
1891
1892   /**
1893    * salt
1894    */
1895
1896   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1897
1898   const u32 pw_salt_len = salt_len + pw_len;
1899
1900   u32 salt_buf0[16];
1901
1902   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1903   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1904   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1905   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1906   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1907   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1908   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1909   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1910   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1911   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1912   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1913   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1914   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1915   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1916   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1917   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1918
1919   u32 salt_buf1[16];
1920
1921   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1922   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1923   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1924   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1925   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1926   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1927   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1928   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1929   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1930   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1931   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1932   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1933   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1934   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1935   salt_buf1[14] = 0;
1936   salt_buf1[15] = 0;
1937
1938   /**
1939    * esalt
1940    */
1941
1942   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1943
1944   u32 esalt_buf0[16];
1945
1946   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1947   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1948   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1949   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1950   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1951   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1952   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1953   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1954   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1955   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1956   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1957   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1958   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1959   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1960   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1961   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1962
1963   u32 esalt_buf1[16];
1964
1965   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1966   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1967   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1968   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1969   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1970   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1971   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1972   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1973   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1974   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1975   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1976   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1977   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1978   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1979   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1980   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1981
1982   const u32 digest_esalt_len = 32 + esalt_len;
1983
1984   /**
1985    * loop
1986    */
1987
1988   u32 w0l = w0[0];
1989
1990   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
1991   {
1992     const u32 w0r = bfs_buf[il_pos].i;
1993
1994     w0[0] = w0l | w0r;
1995
1996     /*
1997      * HA1 = md5 ($salt . $pass)
1998      */
1999
2000     // append the pass to the salt
2001
2002     u32 block0[16];
2003
2004     block0[ 0] = salt_buf0[ 0];
2005     block0[ 1] = salt_buf0[ 1];
2006     block0[ 2] = salt_buf0[ 2];
2007     block0[ 3] = salt_buf0[ 3];
2008     block0[ 4] = salt_buf0[ 4];
2009     block0[ 5] = salt_buf0[ 5];
2010     block0[ 6] = salt_buf0[ 6];
2011     block0[ 7] = salt_buf0[ 7];
2012     block0[ 8] = salt_buf0[ 8];
2013     block0[ 9] = salt_buf0[ 9];
2014     block0[10] = salt_buf0[10];
2015     block0[11] = salt_buf0[11];
2016     block0[12] = salt_buf0[12];
2017     block0[13] = salt_buf0[13];
2018     block0[14] = salt_buf0[14];
2019     block0[15] = salt_buf0[15];
2020
2021     u32 block1[16];
2022
2023     block1[ 0] = salt_buf1[ 0];
2024     block1[ 1] = salt_buf1[ 1];
2025     block1[ 2] = salt_buf1[ 2];
2026     block1[ 3] = salt_buf1[ 3];
2027     block1[ 4] = salt_buf1[ 4];
2028     block1[ 5] = salt_buf1[ 5];
2029     block1[ 6] = salt_buf1[ 6];
2030     block1[ 7] = salt_buf1[ 7];
2031     block1[ 8] = salt_buf1[ 8];
2032     block1[ 9] = salt_buf1[ 9];
2033     block1[10] = salt_buf1[10];
2034     block1[11] = salt_buf1[11];
2035     block1[12] = salt_buf1[12];
2036     block1[13] = salt_buf1[13];
2037     block1[14] = salt_buf1[14];
2038     block1[15] = salt_buf1[15];
2039
2040     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
2041
2042     u32 w0_t[4];
2043
2044     w0_t[0] = block0[ 0];
2045     w0_t[1] = block0[ 1];
2046     w0_t[2] = block0[ 2];
2047     w0_t[3] = block0[ 3];
2048
2049     u32 w1_t[4];
2050
2051     w1_t[0] = block0[ 4];
2052     w1_t[1] = block0[ 5];
2053     w1_t[2] = block0[ 6];
2054     w1_t[3] = block0[ 7];
2055
2056     u32 w2_t[4];
2057
2058     w2_t[0] = block0[ 8];
2059     w2_t[1] = block0[ 9];
2060     w2_t[2] = block0[10];
2061     w2_t[3] = block0[11];
2062
2063     u32 w3_t[4];
2064
2065     w3_t[0] = block0[12];
2066     w3_t[1] = block0[13];
2067     w3_t[2] = block0[14];
2068     w3_t[3] = block0[15];
2069
2070     // md5
2071
2072     u32 tmp2;
2073
2074     u32 a = MD5M_A;
2075     u32 b = MD5M_B;
2076     u32 c = MD5M_C;
2077     u32 d = MD5M_D;
2078
2079     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2080     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2081     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2082     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2083     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2084     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2085     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2086     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2087     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2088     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2089     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2090     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2091     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2092     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2093     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2094     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2095
2096     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2097     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2098     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2099     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2100     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2101     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2102     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2103     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2104     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2105     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2106     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2107     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2108     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2109     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2110     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2111     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2112
2113     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2114     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2115     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2116     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2117     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2118     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2119     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2120     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2121     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2122     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2123     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2124     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2125     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2126     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2127     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2128     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2129
2130     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2131     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2132     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2133     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2134     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2135     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2136     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2137     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2138     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2139     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2140     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2141     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2142     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2143     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2144     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2145     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2146
2147     a += MD5M_A;
2148     b += MD5M_B;
2149     c += MD5M_C;
2150     d += MD5M_D;
2151
2152     u32 r_a = a;
2153     u32 r_b = b;
2154     u32 r_c = c;
2155     u32 r_d = d;
2156
2157     w0_t[0] = block1[ 0];
2158     w0_t[1] = block1[ 1];
2159     w0_t[2] = block1[ 2];
2160     w0_t[3] = block1[ 3];
2161
2162     w1_t[0] = block1[ 4];
2163     w1_t[1] = block1[ 5];
2164     w1_t[2] = block1[ 6];
2165     w1_t[3] = block1[ 7];
2166
2167     w2_t[0] = block1[ 8];
2168     w2_t[1] = block1[ 9];
2169     w2_t[2] = block1[10];
2170     w2_t[3] = block1[11];
2171
2172     w3_t[0] = block1[12];
2173     w3_t[1] = block1[13];
2174     w3_t[2] = pw_salt_len * 8;
2175     w3_t[3] = 0;
2176
2177     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2178     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2179     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2180     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2181     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2182     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2183     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2184     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2185     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2186     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2187     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2188     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2189     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2190     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2191     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2192     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2193
2194     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2195     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2196     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2197     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2198     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2199     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2200     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2201     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2202     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2203     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2204     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2205     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2206     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2207     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2208     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2209     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2210
2211     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2212     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2213     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2214     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2215     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2216     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2217     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2218     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2219     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2220     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2221     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2222     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2223     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2224     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2225     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2226     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2227
2228     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2229     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2230     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2231     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2232     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2233     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2234     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2235     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2236     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2237     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2238     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2239     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2240     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2241     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2242     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2243     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2244
2245     a += r_a;
2246     b += r_b;
2247     c += r_c;
2248     d += r_d;
2249
2250     /*
2251      * final = md5 ($HA1 . $esalt)
2252      * we have at least 2 MD5 blocks/transformations, but we might need 3
2253      */
2254
2255     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2256             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2257     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2258             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2259     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2260             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2261     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2262             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2263     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2264             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2265     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2266             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2267     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2268             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2269     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2270             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2271
2272     w2_t[0] = esalt_buf0[0];
2273     w2_t[1] = esalt_buf0[1];
2274     w2_t[2] = esalt_buf0[2];
2275     w2_t[3] = esalt_buf0[3];
2276
2277     w3_t[0] = esalt_buf0[4];
2278     w3_t[1] = esalt_buf0[5];
2279     w3_t[2] = esalt_buf0[6];
2280     w3_t[3] = esalt_buf0[7];
2281
2282     // md5
2283     // 1st transform
2284
2285     a = MD5M_A;
2286     b = MD5M_B;
2287     c = MD5M_C;
2288     d = MD5M_D;
2289
2290     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2291     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2292     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2293     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2294     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2295     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2296     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2297     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2298     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2299     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2300     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2301     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2302     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2303     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2304     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2305     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2306
2307     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2308     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2309     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2310     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2311     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2312     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2313     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2314     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2315     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2316     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2317     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2318     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2319     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2320     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2321     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2322     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2323
2324     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2325     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2326     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2327     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2328     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2329     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2330     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2331     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2332     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2333     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2334     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2335     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2336     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2337     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2338     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2339     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2340
2341     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2342     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2343     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2344     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2345     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2346     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2347     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2348     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2349     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2350     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2351     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2352     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2353     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2354     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2355     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2356     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2357
2358     a += MD5M_A;
2359     b += MD5M_B;
2360     c += MD5M_C;
2361     d += MD5M_D;
2362
2363     r_a = a;
2364     r_b = b;
2365     r_c = c;
2366     r_d = d;
2367
2368     // 2nd transform
2369
2370     w0_t[0] = esalt_buf0[ 8];
2371     w0_t[1] = esalt_buf0[ 9];
2372     w0_t[2] = esalt_buf0[10];
2373     w0_t[3] = esalt_buf0[11];
2374
2375     w1_t[0] = esalt_buf0[12];
2376     w1_t[1] = esalt_buf0[13];
2377     w1_t[2] = esalt_buf0[14];
2378     w1_t[3] = esalt_buf0[15];
2379
2380     w2_t[0] = esalt_buf1[ 0];
2381     w2_t[1] = esalt_buf1[ 1];
2382     w2_t[2] = esalt_buf1[ 2];
2383     w2_t[3] = esalt_buf1[ 3];
2384
2385     w3_t[0] = esalt_buf1[ 4];
2386     w3_t[1] = esalt_buf1[ 5];
2387     w3_t[2] = digest_esalt_len * 8;
2388     w3_t[3] = 0;
2389
2390     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2391     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2392     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2393     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2394     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2395     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2396     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2397     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2398     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2399     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2400     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2401     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2402     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2403     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2404     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2405     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2406
2407     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2408     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2409     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2410     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2411     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2412     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2413     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2414     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2415     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2416     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2417     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2418     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2419     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2420     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2421     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2422     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2423
2424     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2425     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2426     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2427     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2428     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2429     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2430     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2431     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2432     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2433     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2434     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2435     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2436     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2437     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2438     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2439     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2440
2441     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2442     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2443     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2444     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2445     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2446     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2447     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2448     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2449     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2450     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2451     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2452     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2453     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2454     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2455     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2456     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
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 static void m11400m_1_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
2473 {
2474   /**
2475    * modifier
2476    */
2477
2478   const u32 gid = get_global_id (0);
2479   const u32 lid = get_local_id (0);
2480
2481   /**
2482    * digest
2483    */
2484
2485   const u32 search[4] =
2486   {
2487     digests_buf[digests_offset].digest_buf[DGST_R0],
2488     digests_buf[digests_offset].digest_buf[DGST_R1],
2489     digests_buf[digests_offset].digest_buf[DGST_R2],
2490     digests_buf[digests_offset].digest_buf[DGST_R3]
2491   };
2492
2493   /**
2494    * salt
2495    */
2496
2497   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
2498
2499   const u32 pw_salt_len = salt_len + pw_len;
2500
2501   u32 salt_buf0[16];
2502
2503   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
2504   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
2505   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
2506   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
2507   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
2508   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
2509   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
2510   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
2511   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
2512   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
2513   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
2514   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
2515   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
2516   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
2517   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
2518   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
2519
2520   u32 salt_buf1[16];
2521
2522   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
2523   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
2524   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
2525   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
2526   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
2527   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
2528   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
2529   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
2530   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
2531   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
2532   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
2533   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
2534   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
2535   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
2536   salt_buf1[14] = 0;
2537   salt_buf1[15] = 0;
2538
2539   /**
2540    * esalt
2541    */
2542
2543   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
2544
2545   u32 esalt_buf0[16];
2546
2547   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
2548   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
2549   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
2550   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
2551   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
2552   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
2553   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
2554   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
2555   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
2556   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
2557   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
2558   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
2559   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
2560   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
2561   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
2562   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
2563
2564   u32 esalt_buf1[16];
2565
2566   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
2567   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
2568   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
2569   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
2570   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
2571   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
2572   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
2573   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
2574   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
2575   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
2576   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
2577   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
2578   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
2579   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
2580   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
2581   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
2582
2583   u32 esalt_buf2[16];
2584
2585   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
2586   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
2587   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
2588   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
2589   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
2590   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
2591   esalt_buf2[ 6] = 0;
2592   esalt_buf2[ 7] = 0;
2593   esalt_buf2[ 8] = 0;
2594   esalt_buf2[ 9] = 0;
2595   esalt_buf2[10] = 0;
2596   esalt_buf2[11] = 0;
2597   esalt_buf2[12] = 0;
2598   esalt_buf2[13] = 0;
2599   esalt_buf2[14] = 0;
2600   esalt_buf2[15] = 0;
2601
2602   const u32 digest_esalt_len = 32 + esalt_len;
2603
2604   /**
2605    * loop
2606    */
2607
2608   u32 w0l = w0[0];
2609
2610   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
2611   {
2612     const u32 w0r = bfs_buf[il_pos].i;
2613
2614     w0[0] = w0l | w0r;
2615
2616     /*
2617      * HA1 = md5 ($salt . $pass)
2618      */
2619
2620     // append the pass to the salt
2621
2622     u32 block0[16];
2623
2624     block0[ 0] = salt_buf0[ 0];
2625     block0[ 1] = salt_buf0[ 1];
2626     block0[ 2] = salt_buf0[ 2];
2627     block0[ 3] = salt_buf0[ 3];
2628     block0[ 4] = salt_buf0[ 4];
2629     block0[ 5] = salt_buf0[ 5];
2630     block0[ 6] = salt_buf0[ 6];
2631     block0[ 7] = salt_buf0[ 7];
2632     block0[ 8] = salt_buf0[ 8];
2633     block0[ 9] = salt_buf0[ 9];
2634     block0[10] = salt_buf0[10];
2635     block0[11] = salt_buf0[11];
2636     block0[12] = salt_buf0[12];
2637     block0[13] = salt_buf0[13];
2638     block0[14] = salt_buf0[14];
2639     block0[15] = salt_buf0[15];
2640
2641     u32 block1[16];
2642
2643     block1[ 0] = salt_buf1[ 0];
2644     block1[ 1] = salt_buf1[ 1];
2645     block1[ 2] = salt_buf1[ 2];
2646     block1[ 3] = salt_buf1[ 3];
2647     block1[ 4] = salt_buf1[ 4];
2648     block1[ 5] = salt_buf1[ 5];
2649     block1[ 6] = salt_buf1[ 6];
2650     block1[ 7] = salt_buf1[ 7];
2651     block1[ 8] = salt_buf1[ 8];
2652     block1[ 9] = salt_buf1[ 9];
2653     block1[10] = salt_buf1[10];
2654     block1[11] = salt_buf1[11];
2655     block1[12] = salt_buf1[12];
2656     block1[13] = salt_buf1[13];
2657     block1[14] = salt_buf1[14];
2658     block1[15] = salt_buf1[15];
2659
2660     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
2661
2662     u32 w0_t[4];
2663
2664     w0_t[0] = block0[ 0];
2665     w0_t[1] = block0[ 1];
2666     w0_t[2] = block0[ 2];
2667     w0_t[3] = block0[ 3];
2668
2669     u32 w1_t[4];
2670
2671     w1_t[0] = block0[ 4];
2672     w1_t[1] = block0[ 5];
2673     w1_t[2] = block0[ 6];
2674     w1_t[3] = block0[ 7];
2675
2676     u32 w2_t[4];
2677
2678     w2_t[0] = block0[ 8];
2679     w2_t[1] = block0[ 9];
2680     w2_t[2] = block0[10];
2681     w2_t[3] = block0[11];
2682
2683     u32 w3_t[4];
2684
2685     w3_t[0] = block0[12];
2686     w3_t[1] = block0[13];
2687     w3_t[2] = block0[14];
2688     w3_t[3] = block0[15];
2689
2690     // md5
2691
2692     u32 tmp2;
2693
2694     u32 a = MD5M_A;
2695     u32 b = MD5M_B;
2696     u32 c = MD5M_C;
2697     u32 d = MD5M_D;
2698
2699     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2700     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2701     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2702     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2703     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2704     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2705     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2706     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2707     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2708     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2709     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2710     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2711     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2712     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2713     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2714     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2715
2716     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2717     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2718     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2719     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2720     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2721     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2722     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2723     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2724     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2725     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2726     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2727     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2728     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2729     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2730     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2731     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2732
2733     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2734     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2735     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2736     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2737     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2738     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2739     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2740     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2741     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2742     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2743     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2744     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2745     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2746     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2747     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2748     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2749
2750     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2751     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2752     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2753     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2754     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2755     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2756     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2757     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2758     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2759     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2760     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2761     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2762     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2763     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2764     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2765     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2766
2767     a += MD5M_A;
2768     b += MD5M_B;
2769     c += MD5M_C;
2770     d += MD5M_D;
2771
2772     u32 r_a = a;
2773     u32 r_b = b;
2774     u32 r_c = c;
2775     u32 r_d = d;
2776
2777     w0_t[0] = block1[ 0];
2778     w0_t[1] = block1[ 1];
2779     w0_t[2] = block1[ 2];
2780     w0_t[3] = block1[ 3];
2781
2782     w1_t[0] = block1[ 4];
2783     w1_t[1] = block1[ 5];
2784     w1_t[2] = block1[ 6];
2785     w1_t[3] = block1[ 7];
2786
2787     w2_t[0] = block1[ 8];
2788     w2_t[1] = block1[ 9];
2789     w2_t[2] = block1[10];
2790     w2_t[3] = block1[11];
2791
2792     w3_t[0] = block1[12];
2793     w3_t[1] = block1[13];
2794     w3_t[2] = pw_salt_len * 8;
2795     w3_t[3] = 0;
2796
2797     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2798     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2799     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2800     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2801     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2802     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2803     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2804     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2805     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2806     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2807     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2808     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2809     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2810     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2811     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2812     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2813
2814     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2815     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2816     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2817     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2818     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2819     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2820     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2821     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2822     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2823     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2824     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2825     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2826     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2827     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2828     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2829     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2830
2831     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2832     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2833     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2834     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2835     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2836     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2837     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2838     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2839     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2840     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2841     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2842     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2843     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2844     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2845     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2846     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2847
2848     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2849     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2850     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2851     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2852     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2853     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2854     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2855     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2856     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2857     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2858     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2859     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2860     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2861     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2862     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2863     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2864
2865     a += r_a;
2866     b += r_b;
2867     c += r_c;
2868     d += r_d;
2869
2870     /*
2871      * final = md5 ($HA1 . $esalt)
2872      * we have at least 2 MD5 blocks/transformations, but we might need 3
2873      */
2874
2875     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2876             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2877     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2878             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2879     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2880             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2881     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2882             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2883     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2884             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2885     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2886             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2887     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2888             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2889     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2890             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2891
2892     w2_t[0] = esalt_buf0[0];
2893     w2_t[1] = esalt_buf0[1];
2894     w2_t[2] = esalt_buf0[2];
2895     w2_t[3] = esalt_buf0[3];
2896
2897     w3_t[0] = esalt_buf0[4];
2898     w3_t[1] = esalt_buf0[5];
2899     w3_t[2] = esalt_buf0[6];
2900     w3_t[3] = esalt_buf0[7];
2901
2902     // md5
2903     // 1st transform
2904
2905     a = MD5M_A;
2906     b = MD5M_B;
2907     c = MD5M_C;
2908     d = MD5M_D;
2909
2910     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2911     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2912     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2913     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2914     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2915     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2916     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2917     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2918     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2919     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2920     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2921     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2922     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2923     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2924     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2925     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2926
2927     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2928     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2929     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2930     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2931     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2932     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2933     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2934     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2935     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2936     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2937     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2938     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2939     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2940     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2941     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2942     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2943
2944     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2945     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2946     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2947     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2948     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2949     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2950     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2951     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2952     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2953     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2954     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2955     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2956     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2957     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2958     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2959     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2960
2961     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2962     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2963     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2964     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2965     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2966     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2967     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2968     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2969     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2970     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2971     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2972     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2973     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2974     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2975     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2976     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2977
2978     a += MD5M_A;
2979     b += MD5M_B;
2980     c += MD5M_C;
2981     d += MD5M_D;
2982
2983     r_a = a;
2984     r_b = b;
2985     r_c = c;
2986     r_d = d;
2987
2988     // 2nd transform
2989
2990     w0_t[0] = esalt_buf0[ 8];
2991     w0_t[1] = esalt_buf0[ 9];
2992     w0_t[2] = esalt_buf0[10];
2993     w0_t[3] = esalt_buf0[11];
2994
2995     w1_t[0] = esalt_buf0[12];
2996     w1_t[1] = esalt_buf0[13];
2997     w1_t[2] = esalt_buf0[14];
2998     w1_t[3] = esalt_buf0[15];
2999
3000     w2_t[0] = esalt_buf1[ 0];
3001     w2_t[1] = esalt_buf1[ 1];
3002     w2_t[2] = esalt_buf1[ 2];
3003     w2_t[3] = esalt_buf1[ 3];
3004
3005     w3_t[0] = esalt_buf1[ 4];
3006     w3_t[1] = esalt_buf1[ 5];
3007     w3_t[2] = esalt_buf1[ 6];
3008     w3_t[3] = esalt_buf1[ 7];
3009
3010     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3011     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3012     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3013     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3014     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3015     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3016     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3017     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3018     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3019     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3020     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3021     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3022     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3023     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3024     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3025     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3026
3027     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3028     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3029     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3030     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3031     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3032     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3033     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3034     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3035     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3036     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3037     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3038     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3039     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3040     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3041     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3042     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3043
3044     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3045     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3046     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3047     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3048     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3049     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3050     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3051     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3052     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3053     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3054     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3055     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3056     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3057     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3058     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3059     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3060
3061     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3062     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3063     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3064     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3065     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3066     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3067     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3068     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3069     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3070     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3071     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3072     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3073     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3074     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3075     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3076     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3077
3078     // this is for sure the final block
3079
3080     a += r_a;
3081     b += r_b;
3082     c += r_c;
3083     d += r_d;
3084
3085     r_a = a;
3086     r_b = b;
3087     r_c = c;
3088     r_d = d;
3089
3090     w0_t[0] = esalt_buf1[ 8];
3091     w0_t[1] = esalt_buf1[ 9];
3092     w0_t[2] = esalt_buf1[10];
3093     w0_t[3] = esalt_buf1[11];
3094
3095     w1_t[0] = esalt_buf1[12];
3096     w1_t[1] = esalt_buf1[13];
3097     w1_t[2] = esalt_buf1[14];
3098     w1_t[3] = esalt_buf1[15];
3099
3100     w2_t[0] = esalt_buf2[ 0];
3101     w2_t[1] = esalt_buf2[ 1];
3102     w2_t[2] = esalt_buf2[ 2];
3103     w2_t[3] = esalt_buf2[ 3];
3104
3105     w3_t[0] = esalt_buf2[ 4];
3106     w3_t[1] = esalt_buf2[ 5];
3107     w3_t[2] = digest_esalt_len * 8;
3108     w3_t[3] = 0;
3109
3110     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3111     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3112     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3113     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3114     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3115     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3116     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3117     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3118     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3119     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3120     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3121     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3122     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3123     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3124     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3125     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3126
3127     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3128     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3129     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3130     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3131     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3132     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3133     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3134     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3135     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3136     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3137     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3138     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3139     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3140     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3141     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3142     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3143
3144     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3145     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3146     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3147     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3148     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3149     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3150     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3151     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3152     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3153     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3154     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3155     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3156     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3157     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3158     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3159     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3160
3161     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3162     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3163     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3164     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3165     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3166     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3167     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3168     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3169     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3170     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3171     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3172     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3173     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3174     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3175     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3176     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3177
3178     a += r_a;
3179     b += r_b;
3180     c += r_c;
3181     d += r_d;
3182
3183     const u32 r0 = a;
3184     const u32 r1 = d;
3185     const u32 r2 = c;
3186     const u32 r3 = b;
3187
3188     #include COMPARE_S
3189   }
3190 }
3191
3192 static void m11400s_0_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
3193 {
3194   /**
3195    * modifier
3196    */
3197
3198   const u32 gid = get_global_id (0);
3199   const u32 lid = get_local_id (0);
3200
3201   /**
3202    * digest
3203    */
3204
3205   const u32 search[4] =
3206   {
3207     digests_buf[digests_offset].digest_buf[DGST_R0],
3208     digests_buf[digests_offset].digest_buf[DGST_R1],
3209     digests_buf[digests_offset].digest_buf[DGST_R2],
3210     digests_buf[digests_offset].digest_buf[DGST_R3]
3211   };
3212
3213   /**
3214    * salt
3215    */
3216
3217   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
3218
3219   const u32 pw_salt_len = salt_len + pw_len;
3220
3221   u32 salt_buf0[16];
3222
3223   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
3224   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
3225   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
3226   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
3227   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
3228   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
3229   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
3230   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
3231   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
3232   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
3233   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
3234   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
3235   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
3236   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
3237   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
3238   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
3239
3240   u32 salt_buf1[16];
3241
3242   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
3243   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
3244   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
3245   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
3246   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
3247   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
3248   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
3249   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
3250   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
3251   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
3252   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
3253   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
3254   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
3255   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
3256   salt_buf1[14] = 0;
3257   salt_buf1[15] = 0;
3258
3259   /**
3260    * esalt
3261    */
3262
3263   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
3264
3265   u32 esalt_buf0[16];
3266
3267   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
3268   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
3269   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
3270   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
3271   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
3272   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
3273   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
3274   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
3275   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
3276   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
3277   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
3278   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
3279   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
3280   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
3281   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
3282   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
3283
3284   u32 esalt_buf1[16];
3285
3286   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
3287   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
3288   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
3289   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
3290   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
3291   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
3292   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
3293   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
3294   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
3295   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
3296   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
3297   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
3298   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
3299   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
3300   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
3301   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
3302
3303   const u32 digest_esalt_len = 32 + esalt_len;
3304
3305   /**
3306    * loop
3307    */
3308
3309   u32 w0l = w0[0];
3310
3311   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
3312   {
3313     const u32 w0r = bfs_buf[il_pos].i;
3314
3315     w0[0] = w0l | w0r;
3316
3317     /*
3318      * HA1 = md5 ($salt . $pass)
3319      */
3320
3321     // append the pass to the salt
3322
3323     u32 block0[16];
3324
3325     block0[ 0] = salt_buf0[ 0];
3326     block0[ 1] = salt_buf0[ 1];
3327     block0[ 2] = salt_buf0[ 2];
3328     block0[ 3] = salt_buf0[ 3];
3329     block0[ 4] = salt_buf0[ 4];
3330     block0[ 5] = salt_buf0[ 5];
3331     block0[ 6] = salt_buf0[ 6];
3332     block0[ 7] = salt_buf0[ 7];
3333     block0[ 8] = salt_buf0[ 8];
3334     block0[ 9] = salt_buf0[ 9];
3335     block0[10] = salt_buf0[10];
3336     block0[11] = salt_buf0[11];
3337     block0[12] = salt_buf0[12];
3338     block0[13] = salt_buf0[13];
3339     block0[14] = salt_buf0[14];
3340     block0[15] = salt_buf0[15];
3341
3342     u32 block1[16];
3343
3344     block1[ 0] = salt_buf1[ 0];
3345     block1[ 1] = salt_buf1[ 1];
3346     block1[ 2] = salt_buf1[ 2];
3347     block1[ 3] = salt_buf1[ 3];
3348     block1[ 4] = salt_buf1[ 4];
3349     block1[ 5] = salt_buf1[ 5];
3350     block1[ 6] = salt_buf1[ 6];
3351     block1[ 7] = salt_buf1[ 7];
3352     block1[ 8] = salt_buf1[ 8];
3353     block1[ 9] = salt_buf1[ 9];
3354     block1[10] = salt_buf1[10];
3355     block1[11] = salt_buf1[11];
3356     block1[12] = salt_buf1[12];
3357     block1[13] = salt_buf1[13];
3358     block1[14] = salt_buf1[14];
3359     block1[15] = salt_buf1[15];
3360
3361     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
3362
3363     u32 w0_t[4];
3364
3365     w0_t[0] = block0[ 0];
3366     w0_t[1] = block0[ 1];
3367     w0_t[2] = block0[ 2];
3368     w0_t[3] = block0[ 3];
3369
3370     u32 w1_t[4];
3371
3372     w1_t[0] = block0[ 4];
3373     w1_t[1] = block0[ 5];
3374     w1_t[2] = block0[ 6];
3375     w1_t[3] = block0[ 7];
3376
3377     u32 w2_t[4];
3378
3379     w2_t[0] = block0[ 8];
3380     w2_t[1] = block0[ 9];
3381     w2_t[2] = block0[10];
3382     w2_t[3] = block0[11];
3383
3384     u32 w3_t[4];
3385
3386     w3_t[0] = block0[12];
3387     w3_t[1] = block0[13];
3388     w3_t[2] = pw_salt_len * 8;
3389     w3_t[3] = 0;
3390
3391     // md5
3392
3393     u32 tmp2;
3394
3395     u32 a = MD5M_A;
3396     u32 b = MD5M_B;
3397     u32 c = MD5M_C;
3398     u32 d = MD5M_D;
3399
3400     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3401     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3402     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3403     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3404     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3405     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3406     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3407     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3408     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3409     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3410     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3411     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3412     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3413     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3414     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3415     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3416
3417     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3418     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3419     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3420     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3421     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3422     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3423     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3424     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3425     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3426     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3427     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3428     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3429     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3430     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3431     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3432     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3433
3434     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3435     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3436     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3437     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3438     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3439     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3440     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3441     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3442     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3443     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3444     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3445     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3446     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3447     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3448     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3449     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3450
3451     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3452     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3453     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3454     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3455     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3456     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3457     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3458     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3459     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3460     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3461     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3462     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3463     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3464     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3465     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3466     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3467
3468     a += MD5M_A;
3469     b += MD5M_B;
3470     c += MD5M_C;
3471     d += MD5M_D;
3472
3473     /*
3474      * final = md5 ($HA1 . $esalt)
3475      * we have at least 2 MD5 blocks/transformations, but we might need 3
3476      */
3477
3478     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
3479             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
3480     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
3481             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
3482     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
3483             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
3484     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
3485             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
3486     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
3487             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
3488     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
3489             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
3490     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
3491             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
3492     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
3493             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
3494
3495     w2_t[0] = esalt_buf0[0];
3496     w2_t[1] = esalt_buf0[1];
3497     w2_t[2] = esalt_buf0[2];
3498     w2_t[3] = esalt_buf0[3];
3499
3500     w3_t[0] = esalt_buf0[4];
3501     w3_t[1] = esalt_buf0[5];
3502     w3_t[2] = esalt_buf0[6];
3503     w3_t[3] = esalt_buf0[7];
3504
3505     // md5
3506     // 1st transform
3507
3508     a = MD5M_A;
3509     b = MD5M_B;
3510     c = MD5M_C;
3511     d = MD5M_D;
3512
3513     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3514     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3515     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3516     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3517     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3518     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3519     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3520     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3521     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3522     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3523     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3524     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3525     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3526     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3527     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3528     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3529
3530     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3531     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3532     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3533     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3534     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3535     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3536     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3537     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3538     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3539     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3540     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3541     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3542     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3543     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3544     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3545     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3546
3547     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3548     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3549     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3550     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3551     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3552     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3553     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3554     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3555     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3556     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3557     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3558     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3559     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3560     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3561     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3562     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3563
3564     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3565     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3566     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3567     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3568     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3569     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3570     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3571     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3572     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3573     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3574     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3575     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3576     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3577     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3578     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3579     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3580
3581     a += MD5M_A;
3582     b += MD5M_B;
3583     c += MD5M_C;
3584     d += MD5M_D;
3585
3586     u32 r_a = a;
3587     u32 r_b = b;
3588     u32 r_c = c;
3589     u32 r_d = d;
3590
3591     // 2nd transform
3592
3593     w0_t[0] = esalt_buf0[ 8];
3594     w0_t[1] = esalt_buf0[ 9];
3595     w0_t[2] = esalt_buf0[10];
3596     w0_t[3] = esalt_buf0[11];
3597
3598     w1_t[0] = esalt_buf0[12];
3599     w1_t[1] = esalt_buf0[13];
3600     w1_t[2] = esalt_buf0[14];
3601     w1_t[3] = esalt_buf0[15];
3602
3603     w2_t[0] = esalt_buf1[ 0];
3604     w2_t[1] = esalt_buf1[ 1];
3605     w2_t[2] = esalt_buf1[ 2];
3606     w2_t[3] = esalt_buf1[ 3];
3607
3608     w3_t[0] = esalt_buf1[ 4];
3609     w3_t[1] = esalt_buf1[ 5];
3610     w3_t[2] = digest_esalt_len * 8;
3611     w3_t[3] = 0;
3612
3613     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3614     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3615     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3616     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3617     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3618     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3619     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3620     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3621     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3622     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3623     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3624     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3625     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3626     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3627     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3628     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3629
3630     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3631     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3632     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3633     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3634     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3635     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3636     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3637     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3638     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3639     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3640     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3641     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3642     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3643     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3644     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3645     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3646
3647     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3648     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3649     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3650     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3651     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3652     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3653     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3654     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3655     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3656     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3657     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3658     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3659     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3660     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3661     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3662     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3663
3664     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3665     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3666     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3667     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3668     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3669     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3670     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3671     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3672     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3673     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3674     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3675     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3676     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3677     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3678     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3679     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3680
3681     a += r_a;
3682     b += r_b;
3683     c += r_c;
3684     d += r_d;
3685
3686     const u32 r0 = a;
3687     const u32 r1 = d;
3688     const u32 r2 = c;
3689     const u32 r3 = b;
3690
3691     #include COMPARE_S
3692   }
3693 }
3694
3695 static void m11400s_0_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
3696 {
3697   /**
3698    * modifier
3699    */
3700
3701   const u32 gid = get_global_id (0);
3702   const u32 lid = get_local_id (0);
3703
3704   /**
3705    * digest
3706    */
3707
3708   const u32 search[4] =
3709   {
3710     digests_buf[digests_offset].digest_buf[DGST_R0],
3711     digests_buf[digests_offset].digest_buf[DGST_R1],
3712     digests_buf[digests_offset].digest_buf[DGST_R2],
3713     digests_buf[digests_offset].digest_buf[DGST_R3]
3714   };
3715
3716   /**
3717    * salt
3718    */
3719
3720   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
3721
3722   const u32 pw_salt_len = salt_len + pw_len;
3723
3724   u32 salt_buf0[16];
3725
3726   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
3727   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
3728   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
3729   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
3730   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
3731   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
3732   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
3733   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
3734   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
3735   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
3736   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
3737   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
3738   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
3739   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
3740   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
3741   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
3742
3743   u32 salt_buf1[16];
3744
3745   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
3746   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
3747   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
3748   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
3749   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
3750   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
3751   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
3752   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
3753   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
3754   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
3755   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
3756   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
3757   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
3758   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
3759   salt_buf1[14] = 0;
3760   salt_buf1[15] = 0;
3761
3762   /**
3763    * esalt
3764    */
3765
3766   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
3767
3768   u32 esalt_buf0[16];
3769
3770   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
3771   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
3772   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
3773   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
3774   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
3775   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
3776   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
3777   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
3778   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
3779   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
3780   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
3781   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
3782   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
3783   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
3784   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
3785   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
3786
3787   u32 esalt_buf1[16];
3788
3789   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
3790   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
3791   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
3792   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
3793   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
3794   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
3795   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
3796   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
3797   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
3798   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
3799   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
3800   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
3801   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
3802   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
3803   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
3804   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
3805
3806   u32 esalt_buf2[16];
3807
3808   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
3809   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
3810   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
3811   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
3812   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
3813   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
3814   esalt_buf2[ 6] = 0;
3815   esalt_buf2[ 7] = 0;
3816   esalt_buf2[ 8] = 0;
3817   esalt_buf2[ 9] = 0;
3818   esalt_buf2[10] = 0;
3819   esalt_buf2[11] = 0;
3820   esalt_buf2[12] = 0;
3821   esalt_buf2[13] = 0;
3822   esalt_buf2[14] = 0;
3823   esalt_buf2[15] = 0;
3824
3825   const u32 digest_esalt_len = 32 + esalt_len;
3826
3827   /**
3828    * loop
3829    */
3830
3831   u32 w0l = w0[0];
3832
3833   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
3834   {
3835     const u32 w0r = bfs_buf[il_pos].i;
3836
3837     w0[0] = w0l | w0r;
3838
3839     /*
3840      * HA1 = md5 ($salt . $pass)
3841      */
3842
3843     // append the pass to the salt
3844
3845     u32 block0[16];
3846
3847     block0[ 0] = salt_buf0[ 0];
3848     block0[ 1] = salt_buf0[ 1];
3849     block0[ 2] = salt_buf0[ 2];
3850     block0[ 3] = salt_buf0[ 3];
3851     block0[ 4] = salt_buf0[ 4];
3852     block0[ 5] = salt_buf0[ 5];
3853     block0[ 6] = salt_buf0[ 6];
3854     block0[ 7] = salt_buf0[ 7];
3855     block0[ 8] = salt_buf0[ 8];
3856     block0[ 9] = salt_buf0[ 9];
3857     block0[10] = salt_buf0[10];
3858     block0[11] = salt_buf0[11];
3859     block0[12] = salt_buf0[12];
3860     block0[13] = salt_buf0[13];
3861     block0[14] = salt_buf0[14];
3862     block0[15] = salt_buf0[15];
3863
3864     u32 block1[16];
3865
3866     block1[ 0] = salt_buf1[ 0];
3867     block1[ 1] = salt_buf1[ 1];
3868     block1[ 2] = salt_buf1[ 2];
3869     block1[ 3] = salt_buf1[ 3];
3870     block1[ 4] = salt_buf1[ 4];
3871     block1[ 5] = salt_buf1[ 5];
3872     block1[ 6] = salt_buf1[ 6];
3873     block1[ 7] = salt_buf1[ 7];
3874     block1[ 8] = salt_buf1[ 8];
3875     block1[ 9] = salt_buf1[ 9];
3876     block1[10] = salt_buf1[10];
3877     block1[11] = salt_buf1[11];
3878     block1[12] = salt_buf1[12];
3879     block1[13] = salt_buf1[13];
3880     block1[14] = salt_buf1[14];
3881     block1[15] = salt_buf1[15];
3882
3883     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
3884
3885     u32 w0_t[4];
3886
3887     w0_t[0] = block0[ 0];
3888     w0_t[1] = block0[ 1];
3889     w0_t[2] = block0[ 2];
3890     w0_t[3] = block0[ 3];
3891
3892     u32 w1_t[4];
3893
3894     w1_t[0] = block0[ 4];
3895     w1_t[1] = block0[ 5];
3896     w1_t[2] = block0[ 6];
3897     w1_t[3] = block0[ 7];
3898
3899     u32 w2_t[4];
3900
3901     w2_t[0] = block0[ 8];
3902     w2_t[1] = block0[ 9];
3903     w2_t[2] = block0[10];
3904     w2_t[3] = block0[11];
3905
3906     u32 w3_t[4];
3907
3908     w3_t[0] = block0[12];
3909     w3_t[1] = block0[13];
3910     w3_t[2] = pw_salt_len * 8;
3911     w3_t[3] = 0;
3912
3913     // md5
3914
3915     u32 tmp2;
3916
3917     u32 a = MD5M_A;
3918     u32 b = MD5M_B;
3919     u32 c = MD5M_C;
3920     u32 d = MD5M_D;
3921
3922     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3923     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3924     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3925     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3926     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3927     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3928     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3929     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3930     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3931     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3932     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3933     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3934     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3935     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3936     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3937     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3938
3939     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3940     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3941     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3942     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3943     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3944     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3945     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3946     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3947     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3948     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3949     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3950     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3951     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3952     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3953     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3954     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3955
3956     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
3957     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
3958     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
3959     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
3960     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
3961     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
3962     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
3963     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
3964     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
3965     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
3966     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3967     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3968     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3969     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3970     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3971     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3972
3973     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3974     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3975     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3976     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3977     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3978     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3979     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3980     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3981     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3982     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3983     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3984     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3985     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3986     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3987     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3988     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3989
3990     a += MD5M_A;
3991     b += MD5M_B;
3992     c += MD5M_C;
3993     d += MD5M_D;
3994
3995     /*
3996      * final = md5 ($HA1 . $esalt)
3997      * we have at least 2 MD5 blocks/transformations, but we might need 3
3998      */
3999
4000     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
4001             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
4002     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
4003             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
4004     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
4005             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
4006     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
4007             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
4008     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
4009             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
4010     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
4011             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
4012     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
4013             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
4014     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
4015             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
4016
4017     w2_t[0] = esalt_buf0[0];
4018     w2_t[1] = esalt_buf0[1];
4019     w2_t[2] = esalt_buf0[2];
4020     w2_t[3] = esalt_buf0[3];
4021
4022     w3_t[0] = esalt_buf0[4];
4023     w3_t[1] = esalt_buf0[5];
4024     w3_t[2] = esalt_buf0[6];
4025     w3_t[3] = esalt_buf0[7];
4026
4027     // md5
4028     // 1st transform
4029
4030     a = MD5M_A;
4031     b = MD5M_B;
4032     c = MD5M_C;
4033     d = MD5M_D;
4034
4035     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4036     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4037     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4038     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4039     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4040     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4041     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4042     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4043     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4044     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4045     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4046     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4047     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4048     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4049     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4050     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4051
4052     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4053     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4054     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4055     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4056     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4057     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4058     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4059     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4060     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4061     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4062     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4063     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4064     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4065     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4066     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4067     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4068
4069     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4070     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4071     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4072     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4073     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4074     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4075     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4076     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4077     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4078     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4079     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4080     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4081     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4082     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4083     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4084     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4085
4086     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4087     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4088     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4089     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4090     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4091     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4092     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4093     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4094     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4095     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4096     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4097     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4098     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4099     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4100     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4101     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4102
4103     a += MD5M_A;
4104     b += MD5M_B;
4105     c += MD5M_C;
4106     d += MD5M_D;
4107
4108     u32 r_a = a;
4109     u32 r_b = b;
4110     u32 r_c = c;
4111     u32 r_d = d;
4112
4113     // 2nd transform
4114
4115     w0_t[0] = esalt_buf0[ 8];
4116     w0_t[1] = esalt_buf0[ 9];
4117     w0_t[2] = esalt_buf0[10];
4118     w0_t[3] = esalt_buf0[11];
4119
4120     w1_t[0] = esalt_buf0[12];
4121     w1_t[1] = esalt_buf0[13];
4122     w1_t[2] = esalt_buf0[14];
4123     w1_t[3] = esalt_buf0[15];
4124
4125     w2_t[0] = esalt_buf1[ 0];
4126     w2_t[1] = esalt_buf1[ 1];
4127     w2_t[2] = esalt_buf1[ 2];
4128     w2_t[3] = esalt_buf1[ 3];
4129
4130     w3_t[0] = esalt_buf1[ 4];
4131     w3_t[1] = esalt_buf1[ 5];
4132     w3_t[2] = esalt_buf1[ 6];
4133     w3_t[3] = esalt_buf1[ 7];
4134
4135     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4136     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4137     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4138     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4139     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4140     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4141     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4142     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4143     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4144     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4145     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4146     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4147     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4148     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4149     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4150     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4151
4152     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4153     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4154     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4155     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4156     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4157     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4158     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4159     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4160     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4161     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4162     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4163     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4164     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4165     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4166     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4167     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4168
4169     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4170     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4171     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4172     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4173     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4174     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4175     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4176     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4177     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4178     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4179     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4180     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4181     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4182     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4183     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4184     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4185
4186     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4187     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4188     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4189     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4190     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4191     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4192     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4193     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4194     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4195     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4196     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4197     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4198     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4199     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4200     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4201     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4202
4203     // this is for sure the final block
4204
4205     a += r_a;
4206     b += r_b;
4207     c += r_c;
4208     d += r_d;
4209
4210     r_a = a;
4211     r_b = b;
4212     r_c = c;
4213     r_d = d;
4214
4215     w0_t[0] = esalt_buf1[ 8];
4216     w0_t[1] = esalt_buf1[ 9];
4217     w0_t[2] = esalt_buf1[10];
4218     w0_t[3] = esalt_buf1[11];
4219
4220     w1_t[0] = esalt_buf1[12];
4221     w1_t[1] = esalt_buf1[13];
4222     w1_t[2] = esalt_buf1[14];
4223     w1_t[3] = esalt_buf1[15];
4224
4225     w2_t[0] = esalt_buf2[ 0];
4226     w2_t[1] = esalt_buf2[ 1];
4227     w2_t[2] = esalt_buf2[ 2];
4228     w2_t[3] = esalt_buf2[ 3];
4229
4230     w3_t[0] = esalt_buf2[ 4];
4231     w3_t[1] = esalt_buf2[ 5];
4232     w3_t[2] = digest_esalt_len * 8;
4233     w3_t[3] = 0;
4234
4235     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4236     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4237     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4238     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4239     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4240     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4241     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4242     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4243     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4244     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4245     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4246     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4247     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4248     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4249     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4250     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4251
4252     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4253     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4254     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4255     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4256     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4257     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4258     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4259     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4260     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4261     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4262     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4263     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4264     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4265     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4266     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4267     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4268
4269     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4270     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4271     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4272     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4273     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4274     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4275     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4276     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4277     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4278     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4279     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4280     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4281     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4282     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4283     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4284     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4285
4286     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4287     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4288     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4289     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4290     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4291     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4292     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4293     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4294     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4295     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4296     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4297     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4298     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4299     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4300     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4301     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4302
4303     a += r_a;
4304     b += r_b;
4305     c += r_c;
4306     d += r_d;
4307
4308     const u32 r0 = a;
4309     const u32 r1 = d;
4310     const u32 r2 = c;
4311     const u32 r3 = b;
4312
4313     #include COMPARE_S
4314   }
4315 }
4316
4317 static void m11400s_1_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
4318 {
4319   /**
4320    * modifier
4321    */
4322
4323   const u32 gid = get_global_id (0);
4324   const u32 lid = get_local_id (0);
4325
4326   /**
4327    * digest
4328    */
4329
4330   const u32 search[4] =
4331   {
4332     digests_buf[digests_offset].digest_buf[DGST_R0],
4333     digests_buf[digests_offset].digest_buf[DGST_R1],
4334     digests_buf[digests_offset].digest_buf[DGST_R2],
4335     digests_buf[digests_offset].digest_buf[DGST_R3]
4336   };
4337
4338   /**
4339    * salt
4340    */
4341
4342   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
4343
4344   const u32 pw_salt_len = salt_len + pw_len;
4345
4346   u32 salt_buf0[16];
4347
4348   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
4349   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
4350   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
4351   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
4352   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
4353   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
4354   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
4355   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
4356   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
4357   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
4358   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
4359   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
4360   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
4361   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
4362   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
4363   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
4364
4365   u32 salt_buf1[16];
4366
4367   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
4368   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
4369   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
4370   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
4371   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
4372   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
4373   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
4374   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
4375   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
4376   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
4377   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
4378   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
4379   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
4380   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
4381   salt_buf1[14] = 0;
4382   salt_buf1[15] = 0;
4383
4384   /**
4385    * esalt
4386    */
4387
4388   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
4389
4390   u32 esalt_buf0[16];
4391
4392   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
4393   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
4394   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
4395   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
4396   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
4397   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
4398   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
4399   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
4400   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
4401   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
4402   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
4403   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
4404   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
4405   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
4406   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
4407   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
4408
4409   u32 esalt_buf1[16];
4410
4411   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
4412   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
4413   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
4414   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
4415   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
4416   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
4417   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
4418   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
4419   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
4420   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
4421   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
4422   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
4423   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
4424   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
4425   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
4426   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
4427
4428   const u32 digest_esalt_len = 32 + esalt_len;
4429
4430   /**
4431    * loop
4432    */
4433
4434   u32 w0l = w0[0];
4435
4436   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
4437   {
4438     const u32 w0r = bfs_buf[il_pos].i;
4439
4440     w0[0] = w0l | w0r;
4441
4442     /*
4443      * HA1 = md5 ($salt . $pass)
4444      */
4445
4446     // append the pass to the salt
4447
4448     u32 block0[16];
4449
4450     block0[ 0] = salt_buf0[ 0];
4451     block0[ 1] = salt_buf0[ 1];
4452     block0[ 2] = salt_buf0[ 2];
4453     block0[ 3] = salt_buf0[ 3];
4454     block0[ 4] = salt_buf0[ 4];
4455     block0[ 5] = salt_buf0[ 5];
4456     block0[ 6] = salt_buf0[ 6];
4457     block0[ 7] = salt_buf0[ 7];
4458     block0[ 8] = salt_buf0[ 8];
4459     block0[ 9] = salt_buf0[ 9];
4460     block0[10] = salt_buf0[10];
4461     block0[11] = salt_buf0[11];
4462     block0[12] = salt_buf0[12];
4463     block0[13] = salt_buf0[13];
4464     block0[14] = salt_buf0[14];
4465     block0[15] = salt_buf0[15];
4466
4467     u32 block1[16];
4468
4469     block1[ 0] = salt_buf1[ 0];
4470     block1[ 1] = salt_buf1[ 1];
4471     block1[ 2] = salt_buf1[ 2];
4472     block1[ 3] = salt_buf1[ 3];
4473     block1[ 4] = salt_buf1[ 4];
4474     block1[ 5] = salt_buf1[ 5];
4475     block1[ 6] = salt_buf1[ 6];
4476     block1[ 7] = salt_buf1[ 7];
4477     block1[ 8] = salt_buf1[ 8];
4478     block1[ 9] = salt_buf1[ 9];
4479     block1[10] = salt_buf1[10];
4480     block1[11] = salt_buf1[11];
4481     block1[12] = salt_buf1[12];
4482     block1[13] = salt_buf1[13];
4483     block1[14] = salt_buf1[14];
4484     block1[15] = salt_buf1[15];
4485
4486     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
4487
4488     u32 w0_t[4];
4489
4490     w0_t[0] = block0[ 0];
4491     w0_t[1] = block0[ 1];
4492     w0_t[2] = block0[ 2];
4493     w0_t[3] = block0[ 3];
4494
4495     u32 w1_t[4];
4496
4497     w1_t[0] = block0[ 4];
4498     w1_t[1] = block0[ 5];
4499     w1_t[2] = block0[ 6];
4500     w1_t[3] = block0[ 7];
4501
4502     u32 w2_t[4];
4503
4504     w2_t[0] = block0[ 8];
4505     w2_t[1] = block0[ 9];
4506     w2_t[2] = block0[10];
4507     w2_t[3] = block0[11];
4508
4509     u32 w3_t[4];
4510
4511     w3_t[0] = block0[12];
4512     w3_t[1] = block0[13];
4513     w3_t[2] = block0[14];
4514     w3_t[3] = block0[15];
4515
4516     // md5
4517
4518     u32 tmp2;
4519
4520     u32 a = MD5M_A;
4521     u32 b = MD5M_B;
4522     u32 c = MD5M_C;
4523     u32 d = MD5M_D;
4524
4525     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4526     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4527     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4528     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4529     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4530     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4531     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4532     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4533     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4534     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4535     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4536     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4537     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4538     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4539     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4540     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4541
4542     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4543     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4544     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4545     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4546     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4547     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4548     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4549     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4550     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4551     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4552     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4553     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4554     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4555     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4556     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4557     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4558
4559     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4560     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4561     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4562     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4563     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4564     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4565     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4566     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4567     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4568     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4569     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4570     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4571     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4572     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4573     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4574     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4575
4576     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4577     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4578     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4579     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4580     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4581     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4582     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4583     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4584     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4585     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4586     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4587     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4588     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4589     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4590     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4591     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4592
4593     a += MD5M_A;
4594     b += MD5M_B;
4595     c += MD5M_C;
4596     d += MD5M_D;
4597
4598     u32 r_a = a;
4599     u32 r_b = b;
4600     u32 r_c = c;
4601     u32 r_d = d;
4602
4603     w0_t[0] = block1[ 0];
4604     w0_t[1] = block1[ 1];
4605     w0_t[2] = block1[ 2];
4606     w0_t[3] = block1[ 3];
4607
4608     w1_t[0] = block1[ 4];
4609     w1_t[1] = block1[ 5];
4610     w1_t[2] = block1[ 6];
4611     w1_t[3] = block1[ 7];
4612
4613     w2_t[0] = block1[ 8];
4614     w2_t[1] = block1[ 9];
4615     w2_t[2] = block1[10];
4616     w2_t[3] = block1[11];
4617
4618     w3_t[0] = block1[12];
4619     w3_t[1] = block1[13];
4620     w3_t[2] = pw_salt_len * 8;
4621     w3_t[3] = 0;
4622
4623     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4624     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4625     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4626     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4627     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4628     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4629     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4630     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4631     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4632     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4633     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4634     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4635     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4636     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4637     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4638     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4639
4640     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4641     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4642     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4643     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4644     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4645     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4646     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4647     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4648     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4649     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4650     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4651     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4652     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4653     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4654     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4655     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4656
4657     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4658     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4659     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4660     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4661     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4662     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4663     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4664     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4665     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4666     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4667     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4668     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4669     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4670     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4671     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4672     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4673
4674     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4675     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4676     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4677     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4678     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4679     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4680     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4681     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4682     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4683     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4684     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4685     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4686     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4687     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4688     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4689     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4690
4691     a += r_a;
4692     b += r_b;
4693     c += r_c;
4694     d += r_d;
4695
4696     /*
4697      * final = md5 ($HA1 . $esalt)
4698      * we have at least 2 MD5 blocks/transformations, but we might need 3
4699      */
4700
4701     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
4702             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
4703     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
4704             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
4705     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
4706             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
4707     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
4708             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
4709     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
4710             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
4711     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
4712             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
4713     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
4714             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
4715     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
4716             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
4717
4718     w2_t[0] = esalt_buf0[0];
4719     w2_t[1] = esalt_buf0[1];
4720     w2_t[2] = esalt_buf0[2];
4721     w2_t[3] = esalt_buf0[3];
4722
4723     w3_t[0] = esalt_buf0[4];
4724     w3_t[1] = esalt_buf0[5];
4725     w3_t[2] = esalt_buf0[6];
4726     w3_t[3] = esalt_buf0[7];
4727
4728     // md5
4729     // 1st transform
4730
4731     a = MD5M_A;
4732     b = MD5M_B;
4733     c = MD5M_C;
4734     d = MD5M_D;
4735
4736     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4737     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4738     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4739     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4740     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4741     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4742     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4743     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4744     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4745     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4746     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4747     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4748     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4749     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4750     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4751     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4752
4753     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4754     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4755     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4756     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4757     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4758     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4759     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4760     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4761     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4762     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4763     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4764     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4765     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4766     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4767     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4768     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4769
4770     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4771     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4772     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4773     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4774     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4775     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4776     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4777     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4778     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4779     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4780     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4781     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4782     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4783     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4784     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4785     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4786
4787     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4788     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4789     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4790     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4791     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4792     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4793     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4794     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4795     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4796     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4797     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4798     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4799     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4800     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4801     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4802     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4803
4804     a += MD5M_A;
4805     b += MD5M_B;
4806     c += MD5M_C;
4807     d += MD5M_D;
4808
4809     r_a = a;
4810     r_b = b;
4811     r_c = c;
4812     r_d = d;
4813
4814     // 2nd transform
4815
4816     w0_t[0] = esalt_buf0[ 8];
4817     w0_t[1] = esalt_buf0[ 9];
4818     w0_t[2] = esalt_buf0[10];
4819     w0_t[3] = esalt_buf0[11];
4820
4821     w1_t[0] = esalt_buf0[12];
4822     w1_t[1] = esalt_buf0[13];
4823     w1_t[2] = esalt_buf0[14];
4824     w1_t[3] = esalt_buf0[15];
4825
4826     w2_t[0] = esalt_buf1[ 0];
4827     w2_t[1] = esalt_buf1[ 1];
4828     w2_t[2] = esalt_buf1[ 2];
4829     w2_t[3] = esalt_buf1[ 3];
4830
4831     w3_t[0] = esalt_buf1[ 4];
4832     w3_t[1] = esalt_buf1[ 5];
4833     w3_t[2] = digest_esalt_len * 8;
4834     w3_t[3] = 0;
4835
4836     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4837     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4838     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4839     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4840     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4841     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4842     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4843     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4844     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4845     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4846     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4847     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4848     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4849     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4850     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4851     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4852
4853     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4854     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4855     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4856     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4857     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4858     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4859     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4860     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4861     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4862     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4863     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4864     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4865     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4866     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4867     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4868     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4869
4870     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
4871     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
4872     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
4873     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
4874     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
4875     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
4876     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
4877     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
4878     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
4879     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
4880     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4881     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4882     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4883     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4884     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4885     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4886
4887     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4888     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4889     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4890     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4891     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4892     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4893     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4894     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4895     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4896     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4897     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4898     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4899     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4900     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4901     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4902     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4903
4904     a += r_a;
4905     b += r_b;
4906     c += r_c;
4907     d += r_d;
4908
4909     const u32 r0 = a;
4910     const u32 r1 = d;
4911     const u32 r2 = c;
4912     const u32 r3 = b;
4913
4914     #include COMPARE_S
4915   }
4916 }
4917
4918 static void m11400s_1_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256])
4919 {
4920   /**
4921    * modifier
4922    */
4923
4924   const u32 gid = get_global_id (0);
4925   const u32 lid = get_local_id (0);
4926
4927   /**
4928    * digest
4929    */
4930
4931   const u32 search[4] =
4932   {
4933     digests_buf[digests_offset].digest_buf[DGST_R0],
4934     digests_buf[digests_offset].digest_buf[DGST_R1],
4935     digests_buf[digests_offset].digest_buf[DGST_R2],
4936     digests_buf[digests_offset].digest_buf[DGST_R3]
4937   };
4938
4939   /**
4940    * salt
4941    */
4942
4943   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
4944
4945   const u32 pw_salt_len = salt_len + pw_len;
4946
4947   u32 salt_buf0[16];
4948
4949   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
4950   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
4951   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
4952   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
4953   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
4954   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
4955   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
4956   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
4957   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
4958   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
4959   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
4960   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
4961   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
4962   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
4963   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
4964   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
4965
4966   u32 salt_buf1[16];
4967
4968   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
4969   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
4970   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
4971   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
4972   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
4973   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
4974   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
4975   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
4976   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
4977   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
4978   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
4979   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
4980   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
4981   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
4982   salt_buf1[14] = 0;
4983   salt_buf1[15] = 0;
4984
4985   /**
4986    * esalt
4987    */
4988
4989   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
4990
4991   u32 esalt_buf0[16];
4992
4993   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
4994   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
4995   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
4996   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
4997   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
4998   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
4999   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
5000   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
5001   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
5002   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
5003   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
5004   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
5005   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
5006   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
5007   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
5008   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
5009
5010   u32 esalt_buf1[16];
5011
5012   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
5013   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
5014   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
5015   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
5016   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
5017   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
5018   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
5019   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
5020   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
5021   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
5022   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
5023   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
5024   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
5025   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
5026   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
5027   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
5028
5029   u32 esalt_buf2[16];
5030
5031   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
5032   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
5033   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
5034   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
5035   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
5036   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
5037   esalt_buf2[ 6] = 0;
5038   esalt_buf2[ 7] = 0;
5039   esalt_buf2[ 8] = 0;
5040   esalt_buf2[ 9] = 0;
5041   esalt_buf2[10] = 0;
5042   esalt_buf2[11] = 0;
5043   esalt_buf2[12] = 0;
5044   esalt_buf2[13] = 0;
5045   esalt_buf2[14] = 0;
5046   esalt_buf2[15] = 0;
5047
5048   const u32 digest_esalt_len = 32 + esalt_len;
5049
5050   /**
5051    * loop
5052    */
5053
5054   u32 w0l = w0[0];
5055
5056   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
5057   {
5058     const u32 w0r = bfs_buf[il_pos].i;
5059
5060     w0[0] = w0l | w0r;
5061
5062     /*
5063      * HA1 = md5 ($salt . $pass)
5064      */
5065
5066     // append the pass to the salt
5067
5068     u32 block0[16];
5069
5070     block0[ 0] = salt_buf0[ 0];
5071     block0[ 1] = salt_buf0[ 1];
5072     block0[ 2] = salt_buf0[ 2];
5073     block0[ 3] = salt_buf0[ 3];
5074     block0[ 4] = salt_buf0[ 4];
5075     block0[ 5] = salt_buf0[ 5];
5076     block0[ 6] = salt_buf0[ 6];
5077     block0[ 7] = salt_buf0[ 7];
5078     block0[ 8] = salt_buf0[ 8];
5079     block0[ 9] = salt_buf0[ 9];
5080     block0[10] = salt_buf0[10];
5081     block0[11] = salt_buf0[11];
5082     block0[12] = salt_buf0[12];
5083     block0[13] = salt_buf0[13];
5084     block0[14] = salt_buf0[14];
5085     block0[15] = salt_buf0[15];
5086
5087     u32 block1[16];
5088
5089     block1[ 0] = salt_buf1[ 0];
5090     block1[ 1] = salt_buf1[ 1];
5091     block1[ 2] = salt_buf1[ 2];
5092     block1[ 3] = salt_buf1[ 3];
5093     block1[ 4] = salt_buf1[ 4];
5094     block1[ 5] = salt_buf1[ 5];
5095     block1[ 6] = salt_buf1[ 6];
5096     block1[ 7] = salt_buf1[ 7];
5097     block1[ 8] = salt_buf1[ 8];
5098     block1[ 9] = salt_buf1[ 9];
5099     block1[10] = salt_buf1[10];
5100     block1[11] = salt_buf1[11];
5101     block1[12] = salt_buf1[12];
5102     block1[13] = salt_buf1[13];
5103     block1[14] = salt_buf1[14];
5104     block1[15] = salt_buf1[15];
5105
5106     memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
5107
5108     u32 w0_t[4];
5109
5110     w0_t[0] = block0[ 0];
5111     w0_t[1] = block0[ 1];
5112     w0_t[2] = block0[ 2];
5113     w0_t[3] = block0[ 3];
5114
5115     u32 w1_t[4];
5116
5117     w1_t[0] = block0[ 4];
5118     w1_t[1] = block0[ 5];
5119     w1_t[2] = block0[ 6];
5120     w1_t[3] = block0[ 7];
5121
5122     u32 w2_t[4];
5123
5124     w2_t[0] = block0[ 8];
5125     w2_t[1] = block0[ 9];
5126     w2_t[2] = block0[10];
5127     w2_t[3] = block0[11];
5128
5129     u32 w3_t[4];
5130
5131     w3_t[0] = block0[12];
5132     w3_t[1] = block0[13];
5133     w3_t[2] = block0[14];
5134     w3_t[3] = block0[15];
5135
5136     // md5
5137
5138     u32 tmp2;
5139
5140     u32 a = MD5M_A;
5141     u32 b = MD5M_B;
5142     u32 c = MD5M_C;
5143     u32 d = MD5M_D;
5144
5145     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5146     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5147     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5148     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5149     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5150     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5151     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5152     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5153     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5154     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5155     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5156     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5157     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5158     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5159     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5160     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5161
5162     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5163     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5164     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5165     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5166     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5167     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5168     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5169     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5170     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5171     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5172     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5173     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5174     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5175     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5176     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5177     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5178
5179     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
5180     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
5181     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
5182     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
5183     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
5184     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
5185     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
5186     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
5187     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
5188     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
5189     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5190     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5191     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5192     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5193     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5194     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5195
5196     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5197     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5198     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5199     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5200     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5201     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5202     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5203     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5204     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5205     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5206     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5207     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5208     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5209     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5210     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5211     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5212
5213     a += MD5M_A;
5214     b += MD5M_B;
5215     c += MD5M_C;
5216     d += MD5M_D;
5217
5218     u32 r_a = a;
5219     u32 r_b = b;
5220     u32 r_c = c;
5221     u32 r_d = d;
5222
5223     w0_t[0] = block1[ 0];
5224     w0_t[1] = block1[ 1];
5225     w0_t[2] = block1[ 2];
5226     w0_t[3] = block1[ 3];
5227
5228     w1_t[0] = block1[ 4];
5229     w1_t[1] = block1[ 5];
5230     w1_t[2] = block1[ 6];
5231     w1_t[3] = block1[ 7];
5232
5233     w2_t[0] = block1[ 8];
5234     w2_t[1] = block1[ 9];
5235     w2_t[2] = block1[10];
5236     w2_t[3] = block1[11];
5237
5238     w3_t[0] = block1[12];
5239     w3_t[1] = block1[13];
5240     w3_t[2] = pw_salt_len * 8;
5241     w3_t[3] = 0;
5242
5243     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5244     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5245     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5246     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5247     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5248     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5249     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5250     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5251     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5252     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5253     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5254     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5255     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5256     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5257     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5258     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5259
5260     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5261     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5262     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5263     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5264     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5265     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5266     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5267     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5268     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5269     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5270     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5271     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5272     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5273     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5274     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5275     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5276
5277     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
5278     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
5279     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
5280     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
5281     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
5282     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
5283     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
5284     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
5285     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
5286     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
5287     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5288     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5289     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5290     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5291     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5292     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5293
5294     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5295     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5296     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5297     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5298     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5299     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5300     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5301     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5302     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5303     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5304     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5305     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5306     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5307     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5308     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5309     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5310
5311     a += r_a;
5312     b += r_b;
5313     c += r_c;
5314     d += r_d;
5315
5316     /*
5317      * final = md5 ($HA1 . $esalt)
5318      * we have at least 2 MD5 blocks/transformations, but we might need 3
5319      */
5320
5321     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
5322             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
5323     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
5324             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
5325     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
5326             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
5327     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
5328             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
5329     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
5330             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
5331     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
5332             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
5333     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
5334             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
5335     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
5336             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
5337
5338     w2_t[0] = esalt_buf0[0];
5339     w2_t[1] = esalt_buf0[1];
5340     w2_t[2] = esalt_buf0[2];
5341     w2_t[3] = esalt_buf0[3];
5342
5343     w3_t[0] = esalt_buf0[4];
5344     w3_t[1] = esalt_buf0[5];
5345     w3_t[2] = esalt_buf0[6];
5346     w3_t[3] = esalt_buf0[7];
5347
5348     // md5
5349     // 1st transform
5350
5351     a = MD5M_A;
5352     b = MD5M_B;
5353     c = MD5M_C;
5354     d = MD5M_D;
5355
5356     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5357     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5358     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5359     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5360     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5361     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5362     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5363     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5364     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5365     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5366     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5367     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5368     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5369     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5370     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5371     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5372
5373     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5374     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5375     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5376     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5377     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5378     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5379     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5380     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5381     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5382     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5383     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5384     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5385     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5386     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5387     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5388     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5389
5390     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
5391     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
5392     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
5393     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
5394     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
5395     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
5396     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
5397     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
5398     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
5399     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
5400     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5401     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5402     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5403     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5404     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5405     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5406
5407     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5408     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5409     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5410     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5411     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5412     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5413     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5414     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5415     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5416     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5417     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5418     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5419     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5420     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5421     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5422     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5423
5424     a += MD5M_A;
5425     b += MD5M_B;
5426     c += MD5M_C;
5427     d += MD5M_D;
5428
5429     r_a = a;
5430     r_b = b;
5431     r_c = c;
5432     r_d = d;
5433
5434     // 2nd transform
5435
5436     w0_t[0] = esalt_buf0[ 8];
5437     w0_t[1] = esalt_buf0[ 9];
5438     w0_t[2] = esalt_buf0[10];
5439     w0_t[3] = esalt_buf0[11];
5440
5441     w1_t[0] = esalt_buf0[12];
5442     w1_t[1] = esalt_buf0[13];
5443     w1_t[2] = esalt_buf0[14];
5444     w1_t[3] = esalt_buf0[15];
5445
5446     w2_t[0] = esalt_buf1[ 0];
5447     w2_t[1] = esalt_buf1[ 1];
5448     w2_t[2] = esalt_buf1[ 2];
5449     w2_t[3] = esalt_buf1[ 3];
5450
5451     w3_t[0] = esalt_buf1[ 4];
5452     w3_t[1] = esalt_buf1[ 5];
5453     w3_t[2] = esalt_buf1[ 6];
5454     w3_t[3] = esalt_buf1[ 7];
5455
5456     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5457     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5458     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5459     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5460     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5461     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5462     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5463     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5464     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5465     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5466     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5467     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5468     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5469     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5470     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5471     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5472
5473     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5474     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5475     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5476     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5477     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5478     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5479     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5480     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5481     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5482     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5483     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5484     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5485     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5486     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5487     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5488     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5489
5490     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
5491     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
5492     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
5493     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
5494     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
5495     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
5496     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
5497     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
5498     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
5499     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
5500     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5501     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5502     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5503     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5504     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5505     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5506
5507     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5508     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5509     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5510     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5511     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5512     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5513     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5514     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5515     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5516     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5517     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5518     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5519     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5520     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5521     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5522     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5523
5524     // this is for sure the final block
5525
5526     a += r_a;
5527     b += r_b;
5528     c += r_c;
5529     d += r_d;
5530
5531     r_a = a;
5532     r_b = b;
5533     r_c = c;
5534     r_d = d;
5535
5536     w0_t[0] = esalt_buf1[ 8];
5537     w0_t[1] = esalt_buf1[ 9];
5538     w0_t[2] = esalt_buf1[10];
5539     w0_t[3] = esalt_buf1[11];
5540
5541     w1_t[0] = esalt_buf1[12];
5542     w1_t[1] = esalt_buf1[13];
5543     w1_t[2] = esalt_buf1[14];
5544     w1_t[3] = esalt_buf1[15];
5545
5546     w2_t[0] = esalt_buf2[ 0];
5547     w2_t[1] = esalt_buf2[ 1];
5548     w2_t[2] = esalt_buf2[ 2];
5549     w2_t[3] = esalt_buf2[ 3];
5550
5551     w3_t[0] = esalt_buf2[ 4];
5552     w3_t[1] = esalt_buf2[ 5];
5553     w3_t[2] = digest_esalt_len * 8;
5554     w3_t[3] = 0;
5555
5556     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5557     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5558     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5559     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5560     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5561     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5562     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5563     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5564     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5565     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5566     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5567     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5568     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5569     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5570     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5571     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5572
5573     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5574     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5575     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5576     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5577     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5578     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5579     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5580     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5581     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5582     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5583     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5584     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5585     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5586     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5587     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5588     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5589
5590     MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
5591     MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
5592     MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
5593     MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
5594     MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
5595     MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
5596     MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
5597     MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
5598     MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
5599     MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
5600     MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5601     MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5602     MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5603     MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5604     MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5605     MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5606
5607     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5608     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5609     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5610     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5611     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5612     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5613     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5614     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5615     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5616     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5617     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5618     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5619     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5620     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5621     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5622     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5623
5624     a += r_a;
5625     b += r_b;
5626     c += r_c;
5627     d += r_d;
5628
5629     const u32 r0 = a;
5630     const u32 r1 = d;
5631     const u32 r2 = c;
5632     const u32 r3 = b;
5633
5634     #include COMPARE_S
5635   }
5636 }
5637
5638 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
5639 {
5640   /**
5641    * base
5642    */
5643
5644   const u32 gid = get_global_id (0);
5645
5646   /**
5647    * modifier
5648    */
5649
5650   const u32 lid = get_local_id (0);
5651
5652
5653   u32 w0[4];
5654
5655   w0[0] = pws[gid].i[ 0];
5656   w0[1] = pws[gid].i[ 1];
5657   w0[2] = pws[gid].i[ 2];
5658   w0[3] = pws[gid].i[ 3];
5659
5660   u32 w1[4];
5661
5662   w1[0] = 0;
5663   w1[1] = 0;
5664   w1[2] = 0;
5665   w1[3] = 0;
5666
5667   u32 w2[4];
5668
5669   w2[0] = 0;
5670   w2[1] = 0;
5671   w2[2] = 0;
5672   w2[3] = 0;
5673
5674   u32 w3[4];
5675
5676   w3[0] = 0;
5677   w3[1] = 0;
5678   w3[2] = pws[gid].i[14];
5679   w3[3] = 0;
5680
5681   const u32 pw_len = pws[gid].pw_len;
5682
5683   /**
5684    * bin2asc table
5685    */
5686
5687   __local u32 l_bin2asc[256];
5688
5689   const u32 lid4 = lid * 4;
5690
5691   const u32 lid40 = lid4 + 0;
5692   const u32 lid41 = lid4 + 1;
5693   const u32 lid42 = lid4 + 2;
5694   const u32 lid43 = lid4 + 3;
5695
5696   const u32 v400 = (lid40 >> 0) & 15;
5697   const u32 v401 = (lid40 >> 4) & 15;
5698   const u32 v410 = (lid41 >> 0) & 15;
5699   const u32 v411 = (lid41 >> 4) & 15;
5700   const u32 v420 = (lid42 >> 0) & 15;
5701   const u32 v421 = (lid42 >> 4) & 15;
5702   const u32 v430 = (lid43 >> 0) & 15;
5703   const u32 v431 = (lid43 >> 4) & 15;
5704
5705   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
5706                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
5707   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
5708                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
5709   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
5710                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
5711   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
5712                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
5713
5714   barrier (CLK_LOCAL_MEM_FENCE);
5715
5716   if (gid >= gid_max) return;
5717
5718   /**
5719    * main
5720    */
5721
5722   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5723   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5724
5725   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5726   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5727
5728   switch (sw_1 | sw_2)
5729   {
5730     case 0:
5731       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5732       break;
5733     case 1:
5734       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5735       break;
5736     case 2:
5737       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5738       break;
5739     case 3:
5740       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5741       break;
5742   }
5743 }
5744
5745 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
5746 {
5747   /**
5748    * base
5749    */
5750
5751   const u32 gid = get_global_id (0);
5752
5753   /**
5754    * modifier
5755    */
5756
5757   const u32 lid = get_local_id (0);
5758
5759   u32 w0[4];
5760
5761   w0[0] = pws[gid].i[ 0];
5762   w0[1] = pws[gid].i[ 1];
5763   w0[2] = pws[gid].i[ 2];
5764   w0[3] = pws[gid].i[ 3];
5765
5766   u32 w1[4];
5767
5768   w1[0] = pws[gid].i[ 4];
5769   w1[1] = pws[gid].i[ 5];
5770   w1[2] = pws[gid].i[ 6];
5771   w1[3] = pws[gid].i[ 7];
5772
5773   u32 w2[4];
5774
5775   w2[0] = 0;
5776   w2[1] = 0;
5777   w2[2] = 0;
5778   w2[3] = 0;
5779
5780   u32 w3[4];
5781
5782   w3[0] = 0;
5783   w3[1] = 0;
5784   w3[2] = pws[gid].i[14];
5785   w3[3] = 0;
5786
5787   const u32 pw_len = pws[gid].pw_len;
5788
5789   /**
5790    * bin2asc table
5791    */
5792
5793   __local u32 l_bin2asc[256];
5794
5795   const u32 lid4 = lid * 4;
5796
5797   const u32 lid40 = lid4 + 0;
5798   const u32 lid41 = lid4 + 1;
5799   const u32 lid42 = lid4 + 2;
5800   const u32 lid43 = lid4 + 3;
5801
5802   const u32 v400 = (lid40 >> 0) & 15;
5803   const u32 v401 = (lid40 >> 4) & 15;
5804   const u32 v410 = (lid41 >> 0) & 15;
5805   const u32 v411 = (lid41 >> 4) & 15;
5806   const u32 v420 = (lid42 >> 0) & 15;
5807   const u32 v421 = (lid42 >> 4) & 15;
5808   const u32 v430 = (lid43 >> 0) & 15;
5809   const u32 v431 = (lid43 >> 4) & 15;
5810
5811   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
5812                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
5813   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
5814                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
5815   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
5816                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
5817   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
5818                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
5819
5820   barrier (CLK_LOCAL_MEM_FENCE);
5821
5822   if (gid >= gid_max) return;
5823
5824   /**
5825    * main
5826    */
5827
5828   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5829   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5830
5831   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5832   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5833
5834   switch (sw_1 | sw_2)
5835   {
5836     case 0:
5837       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5838       break;
5839     case 1:
5840       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5841       break;
5842     case 2:
5843       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5844       break;
5845     case 3:
5846       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5847       break;
5848   }
5849 }
5850
5851 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
5852 {
5853   /**
5854    * base
5855    */
5856
5857   const u32 gid = get_global_id (0);
5858
5859   /**
5860    * modifier
5861    */
5862
5863   const u32 lid = get_local_id (0);
5864
5865   u32 w0[4];
5866
5867   w0[0] = pws[gid].i[ 0];
5868   w0[1] = pws[gid].i[ 1];
5869   w0[2] = pws[gid].i[ 2];
5870   w0[3] = pws[gid].i[ 3];
5871
5872   u32 w1[4];
5873
5874   w1[0] = pws[gid].i[ 4];
5875   w1[1] = pws[gid].i[ 5];
5876   w1[2] = pws[gid].i[ 6];
5877   w1[3] = pws[gid].i[ 7];
5878
5879   u32 w2[4];
5880
5881   w2[0] = pws[gid].i[ 8];
5882   w2[1] = pws[gid].i[ 9];
5883   w2[2] = pws[gid].i[10];
5884   w2[3] = pws[gid].i[11];
5885
5886   u32 w3[4];
5887
5888   w3[0] = pws[gid].i[12];
5889   w3[1] = pws[gid].i[13];
5890   w3[2] = pws[gid].i[14];
5891   w3[3] = pws[gid].i[15];
5892
5893   const u32 pw_len = pws[gid].pw_len;
5894
5895   /**
5896    * bin2asc table
5897    */
5898
5899   __local u32 l_bin2asc[256];
5900
5901   const u32 lid4 = lid * 4;
5902
5903   const u32 lid40 = lid4 + 0;
5904   const u32 lid41 = lid4 + 1;
5905   const u32 lid42 = lid4 + 2;
5906   const u32 lid43 = lid4 + 3;
5907
5908   const u32 v400 = (lid40 >> 0) & 15;
5909   const u32 v401 = (lid40 >> 4) & 15;
5910   const u32 v410 = (lid41 >> 0) & 15;
5911   const u32 v411 = (lid41 >> 4) & 15;
5912   const u32 v420 = (lid42 >> 0) & 15;
5913   const u32 v421 = (lid42 >> 4) & 15;
5914   const u32 v430 = (lid43 >> 0) & 15;
5915   const u32 v431 = (lid43 >> 4) & 15;
5916
5917   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
5918                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
5919   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
5920                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
5921   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
5922                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
5923   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
5924                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
5925
5926   barrier (CLK_LOCAL_MEM_FENCE);
5927
5928   if (gid >= gid_max) return;
5929
5930   /**
5931    * main
5932    */
5933
5934   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5935   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5936
5937   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5938   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5939
5940   switch (sw_1 | sw_2)
5941   {
5942     case 0:
5943       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5944       break;
5945     case 1:
5946       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5947       break;
5948     case 2:
5949       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5950       break;
5951     case 3:
5952       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
5953       break;
5954   }
5955 }
5956
5957 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
5958 {
5959   /**
5960    * base
5961    */
5962
5963   const u32 gid = get_global_id (0);
5964
5965   /**
5966    * modifier
5967    */
5968
5969   const u32 lid = get_local_id (0);
5970
5971   u32 w0[4];
5972
5973   w0[0] = pws[gid].i[ 0];
5974   w0[1] = pws[gid].i[ 1];
5975   w0[2] = pws[gid].i[ 2];
5976   w0[3] = pws[gid].i[ 3];
5977
5978   u32 w1[4];
5979
5980   w1[0] = 0;
5981   w1[1] = 0;
5982   w1[2] = 0;
5983   w1[3] = 0;
5984
5985   u32 w2[4];
5986
5987   w2[0] = 0;
5988   w2[1] = 0;
5989   w2[2] = 0;
5990   w2[3] = 0;
5991
5992   u32 w3[4];
5993
5994   w3[0] = 0;
5995   w3[1] = 0;
5996   w3[2] = pws[gid].i[14];
5997   w3[3] = 0;
5998
5999   const u32 pw_len = pws[gid].pw_len;
6000
6001   /**
6002    * bin2asc table
6003    */
6004
6005   __local u32 l_bin2asc[256];
6006
6007   const u32 lid4 = lid * 4;
6008
6009   const u32 lid40 = lid4 + 0;
6010   const u32 lid41 = lid4 + 1;
6011   const u32 lid42 = lid4 + 2;
6012   const u32 lid43 = lid4 + 3;
6013
6014   const u32 v400 = (lid40 >> 0) & 15;
6015   const u32 v401 = (lid40 >> 4) & 15;
6016   const u32 v410 = (lid41 >> 0) & 15;
6017   const u32 v411 = (lid41 >> 4) & 15;
6018   const u32 v420 = (lid42 >> 0) & 15;
6019   const u32 v421 = (lid42 >> 4) & 15;
6020   const u32 v430 = (lid43 >> 0) & 15;
6021   const u32 v431 = (lid43 >> 4) & 15;
6022
6023   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
6024                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
6025   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
6026                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
6027   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
6028                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
6029   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
6030                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
6031
6032   barrier (CLK_LOCAL_MEM_FENCE);
6033
6034   if (gid >= gid_max) return;
6035
6036   /**
6037    * main
6038    */
6039
6040   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
6041   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
6042
6043   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
6044   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
6045
6046   switch (sw_1 | sw_2)
6047   {
6048     case 0:
6049       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6050       break;
6051     case 1:
6052       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6053       break;
6054     case 2:
6055       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6056       break;
6057     case 3:
6058       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6059       break;
6060   }
6061 }
6062
6063 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
6064 {
6065   /**
6066    * base
6067    */
6068
6069   const u32 gid = get_global_id (0);
6070
6071   /**
6072    * modifier
6073    */
6074
6075   const u32 lid = get_local_id (0);
6076
6077   u32 w0[4];
6078
6079   w0[0] = pws[gid].i[ 0];
6080   w0[1] = pws[gid].i[ 1];
6081   w0[2] = pws[gid].i[ 2];
6082   w0[3] = pws[gid].i[ 3];
6083
6084   u32 w1[4];
6085
6086   w1[0] = pws[gid].i[ 4];
6087   w1[1] = pws[gid].i[ 5];
6088   w1[2] = pws[gid].i[ 6];
6089   w1[3] = pws[gid].i[ 7];
6090
6091   u32 w2[4];
6092
6093   w2[0] = 0;
6094   w2[1] = 0;
6095   w2[2] = 0;
6096   w2[3] = 0;
6097
6098   u32 w3[4];
6099
6100   w3[0] = 0;
6101   w3[1] = 0;
6102   w3[2] = pws[gid].i[14];
6103   w3[3] = 0;
6104
6105   const u32 pw_len = pws[gid].pw_len;
6106
6107   /**
6108    * bin2asc table
6109    */
6110
6111   __local u32 l_bin2asc[256];
6112
6113   const u32 lid4 = lid * 4;
6114
6115   const u32 lid40 = lid4 + 0;
6116   const u32 lid41 = lid4 + 1;
6117   const u32 lid42 = lid4 + 2;
6118   const u32 lid43 = lid4 + 3;
6119
6120   const u32 v400 = (lid40 >> 0) & 15;
6121   const u32 v401 = (lid40 >> 4) & 15;
6122   const u32 v410 = (lid41 >> 0) & 15;
6123   const u32 v411 = (lid41 >> 4) & 15;
6124   const u32 v420 = (lid42 >> 0) & 15;
6125   const u32 v421 = (lid42 >> 4) & 15;
6126   const u32 v430 = (lid43 >> 0) & 15;
6127   const u32 v431 = (lid43 >> 4) & 15;
6128
6129   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
6130                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
6131   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
6132                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
6133   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
6134                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
6135   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
6136                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
6137
6138   barrier (CLK_LOCAL_MEM_FENCE);
6139
6140   if (gid >= gid_max) return;
6141
6142   /**
6143    * main
6144    */
6145
6146   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
6147   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
6148
6149   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
6150   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
6151
6152   switch (sw_1 | sw_2)
6153   {
6154     case 0:
6155       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6156       break;
6157     case 1:
6158       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6159       break;
6160     case 2:
6161       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6162       break;
6163     case 3:
6164       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6165       break;
6166   }
6167 }
6168
6169 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
6170 {
6171   /**
6172    * base
6173    */
6174
6175   const u32 gid = get_global_id (0);
6176
6177   /**
6178    * modifier
6179    */
6180
6181   const u32 lid = get_local_id (0);
6182
6183   u32 w0[4];
6184
6185   w0[0] = pws[gid].i[ 0];
6186   w0[1] = pws[gid].i[ 1];
6187   w0[2] = pws[gid].i[ 2];
6188   w0[3] = pws[gid].i[ 3];
6189
6190   u32 w1[4];
6191
6192   w1[0] = pws[gid].i[ 4];
6193   w1[1] = pws[gid].i[ 5];
6194   w1[2] = pws[gid].i[ 6];
6195   w1[3] = pws[gid].i[ 7];
6196
6197   u32 w2[4];
6198
6199   w2[0] = pws[gid].i[ 8];
6200   w2[1] = pws[gid].i[ 9];
6201   w2[2] = pws[gid].i[10];
6202   w2[3] = pws[gid].i[11];
6203
6204   u32 w3[4];
6205
6206   w3[0] = pws[gid].i[12];
6207   w3[1] = pws[gid].i[13];
6208   w3[2] = pws[gid].i[14];
6209   w3[3] = pws[gid].i[15];
6210
6211   const u32 pw_len = pws[gid].pw_len;
6212
6213   /**
6214    * bin2asc table
6215    */
6216
6217   __local u32 l_bin2asc[256];
6218
6219   const u32 lid4 = lid * 4;
6220
6221   const u32 lid40 = lid4 + 0;
6222   const u32 lid41 = lid4 + 1;
6223   const u32 lid42 = lid4 + 2;
6224   const u32 lid43 = lid4 + 3;
6225
6226   const u32 v400 = (lid40 >> 0) & 15;
6227   const u32 v401 = (lid40 >> 4) & 15;
6228   const u32 v410 = (lid41 >> 0) & 15;
6229   const u32 v411 = (lid41 >> 4) & 15;
6230   const u32 v420 = (lid42 >> 0) & 15;
6231   const u32 v421 = (lid42 >> 4) & 15;
6232   const u32 v430 = (lid43 >> 0) & 15;
6233   const u32 v431 = (lid43 >> 4) & 15;
6234
6235   l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8
6236                    | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0;
6237   l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8
6238                    | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0;
6239   l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8
6240                    | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0;
6241   l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8
6242                    | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0;
6243
6244   barrier (CLK_LOCAL_MEM_FENCE);
6245
6246   if (gid >= gid_max) return;
6247
6248   /**
6249    * main
6250    */
6251
6252   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
6253   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
6254
6255   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
6256   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
6257
6258   switch (sw_1 | sw_2)
6259   {
6260     case 0:
6261       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6262       break;
6263     case 1:
6264       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6265       break;
6266     case 2:
6267       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6268       break;
6269     case 3:
6270       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc);
6271       break;
6272   }
6273 }