Zero pws_buf before reuse
[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 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 3
15 #define DGST_R2 2
16 #define DGST_R3 1
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.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   #if defined IS_AMD || defined IS_GENERIC
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 m11400_m04 (__global pw_t *pws, __global kernel_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 gid = get_global_id (0);
753   const u32 lid = get_local_id (0);
754   const u32 lsz = get_local_size (0);
755
756   /**
757    * bin2asc table
758    */
759
760   __local u32 l_bin2asc[256];
761
762   for (u32 i = lid; i < 256; i += lsz)
763   {
764     const u32 i0 = (i >> 0) & 15;
765     const u32 i1 = (i >> 4) & 15;
766
767     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
768                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
769   }
770
771   barrier (CLK_LOCAL_MEM_FENCE);
772
773   if (gid >= gid_max) return;
774
775   /**
776    * base
777    */
778
779   u32 pws0[4] = { 0 };
780   u32 pws1[4] = { 0 };
781
782   pws0[0] = pws[gid].i[0];
783   pws0[1] = pws[gid].i[1];
784   pws0[2] = pws[gid].i[2];
785   pws0[3] = pws[gid].i[3];
786   pws1[0] = pws[gid].i[4];
787   pws1[1] = pws[gid].i[5];
788   pws1[2] = pws[gid].i[6];
789   pws1[3] = pws[gid].i[7];
790
791   const u32 pw_l_len = pws[gid].pw_len;
792
793   /**
794    * salt
795    */
796
797   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
798
799   u32 salt_buf0[16];
800
801   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
802   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
803   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
804   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
805   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
806   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
807   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
808   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
809   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
810   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
811   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
812   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
813   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
814   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
815   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
816   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
817
818   u32 salt_buf1[16];
819
820   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
821   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
822   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
823   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
824   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
825   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
826   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
827   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
828   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
829   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
830   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
831   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
832   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
833   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
834   salt_buf1[14] = 0;
835   salt_buf1[15] = 0;
836
837   /**
838    * esalt
839    */
840
841   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
842
843   u32 esalt_buf0[16];
844
845   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
846   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
847   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
848   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
849   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
850   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
851   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
852   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
853   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
854   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
855   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
856   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
857   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
858   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
859   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
860   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
861
862   u32 esalt_buf1[16];
863
864   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
865   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
866   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
867   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
868   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
869   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
870   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
871   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
872   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
873   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
874   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
875   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
876   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
877   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
878   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
879   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
880
881   u32 esalt_buf2[16];
882
883   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
884   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
885   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
886   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
887   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
888   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
889   esalt_buf2[ 6] = 0;
890   esalt_buf2[ 7] = 0;
891   esalt_buf2[ 8] = 0;
892   esalt_buf2[ 9] = 0;
893   esalt_buf2[10] = 0;
894   esalt_buf2[11] = 0;
895   esalt_buf2[12] = 0;
896   esalt_buf2[13] = 0;
897   esalt_buf2[14] = 0;
898   esalt_buf2[15] = 0;
899
900   const u32 digest_esalt_len = 32 + esalt_len;
901   const u32 remaining_bytes  = digest_esalt_len + 1 - 64; // substract previous block
902
903   /**
904    * loop
905    */
906
907   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
908   {
909     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
910
911     const u32x pw_len = pw_l_len + pw_r_len;
912
913     u32x wordr0[4] = { 0 };
914     u32x wordr1[4] = { 0 };
915     u32x wordr2[4] = { 0 };
916     u32x wordr3[4] = { 0 };
917
918     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
919     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
920     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
921     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
922     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
923     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
924     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
925     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
926
927     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
928     {
929       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
930     }
931
932     u32x w0[4];
933
934     w0[0] = wordl0[0] | wordr0[0];
935     w0[1] = wordl0[1] | wordr0[1];
936     w0[2] = wordl0[2] | wordr0[2];
937     w0[3] = wordl0[3] | wordr0[3];
938
939     u32x w1[4];
940
941     w1[0] = wordl1[0] | wordr1[0];
942     w1[1] = wordl1[1] | wordr1[1];
943     w1[2] = wordl1[2] | wordr1[2];
944     w1[3] = wordl1[3] | wordr1[3];
945
946     u32x w2[4];
947
948     w2[0] = wordl2[0] | wordr2[0];
949     w2[1] = wordl2[1] | wordr2[1];
950     w2[2] = wordl2[2] | wordr2[2];
951     w2[3] = wordl2[3] | wordr2[3];
952
953     u32x w3[4];
954
955     w3[0] = wordl3[0] | wordr3[0];
956     w3[1] = wordl3[1] | wordr3[1];
957     w3[2] = wordl3[2] | wordr3[2];
958     w3[3] = wordl3[3] | wordr3[3];
959
960     const u32 pw_salt_len = salt_len + pw_len;
961
962     /*
963      * HA1 = md5 ($salt . $pass)
964      */
965
966     // append the pass to the salt
967
968     u32 block0[16];
969
970     block0[ 0] = salt_buf0[ 0];
971     block0[ 1] = salt_buf0[ 1];
972     block0[ 2] = salt_buf0[ 2];
973     block0[ 3] = salt_buf0[ 3];
974     block0[ 4] = salt_buf0[ 4];
975     block0[ 5] = salt_buf0[ 5];
976     block0[ 6] = salt_buf0[ 6];
977     block0[ 7] = salt_buf0[ 7];
978     block0[ 8] = salt_buf0[ 8];
979     block0[ 9] = salt_buf0[ 9];
980     block0[10] = salt_buf0[10];
981     block0[11] = salt_buf0[11];
982     block0[12] = salt_buf0[12];
983     block0[13] = salt_buf0[13];
984     block0[14] = salt_buf0[14];
985     block0[15] = salt_buf0[15];
986
987     u32 block1[16];
988
989     block1[ 0] = salt_buf1[ 0];
990     block1[ 1] = salt_buf1[ 1];
991     block1[ 2] = salt_buf1[ 2];
992     block1[ 3] = salt_buf1[ 3];
993     block1[ 4] = salt_buf1[ 4];
994     block1[ 5] = salt_buf1[ 5];
995     block1[ 6] = salt_buf1[ 6];
996     block1[ 7] = salt_buf1[ 7];
997     block1[ 8] = salt_buf1[ 8];
998     block1[ 9] = salt_buf1[ 9];
999     block1[10] = salt_buf1[10];
1000     block1[11] = salt_buf1[11];
1001     block1[12] = salt_buf1[12];
1002     block1[13] = salt_buf1[13];
1003     block1[14] = salt_buf1[14];
1004     block1[15] = salt_buf1[15];
1005
1006     u32 block_len = 0;
1007
1008     block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1009
1010     u32x w0_t[4];
1011
1012     w0_t[0] = block0[ 0];
1013     w0_t[1] = block0[ 1];
1014     w0_t[2] = block0[ 2];
1015     w0_t[3] = block0[ 3];
1016
1017     u32x w1_t[4];
1018
1019     w1_t[0] = block0[ 4];
1020     w1_t[1] = block0[ 5];
1021     w1_t[2] = block0[ 6];
1022     w1_t[3] = block0[ 7];
1023
1024     u32x w2_t[4];
1025
1026     w2_t[0] = block0[ 8];
1027     w2_t[1] = block0[ 9];
1028     w2_t[2] = block0[10];
1029     w2_t[3] = block0[11];
1030
1031     u32x w3_t[4];
1032
1033     w3_t[0] = block0[12];
1034     w3_t[1] = block0[13];
1035     w3_t[2] = block0[14];
1036     w3_t[3] = block0[15];
1037
1038     if (block_len < 56)
1039     {
1040       w3_t[2] = pw_salt_len * 8;
1041     }
1042
1043     // md5
1044
1045     u32x a = MD5M_A;
1046     u32x b = MD5M_B;
1047     u32x c = MD5M_C;
1048     u32x d = MD5M_D;
1049
1050     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1051     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1052     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1053     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1054     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1055     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1056     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1057     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1058     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1059     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1060     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1061     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1062     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1063     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1064     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1065     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1066
1067     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1068     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1069     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1070     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1071     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1072     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1073     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1074     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1075     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1076     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1077     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1078     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1079     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1080     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1081     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1082     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1083
1084     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1085     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1086     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1087     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1088     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1089     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1090     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1091     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1092     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1093     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1094     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1095     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1096     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1097     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1098     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1099     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1100
1101     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1102     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1103     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1104     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1105     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1106     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1107     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1108     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1109     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1110     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1111     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1112     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1113     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1114     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1115     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1116     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1117
1118     a += MD5M_A;
1119     b += MD5M_B;
1120     c += MD5M_C;
1121     d += MD5M_D;
1122
1123     if (block_len > 55)
1124     {
1125       u32 r_a = a;
1126       u32 r_b = b;
1127       u32 r_c = c;
1128       u32 r_d = d;
1129
1130       w0_t[0] = block1[ 0];
1131       w0_t[1] = block1[ 1];
1132       w0_t[2] = block1[ 2];
1133       w0_t[3] = block1[ 3];
1134
1135       w1_t[0] = block1[ 4];
1136       w1_t[1] = block1[ 5];
1137       w1_t[2] = block1[ 6];
1138       w1_t[3] = block1[ 7];
1139
1140       w2_t[0] = block1[ 8];
1141       w2_t[1] = block1[ 9];
1142       w2_t[2] = block1[10];
1143       w2_t[3] = block1[11];
1144
1145       w3_t[0] = block1[12];
1146       w3_t[1] = block1[13];
1147       w3_t[2] = pw_salt_len * 8;
1148       w3_t[3] = 0;
1149
1150       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1151       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1152       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1153       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1154       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1155       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1156       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1157       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1158       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1159       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1160       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1161       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1162       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1163       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1164       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1165       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1166
1167       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1168       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1169       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1170       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1171       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1172       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1173       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1174       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1175       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1176       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1177       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1178       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1179       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1180       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1181       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1182       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1183
1184       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1185       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1186       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1187       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1188       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1189       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1190       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1191       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1192       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1193       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1194       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1195       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1196       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1197       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1198       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1199       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1200
1201       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1202       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1203       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1204       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1205       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1206       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1207       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1208       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1209       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1210       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1211       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1212       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1213       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1214       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1215       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1216       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1217
1218       a += r_a;
1219       b += r_b;
1220       c += r_c;
1221       d += r_d;
1222     }
1223
1224     /*
1225      * final = md5 ($HA1 . $esalt)
1226      * we have at least 2 MD5 blocks/transformations, but we might need 3
1227      */
1228
1229     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1230             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1231     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1232             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1233     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1234             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1235     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1236             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1237     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1238             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1239     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1240             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1241     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1242             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1243     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1244             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1245
1246     w2_t[0] = esalt_buf0[0];
1247     w2_t[1] = esalt_buf0[1];
1248     w2_t[2] = esalt_buf0[2];
1249     w2_t[3] = esalt_buf0[3];
1250
1251     w3_t[0] = esalt_buf0[4];
1252     w3_t[1] = esalt_buf0[5];
1253     w3_t[2] = esalt_buf0[6];
1254     w3_t[3] = esalt_buf0[7];
1255
1256     // md5
1257     // 1st transform
1258
1259     a = MD5M_A;
1260     b = MD5M_B;
1261     c = MD5M_C;
1262     d = MD5M_D;
1263
1264     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1265     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1266     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1267     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1268     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1269     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1270     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1271     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1272     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1273     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1274     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1275     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1276     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1277     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1278     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1279     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1280
1281     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1282     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1283     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1284     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1285     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1286     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1287     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1288     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1289     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1290     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1291     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1292     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1293     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1294     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1295     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1296     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1297
1298     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1299     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1300     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1301     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1302     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1303     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1304     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1305     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1306     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1307     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1308     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1309     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1310     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1311     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1312     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1313     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1314
1315     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1316     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1317     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1318     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1319     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1320     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1321     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1322     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1323     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1324     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1325     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1326     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1327     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1328     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1329     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1330     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1331
1332     a += MD5M_A;
1333     b += MD5M_B;
1334     c += MD5M_C;
1335     d += MD5M_D;
1336
1337     u32 r_a = a;
1338     u32 r_b = b;
1339     u32 r_c = c;
1340     u32 r_d = d;
1341
1342     // 2nd transform
1343
1344     w0_t[0] = esalt_buf0[ 8];
1345     w0_t[1] = esalt_buf0[ 9];
1346     w0_t[2] = esalt_buf0[10];
1347     w0_t[3] = esalt_buf0[11];
1348
1349     w1_t[0] = esalt_buf0[12];
1350     w1_t[1] = esalt_buf0[13];
1351     w1_t[2] = esalt_buf0[14];
1352     w1_t[3] = esalt_buf0[15];
1353
1354     w2_t[0] = esalt_buf1[ 0];
1355     w2_t[1] = esalt_buf1[ 1];
1356     w2_t[2] = esalt_buf1[ 2];
1357     w2_t[3] = esalt_buf1[ 3];
1358
1359     w3_t[0] = esalt_buf1[ 4];
1360     w3_t[1] = esalt_buf1[ 5];
1361     w3_t[2] = esalt_buf1[ 6];
1362     w3_t[3] = esalt_buf1[ 7];
1363
1364     // it is the final block when no more than 55 bytes left
1365
1366     if (remaining_bytes < 56)
1367     {
1368       // it is the last block !
1369
1370       w3_t[2] = digest_esalt_len * 8;
1371     }
1372
1373     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1374     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1375     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1376     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1377     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1378     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1379     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1380     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1381     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1382     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1383     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1384     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1385     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1386     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1387     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1388     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1389
1390     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1391     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1392     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1393     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1394     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1395     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1396     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1397     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1398     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1399     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1400     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1401     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1402     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1403     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1404     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1405     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1406
1407     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1408     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1409     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1410     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1411     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1412     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1413     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1414     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1415     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1416     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1417     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1418     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1419     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1420     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1421     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1422     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1423
1424     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1425     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1426     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1427     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1428     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1429     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1430     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1431     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1432     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1433     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1434     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1435     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1436     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1437     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1438     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1439     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1440
1441     // sometimes (not rare at all) we need a third block :(
1442
1443     if (remaining_bytes > 55)
1444     {
1445       // this is for sure the final block
1446
1447       a += r_a;
1448       b += r_b;
1449       c += r_c;
1450       d += r_d;
1451
1452       r_a = a;
1453       r_b = b;
1454       r_c = c;
1455       r_d = d;
1456
1457       w0_t[0] = esalt_buf1[ 8];
1458       w0_t[1] = esalt_buf1[ 9];
1459       w0_t[2] = esalt_buf1[10];
1460       w0_t[3] = esalt_buf1[11];
1461
1462       w1_t[0] = esalt_buf1[12];
1463       w1_t[1] = esalt_buf1[13];
1464       w1_t[2] = esalt_buf1[14];
1465       w1_t[3] = esalt_buf1[15];
1466
1467       w2_t[0] = esalt_buf2[ 0];
1468       w2_t[1] = esalt_buf2[ 1];
1469       w2_t[2] = esalt_buf2[ 2];
1470       w2_t[3] = esalt_buf2[ 3];
1471
1472       w3_t[0] = esalt_buf2[ 4];
1473       w3_t[1] = esalt_buf2[ 5];
1474       w3_t[2] = digest_esalt_len * 8;
1475       w3_t[3] = 0;
1476
1477       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1478       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1479       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1480       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1481       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1482       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1483       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1484       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1485       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1486       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1487       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1488       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1489       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1490       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1491       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1492       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1493
1494       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1495       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1496       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1497       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1498       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1499       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1500       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1501       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1502       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1503       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1504       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1505       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1506       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1507       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1508       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1509       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1510
1511       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1512       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1513       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1514       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1515       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1516       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1517       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1518       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1519       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1520       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1521       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1522       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1523       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1524       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1525       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1526       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1527
1528       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1529       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1530       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1531       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1532       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1533       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1534       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1535       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1536       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1537       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1538       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1539       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1540       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1541       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1542       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1543       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1544     }
1545
1546     a += r_a;
1547     b += r_b;
1548     c += r_c;
1549     d += r_d;
1550     COMPARE_M_SIMD (a, d, c, b);
1551   }
1552 }
1553
1554 __kernel void m11400_m08 (__global pw_t *pws, __global kernel_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)
1555 {
1556 }
1557
1558 __kernel void m11400_m16 (__global pw_t *pws, __global kernel_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)
1559 {
1560 }
1561
1562 __kernel void m11400_s04 (__global pw_t *pws, __global kernel_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)
1563 {
1564   /**
1565    * modifier
1566    */
1567
1568   const u32 gid = get_global_id (0);
1569   const u32 lid = get_local_id (0);
1570   const u32 lsz = get_local_size (0);
1571
1572   /**
1573    * bin2asc table
1574    */
1575
1576   __local u32 l_bin2asc[256];
1577
1578   for (u32 i = lid; i < 256; i += lsz)
1579   {
1580     const u32 i0 = (i >> 0) & 15;
1581     const u32 i1 = (i >> 4) & 15;
1582
1583     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
1584                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
1585   }
1586
1587   barrier (CLK_LOCAL_MEM_FENCE);
1588
1589   if (gid >= gid_max) return;
1590
1591   /**
1592    * base
1593    */
1594
1595   u32 pws0[4] = { 0 };
1596   u32 pws1[4] = { 0 };
1597
1598   pws0[0] = pws[gid].i[0];
1599   pws0[1] = pws[gid].i[1];
1600   pws0[2] = pws[gid].i[2];
1601   pws0[3] = pws[gid].i[3];
1602   pws1[0] = pws[gid].i[4];
1603   pws1[1] = pws[gid].i[5];
1604   pws1[2] = pws[gid].i[6];
1605   pws1[3] = pws[gid].i[7];
1606
1607   const u32 pw_l_len = pws[gid].pw_len;
1608
1609   /**
1610    * salt
1611    */
1612
1613   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1614
1615   u32 salt_buf0[16];
1616
1617   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1618   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1619   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1620   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1621   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1622   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1623   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1624   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1625   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1626   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1627   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1628   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1629   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1630   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1631   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1632   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1633
1634   u32 salt_buf1[16];
1635
1636   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1637   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1638   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1639   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1640   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1641   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1642   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1643   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1644   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1645   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1646   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1647   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1648   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1649   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1650   salt_buf1[14] = 0;
1651   salt_buf1[15] = 0;
1652
1653   /**
1654    * esalt
1655    */
1656
1657   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1658
1659   u32 esalt_buf0[16];
1660
1661   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1662   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1663   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1664   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1665   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1666   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1667   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1668   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1669   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1670   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1671   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1672   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1673   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1674   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1675   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1676   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1677
1678   u32 esalt_buf1[16];
1679
1680   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1681   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1682   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1683   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1684   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1685   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1686   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1687   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1688   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1689   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1690   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1691   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1692   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1693   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1694   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1695   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1696
1697   u32 esalt_buf2[16];
1698
1699   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1700   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1701   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1702   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1703   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1704   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1705   esalt_buf2[ 6] = 0;
1706   esalt_buf2[ 7] = 0;
1707   esalt_buf2[ 8] = 0;
1708   esalt_buf2[ 9] = 0;
1709   esalt_buf2[10] = 0;
1710   esalt_buf2[11] = 0;
1711   esalt_buf2[12] = 0;
1712   esalt_buf2[13] = 0;
1713   esalt_buf2[14] = 0;
1714   esalt_buf2[15] = 0;
1715
1716   const u32 digest_esalt_len = 32 + esalt_len;
1717   const u32 remaining_bytes  = digest_esalt_len + 1 - 64; // substract previous block
1718
1719   /**
1720    * digest
1721    */
1722
1723   const u32 search[4] =
1724   {
1725     digests_buf[digests_offset].digest_buf[DGST_R0],
1726     digests_buf[digests_offset].digest_buf[DGST_R1],
1727     digests_buf[digests_offset].digest_buf[DGST_R2],
1728     digests_buf[digests_offset].digest_buf[DGST_R3]
1729   };
1730
1731   /**
1732    * loop
1733    */
1734
1735   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
1736   {
1737     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
1738
1739     const u32x pw_len = pw_l_len + pw_r_len;
1740
1741     u32x wordr0[4] = { 0 };
1742     u32x wordr1[4] = { 0 };
1743     u32x wordr2[4] = { 0 };
1744     u32x wordr3[4] = { 0 };
1745
1746     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
1747     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
1748     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
1749     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
1750     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
1751     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
1752     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
1753     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
1754
1755     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1756     {
1757       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1758     }
1759
1760     u32x w0[4];
1761
1762     w0[0] = wordl0[0] | wordr0[0];
1763     w0[1] = wordl0[1] | wordr0[1];
1764     w0[2] = wordl0[2] | wordr0[2];
1765     w0[3] = wordl0[3] | wordr0[3];
1766
1767     u32x w1[4];
1768
1769     w1[0] = wordl1[0] | wordr1[0];
1770     w1[1] = wordl1[1] | wordr1[1];
1771     w1[2] = wordl1[2] | wordr1[2];
1772     w1[3] = wordl1[3] | wordr1[3];
1773
1774     u32x w2[4];
1775
1776     w2[0] = wordl2[0] | wordr2[0];
1777     w2[1] = wordl2[1] | wordr2[1];
1778     w2[2] = wordl2[2] | wordr2[2];
1779     w2[3] = wordl2[3] | wordr2[3];
1780
1781     u32x w3[4];
1782
1783     w3[0] = wordl3[0] | wordr3[0];
1784     w3[1] = wordl3[1] | wordr3[1];
1785     w3[2] = wordl3[2] | wordr3[2];
1786     w3[3] = wordl3[3] | wordr3[3];
1787
1788     const u32 pw_salt_len = salt_len + pw_len;
1789
1790     /*
1791      * HA1 = md5 ($salt . $pass)
1792      */
1793
1794     // append the pass to the salt
1795
1796     u32 block0[16];
1797
1798     block0[ 0] = salt_buf0[ 0];
1799     block0[ 1] = salt_buf0[ 1];
1800     block0[ 2] = salt_buf0[ 2];
1801     block0[ 3] = salt_buf0[ 3];
1802     block0[ 4] = salt_buf0[ 4];
1803     block0[ 5] = salt_buf0[ 5];
1804     block0[ 6] = salt_buf0[ 6];
1805     block0[ 7] = salt_buf0[ 7];
1806     block0[ 8] = salt_buf0[ 8];
1807     block0[ 9] = salt_buf0[ 9];
1808     block0[10] = salt_buf0[10];
1809     block0[11] = salt_buf0[11];
1810     block0[12] = salt_buf0[12];
1811     block0[13] = salt_buf0[13];
1812     block0[14] = salt_buf0[14];
1813     block0[15] = salt_buf0[15];
1814
1815     u32 block1[16];
1816
1817     block1[ 0] = salt_buf1[ 0];
1818     block1[ 1] = salt_buf1[ 1];
1819     block1[ 2] = salt_buf1[ 2];
1820     block1[ 3] = salt_buf1[ 3];
1821     block1[ 4] = salt_buf1[ 4];
1822     block1[ 5] = salt_buf1[ 5];
1823     block1[ 6] = salt_buf1[ 6];
1824     block1[ 7] = salt_buf1[ 7];
1825     block1[ 8] = salt_buf1[ 8];
1826     block1[ 9] = salt_buf1[ 9];
1827     block1[10] = salt_buf1[10];
1828     block1[11] = salt_buf1[11];
1829     block1[12] = salt_buf1[12];
1830     block1[13] = salt_buf1[13];
1831     block1[14] = salt_buf1[14];
1832     block1[15] = salt_buf1[15];
1833
1834     u32 block_len = 0;
1835
1836     block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1837
1838     u32x w0_t[4];
1839
1840     w0_t[0] = block0[ 0];
1841     w0_t[1] = block0[ 1];
1842     w0_t[2] = block0[ 2];
1843     w0_t[3] = block0[ 3];
1844
1845     u32x w1_t[4];
1846
1847     w1_t[0] = block0[ 4];
1848     w1_t[1] = block0[ 5];
1849     w1_t[2] = block0[ 6];
1850     w1_t[3] = block0[ 7];
1851
1852     u32x w2_t[4];
1853
1854     w2_t[0] = block0[ 8];
1855     w2_t[1] = block0[ 9];
1856     w2_t[2] = block0[10];
1857     w2_t[3] = block0[11];
1858
1859     u32x w3_t[4];
1860
1861     w3_t[0] = block0[12];
1862     w3_t[1] = block0[13];
1863     w3_t[2] = block0[14];
1864     w3_t[3] = block0[15];
1865
1866     if (block_len < 56)
1867     {
1868       w3_t[2] = pw_salt_len * 8;
1869     }
1870
1871     // md5
1872
1873     u32x a = MD5M_A;
1874     u32x b = MD5M_B;
1875     u32x c = MD5M_C;
1876     u32x d = MD5M_D;
1877
1878     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1879     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1880     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1881     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1882     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1883     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1884     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1885     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1886     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1887     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1888     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1889     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1890     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1891     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1892     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1893     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1894
1895     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1896     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1897     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1898     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1899     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1900     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1901     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1902     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1903     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1904     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1905     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1906     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1907     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1908     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1909     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1910     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1911
1912     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1913     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1914     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1915     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1916     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1917     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1918     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1919     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1920     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1921     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1922     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1923     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1924     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1925     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1926     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1927     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1928
1929     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1930     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1931     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1932     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1933     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1934     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1935     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1936     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1937     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1938     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1939     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1940     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1941     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1942     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1943     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1944     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1945
1946     a += MD5M_A;
1947     b += MD5M_B;
1948     c += MD5M_C;
1949     d += MD5M_D;
1950
1951     if (block_len > 55)
1952     {
1953       u32 r_a = a;
1954       u32 r_b = b;
1955       u32 r_c = c;
1956       u32 r_d = d;
1957
1958       w0_t[0] = block1[ 0];
1959       w0_t[1] = block1[ 1];
1960       w0_t[2] = block1[ 2];
1961       w0_t[3] = block1[ 3];
1962
1963       w1_t[0] = block1[ 4];
1964       w1_t[1] = block1[ 5];
1965       w1_t[2] = block1[ 6];
1966       w1_t[3] = block1[ 7];
1967
1968       w2_t[0] = block1[ 8];
1969       w2_t[1] = block1[ 9];
1970       w2_t[2] = block1[10];
1971       w2_t[3] = block1[11];
1972
1973       w3_t[0] = block1[12];
1974       w3_t[1] = block1[13];
1975       w3_t[2] = pw_salt_len * 8;
1976       w3_t[3] = 0;
1977
1978       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1979       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1980       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1981       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1982       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1983       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1984       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1985       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1986       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1987       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1988       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1989       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1990       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1991       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1992       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1993       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1994
1995       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1996       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1997       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1998       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1999       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2000       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2001       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2002       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2003       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2004       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2005       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2006       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2007       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2008       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2009       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2010       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2011
2012       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2013       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2014       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2015       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2016       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2017       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2018       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2019       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2020       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2021       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2022       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2023       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2024       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2025       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2026       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2027       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2028
2029       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2030       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2031       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2032       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2033       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2034       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2035       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2036       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2037       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2038       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2039       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2040       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2041       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2042       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2043       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2044       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2045
2046       a += r_a;
2047       b += r_b;
2048       c += r_c;
2049       d += r_d;
2050     }
2051
2052     /*
2053      * final = md5 ($HA1 . $esalt)
2054      * we have at least 2 MD5 blocks/transformations, but we might need 3
2055      */
2056
2057     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2058             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2059     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2060             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2061     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2062             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2063     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2064             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2065     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2066             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2067     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2068             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2069     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2070             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2071     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2072             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2073
2074     w2_t[0] = esalt_buf0[0];
2075     w2_t[1] = esalt_buf0[1];
2076     w2_t[2] = esalt_buf0[2];
2077     w2_t[3] = esalt_buf0[3];
2078
2079     w3_t[0] = esalt_buf0[4];
2080     w3_t[1] = esalt_buf0[5];
2081     w3_t[2] = esalt_buf0[6];
2082     w3_t[3] = esalt_buf0[7];
2083
2084     // md5
2085     // 1st transform
2086
2087     a = MD5M_A;
2088     b = MD5M_B;
2089     c = MD5M_C;
2090     d = MD5M_D;
2091
2092     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2093     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2094     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2095     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2096     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2097     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2098     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2099     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2100     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2101     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2102     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2103     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2104     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2105     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2106     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2107     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2108
2109     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2110     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2111     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2112     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2113     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2114     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2115     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2116     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2117     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2118     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2119     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2120     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2121     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2122     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2123     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2124     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2125
2126     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2127     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2128     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2129     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2130     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2131     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2132     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2133     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2134     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2135     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2136     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2137     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2138     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2139     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2140     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2141     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2142
2143     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2144     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2145     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2146     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2147     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2148     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2149     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2150     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2151     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2152     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2153     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2154     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2155     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2156     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2157     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2158     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2159
2160     a += MD5M_A;
2161     b += MD5M_B;
2162     c += MD5M_C;
2163     d += MD5M_D;
2164
2165     u32 r_a = a;
2166     u32 r_b = b;
2167     u32 r_c = c;
2168     u32 r_d = d;
2169
2170     // 2nd transform
2171
2172     w0_t[0] = esalt_buf0[ 8];
2173     w0_t[1] = esalt_buf0[ 9];
2174     w0_t[2] = esalt_buf0[10];
2175     w0_t[3] = esalt_buf0[11];
2176
2177     w1_t[0] = esalt_buf0[12];
2178     w1_t[1] = esalt_buf0[13];
2179     w1_t[2] = esalt_buf0[14];
2180     w1_t[3] = esalt_buf0[15];
2181
2182     w2_t[0] = esalt_buf1[ 0];
2183     w2_t[1] = esalt_buf1[ 1];
2184     w2_t[2] = esalt_buf1[ 2];
2185     w2_t[3] = esalt_buf1[ 3];
2186
2187     w3_t[0] = esalt_buf1[ 4];
2188     w3_t[1] = esalt_buf1[ 5];
2189     w3_t[2] = esalt_buf1[ 6];
2190     w3_t[3] = esalt_buf1[ 7];
2191
2192     // it is the final block when no more than 55 bytes left
2193
2194     if (remaining_bytes < 56)
2195     {
2196       // it is the last block !
2197
2198       w3_t[2] = digest_esalt_len * 8;
2199     }
2200
2201     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2202     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2203     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2204     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2205     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2206     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2207     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2208     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2209     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2210     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2211     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2212     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2213     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2214     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2215     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2216     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2217
2218     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2219     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2220     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2221     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2222     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2223     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2224     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2225     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2226     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2227     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2228     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2229     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2230     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2231     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2232     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2233     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2234
2235     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2236     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2237     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2238     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2239     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2240     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2241     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2242     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2243     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2244     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2245     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2246     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2247     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2248     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2249     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2250     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2251
2252     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2253     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2254     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2255     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2256     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2257     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2258     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2259     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2260     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2261     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2262     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2263     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2264     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2265     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2266     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2267     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2268
2269     // sometimes (not rare at all) we need a third block :(
2270
2271     if (remaining_bytes > 55)
2272     {
2273       // this is for sure the final block
2274
2275       a += r_a;
2276       b += r_b;
2277       c += r_c;
2278       d += r_d;
2279
2280       r_a = a;
2281       r_b = b;
2282       r_c = c;
2283       r_d = d;
2284
2285       w0_t[0] = esalt_buf1[ 8];
2286       w0_t[1] = esalt_buf1[ 9];
2287       w0_t[2] = esalt_buf1[10];
2288       w0_t[3] = esalt_buf1[11];
2289
2290       w1_t[0] = esalt_buf1[12];
2291       w1_t[1] = esalt_buf1[13];
2292       w1_t[2] = esalt_buf1[14];
2293       w1_t[3] = esalt_buf1[15];
2294
2295       w2_t[0] = esalt_buf2[ 0];
2296       w2_t[1] = esalt_buf2[ 1];
2297       w2_t[2] = esalt_buf2[ 2];
2298       w2_t[3] = esalt_buf2[ 3];
2299
2300       w3_t[0] = esalt_buf2[ 4];
2301       w3_t[1] = esalt_buf2[ 5];
2302       w3_t[2] = digest_esalt_len * 8;
2303       w3_t[3] = 0;
2304
2305       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2306       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2307       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2308       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2309       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2310       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2311       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2312       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2313       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2314       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2315       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2316       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2317       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2318       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2319       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2320       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2321
2322       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2323       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2324       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2325       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2326       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2327       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2328       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2329       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2330       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2331       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2332       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2333       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2334       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2335       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2336       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2337       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2338
2339       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2340       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2341       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2342       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2343       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2344       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2345       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2346       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2347       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2348       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2349       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2350       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2351       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2352       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2353       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2354       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2355
2356       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2357       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2358       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2359       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2360       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2361       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2362       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2363       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2364       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2365       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2366       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2367       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2368       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2369       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2370       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2371       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2372     }
2373
2374     a += r_a;
2375     b += r_b;
2376     c += r_c;
2377     d += r_d;
2378     COMPARE_S_SIMD (a, d, c, b);
2379   }
2380 }
2381
2382 __kernel void m11400_s08 (__global pw_t *pws, __global kernel_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)
2383 {
2384 }
2385
2386 __kernel void m11400_s16 (__global pw_t *pws, __global kernel_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)
2387 {
2388 }