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