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