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