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