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