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