Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m11400_a3.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *               magnum <john.magnum@hushmail.com>
5  *
6  * License.....: MIT
7  */
8
9 #define _MD5_
10
11 //incompatible because of brances
12 //#define NEW_SIMD_CODE
13
14 #include "inc_vendor.cl"
15 #include "inc_hash_constants.h"
16 #include "inc_hash_functions.cl"
17 #include "inc_types.cl"
18 #include "inc_common.cl"
19 #include "inc_simd.cl"
20
21 #if   VECT_SIZE == 1
22 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i)])
23 #elif VECT_SIZE == 2
24 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1])
25 #elif VECT_SIZE == 4
26 #define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3])
27 #elif VECT_SIZE == 8
28 #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])
29 #elif VECT_SIZE == 16
30 #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])
31 #endif
32
33 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)
34 {
35   const u32 mod = block_len & 3;
36   const u32 div = block_len / 4;
37
38   #if defined IS_AMD || defined IS_GENERIC
39   const int offset_minus_4 = 4 - mod;
40
41   u32x append0_t[4];
42
43   append0_t[0] = amd_bytealign (append0[0],          0, offset_minus_4);
44   append0_t[1] = amd_bytealign (append0[1], append0[0], offset_minus_4);
45   append0_t[2] = amd_bytealign (append0[2], append0[1], offset_minus_4);
46   append0_t[3] = amd_bytealign (append0[3], append0[2], offset_minus_4);
47
48   u32x append1_t[4];
49
50   append1_t[0] = amd_bytealign (append1[0], append0[3], offset_minus_4);
51   append1_t[1] = amd_bytealign (append1[1], append1[0], offset_minus_4);
52   append1_t[2] = amd_bytealign (append1[2], append1[1], offset_minus_4);
53   append1_t[3] = amd_bytealign (append1[3], append1[2], offset_minus_4);
54
55   u32x append2_t[4];
56
57   append2_t[0] = amd_bytealign (append2[0], append1[3], offset_minus_4);
58   append2_t[1] = amd_bytealign (append2[1], append2[0], offset_minus_4);
59   append2_t[2] = amd_bytealign (append2[2], append2[1], offset_minus_4);
60   append2_t[3] = amd_bytealign (append2[3], append2[2], offset_minus_4);
61
62   u32x append3_t[4];
63
64   append3_t[0] = amd_bytealign (append3[0], append2[3], offset_minus_4);
65   append3_t[1] = amd_bytealign (append3[1], append3[0], offset_minus_4);
66   append3_t[2] = amd_bytealign (append3[2], append3[1], offset_minus_4);
67   append3_t[3] = amd_bytealign (append3[3], append3[2], offset_minus_4);
68
69   u32x append4_t[4];
70
71   append4_t[0] = amd_bytealign (         0, append3[3], offset_minus_4);
72   append4_t[1] = 0;
73   append4_t[2] = 0;
74   append4_t[3] = 0;
75
76   if (mod == 0)
77   {
78     append0_t[0] = append0[0];
79     append0_t[1] = append0[1];
80     append0_t[2] = append0[2];
81     append0_t[3] = append0[3];
82
83     append1_t[0] = append1[0];
84     append1_t[1] = append1[1];
85     append1_t[2] = append1[2];
86     append1_t[3] = append1[3];
87
88     append2_t[0] = append2[0];
89     append2_t[1] = append2[1];
90     append2_t[2] = append2[2];
91     append2_t[3] = append2[3];
92
93     append3_t[0] = append3[0];
94     append3_t[1] = append3[1];
95     append3_t[2] = append3[2];
96     append3_t[3] = append3[3];
97
98     append4_t[0] = 0;
99     append4_t[1] = 0;
100     append4_t[2] = 0;
101     append4_t[3] = 0;
102   }
103   #endif
104
105   #ifdef IS_NV
106
107   const int offset_minus_4 = 4 - mod;
108
109   const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
110
111   u32x append0_t[4];
112
113   append0_t[0] = __byte_perm (         0, append0[0], selector);
114   append0_t[1] = __byte_perm (append0[0], append0[1], selector);
115   append0_t[2] = __byte_perm (append0[1], append0[2], selector);
116   append0_t[3] = __byte_perm (append0[2], append0[3], selector);
117
118   u32x append1_t[4];
119
120   append1_t[0] = __byte_perm (append0[3], append1[0], selector);
121   append1_t[1] = __byte_perm (append1[0], append1[1], selector);
122   append1_t[2] = __byte_perm (append1[1], append1[2], selector);
123   append1_t[3] = __byte_perm (append1[2], append1[3], selector);
124
125   u32x append2_t[4];
126
127   append2_t[0] = __byte_perm (append1[3], append2[0], selector);
128   append2_t[1] = __byte_perm (append2[0], append2[1], selector);
129   append2_t[2] = __byte_perm (append2[1], append2[2], selector);
130   append2_t[3] = __byte_perm (append2[2], append2[3], selector);
131
132   u32x append3_t[4];
133
134   append3_t[0] = __byte_perm (append2[3], append3[0], selector);
135   append3_t[1] = __byte_perm (append3[0], append3[1], selector);
136   append3_t[2] = __byte_perm (append3[1], append3[2], selector);
137   append3_t[3] = __byte_perm (append3[2], append3[3], selector);
138
139   u32x append4_t[4];
140
141   append4_t[0] = __byte_perm (append3[3],          0, selector);
142   append4_t[1] = 0;
143   append4_t[2] = 0;
144   append4_t[3] = 0;
145   #endif
146
147   switch (div)
148   {
149     case  0:  block0[ 0] |= append0_t[0];
150               block0[ 1]  = append0_t[1];
151               block0[ 2]  = append0_t[2];
152               block0[ 3]  = append0_t[3];
153
154               block0[ 4]  = append1_t[0];
155               block0[ 5]  = append1_t[1];
156               block0[ 6]  = append1_t[2];
157               block0[ 7]  = append1_t[3];
158
159               block0[ 8]  = append2_t[0];
160               block0[ 9]  = append2_t[1];
161               block0[10]  = append2_t[2];
162               block0[11]  = append2_t[3];
163
164               block0[12]  = append3_t[0];
165               block0[13]  = append3_t[1];
166               block0[14]  = append3_t[2];
167               block0[15]  = append3_t[3];
168
169               block1[ 0]  = append4_t[0];
170               block1[ 1]  = append4_t[1];
171               block1[ 2]  = append4_t[2];
172               block1[ 3]  = append4_t[3];
173               break;
174
175     case  1:  block0[ 1] |= append0_t[0];
176               block0[ 2]  = append0_t[1];
177               block0[ 3]  = append0_t[2];
178               block0[ 4]  = append0_t[3];
179
180               block0[ 5]  = append1_t[0];
181               block0[ 6]  = append1_t[1];
182               block0[ 7]  = append1_t[2];
183               block0[ 8]  = append1_t[3];
184
185               block0[ 9]  = append2_t[0];
186               block0[10]  = append2_t[1];
187               block0[11]  = append2_t[2];
188               block0[12]  = append2_t[3];
189
190               block0[13]  = append3_t[0];
191               block0[14]  = append3_t[1];
192               block0[15]  = append3_t[2];
193               block1[ 0]  = append3_t[3];
194
195               block1[ 1]  = append4_t[0];
196               block1[ 2]  = append4_t[1];
197               block1[ 3]  = append4_t[2];
198               block1[ 4]  = append4_t[3];
199               break;
200
201     case  2:  block0[ 2] |= append0_t[0];
202               block0[ 3]  = append0_t[1];
203               block0[ 4]  = append0_t[2];
204               block0[ 5]  = append0_t[3];
205
206               block0[ 6]  = append1_t[0];
207               block0[ 7]  = append1_t[1];
208               block0[ 8]  = append1_t[2];
209               block0[ 9]  = append1_t[3];
210
211               block0[10]  = append2_t[0];
212               block0[11]  = append2_t[1];
213               block0[12]  = append2_t[2];
214               block0[13]  = append2_t[3];
215
216               block0[14]  = append3_t[0];
217               block0[15]  = append3_t[1];
218               block1[ 0]  = append3_t[2];
219               block1[ 1]  = append3_t[3];
220
221               block1[ 2]  = append4_t[0];
222               block1[ 3]  = append4_t[1];
223               block1[ 4]  = append4_t[2];
224               block1[ 5]  = append4_t[3];
225               break;
226
227     case  3:  block0[ 3] |= append0_t[0];
228               block0[ 4]  = append0_t[1];
229               block0[ 5]  = append0_t[2];
230               block0[ 6]  = append0_t[3];
231
232               block0[ 7]  = append1_t[0];
233               block0[ 8]  = append1_t[1];
234               block0[ 9]  = append1_t[2];
235               block0[10]  = append1_t[3];
236
237               block0[11]  = append2_t[0];
238               block0[12]  = append2_t[1];
239               block0[13]  = append2_t[2];
240               block0[14]  = append2_t[3];
241
242               block0[15]  = append3_t[0];
243               block1[ 0]  = append3_t[1];
244               block1[ 1]  = append3_t[2];
245               block1[ 2]  = append3_t[3];
246
247               block1[ 3]  = append4_t[0];
248               block1[ 4]  = append4_t[1];
249               block1[ 5]  = append4_t[2];
250               block1[ 6]  = append4_t[3];
251               break;
252
253     case  4:  block0[ 4] |= append0_t[0];
254               block0[ 5]  = append0_t[1];
255               block0[ 6]  = append0_t[2];
256               block0[ 7]  = append0_t[3];
257
258               block0[ 8]  = append1_t[0];
259               block0[ 9]  = append1_t[1];
260               block0[10]  = append1_t[2];
261               block0[11]  = append1_t[3];
262
263               block0[12]  = append2_t[0];
264               block0[13]  = append2_t[1];
265               block0[14]  = append2_t[2];
266               block0[15]  = append2_t[3];
267
268               block1[ 0]  = append3_t[0];
269               block1[ 1]  = append3_t[1];
270               block1[ 2]  = append3_t[2];
271               block1[ 3]  = append3_t[3];
272
273               block1[ 4]  = append4_t[0];
274               block1[ 5]  = append4_t[1];
275               block1[ 6]  = append4_t[2];
276               block1[ 7]  = append4_t[3];
277               break;
278
279     case  5:  block0[ 5] |= append0_t[0];
280               block0[ 6]  = append0_t[1];
281               block0[ 7]  = append0_t[2];
282               block0[ 8]  = append0_t[3];
283
284               block0[ 9]  = append1_t[0];
285               block0[10]  = append1_t[1];
286               block0[11]  = append1_t[2];
287               block0[12]  = append1_t[3];
288
289               block0[13]  = append2_t[0];
290               block0[14]  = append2_t[1];
291               block0[15]  = append2_t[2];
292               block1[ 0]  = append2_t[3];
293
294               block1[ 1]  = append3_t[0];
295               block1[ 2]  = append3_t[1];
296               block1[ 3]  = append3_t[2];
297               block1[ 4]  = append3_t[3];
298
299               block1[ 5]  = append4_t[0];
300               block1[ 6]  = append4_t[1];
301               block1[ 7]  = append4_t[2];
302               block1[ 8]  = append4_t[3];
303               break;
304
305     case  6:  block0[ 6] |= append0_t[0];
306               block0[ 7]  = append0_t[1];
307               block0[ 8]  = append0_t[2];
308               block0[ 9]  = append0_t[3];
309
310               block0[10]  = append1_t[0];
311               block0[11]  = append1_t[1];
312               block0[12]  = append1_t[2];
313               block0[13]  = append1_t[3];
314
315               block0[14]  = append2_t[0];
316               block0[15]  = append2_t[1];
317               block1[ 0]  = append2_t[2];
318               block1[ 1]  = append2_t[3];
319
320               block1[ 2]  = append3_t[0];
321               block1[ 3]  = append3_t[1];
322               block1[ 4]  = append3_t[2];
323               block1[ 5]  = append3_t[3];
324
325               block1[ 6]  = append4_t[0];
326               block1[ 7]  = append4_t[1];
327               block1[ 8]  = append4_t[2];
328               block1[ 9]  = append4_t[3];
329               break;
330
331     case  7:  block0[ 7] |= append0_t[0];
332               block0[ 8]  = append0_t[1];
333               block0[ 9]  = append0_t[2];
334               block0[10]  = append0_t[3];
335
336               block0[11]  = append1_t[0];
337               block0[12]  = append1_t[1];
338               block0[13]  = append1_t[2];
339               block0[14]  = append1_t[3];
340
341               block0[15]  = append2_t[0];
342               block1[ 0]  = append2_t[1];
343               block1[ 1]  = append2_t[2];
344               block1[ 2]  = append2_t[3];
345
346               block1[ 3]  = append3_t[0];
347               block1[ 4]  = append3_t[1];
348               block1[ 5]  = append3_t[2];
349               block1[ 6]  = append3_t[3];
350
351               block1[ 7]  = append4_t[0];
352               block1[ 8]  = append4_t[1];
353               block1[ 9]  = append4_t[2];
354               block1[10]  = append4_t[3];
355               break;
356
357     case  8:  block0[ 8] |= append0_t[0];
358               block0[ 9]  = append0_t[1];
359               block0[10]  = append0_t[2];
360               block0[11]  = append0_t[3];
361
362               block0[12]  = append1_t[0];
363               block0[13]  = append1_t[1];
364               block0[14]  = append1_t[2];
365               block0[15]  = append1_t[3];
366
367               block1[ 0]  = append2_t[0];
368               block1[ 1]  = append2_t[1];
369               block1[ 2]  = append2_t[2];
370               block1[ 3]  = append2_t[3];
371
372               block1[ 4]  = append3_t[0];
373               block1[ 5]  = append3_t[1];
374               block1[ 6]  = append3_t[2];
375               block1[ 7]  = append3_t[3];
376
377               block1[ 8]  = append4_t[0];
378               block1[ 9]  = append4_t[1];
379               block1[10]  = append4_t[2];
380               block1[11]  = append4_t[3];
381               break;
382
383     case  9:  block0[ 9] |= append0_t[0];
384               block0[10]  = append0_t[1];
385               block0[11]  = append0_t[2];
386               block0[12]  = append0_t[3];
387
388               block0[13]  = append1_t[0];
389               block0[14]  = append1_t[1];
390               block0[15]  = append1_t[2];
391               block1[ 0]  = append1_t[3];
392
393               block1[ 1]  = append2_t[0];
394               block1[ 2]  = append2_t[1];
395               block1[ 3]  = append2_t[2];
396               block1[ 4]  = append2_t[3];
397
398               block1[ 5]  = append3_t[0];
399               block1[ 6]  = append3_t[1];
400               block1[ 7]  = append3_t[2];
401               block1[ 8]  = append3_t[3];
402
403               block1[ 9]  = append4_t[0];
404               block1[10]  = append4_t[1];
405               block1[11]  = append4_t[2];
406               block1[12]  = append4_t[3];
407               break;
408
409     case 10:  block0[10] |= append0_t[0];
410               block0[11]  = append0_t[1];
411               block0[12]  = append0_t[2];
412               block0[13]  = append0_t[3];
413
414               block0[14]  = append1_t[0];
415               block0[15]  = append1_t[1];
416               block1[ 0]  = append1_t[2];
417               block1[ 1]  = append1_t[3];
418
419               block1[ 2]  = append2_t[0];
420               block1[ 3]  = append2_t[1];
421               block1[ 4]  = append2_t[2];
422               block1[ 5]  = append2_t[3];
423
424               block1[ 6]  = append3_t[0];
425               block1[ 7]  = append3_t[1];
426               block1[ 8]  = append3_t[2];
427               block1[ 9]  = append3_t[3];
428
429               block1[10]  = append4_t[0];
430               block1[11]  = append4_t[1];
431               block1[12]  = append4_t[2];
432               block1[13]  = append4_t[3];
433               break;
434
435     case 11:  block0[11] |= append0_t[0];
436               block0[12]  = append0_t[1];
437               block0[13]  = append0_t[2];
438               block0[14]  = append0_t[3];
439
440               block0[15]  = append1_t[0];
441               block1[ 0]  = append1_t[1];
442               block1[ 1]  = append1_t[2];
443               block1[ 2]  = append1_t[3];
444
445               block1[ 3]  = append2_t[0];
446               block1[ 4]  = append2_t[1];
447               block1[ 5]  = append2_t[2];
448               block1[ 6]  = append2_t[3];
449
450               block1[ 7]  = append3_t[0];
451               block1[ 8]  = append3_t[1];
452               block1[ 9]  = append3_t[2];
453               block1[10]  = append3_t[3];
454
455               block1[11]  = append4_t[0];
456               block1[12]  = append4_t[1];
457               block1[13]  = append4_t[2];
458               block1[14]  = append4_t[3];
459               break;
460
461     case 12:  block0[12] |= append0_t[0];
462               block0[13]  = append0_t[1];
463               block0[14]  = append0_t[2];
464               block0[15]  = append0_t[3];
465
466               block1[ 0]  = append1_t[0];
467               block1[ 1]  = append1_t[1];
468               block1[ 2]  = append1_t[2];
469               block1[ 3]  = append1_t[3];
470
471               block1[ 4]  = append2_t[0];
472               block1[ 5]  = append2_t[1];
473               block1[ 6]  = append2_t[2];
474               block1[ 7]  = append2_t[3];
475
476               block1[ 8]  = append3_t[0];
477               block1[ 9]  = append3_t[1];
478               block1[10]  = append3_t[2];
479               block1[11]  = append3_t[3];
480
481               block1[12]  = append4_t[0];
482               block1[13]  = append4_t[1];
483               block1[14]  = append4_t[2];
484               block1[15]  = append4_t[3];
485               break;
486
487     case 13:  block0[13] |= append0_t[0];
488               block0[14]  = append0_t[1];
489               block0[15]  = append0_t[2];
490               block1[ 0]  = append0_t[3];
491
492               block1[ 1]  = append1_t[0];
493               block1[ 2]  = append1_t[1];
494               block1[ 3]  = append1_t[2];
495               block1[ 4]  = append1_t[3];
496
497               block1[ 5]  = append2_t[0];
498               block1[ 6]  = append2_t[1];
499               block1[ 7]  = append2_t[2];
500               block1[ 8]  = append2_t[3];
501
502               block1[ 9]  = append3_t[0];
503               block1[10]  = append3_t[1];
504               block1[11]  = append3_t[2];
505               block1[12]  = append3_t[3];
506
507               block1[13]  = append4_t[0];
508               block1[14]  = append4_t[1];
509               block1[15]  = append4_t[2];
510               break;
511
512     case 14:  block0[14] |= append0_t[0];
513               block0[15]  = append0_t[1];
514               block1[ 0]  = append0_t[2];
515               block1[ 1]  = append0_t[3];
516
517               block1[ 2]  = append1_t[0];
518               block1[ 3]  = append1_t[1];
519               block1[ 4]  = append1_t[2];
520               block1[ 5]  = append1_t[3];
521
522               block1[ 6]  = append2_t[0];
523               block1[ 7]  = append2_t[1];
524               block1[ 8]  = append2_t[2];
525               block1[ 9]  = append2_t[3];
526
527               block1[10]  = append3_t[0];
528               block1[11]  = append3_t[1];
529               block1[12]  = append3_t[2];
530               block1[13]  = append3_t[3];
531
532               block1[14]  = append4_t[0];
533               block1[15]  = append4_t[1];
534               break;
535
536     case 15:  block0[15] |= append0_t[0];
537               block1[ 0]  = append0_t[1];
538               block1[ 1]  = append0_t[2];
539               block1[ 2]  = append0_t[3];
540
541               block1[ 3]  = append1_t[1];
542               block1[ 4]  = append1_t[2];
543               block1[ 5]  = append1_t[3];
544               block1[ 6]  = append1_t[0];
545
546               block1[ 7]  = append2_t[0];
547               block1[ 8]  = append2_t[1];
548               block1[ 9]  = append2_t[2];
549               block1[10]  = append2_t[3];
550
551               block1[11]  = append3_t[0];
552               block1[12]  = append3_t[1];
553               block1[13]  = append3_t[2];
554               block1[14]  = append3_t[3];
555
556               block1[15]  = append4_t[0];
557               break;
558
559     case 16:  block1[ 0] |= append0_t[0];
560               block1[ 1]  = append0_t[1];
561               block1[ 2]  = append0_t[2];
562               block1[ 3]  = append0_t[3];
563
564               block1[ 4]  = append1_t[0];
565               block1[ 5]  = append1_t[1];
566               block1[ 6]  = append1_t[2];
567               block1[ 7]  = append1_t[3];
568
569               block1[ 8]  = append2_t[0];
570               block1[ 9]  = append2_t[1];
571               block1[10]  = append2_t[2];
572               block1[11]  = append2_t[3];
573
574               block1[12]  = append3_t[0];
575               block1[13]  = append3_t[1];
576               block1[14]  = append3_t[2];
577               block1[15]  = append3_t[3];
578               break;
579
580     case 17:  block1[ 1] |= append0_t[0];
581               block1[ 2]  = append0_t[1];
582               block1[ 3]  = append0_t[2];
583               block1[ 4]  = append0_t[3];
584
585               block1[ 5]  = append1_t[0];
586               block1[ 6]  = append1_t[1];
587               block1[ 7]  = append1_t[2];
588               block1[ 8]  = append1_t[3];
589
590               block1[ 9]  = append2_t[0];
591               block1[10]  = append2_t[1];
592               block1[11]  = append2_t[2];
593               block1[12]  = append2_t[3];
594
595               block1[13]  = append3_t[0];
596               block1[14]  = append3_t[1];
597               block1[15]  = append3_t[2];
598               break;
599
600     case 18:  block1[ 2] |= append0_t[0];
601               block1[ 3]  = append0_t[1];
602               block1[ 4]  = append0_t[2];
603               block1[ 5]  = append0_t[3];
604
605               block1[ 6]  = append1_t[0];
606               block1[ 7]  = append1_t[1];
607               block1[ 8]  = append1_t[2];
608               block1[ 9]  = append1_t[3];
609
610               block1[10]  = append2_t[0];
611               block1[11]  = append2_t[1];
612               block1[12]  = append2_t[2];
613               block1[13]  = append2_t[3];
614
615               block1[14]  = append3_t[0];
616               block1[15]  = append3_t[1];
617               break;
618
619     case 19:  block1[ 3] |= append0_t[0];
620               block1[ 4]  = append0_t[1];
621               block1[ 5]  = append0_t[2];
622               block1[ 6]  = append0_t[3];
623
624               block1[ 7]  = append1_t[0];
625               block1[ 8]  = append1_t[1];
626               block1[ 9]  = append1_t[2];
627               block1[10]  = append1_t[3];
628
629               block1[11]  = append2_t[0];
630               block1[12]  = append2_t[1];
631               block1[13]  = append2_t[2];
632               block1[14]  = append2_t[3];
633
634               block1[15]  = append3_t[0];
635               break;
636
637     case 20:  block1[ 4] |= append0_t[0];
638               block1[ 5]  = append0_t[1];
639               block1[ 6]  = append0_t[2];
640               block1[ 7]  = append0_t[3];
641
642               block1[ 8]  = append1_t[0];
643               block1[ 9]  = append1_t[1];
644               block1[10]  = append1_t[2];
645               block1[11]  = append1_t[3];
646
647               block1[12]  = append2_t[0];
648               block1[13]  = append2_t[1];
649               block1[14]  = append2_t[2];
650               block1[15]  = append2_t[3];
651               break;
652
653     case 21:  block1[ 5] |= append0_t[0];
654               block1[ 6]  = append0_t[1];
655               block1[ 7]  = append0_t[2];
656               block1[ 8]  = append0_t[3];
657
658               block1[ 9]  = append1_t[0];
659               block1[10]  = append1_t[1];
660               block1[11]  = append1_t[2];
661               block1[12]  = append1_t[3];
662
663               block1[13]  = append2_t[0];
664               block1[14]  = append2_t[1];
665               block1[15]  = append2_t[2];
666               break;
667
668     case 22:  block1[ 6] |= append0_t[0];
669               block1[ 7]  = append0_t[1];
670               block1[ 8]  = append0_t[2];
671               block1[ 9]  = append0_t[3];
672
673               block1[10]  = append1_t[0];
674               block1[11]  = append1_t[1];
675               block1[12]  = append1_t[2];
676               block1[13]  = append1_t[3];
677
678               block1[14]  = append2_t[0];
679               block1[15]  = append2_t[1];
680               break;
681
682     case 23:  block1[ 7] |= append0_t[0];
683               block1[ 8]  = append0_t[1];
684               block1[ 9]  = append0_t[2];
685               block1[10]  = append0_t[3];
686
687               block1[11]  = append1_t[0];
688               block1[12]  = append1_t[1];
689               block1[13]  = append1_t[2];
690               block1[14]  = append1_t[3];
691
692               block1[15]  = append2_t[0];
693               break;
694
695     case 24:  block1[ 8] |= append0_t[0];
696               block1[ 9]  = append0_t[1];
697               block1[10]  = append0_t[2];
698               block1[11]  = append0_t[3];
699
700               block1[12]  = append1_t[0];
701               block1[13]  = append1_t[1];
702               block1[14]  = append1_t[2];
703               block1[15]  = append1_t[3];
704               break;
705
706     case 25:  block1[ 9] |= append0_t[0];
707               block1[10]  = append0_t[1];
708               block1[11]  = append0_t[2];
709               block1[12]  = append0_t[3];
710
711               block1[13]  = append1_t[0];
712               block1[14]  = append1_t[1];
713               block1[15]  = append1_t[2];
714               break;
715
716     case 26:  block1[10] |= append0_t[0];
717               block1[11]  = append0_t[1];
718               block1[12]  = append0_t[2];
719               block1[13]  = append0_t[3];
720
721               block1[14]  = append1_t[0];
722               block1[15]  = append1_t[1];
723               break;
724
725     case 27:  block1[11] |= append0_t[0];
726               block1[12]  = append0_t[1];
727               block1[13]  = append0_t[2];
728               block1[14]  = append0_t[3];
729
730               block1[15]  = append1_t[0];
731               break;
732
733     case 28:  block1[12] |= append0_t[0];
734               block1[13]  = append0_t[1];
735               block1[14]  = append0_t[2];
736               block1[15]  = append0_t[3];
737               break;
738
739     case 29:  block1[13] |= append0_t[0];
740               block1[14]  = append0_t[1];
741               block1[15]  = append0_t[2];
742               break;
743
744     case 30:  block1[14] |= append0_t[0];
745               block1[15]  = append0_t[1];
746               break;
747   }
748
749   u32 new_len = block_len + append_len;
750
751   return new_len;
752 }
753
754 void m11400m_0_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
755 {
756   /**
757    * modifier
758    */
759
760   const u32 gid = get_global_id (0);
761   const u32 lid = get_local_id (0);
762
763   /**
764    * salt
765    */
766
767   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
768
769   const u32 pw_salt_len = salt_len + pw_len;
770
771   u32 salt_buf0[16];
772   u32 salt_buf1[16];
773
774   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
775   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
776   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
777   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
778   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
779   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
780   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
781   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
782   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
783   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
784   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
785   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
786   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
787   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
788   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
789   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
790   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
791   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
792   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
793   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
794   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
795   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
796   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
797   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
798   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
799   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
800   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
801   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
802   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
803   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
804   salt_buf1[14] = 0;
805   salt_buf1[15] = 0;
806
807   /**
808    * esalt
809    */
810
811   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
812
813   u32 esalt_buf0[16];
814   u32 esalt_buf1[16];
815
816   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
817   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
818   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
819   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
820   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
821   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
822   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
823   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
824   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
825   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
826   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
827   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
828   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
829   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
830   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
831   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
832   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
833   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
834   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
835   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
836   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
837   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
838   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
839   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
840   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
841   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
842   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
843   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
844   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
845   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
846   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
847   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
848
849   const u32 digest_esalt_len = 32 + esalt_len;
850
851   /**
852    * loop
853    */
854
855   u32 w0l = w0[0];
856
857   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
858   {
859     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
860
861     const u32x w0lr = w0l | w0r;
862
863     /*
864      * HA1 = md5 ($salt . $pass)
865      */
866
867     // append the pass to the salt
868
869     u32x block0[16];
870     u32x block1[16];
871
872     block0[ 0] = salt_buf0[ 0];
873     block0[ 1] = salt_buf0[ 1];
874     block0[ 2] = salt_buf0[ 2];
875     block0[ 3] = salt_buf0[ 3];
876     block0[ 4] = salt_buf0[ 4];
877     block0[ 5] = salt_buf0[ 5];
878     block0[ 6] = salt_buf0[ 6];
879     block0[ 7] = salt_buf0[ 7];
880     block0[ 8] = salt_buf0[ 8];
881     block0[ 9] = salt_buf0[ 9];
882     block0[10] = salt_buf0[10];
883     block0[11] = salt_buf0[11];
884     block0[12] = salt_buf0[12];
885     block0[13] = salt_buf0[13];
886     block0[14] = salt_buf0[14];
887     block0[15] = salt_buf0[15];
888     block1[ 0] = salt_buf1[ 0];
889     block1[ 1] = salt_buf1[ 1];
890     block1[ 2] = salt_buf1[ 2];
891     block1[ 3] = salt_buf1[ 3];
892     block1[ 4] = salt_buf1[ 4];
893     block1[ 5] = salt_buf1[ 5];
894     block1[ 6] = salt_buf1[ 6];
895     block1[ 7] = salt_buf1[ 7];
896     block1[ 8] = salt_buf1[ 8];
897     block1[ 9] = salt_buf1[ 9];
898     block1[10] = salt_buf1[10];
899     block1[11] = salt_buf1[11];
900     block1[12] = salt_buf1[12];
901     block1[13] = salt_buf1[13];
902     block1[14] = salt_buf1[14];
903     block1[15] = salt_buf1[15];
904
905     u32x w0_t[4];
906     u32x w1_t[4];
907     u32x w2_t[4];
908     u32x w3_t[4];
909
910     w0_t[0] = w0lr;
911     w0_t[1] = w0[1];
912     w0_t[2] = w0[2];
913     w0_t[3] = w0[3];
914     w1_t[0] = w1[0];
915     w1_t[1] = w1[1];
916     w1_t[2] = w1[2];
917     w1_t[3] = w1[3];
918     w2_t[0] = w2[0];
919     w2_t[1] = w2[1];
920     w2_t[2] = w2[2];
921     w2_t[3] = w2[3];
922     w3_t[0] = w3[0];
923     w3_t[1] = w3[1];
924     w3_t[2] = w3[2];
925     w3_t[3] = w3[3];
926
927     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
928
929     w0_t[0] = block0[ 0];
930     w0_t[1] = block0[ 1];
931     w0_t[2] = block0[ 2];
932     w0_t[3] = block0[ 3];
933     w1_t[0] = block0[ 4];
934     w1_t[1] = block0[ 5];
935     w1_t[2] = block0[ 6];
936     w1_t[3] = block0[ 7];
937     w2_t[0] = block0[ 8];
938     w2_t[1] = block0[ 9];
939     w2_t[2] = block0[10];
940     w2_t[3] = block0[11];
941     w3_t[0] = block0[12];
942     w3_t[1] = block0[13];
943     w3_t[2] = pw_salt_len * 8;
944     w3_t[3] = 0;
945
946     // md5
947
948     u32x a = MD5M_A;
949     u32x b = MD5M_B;
950     u32x c = MD5M_C;
951     u32x d = MD5M_D;
952
953     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
954     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
955     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
956     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
957     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
958     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
959     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
960     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
961     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
962     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
963     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
964     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
965     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
966     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
967     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
968     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
969
970     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
971     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
972     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
973     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
974     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
975     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
976     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
977     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
978     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
979     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
980     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
981     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
982     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
983     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
984     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
985     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
986
987     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
988     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
989     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
990     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
991     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
992     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
993     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
994     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
995     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
996     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
997     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
998     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
999     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1000     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1001     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1002     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1003
1004     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1005     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1006     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1007     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1008     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1009     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1010     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1011     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1012     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1013     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1014     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1015     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1016     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1017     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1018     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1019     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1020
1021     a += MD5M_A;
1022     b += MD5M_B;
1023     c += MD5M_C;
1024     d += MD5M_D;
1025
1026     /*
1027      * final = md5 ($HA1 . $esalt)
1028      * we have at least 2 MD5 blocks/transformations, but we might need 3
1029      */
1030
1031     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1032             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1033     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1034             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1035     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1036             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1037     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1038             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1039     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1040             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1041     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1042             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1043     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1044             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1045     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1046             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1047     w2_t[0] = esalt_buf0[0];
1048     w2_t[1] = esalt_buf0[1];
1049     w2_t[2] = esalt_buf0[2];
1050     w2_t[3] = esalt_buf0[3];
1051     w3_t[0] = esalt_buf0[4];
1052     w3_t[1] = esalt_buf0[5];
1053     w3_t[2] = esalt_buf0[6];
1054     w3_t[3] = esalt_buf0[7];
1055
1056     // md5
1057     // 1st transform
1058
1059     a = MD5M_A;
1060     b = MD5M_B;
1061     c = MD5M_C;
1062     d = MD5M_D;
1063
1064     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1065     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1066     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1067     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1068     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1069     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1070     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1071     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1072     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1073     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1074     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1075     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1076     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1077     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1078     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1079     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1080
1081     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1082     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1083     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1084     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1085     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1086     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1087     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1088     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1089     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1090     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1091     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1092     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1093     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1094     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1095     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1096     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1097
1098     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1099     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1100     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1101     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1102     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1103     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1104     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1105     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1106     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1107     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1108     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1109     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1110     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1111     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1112     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1113     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1114
1115     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1116     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1117     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1118     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1119     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1120     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1121     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1122     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1123     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1124     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1125     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1126     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1127     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1128     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1129     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1130     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1131
1132     a += MD5M_A;
1133     b += MD5M_B;
1134     c += MD5M_C;
1135     d += MD5M_D;
1136
1137     u32x r_a = a;
1138     u32x r_b = b;
1139     u32x r_c = c;
1140     u32x r_d = d;
1141
1142     // 2nd transform
1143
1144     w0_t[0] = esalt_buf0[ 8];
1145     w0_t[1] = esalt_buf0[ 9];
1146     w0_t[2] = esalt_buf0[10];
1147     w0_t[3] = esalt_buf0[11];
1148     w1_t[0] = esalt_buf0[12];
1149     w1_t[1] = esalt_buf0[13];
1150     w1_t[2] = esalt_buf0[14];
1151     w1_t[3] = esalt_buf0[15];
1152     w2_t[0] = esalt_buf1[ 0];
1153     w2_t[1] = esalt_buf1[ 1];
1154     w2_t[2] = esalt_buf1[ 2];
1155     w2_t[3] = esalt_buf1[ 3];
1156     w3_t[0] = esalt_buf1[ 4];
1157     w3_t[1] = esalt_buf1[ 5];
1158     w3_t[2] = digest_esalt_len * 8;
1159     w3_t[3] = 0;
1160
1161     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1162     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1163     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1164     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1165     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1166     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1167     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1168     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1169     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1170     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1171     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1172     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1173     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1174     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1175     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1176     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1177
1178     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1179     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1180     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1181     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1182     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1183     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1184     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1185     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1186     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1187     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1188     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1189     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1190     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1191     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1192     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1193     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1194
1195     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1196     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1197     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1198     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1199     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1200     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1201     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1202     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1203     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1204     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1205     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1206     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1207     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1208     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1209     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1210     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1211
1212     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1213     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1214     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1215     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1216     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1217     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1218     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1219     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1220     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1221     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1222     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1223     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1224     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1225     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1226     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1227     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1228
1229     a += r_a;
1230     b += r_b;
1231     c += r_c;
1232     d += r_d;
1233
1234     COMPARE_M_SIMD (a, d, c, b);
1235   }
1236 }
1237
1238 void m11400m_0_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
1239 {
1240   /**
1241    * modifier
1242    */
1243
1244   const u32 gid = get_global_id (0);
1245   const u32 lid = get_local_id (0);
1246
1247   /**
1248    * salt
1249    */
1250
1251   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1252
1253   const u32 pw_salt_len = salt_len + pw_len;
1254
1255   u32 salt_buf0[16];
1256   u32 salt_buf1[16];
1257
1258   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1259   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1260   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1261   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1262   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1263   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1264   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1265   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1266   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1267   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1268   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1269   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1270   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1271   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1272   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1273   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1274   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1275   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1276   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1277   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1278   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1279   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1280   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1281   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1282   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1283   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1284   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1285   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1286   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1287   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1288   salt_buf1[14] = 0;
1289   salt_buf1[15] = 0;
1290
1291   /**
1292    * esalt
1293    */
1294
1295   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1296
1297   u32 esalt_buf0[16];
1298   u32 esalt_buf1[16];
1299   u32 esalt_buf2[16];
1300
1301   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1302   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1303   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1304   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1305   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1306   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1307   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1308   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1309   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1310   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1311   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1312   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1313   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1314   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1315   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1316   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1317   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1318   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1319   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1320   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1321   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1322   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1323   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1324   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1325   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1326   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1327   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1328   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1329   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1330   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1331   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1332   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1333   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1334   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1335   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1336   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1337   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1338   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1339   esalt_buf2[ 6] = 0;
1340   esalt_buf2[ 7] = 0;
1341   esalt_buf2[ 8] = 0;
1342   esalt_buf2[ 9] = 0;
1343   esalt_buf2[10] = 0;
1344   esalt_buf2[11] = 0;
1345   esalt_buf2[12] = 0;
1346   esalt_buf2[13] = 0;
1347   esalt_buf2[14] = 0;
1348   esalt_buf2[15] = 0;
1349
1350   const u32 digest_esalt_len = 32 + esalt_len;
1351
1352   /**
1353    * loop
1354    */
1355
1356   u32 w0l = w0[0];
1357
1358   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
1359   {
1360     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
1361
1362     const u32x w0lr = w0l | w0r;
1363
1364     /*
1365      * HA1 = md5 ($salt . $pass)
1366      */
1367
1368     // append the pass to the salt
1369
1370     u32x block0[16];
1371     u32x block1[16];
1372
1373     block0[ 0] = salt_buf0[ 0];
1374     block0[ 1] = salt_buf0[ 1];
1375     block0[ 2] = salt_buf0[ 2];
1376     block0[ 3] = salt_buf0[ 3];
1377     block0[ 4] = salt_buf0[ 4];
1378     block0[ 5] = salt_buf0[ 5];
1379     block0[ 6] = salt_buf0[ 6];
1380     block0[ 7] = salt_buf0[ 7];
1381     block0[ 8] = salt_buf0[ 8];
1382     block0[ 9] = salt_buf0[ 9];
1383     block0[10] = salt_buf0[10];
1384     block0[11] = salt_buf0[11];
1385     block0[12] = salt_buf0[12];
1386     block0[13] = salt_buf0[13];
1387     block0[14] = salt_buf0[14];
1388     block0[15] = salt_buf0[15];
1389     block1[ 0] = salt_buf1[ 0];
1390     block1[ 1] = salt_buf1[ 1];
1391     block1[ 2] = salt_buf1[ 2];
1392     block1[ 3] = salt_buf1[ 3];
1393     block1[ 4] = salt_buf1[ 4];
1394     block1[ 5] = salt_buf1[ 5];
1395     block1[ 6] = salt_buf1[ 6];
1396     block1[ 7] = salt_buf1[ 7];
1397     block1[ 8] = salt_buf1[ 8];
1398     block1[ 9] = salt_buf1[ 9];
1399     block1[10] = salt_buf1[10];
1400     block1[11] = salt_buf1[11];
1401     block1[12] = salt_buf1[12];
1402     block1[13] = salt_buf1[13];
1403     block1[14] = salt_buf1[14];
1404     block1[15] = salt_buf1[15];
1405
1406     u32x w0_t[4];
1407     u32x w1_t[4];
1408     u32x w2_t[4];
1409     u32x w3_t[4];
1410
1411     w0_t[0] = w0lr;
1412     w0_t[1] = w0[1];
1413     w0_t[2] = w0[2];
1414     w0_t[3] = w0[3];
1415     w1_t[0] = w1[0];
1416     w1_t[1] = w1[1];
1417     w1_t[2] = w1[2];
1418     w1_t[3] = w1[3];
1419     w2_t[0] = w2[0];
1420     w2_t[1] = w2[1];
1421     w2_t[2] = w2[2];
1422     w2_t[3] = w2[3];
1423     w3_t[0] = w3[0];
1424     w3_t[1] = w3[1];
1425     w3_t[2] = w3[2];
1426     w3_t[3] = w3[3];
1427
1428     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
1429
1430     w0_t[0] = block0[ 0];
1431     w0_t[1] = block0[ 1];
1432     w0_t[2] = block0[ 2];
1433     w0_t[3] = block0[ 3];
1434     w1_t[0] = block0[ 4];
1435     w1_t[1] = block0[ 5];
1436     w1_t[2] = block0[ 6];
1437     w1_t[3] = block0[ 7];
1438     w2_t[0] = block0[ 8];
1439     w2_t[1] = block0[ 9];
1440     w2_t[2] = block0[10];
1441     w2_t[3] = block0[11];
1442     w3_t[0] = block0[12];
1443     w3_t[1] = block0[13];
1444     w3_t[2] = pw_salt_len * 8;
1445     w3_t[3] = 0;
1446
1447     // md5
1448
1449     u32x a = MD5M_A;
1450     u32x b = MD5M_B;
1451     u32x c = MD5M_C;
1452     u32x d = MD5M_D;
1453
1454     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1455     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1456     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1457     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1458     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1459     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1460     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1461     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1462     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1463     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1464     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1465     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1466     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1467     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1468     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1469     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1470
1471     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1472     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1473     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1474     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1475     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1476     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1477     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1478     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1479     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1480     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1481     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1482     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1483     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1484     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1485     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1486     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1487
1488     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1489     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1490     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1491     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1492     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1493     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1494     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1495     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1496     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1497     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1498     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1499     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1500     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1501     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1502     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1503     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1504
1505     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1506     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1507     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1508     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1509     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1510     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1511     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1512     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1513     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1514     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1515     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1516     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1517     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1518     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1519     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1520     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1521
1522     a += MD5M_A;
1523     b += MD5M_B;
1524     c += MD5M_C;
1525     d += MD5M_D;
1526
1527     /*
1528      * final = md5 ($HA1 . $esalt)
1529      * we have at least 2 MD5 blocks/transformations, but we might need 3
1530      */
1531
1532     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1533             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1534     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1535             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1536     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1537             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1538     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1539             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1540     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1541             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1542     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1543             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1544     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1545             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1546     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1547             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1548     w2_t[0] = esalt_buf0[0];
1549     w2_t[1] = esalt_buf0[1];
1550     w2_t[2] = esalt_buf0[2];
1551     w2_t[3] = esalt_buf0[3];
1552     w3_t[0] = esalt_buf0[4];
1553     w3_t[1] = esalt_buf0[5];
1554     w3_t[2] = esalt_buf0[6];
1555     w3_t[3] = esalt_buf0[7];
1556
1557     // md5
1558     // 1st transform
1559
1560     a = MD5M_A;
1561     b = MD5M_B;
1562     c = MD5M_C;
1563     d = MD5M_D;
1564
1565     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1566     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1567     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1568     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1569     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1570     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1571     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1572     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1573     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1574     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1575     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1576     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1577     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1578     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1579     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1580     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1581
1582     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1583     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1584     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1585     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1586     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1587     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1588     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1589     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1590     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1591     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1592     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1593     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1594     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1595     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1596     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1597     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1598
1599     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1600     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1601     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1602     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1603     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1604     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1605     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1606     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1607     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1608     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1609     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1610     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1611     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1612     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1613     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1614     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1615
1616     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1617     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1618     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1619     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1620     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1621     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1622     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1623     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1624     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1625     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1626     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1627     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1628     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1629     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1630     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1631     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1632
1633     a += MD5M_A;
1634     b += MD5M_B;
1635     c += MD5M_C;
1636     d += MD5M_D;
1637
1638     u32x r_a = a;
1639     u32x r_b = b;
1640     u32x r_c = c;
1641     u32x r_d = d;
1642
1643     // 2nd transform
1644
1645     w0_t[0] = esalt_buf0[ 8];
1646     w0_t[1] = esalt_buf0[ 9];
1647     w0_t[2] = esalt_buf0[10];
1648     w0_t[3] = esalt_buf0[11];
1649     w1_t[0] = esalt_buf0[12];
1650     w1_t[1] = esalt_buf0[13];
1651     w1_t[2] = esalt_buf0[14];
1652     w1_t[3] = esalt_buf0[15];
1653     w2_t[0] = esalt_buf1[ 0];
1654     w2_t[1] = esalt_buf1[ 1];
1655     w2_t[2] = esalt_buf1[ 2];
1656     w2_t[3] = esalt_buf1[ 3];
1657     w3_t[0] = esalt_buf1[ 4];
1658     w3_t[1] = esalt_buf1[ 5];
1659     w3_t[2] = esalt_buf1[ 6];
1660     w3_t[3] = esalt_buf1[ 7];
1661
1662     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1663     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1664     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1665     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1666     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1667     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1668     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1669     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1670     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1671     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1672     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1673     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1674     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1675     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1676     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1677     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1678
1679     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1680     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1681     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1682     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1683     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1684     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1685     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1686     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1687     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1688     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1689     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1690     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1691     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1692     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1693     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1694     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1695
1696     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1697     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1698     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1699     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1700     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1701     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1702     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1703     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1704     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1705     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1706     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1707     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1708     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1709     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1710     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1711     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1712
1713     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1714     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1715     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1716     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1717     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1718     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1719     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1720     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1721     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1722     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1723     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1724     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1725     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1726     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1727     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1728     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1729
1730     // this is for sure the final block
1731
1732     a += r_a;
1733     b += r_b;
1734     c += r_c;
1735     d += r_d;
1736
1737     r_a = a;
1738     r_b = b;
1739     r_c = c;
1740     r_d = d;
1741
1742     w0_t[0] = esalt_buf1[ 8];
1743     w0_t[1] = esalt_buf1[ 9];
1744     w0_t[2] = esalt_buf1[10];
1745     w0_t[3] = esalt_buf1[11];
1746     w1_t[0] = esalt_buf1[12];
1747     w1_t[1] = esalt_buf1[13];
1748     w1_t[2] = esalt_buf1[14];
1749     w1_t[3] = esalt_buf1[15];
1750     w2_t[0] = esalt_buf2[ 0];
1751     w2_t[1] = esalt_buf2[ 1];
1752     w2_t[2] = esalt_buf2[ 2];
1753     w2_t[3] = esalt_buf2[ 3];
1754     w3_t[0] = esalt_buf2[ 4];
1755     w3_t[1] = esalt_buf2[ 5];
1756     w3_t[2] = digest_esalt_len * 8;
1757     w3_t[3] = 0;
1758
1759     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1760     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1761     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1762     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1763     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1764     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1765     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1766     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1767     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1768     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1769     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1770     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1771     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1772     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1773     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1774     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1775
1776     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1777     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1778     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1779     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1780     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1781     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1782     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1783     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1784     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1785     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1786     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1787     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1788     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1789     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1790     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1791     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1792
1793     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1794     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1795     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1796     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1797     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1798     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1799     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1800     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1801     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1802     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1803     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1804     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1805     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1806     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1807     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1808     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1809
1810     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1811     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1812     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1813     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1814     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1815     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1816     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1817     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1818     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1819     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1820     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1821     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1822     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1823     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1824     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1825     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1826
1827     a += r_a;
1828     b += r_b;
1829     c += r_c;
1830     d += r_d;
1831
1832     COMPARE_M_SIMD (a, d, c, b);
1833   }
1834 }
1835
1836 void m11400m_1_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
1837 {
1838   /**
1839    * modifier
1840    */
1841
1842   const u32 gid = get_global_id (0);
1843   const u32 lid = get_local_id (0);
1844
1845   /**
1846    * salt
1847    */
1848
1849   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1850
1851   const u32 pw_salt_len = salt_len + pw_len;
1852
1853   u32 salt_buf0[16];
1854   u32 salt_buf1[16];
1855
1856   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1857   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1858   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1859   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1860   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1861   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1862   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1863   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1864   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1865   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1866   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1867   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1868   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1869   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1870   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1871   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1872   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1873   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1874   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1875   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1876   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1877   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1878   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1879   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1880   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1881   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1882   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1883   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1884   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1885   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1886   salt_buf1[14] = 0;
1887   salt_buf1[15] = 0;
1888
1889   /**
1890    * esalt
1891    */
1892
1893   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1894
1895   u32 esalt_buf0[16];
1896   u32 esalt_buf1[16];
1897
1898   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1899   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1900   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1901   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1902   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1903   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1904   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1905   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1906   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1907   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1908   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1909   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1910   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1911   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1912   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1913   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1914   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1915   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1916   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1917   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1918   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1919   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1920   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1921   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1922   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1923   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1924   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1925   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1926   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1927   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1928   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1929   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1930
1931   const u32 digest_esalt_len = 32 + esalt_len;
1932
1933   /**
1934    * loop
1935    */
1936
1937   u32 w0l = w0[0];
1938
1939   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
1940   {
1941     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
1942
1943     const u32x w0lr = w0l | w0r;
1944
1945     /*
1946      * HA1 = md5 ($salt . $pass)
1947      */
1948
1949     // append the pass to the salt
1950
1951     u32x block0[16];
1952     u32x block1[16];
1953
1954     block0[ 0] = salt_buf0[ 0];
1955     block0[ 1] = salt_buf0[ 1];
1956     block0[ 2] = salt_buf0[ 2];
1957     block0[ 3] = salt_buf0[ 3];
1958     block0[ 4] = salt_buf0[ 4];
1959     block0[ 5] = salt_buf0[ 5];
1960     block0[ 6] = salt_buf0[ 6];
1961     block0[ 7] = salt_buf0[ 7];
1962     block0[ 8] = salt_buf0[ 8];
1963     block0[ 9] = salt_buf0[ 9];
1964     block0[10] = salt_buf0[10];
1965     block0[11] = salt_buf0[11];
1966     block0[12] = salt_buf0[12];
1967     block0[13] = salt_buf0[13];
1968     block0[14] = salt_buf0[14];
1969     block0[15] = salt_buf0[15];
1970     block1[ 0] = salt_buf1[ 0];
1971     block1[ 1] = salt_buf1[ 1];
1972     block1[ 2] = salt_buf1[ 2];
1973     block1[ 3] = salt_buf1[ 3];
1974     block1[ 4] = salt_buf1[ 4];
1975     block1[ 5] = salt_buf1[ 5];
1976     block1[ 6] = salt_buf1[ 6];
1977     block1[ 7] = salt_buf1[ 7];
1978     block1[ 8] = salt_buf1[ 8];
1979     block1[ 9] = salt_buf1[ 9];
1980     block1[10] = salt_buf1[10];
1981     block1[11] = salt_buf1[11];
1982     block1[12] = salt_buf1[12];
1983     block1[13] = salt_buf1[13];
1984     block1[14] = salt_buf1[14];
1985     block1[15] = salt_buf1[15];
1986
1987     u32x w0_t[4];
1988     u32x w1_t[4];
1989     u32x w2_t[4];
1990     u32x w3_t[4];
1991
1992     w0_t[0] = w0lr;
1993     w0_t[1] = w0[1];
1994     w0_t[2] = w0[2];
1995     w0_t[3] = w0[3];
1996     w1_t[0] = w1[0];
1997     w1_t[1] = w1[1];
1998     w1_t[2] = w1[2];
1999     w1_t[3] = w1[3];
2000     w2_t[0] = w2[0];
2001     w2_t[1] = w2[1];
2002     w2_t[2] = w2[2];
2003     w2_t[3] = w2[3];
2004     w3_t[0] = w3[0];
2005     w3_t[1] = w3[1];
2006     w3_t[2] = w3[2];
2007     w3_t[3] = w3[3];
2008
2009     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
2010
2011     w0_t[0] = block0[ 0];
2012     w0_t[1] = block0[ 1];
2013     w0_t[2] = block0[ 2];
2014     w0_t[3] = block0[ 3];
2015     w1_t[0] = block0[ 4];
2016     w1_t[1] = block0[ 5];
2017     w1_t[2] = block0[ 6];
2018     w1_t[3] = block0[ 7];
2019     w2_t[0] = block0[ 8];
2020     w2_t[1] = block0[ 9];
2021     w2_t[2] = block0[10];
2022     w2_t[3] = block0[11];
2023     w3_t[0] = block0[12];
2024     w3_t[1] = block0[13];
2025     w3_t[2] = block0[14];
2026     w3_t[3] = block0[15];
2027
2028     // md5
2029
2030     u32x a = MD5M_A;
2031     u32x b = MD5M_B;
2032     u32x c = MD5M_C;
2033     u32x d = MD5M_D;
2034
2035     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2036     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2037     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2038     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2039     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2040     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2041     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2042     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2043     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2044     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2045     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2046     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2047     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2048     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2049     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2050     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2051
2052     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2053     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2054     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2055     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2056     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2057     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2058     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2059     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2060     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2061     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2062     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2063     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2064     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2065     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2066     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2067     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2068
2069     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2070     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2071     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2072     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2073     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2074     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2075     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2076     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2077     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2078     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2079     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2080     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2081     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2082     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2083     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2084     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2085
2086     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2087     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2088     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2089     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2090     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2091     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2092     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2093     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2094     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2095     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2096     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2097     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2098     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2099     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2100     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2101     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2102
2103     a += MD5M_A;
2104     b += MD5M_B;
2105     c += MD5M_C;
2106     d += MD5M_D;
2107
2108     u32x r_a = a;
2109     u32x r_b = b;
2110     u32x r_c = c;
2111     u32x r_d = d;
2112
2113     w0_t[0] = block1[ 0];
2114     w0_t[1] = block1[ 1];
2115     w0_t[2] = block1[ 2];
2116     w0_t[3] = block1[ 3];
2117     w1_t[0] = block1[ 4];
2118     w1_t[1] = block1[ 5];
2119     w1_t[2] = block1[ 6];
2120     w1_t[3] = block1[ 7];
2121     w2_t[0] = block1[ 8];
2122     w2_t[1] = block1[ 9];
2123     w2_t[2] = block1[10];
2124     w2_t[3] = block1[11];
2125     w3_t[0] = block1[12];
2126     w3_t[1] = block1[13];
2127     w3_t[2] = pw_salt_len * 8;
2128     w3_t[3] = 0;
2129
2130     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2131     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2132     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2133     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2134     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2135     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2136     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2137     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2138     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2139     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2140     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2141     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2142     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2143     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2144     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2145     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2146
2147     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2148     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2149     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2150     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2151     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2152     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2153     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2154     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2155     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2156     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2157     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2158     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2159     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2160     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2161     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2162     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2163
2164     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2165     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2166     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2167     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2168     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2169     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2170     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2171     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2172     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2173     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2174     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2175     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2176     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2177     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2178     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2179     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2180
2181     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2182     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2183     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2184     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2185     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2186     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2187     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2188     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2189     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2190     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2191     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2192     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2193     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2194     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2195     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2196     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2197
2198     a += r_a;
2199     b += r_b;
2200     c += r_c;
2201     d += r_d;
2202
2203     /*
2204      * final = md5 ($HA1 . $esalt)
2205      * we have at least 2 MD5 blocks/transformations, but we might need 3
2206      */
2207
2208     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2209             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2210     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2211             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2212     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2213             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2214     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2215             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2216     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2217             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2218     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2219             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2220     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2221             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2222     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2223             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2224     w2_t[0] = esalt_buf0[0];
2225     w2_t[1] = esalt_buf0[1];
2226     w2_t[2] = esalt_buf0[2];
2227     w2_t[3] = esalt_buf0[3];
2228     w3_t[0] = esalt_buf0[4];
2229     w3_t[1] = esalt_buf0[5];
2230     w3_t[2] = esalt_buf0[6];
2231     w3_t[3] = esalt_buf0[7];
2232
2233     // md5
2234     // 1st transform
2235
2236     a = MD5M_A;
2237     b = MD5M_B;
2238     c = MD5M_C;
2239     d = MD5M_D;
2240
2241     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2242     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2243     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2244     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2245     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2246     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2247     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2248     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2249     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2250     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2251     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2252     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2253     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2254     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2255     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2256     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2257
2258     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2259     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2260     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2261     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2262     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2263     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2264     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2265     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2266     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2267     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2268     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2269     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2270     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2271     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2272     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2273     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2274
2275     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2276     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2277     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2278     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2279     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2280     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2281     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2282     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2283     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2284     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2285     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2286     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2287     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2288     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2289     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2290     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2291
2292     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2293     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2294     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2295     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2296     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2297     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2298     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2299     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2300     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2301     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2302     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2303     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2304     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2305     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2306     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2307     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2308
2309     a += MD5M_A;
2310     b += MD5M_B;
2311     c += MD5M_C;
2312     d += MD5M_D;
2313
2314     r_a = a;
2315     r_b = b;
2316     r_c = c;
2317     r_d = d;
2318
2319     // 2nd transform
2320
2321     w0_t[0] = esalt_buf0[ 8];
2322     w0_t[1] = esalt_buf0[ 9];
2323     w0_t[2] = esalt_buf0[10];
2324     w0_t[3] = esalt_buf0[11];
2325     w1_t[0] = esalt_buf0[12];
2326     w1_t[1] = esalt_buf0[13];
2327     w1_t[2] = esalt_buf0[14];
2328     w1_t[3] = esalt_buf0[15];
2329     w2_t[0] = esalt_buf1[ 0];
2330     w2_t[1] = esalt_buf1[ 1];
2331     w2_t[2] = esalt_buf1[ 2];
2332     w2_t[3] = esalt_buf1[ 3];
2333     w3_t[0] = esalt_buf1[ 4];
2334     w3_t[1] = esalt_buf1[ 5];
2335     w3_t[2] = digest_esalt_len * 8;
2336     w3_t[3] = 0;
2337
2338     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2339     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2340     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2341     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2342     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2343     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2344     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2345     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2346     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2347     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2348     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2349     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2350     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2351     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2352     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2353     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2354
2355     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2356     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2357     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2358     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2359     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2360     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2361     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2362     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2363     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2364     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2365     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2366     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2367     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2368     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2369     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2370     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2371
2372     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2373     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2374     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2375     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2376     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2377     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2378     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2379     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2380     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2381     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2382     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2383     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2384     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2385     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2386     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2387     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2388
2389     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2390     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2391     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2392     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2393     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2394     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2395     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2396     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2397     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2398     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2399     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2400     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2401     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2402     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2403     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2404     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2405
2406     a += r_a;
2407     b += r_b;
2408     c += r_c;
2409     d += r_d;
2410
2411     COMPARE_M_SIMD (a, d, c, b);
2412   }
2413 }
2414
2415 void m11400m_1_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
2416 {
2417   /**
2418    * modifier
2419    */
2420
2421   const u32 gid = get_global_id (0);
2422   const u32 lid = get_local_id (0);
2423
2424   /**
2425    * salt
2426    */
2427
2428   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
2429
2430   const u32 pw_salt_len = salt_len + pw_len;
2431
2432   u32 salt_buf0[16];
2433   u32 salt_buf1[16];
2434
2435   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
2436   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
2437   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
2438   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
2439   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
2440   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
2441   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
2442   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
2443   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
2444   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
2445   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
2446   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
2447   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
2448   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
2449   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
2450   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
2451   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
2452   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
2453   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
2454   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
2455   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
2456   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
2457   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
2458   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
2459   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
2460   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
2461   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
2462   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
2463   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
2464   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
2465   salt_buf1[14] = 0;
2466   salt_buf1[15] = 0;
2467
2468   /**
2469    * esalt
2470    */
2471
2472   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
2473
2474   u32 esalt_buf0[16];
2475   u32 esalt_buf1[16];
2476   u32 esalt_buf2[16];
2477
2478   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
2479   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
2480   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
2481   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
2482   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
2483   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
2484   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
2485   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
2486   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
2487   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
2488   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
2489   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
2490   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
2491   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
2492   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
2493   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
2494   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
2495   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
2496   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
2497   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
2498   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
2499   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
2500   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
2501   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
2502   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
2503   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
2504   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
2505   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
2506   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
2507   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
2508   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
2509   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
2510   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
2511   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
2512   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
2513   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
2514   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
2515   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
2516   esalt_buf2[ 6] = 0;
2517   esalt_buf2[ 7] = 0;
2518   esalt_buf2[ 8] = 0;
2519   esalt_buf2[ 9] = 0;
2520   esalt_buf2[10] = 0;
2521   esalt_buf2[11] = 0;
2522   esalt_buf2[12] = 0;
2523   esalt_buf2[13] = 0;
2524   esalt_buf2[14] = 0;
2525   esalt_buf2[15] = 0;
2526
2527   const u32 digest_esalt_len = 32 + esalt_len;
2528
2529   /**
2530    * loop
2531    */
2532
2533   u32 w0l = w0[0];
2534
2535   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
2536   {
2537     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
2538
2539     const u32x w0lr = w0l | w0r;
2540
2541     /*
2542      * HA1 = md5 ($salt . $pass)
2543      */
2544
2545     // append the pass to the salt
2546
2547     u32x block0[16];
2548     u32x block1[16];
2549
2550     block0[ 0] = salt_buf0[ 0];
2551     block0[ 1] = salt_buf0[ 1];
2552     block0[ 2] = salt_buf0[ 2];
2553     block0[ 3] = salt_buf0[ 3];
2554     block0[ 4] = salt_buf0[ 4];
2555     block0[ 5] = salt_buf0[ 5];
2556     block0[ 6] = salt_buf0[ 6];
2557     block0[ 7] = salt_buf0[ 7];
2558     block0[ 8] = salt_buf0[ 8];
2559     block0[ 9] = salt_buf0[ 9];
2560     block0[10] = salt_buf0[10];
2561     block0[11] = salt_buf0[11];
2562     block0[12] = salt_buf0[12];
2563     block0[13] = salt_buf0[13];
2564     block0[14] = salt_buf0[14];
2565     block0[15] = salt_buf0[15];
2566     block1[ 0] = salt_buf1[ 0];
2567     block1[ 1] = salt_buf1[ 1];
2568     block1[ 2] = salt_buf1[ 2];
2569     block1[ 3] = salt_buf1[ 3];
2570     block1[ 4] = salt_buf1[ 4];
2571     block1[ 5] = salt_buf1[ 5];
2572     block1[ 6] = salt_buf1[ 6];
2573     block1[ 7] = salt_buf1[ 7];
2574     block1[ 8] = salt_buf1[ 8];
2575     block1[ 9] = salt_buf1[ 9];
2576     block1[10] = salt_buf1[10];
2577     block1[11] = salt_buf1[11];
2578     block1[12] = salt_buf1[12];
2579     block1[13] = salt_buf1[13];
2580     block1[14] = salt_buf1[14];
2581     block1[15] = salt_buf1[15];
2582
2583     u32x w0_t[4];
2584     u32x w1_t[4];
2585     u32x w2_t[4];
2586     u32x w3_t[4];
2587
2588     w0_t[0] = w0lr;
2589     w0_t[1] = w0[1];
2590     w0_t[2] = w0[2];
2591     w0_t[3] = w0[3];
2592     w1_t[0] = w1[0];
2593     w1_t[1] = w1[1];
2594     w1_t[2] = w1[2];
2595     w1_t[3] = w1[3];
2596     w2_t[0] = w2[0];
2597     w2_t[1] = w2[1];
2598     w2_t[2] = w2[2];
2599     w2_t[3] = w2[3];
2600     w3_t[0] = w3[0];
2601     w3_t[1] = w3[1];
2602     w3_t[2] = w3[2];
2603     w3_t[3] = w3[3];
2604
2605     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
2606
2607     w0_t[0] = block0[ 0];
2608     w0_t[1] = block0[ 1];
2609     w0_t[2] = block0[ 2];
2610     w0_t[3] = block0[ 3];
2611     w1_t[0] = block0[ 4];
2612     w1_t[1] = block0[ 5];
2613     w1_t[2] = block0[ 6];
2614     w1_t[3] = block0[ 7];
2615     w2_t[0] = block0[ 8];
2616     w2_t[1] = block0[ 9];
2617     w2_t[2] = block0[10];
2618     w2_t[3] = block0[11];
2619     w3_t[0] = block0[12];
2620     w3_t[1] = block0[13];
2621     w3_t[2] = block0[14];
2622     w3_t[3] = block0[15];
2623
2624     // md5
2625
2626     u32x a = MD5M_A;
2627     u32x b = MD5M_B;
2628     u32x c = MD5M_C;
2629     u32x d = MD5M_D;
2630
2631     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2632     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2633     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2634     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2635     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2636     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2637     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2638     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2639     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2640     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2641     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2642     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2643     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2644     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2645     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2646     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2647
2648     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2649     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2650     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2651     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2652     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2653     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2654     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2655     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2656     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2657     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2658     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2659     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2660     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2661     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2662     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2663     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2664
2665     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2666     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2667     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2668     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2669     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2670     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2671     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2672     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2673     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2674     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2675     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2676     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2677     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2678     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2679     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2680     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2681
2682     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2683     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2684     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2685     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2686     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2687     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2688     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2689     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2690     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2691     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2692     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2693     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2694     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2695     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2696     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2697     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2698
2699     a += MD5M_A;
2700     b += MD5M_B;
2701     c += MD5M_C;
2702     d += MD5M_D;
2703
2704     u32x r_a = a;
2705     u32x r_b = b;
2706     u32x r_c = c;
2707     u32x r_d = d;
2708
2709     w0_t[0] = block1[ 0];
2710     w0_t[1] = block1[ 1];
2711     w0_t[2] = block1[ 2];
2712     w0_t[3] = block1[ 3];
2713     w1_t[0] = block1[ 4];
2714     w1_t[1] = block1[ 5];
2715     w1_t[2] = block1[ 6];
2716     w1_t[3] = block1[ 7];
2717     w2_t[0] = block1[ 8];
2718     w2_t[1] = block1[ 9];
2719     w2_t[2] = block1[10];
2720     w2_t[3] = block1[11];
2721     w3_t[0] = block1[12];
2722     w3_t[1] = block1[13];
2723     w3_t[2] = pw_salt_len * 8;
2724     w3_t[3] = 0;
2725
2726     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2727     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2728     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2729     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2730     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2731     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2732     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2733     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2734     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2735     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2736     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2737     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2738     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2739     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2740     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2741     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2742
2743     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2744     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2745     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2746     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2747     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2748     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2749     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2750     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2751     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2752     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2753     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2754     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2755     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2756     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2757     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2758     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2759
2760     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2761     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2762     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2763     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2764     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2765     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2766     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2767     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2768     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2769     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2770     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2771     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2772     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2773     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2774     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2775     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2776
2777     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2778     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2779     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2780     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2781     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2782     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2783     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2784     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2785     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2786     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2787     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2788     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2789     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2790     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2791     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2792     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2793
2794     a += r_a;
2795     b += r_b;
2796     c += r_c;
2797     d += r_d;
2798
2799     /*
2800      * final = md5 ($HA1 . $esalt)
2801      * we have at least 2 MD5 blocks/transformations, but we might need 3
2802      */
2803
2804     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2805             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2806     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2807             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2808     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2809             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2810     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2811             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2812     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2813             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2814     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2815             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2816     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2817             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2818     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2819             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2820     w2_t[0] = esalt_buf0[0];
2821     w2_t[1] = esalt_buf0[1];
2822     w2_t[2] = esalt_buf0[2];
2823     w2_t[3] = esalt_buf0[3];
2824     w3_t[0] = esalt_buf0[4];
2825     w3_t[1] = esalt_buf0[5];
2826     w3_t[2] = esalt_buf0[6];
2827     w3_t[3] = esalt_buf0[7];
2828
2829     // md5
2830     // 1st transform
2831
2832     a = MD5M_A;
2833     b = MD5M_B;
2834     c = MD5M_C;
2835     d = MD5M_D;
2836
2837     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2838     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2839     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2840     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2841     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2842     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2843     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2844     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2845     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2846     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2847     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2848     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2849     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2850     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2851     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2852     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2853
2854     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2855     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2856     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2857     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2858     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2859     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2860     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2861     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2862     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2863     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2864     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2865     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2866     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2867     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2868     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2869     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2870
2871     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2872     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2873     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2874     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2875     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2876     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2877     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2878     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2879     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2880     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2881     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2882     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2883     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2884     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2885     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2886     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2887
2888     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2889     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2890     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2891     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2892     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2893     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2894     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2895     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2896     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2897     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2898     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2899     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2900     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2901     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2902     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2903     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2904
2905     a += MD5M_A;
2906     b += MD5M_B;
2907     c += MD5M_C;
2908     d += MD5M_D;
2909
2910     r_a = a;
2911     r_b = b;
2912     r_c = c;
2913     r_d = d;
2914
2915     // 2nd transform
2916
2917     w0_t[0] = esalt_buf0[ 8];
2918     w0_t[1] = esalt_buf0[ 9];
2919     w0_t[2] = esalt_buf0[10];
2920     w0_t[3] = esalt_buf0[11];
2921     w1_t[0] = esalt_buf0[12];
2922     w1_t[1] = esalt_buf0[13];
2923     w1_t[2] = esalt_buf0[14];
2924     w1_t[3] = esalt_buf0[15];
2925     w2_t[0] = esalt_buf1[ 0];
2926     w2_t[1] = esalt_buf1[ 1];
2927     w2_t[2] = esalt_buf1[ 2];
2928     w2_t[3] = esalt_buf1[ 3];
2929     w3_t[0] = esalt_buf1[ 4];
2930     w3_t[1] = esalt_buf1[ 5];
2931     w3_t[2] = esalt_buf1[ 6];
2932     w3_t[3] = esalt_buf1[ 7];
2933
2934     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2935     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2936     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2937     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2938     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2939     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2940     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2941     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2942     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2943     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2944     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2945     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2946     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2947     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2948     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2949     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2950
2951     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2952     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2953     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2954     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2955     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2956     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2957     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2958     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2959     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2960     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2961     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2962     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2963     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2964     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2965     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2966     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2967
2968     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2969     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2970     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2971     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2972     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2973     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2974     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2975     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2976     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2977     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2978     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2979     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2980     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2981     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2982     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2983     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2984
2985     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2986     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2987     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2988     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2989     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2990     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2991     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2992     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2993     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2994     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2995     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2996     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2997     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2998     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2999     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3000     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3001
3002     // this is for sure the final block
3003
3004     a += r_a;
3005     b += r_b;
3006     c += r_c;
3007     d += r_d;
3008
3009     r_a = a;
3010     r_b = b;
3011     r_c = c;
3012     r_d = d;
3013
3014     w0_t[0] = esalt_buf1[ 8];
3015     w0_t[1] = esalt_buf1[ 9];
3016     w0_t[2] = esalt_buf1[10];
3017     w0_t[3] = esalt_buf1[11];
3018     w1_t[0] = esalt_buf1[12];
3019     w1_t[1] = esalt_buf1[13];
3020     w1_t[2] = esalt_buf1[14];
3021     w1_t[3] = esalt_buf1[15];
3022     w2_t[0] = esalt_buf2[ 0];
3023     w2_t[1] = esalt_buf2[ 1];
3024     w2_t[2] = esalt_buf2[ 2];
3025     w2_t[3] = esalt_buf2[ 3];
3026     w3_t[0] = esalt_buf2[ 4];
3027     w3_t[1] = esalt_buf2[ 5];
3028     w3_t[2] = digest_esalt_len * 8;
3029     w3_t[3] = 0;
3030
3031     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3032     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3033     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3034     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3035     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3036     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3037     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3038     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3039     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3040     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3041     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3042     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3043     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3044     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3045     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3046     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3047
3048     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3049     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3050     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3051     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3052     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3053     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3054     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3055     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3056     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3057     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3058     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3059     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3060     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3061     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3062     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3063     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3064
3065     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3066     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3067     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3068     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3069     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3070     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3071     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3072     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3073     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3074     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3075     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3076     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3077     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3078     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3079     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3080     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3081
3082     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3083     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3084     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3085     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3086     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3087     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3088     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3089     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3090     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3091     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3092     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3093     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3094     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3095     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3096     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3097     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3098
3099     a += r_a;
3100     b += r_b;
3101     c += r_c;
3102     d += r_d;
3103
3104     COMPARE_M_SIMD (a, d, c, b);
3105   }
3106 }
3107
3108 void m11400s_0_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
3109 {
3110   /**
3111    * modifier
3112    */
3113
3114   const u32 gid = get_global_id (0);
3115   const u32 lid = get_local_id (0);
3116
3117   /**
3118    * digest
3119    */
3120
3121   const u32 search[4] =
3122   {
3123     digests_buf[digests_offset].digest_buf[DGST_R0],
3124     digests_buf[digests_offset].digest_buf[DGST_R1],
3125     digests_buf[digests_offset].digest_buf[DGST_R2],
3126     digests_buf[digests_offset].digest_buf[DGST_R3]
3127   };
3128
3129   /**
3130    * salt
3131    */
3132
3133   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
3134
3135   const u32 pw_salt_len = salt_len + pw_len;
3136
3137   u32 salt_buf0[16];
3138   u32 salt_buf1[16];
3139
3140   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
3141   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
3142   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
3143   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
3144   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
3145   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
3146   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
3147   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
3148   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
3149   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
3150   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
3151   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
3152   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
3153   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
3154   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
3155   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
3156   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
3157   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
3158   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
3159   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
3160   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
3161   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
3162   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
3163   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
3164   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
3165   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
3166   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
3167   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
3168   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
3169   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
3170   salt_buf1[14] = 0;
3171   salt_buf1[15] = 0;
3172
3173   /**
3174    * esalt
3175    */
3176
3177   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
3178
3179   u32 esalt_buf0[16];
3180   u32 esalt_buf1[16];
3181
3182   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
3183   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
3184   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
3185   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
3186   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
3187   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
3188   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
3189   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
3190   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
3191   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
3192   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
3193   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
3194   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
3195   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
3196   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
3197   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
3198   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
3199   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
3200   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
3201   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
3202   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
3203   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
3204   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
3205   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
3206   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
3207   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
3208   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
3209   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
3210   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
3211   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
3212   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
3213   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
3214
3215   const u32 digest_esalt_len = 32 + esalt_len;
3216
3217   /**
3218    * loop
3219    */
3220
3221   u32 w0l = w0[0];
3222
3223   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
3224   {
3225     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
3226
3227     const u32x w0lr = w0l | w0r;
3228
3229     /*
3230      * HA1 = md5 ($salt . $pass)
3231      */
3232
3233     // append the pass to the salt
3234
3235     u32x block0[16];
3236     u32x block1[16];
3237
3238     block0[ 0] = salt_buf0[ 0];
3239     block0[ 1] = salt_buf0[ 1];
3240     block0[ 2] = salt_buf0[ 2];
3241     block0[ 3] = salt_buf0[ 3];
3242     block0[ 4] = salt_buf0[ 4];
3243     block0[ 5] = salt_buf0[ 5];
3244     block0[ 6] = salt_buf0[ 6];
3245     block0[ 7] = salt_buf0[ 7];
3246     block0[ 8] = salt_buf0[ 8];
3247     block0[ 9] = salt_buf0[ 9];
3248     block0[10] = salt_buf0[10];
3249     block0[11] = salt_buf0[11];
3250     block0[12] = salt_buf0[12];
3251     block0[13] = salt_buf0[13];
3252     block0[14] = salt_buf0[14];
3253     block0[15] = salt_buf0[15];
3254     block1[ 0] = salt_buf1[ 0];
3255     block1[ 1] = salt_buf1[ 1];
3256     block1[ 2] = salt_buf1[ 2];
3257     block1[ 3] = salt_buf1[ 3];
3258     block1[ 4] = salt_buf1[ 4];
3259     block1[ 5] = salt_buf1[ 5];
3260     block1[ 6] = salt_buf1[ 6];
3261     block1[ 7] = salt_buf1[ 7];
3262     block1[ 8] = salt_buf1[ 8];
3263     block1[ 9] = salt_buf1[ 9];
3264     block1[10] = salt_buf1[10];
3265     block1[11] = salt_buf1[11];
3266     block1[12] = salt_buf1[12];
3267     block1[13] = salt_buf1[13];
3268     block1[14] = salt_buf1[14];
3269     block1[15] = salt_buf1[15];
3270
3271     u32x w0_t[4];
3272     u32x w1_t[4];
3273     u32x w2_t[4];
3274     u32x w3_t[4];
3275
3276     w0_t[0] = w0lr;
3277     w0_t[1] = w0[1];
3278     w0_t[2] = w0[2];
3279     w0_t[3] = w0[3];
3280     w1_t[0] = w1[0];
3281     w1_t[1] = w1[1];
3282     w1_t[2] = w1[2];
3283     w1_t[3] = w1[3];
3284     w2_t[0] = w2[0];
3285     w2_t[1] = w2[1];
3286     w2_t[2] = w2[2];
3287     w2_t[3] = w2[3];
3288     w3_t[0] = w3[0];
3289     w3_t[1] = w3[1];
3290     w3_t[2] = w3[2];
3291     w3_t[3] = w3[3];
3292
3293     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
3294
3295     w0_t[0] = block0[ 0];
3296     w0_t[1] = block0[ 1];
3297     w0_t[2] = block0[ 2];
3298     w0_t[3] = block0[ 3];
3299     w1_t[0] = block0[ 4];
3300     w1_t[1] = block0[ 5];
3301     w1_t[2] = block0[ 6];
3302     w1_t[3] = block0[ 7];
3303     w2_t[0] = block0[ 8];
3304     w2_t[1] = block0[ 9];
3305     w2_t[2] = block0[10];
3306     w2_t[3] = block0[11];
3307     w3_t[0] = block0[12];
3308     w3_t[1] = block0[13];
3309     w3_t[2] = pw_salt_len * 8;
3310     w3_t[3] = 0;
3311
3312     // md5
3313
3314     u32x a = MD5M_A;
3315     u32x b = MD5M_B;
3316     u32x c = MD5M_C;
3317     u32x d = MD5M_D;
3318
3319     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3320     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3321     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3322     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3323     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3324     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3325     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3326     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3327     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3328     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3329     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3330     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3331     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3332     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3333     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3334     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3335
3336     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3337     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3338     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3339     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3340     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3341     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3342     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3343     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3344     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3345     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3346     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3347     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3348     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3349     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3350     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3351     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3352
3353     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3354     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3355     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3356     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3357     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3358     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3359     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3360     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3361     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3362     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3363     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3364     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3365     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3366     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3367     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3368     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3369
3370     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3371     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3372     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3373     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3374     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3375     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3376     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3377     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3378     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3379     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3380     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3381     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3382     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3383     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3384     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3385     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3386
3387     a += MD5M_A;
3388     b += MD5M_B;
3389     c += MD5M_C;
3390     d += MD5M_D;
3391
3392     /*
3393      * final = md5 ($HA1 . $esalt)
3394      * we have at least 2 MD5 blocks/transformations, but we might need 3
3395      */
3396
3397     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
3398             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
3399     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
3400             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
3401     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
3402             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
3403     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
3404             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
3405     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
3406             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
3407     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
3408             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
3409     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
3410             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
3411     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
3412             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
3413     w2_t[0] = esalt_buf0[0];
3414     w2_t[1] = esalt_buf0[1];
3415     w2_t[2] = esalt_buf0[2];
3416     w2_t[3] = esalt_buf0[3];
3417     w3_t[0] = esalt_buf0[4];
3418     w3_t[1] = esalt_buf0[5];
3419     w3_t[2] = esalt_buf0[6];
3420     w3_t[3] = esalt_buf0[7];
3421
3422     // md5
3423     // 1st transform
3424
3425     a = MD5M_A;
3426     b = MD5M_B;
3427     c = MD5M_C;
3428     d = MD5M_D;
3429
3430     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3431     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3432     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3433     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3434     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3435     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3436     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3437     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3438     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3439     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3440     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3441     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3442     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3443     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3444     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3445     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3446
3447     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3448     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3449     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3450     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3451     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3452     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3453     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3454     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3455     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3456     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3457     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3458     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3459     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3460     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3461     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3462     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3463
3464     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3465     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3466     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3467     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3468     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3469     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3470     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3471     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3472     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3473     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3474     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3475     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3476     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3477     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3478     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3479     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3480
3481     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3482     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3483     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3484     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3485     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3486     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3487     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3488     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3489     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3490     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3491     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3492     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3493     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3494     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3495     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3496     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3497
3498     a += MD5M_A;
3499     b += MD5M_B;
3500     c += MD5M_C;
3501     d += MD5M_D;
3502
3503     u32x r_a = a;
3504     u32x r_b = b;
3505     u32x r_c = c;
3506     u32x r_d = d;
3507
3508     // 2nd transform
3509
3510     w0_t[0] = esalt_buf0[ 8];
3511     w0_t[1] = esalt_buf0[ 9];
3512     w0_t[2] = esalt_buf0[10];
3513     w0_t[3] = esalt_buf0[11];
3514     w1_t[0] = esalt_buf0[12];
3515     w1_t[1] = esalt_buf0[13];
3516     w1_t[2] = esalt_buf0[14];
3517     w1_t[3] = esalt_buf0[15];
3518     w2_t[0] = esalt_buf1[ 0];
3519     w2_t[1] = esalt_buf1[ 1];
3520     w2_t[2] = esalt_buf1[ 2];
3521     w2_t[3] = esalt_buf1[ 3];
3522     w3_t[0] = esalt_buf1[ 4];
3523     w3_t[1] = esalt_buf1[ 5];
3524     w3_t[2] = digest_esalt_len * 8;
3525     w3_t[3] = 0;
3526
3527     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3528     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3529     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3530     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3531     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3532     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3533     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3534     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3535     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3536     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3537     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3538     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3539     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3540     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3541     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3542     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3543
3544     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3545     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3546     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3547     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3548     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3549     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3550     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3551     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3552     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3553     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3554     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3555     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3556     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3557     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3558     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3559     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3560
3561     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3562     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3563     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3564     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3565     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3566     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3567     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3568     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3569     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3570     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3571     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3572     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3573     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3574     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3575     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3576     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3577
3578     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3579     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3580     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3581     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3582     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3583     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3584     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3585     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3586     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3587     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3588     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3589     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3590     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3591     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3592     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3593     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3594
3595     a += r_a;
3596     b += r_b;
3597     c += r_c;
3598     d += r_d;
3599
3600     COMPARE_S_SIMD (a, d, c, b);
3601   }
3602 }
3603
3604 void m11400s_0_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
3605 {
3606   /**
3607    * modifier
3608    */
3609
3610   const u32 gid = get_global_id (0);
3611   const u32 lid = get_local_id (0);
3612
3613   /**
3614    * digest
3615    */
3616
3617   const u32 search[4] =
3618   {
3619     digests_buf[digests_offset].digest_buf[DGST_R0],
3620     digests_buf[digests_offset].digest_buf[DGST_R1],
3621     digests_buf[digests_offset].digest_buf[DGST_R2],
3622     digests_buf[digests_offset].digest_buf[DGST_R3]
3623   };
3624
3625   /**
3626    * salt
3627    */
3628
3629   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
3630
3631   const u32 pw_salt_len = salt_len + pw_len;
3632
3633   u32 salt_buf0[16];
3634   u32 salt_buf1[16];
3635
3636   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
3637   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
3638   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
3639   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
3640   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
3641   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
3642   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
3643   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
3644   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
3645   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
3646   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
3647   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
3648   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
3649   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
3650   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
3651   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
3652   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
3653   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
3654   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
3655   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
3656   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
3657   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
3658   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
3659   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
3660   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
3661   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
3662   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
3663   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
3664   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
3665   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
3666   salt_buf1[14] = 0;
3667   salt_buf1[15] = 0;
3668
3669   /**
3670    * esalt
3671    */
3672
3673   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
3674
3675   u32 esalt_buf0[16];
3676   u32 esalt_buf1[16];
3677   u32 esalt_buf2[16];
3678
3679   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
3680   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
3681   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
3682   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
3683   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
3684   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
3685   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
3686   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
3687   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
3688   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
3689   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
3690   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
3691   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
3692   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
3693   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
3694   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
3695   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
3696   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
3697   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
3698   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
3699   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
3700   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
3701   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
3702   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
3703   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
3704   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
3705   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
3706   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
3707   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
3708   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
3709   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
3710   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
3711   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
3712   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
3713   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
3714   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
3715   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
3716   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
3717   esalt_buf2[ 6] = 0;
3718   esalt_buf2[ 7] = 0;
3719   esalt_buf2[ 8] = 0;
3720   esalt_buf2[ 9] = 0;
3721   esalt_buf2[10] = 0;
3722   esalt_buf2[11] = 0;
3723   esalt_buf2[12] = 0;
3724   esalt_buf2[13] = 0;
3725   esalt_buf2[14] = 0;
3726   esalt_buf2[15] = 0;
3727
3728   const u32 digest_esalt_len = 32 + esalt_len;
3729
3730   /**
3731    * loop
3732    */
3733
3734   u32 w0l = w0[0];
3735
3736   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
3737   {
3738     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
3739
3740     const u32x w0lr = w0l | w0r;
3741
3742     /*
3743      * HA1 = md5 ($salt . $pass)
3744      */
3745
3746     // append the pass to the salt
3747
3748     u32x block0[16];
3749     u32x block1[16];
3750
3751     block0[ 0] = salt_buf0[ 0];
3752     block0[ 1] = salt_buf0[ 1];
3753     block0[ 2] = salt_buf0[ 2];
3754     block0[ 3] = salt_buf0[ 3];
3755     block0[ 4] = salt_buf0[ 4];
3756     block0[ 5] = salt_buf0[ 5];
3757     block0[ 6] = salt_buf0[ 6];
3758     block0[ 7] = salt_buf0[ 7];
3759     block0[ 8] = salt_buf0[ 8];
3760     block0[ 9] = salt_buf0[ 9];
3761     block0[10] = salt_buf0[10];
3762     block0[11] = salt_buf0[11];
3763     block0[12] = salt_buf0[12];
3764     block0[13] = salt_buf0[13];
3765     block0[14] = salt_buf0[14];
3766     block0[15] = salt_buf0[15];
3767     block1[ 0] = salt_buf1[ 0];
3768     block1[ 1] = salt_buf1[ 1];
3769     block1[ 2] = salt_buf1[ 2];
3770     block1[ 3] = salt_buf1[ 3];
3771     block1[ 4] = salt_buf1[ 4];
3772     block1[ 5] = salt_buf1[ 5];
3773     block1[ 6] = salt_buf1[ 6];
3774     block1[ 7] = salt_buf1[ 7];
3775     block1[ 8] = salt_buf1[ 8];
3776     block1[ 9] = salt_buf1[ 9];
3777     block1[10] = salt_buf1[10];
3778     block1[11] = salt_buf1[11];
3779     block1[12] = salt_buf1[12];
3780     block1[13] = salt_buf1[13];
3781     block1[14] = salt_buf1[14];
3782     block1[15] = salt_buf1[15];
3783
3784     u32x w0_t[4];
3785     u32x w1_t[4];
3786     u32x w2_t[4];
3787     u32x w3_t[4];
3788
3789     w0_t[0] = w0lr;
3790     w0_t[1] = w0[1];
3791     w0_t[2] = w0[2];
3792     w0_t[3] = w0[3];
3793     w1_t[0] = w1[0];
3794     w1_t[1] = w1[1];
3795     w1_t[2] = w1[2];
3796     w1_t[3] = w1[3];
3797     w2_t[0] = w2[0];
3798     w2_t[1] = w2[1];
3799     w2_t[2] = w2[2];
3800     w2_t[3] = w2[3];
3801     w3_t[0] = w3[0];
3802     w3_t[1] = w3[1];
3803     w3_t[2] = w3[2];
3804     w3_t[3] = w3[3];
3805
3806     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
3807
3808     w0_t[0] = block0[ 0];
3809     w0_t[1] = block0[ 1];
3810     w0_t[2] = block0[ 2];
3811     w0_t[3] = block0[ 3];
3812     w1_t[0] = block0[ 4];
3813     w1_t[1] = block0[ 5];
3814     w1_t[2] = block0[ 6];
3815     w1_t[3] = block0[ 7];
3816     w2_t[0] = block0[ 8];
3817     w2_t[1] = block0[ 9];
3818     w2_t[2] = block0[10];
3819     w2_t[3] = block0[11];
3820     w3_t[0] = block0[12];
3821     w3_t[1] = block0[13];
3822     w3_t[2] = pw_salt_len * 8;
3823     w3_t[3] = 0;
3824
3825     // md5
3826
3827     u32x a = MD5M_A;
3828     u32x b = MD5M_B;
3829     u32x c = MD5M_C;
3830     u32x d = MD5M_D;
3831
3832     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3833     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3834     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3835     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3836     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3837     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3838     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3839     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3840     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3841     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3842     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3843     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3844     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3845     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3846     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3847     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3848
3849     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3850     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3851     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3852     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3853     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3854     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3855     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3856     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3857     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3858     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3859     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3860     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3861     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3862     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3863     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3864     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3865
3866     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3867     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3868     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3869     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3870     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3871     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3872     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3873     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3874     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3875     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3876     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3877     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3878     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3879     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3880     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3881     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3882
3883     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3884     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3885     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3886     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3887     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3888     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
3889     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
3890     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
3891     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
3892     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
3893     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
3894     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
3895     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
3896     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
3897     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
3898     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
3899
3900     a += MD5M_A;
3901     b += MD5M_B;
3902     c += MD5M_C;
3903     d += MD5M_D;
3904
3905     /*
3906      * final = md5 ($HA1 . $esalt)
3907      * we have at least 2 MD5 blocks/transformations, but we might need 3
3908      */
3909
3910     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
3911             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
3912     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
3913             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
3914     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
3915             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
3916     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
3917             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
3918     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
3919             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
3920     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
3921             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
3922     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
3923             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
3924     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
3925             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
3926     w2_t[0] = esalt_buf0[0];
3927     w2_t[1] = esalt_buf0[1];
3928     w2_t[2] = esalt_buf0[2];
3929     w2_t[3] = esalt_buf0[3];
3930     w3_t[0] = esalt_buf0[4];
3931     w3_t[1] = esalt_buf0[5];
3932     w3_t[2] = esalt_buf0[6];
3933     w3_t[3] = esalt_buf0[7];
3934
3935     // md5
3936     // 1st transform
3937
3938     a = MD5M_A;
3939     b = MD5M_B;
3940     c = MD5M_C;
3941     d = MD5M_D;
3942
3943     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
3944     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
3945     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
3946     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
3947     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
3948     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
3949     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
3950     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
3951     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
3952     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
3953     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
3954     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
3955     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
3956     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
3957     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
3958     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
3959
3960     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
3961     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
3962     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
3963     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
3964     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
3965     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
3966     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
3967     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
3968     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
3969     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
3970     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
3971     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
3972     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
3973     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
3974     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
3975     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
3976
3977     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
3978     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
3979     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
3980     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
3981     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
3982     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
3983     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
3984     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
3985     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
3986     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
3987     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
3988     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
3989     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
3990     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
3991     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
3992     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
3993
3994     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
3995     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
3996     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
3997     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
3998     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
3999     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4000     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4001     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4002     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4003     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4004     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4005     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4006     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4007     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4008     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4009     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4010
4011     a += MD5M_A;
4012     b += MD5M_B;
4013     c += MD5M_C;
4014     d += MD5M_D;
4015
4016     u32x r_a = a;
4017     u32x r_b = b;
4018     u32x r_c = c;
4019     u32x r_d = d;
4020
4021     // 2nd transform
4022
4023     w0_t[0] = esalt_buf0[ 8];
4024     w0_t[1] = esalt_buf0[ 9];
4025     w0_t[2] = esalt_buf0[10];
4026     w0_t[3] = esalt_buf0[11];
4027     w1_t[0] = esalt_buf0[12];
4028     w1_t[1] = esalt_buf0[13];
4029     w1_t[2] = esalt_buf0[14];
4030     w1_t[3] = esalt_buf0[15];
4031     w2_t[0] = esalt_buf1[ 0];
4032     w2_t[1] = esalt_buf1[ 1];
4033     w2_t[2] = esalt_buf1[ 2];
4034     w2_t[3] = esalt_buf1[ 3];
4035     w3_t[0] = esalt_buf1[ 4];
4036     w3_t[1] = esalt_buf1[ 5];
4037     w3_t[2] = esalt_buf1[ 6];
4038     w3_t[3] = esalt_buf1[ 7];
4039
4040     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4041     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4042     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4043     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4044     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4045     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4046     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4047     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4048     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4049     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4050     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4051     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4052     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4053     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4054     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4055     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4056
4057     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4058     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4059     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4060     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4061     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4062     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4063     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4064     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4065     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4066     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4067     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4068     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4069     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4070     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4071     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4072     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4073
4074     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4075     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4076     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4077     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4078     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4079     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4080     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4081     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4082     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4083     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4084     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4085     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4086     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4087     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4088     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4089     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4090
4091     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4092     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4093     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4094     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4095     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4096     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4097     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4098     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4099     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4100     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4101     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4102     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4103     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4104     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4105     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4106     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4107
4108     // this is for sure the final block
4109
4110     a += r_a;
4111     b += r_b;
4112     c += r_c;
4113     d += r_d;
4114
4115     r_a = a;
4116     r_b = b;
4117     r_c = c;
4118     r_d = d;
4119
4120     w0_t[0] = esalt_buf1[ 8];
4121     w0_t[1] = esalt_buf1[ 9];
4122     w0_t[2] = esalt_buf1[10];
4123     w0_t[3] = esalt_buf1[11];
4124     w1_t[0] = esalt_buf1[12];
4125     w1_t[1] = esalt_buf1[13];
4126     w1_t[2] = esalt_buf1[14];
4127     w1_t[3] = esalt_buf1[15];
4128     w2_t[0] = esalt_buf2[ 0];
4129     w2_t[1] = esalt_buf2[ 1];
4130     w2_t[2] = esalt_buf2[ 2];
4131     w2_t[3] = esalt_buf2[ 3];
4132     w3_t[0] = esalt_buf2[ 4];
4133     w3_t[1] = esalt_buf2[ 5];
4134     w3_t[2] = digest_esalt_len * 8;
4135     w3_t[3] = 0;
4136
4137     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4138     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4139     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4140     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4141     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4142     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4143     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4144     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4145     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4146     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4147     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4148     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4149     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4150     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4151     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4152     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4153
4154     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4155     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4156     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4157     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4158     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4159     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4160     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4161     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4162     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4163     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4164     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4165     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4166     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4167     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4168     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4169     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4170
4171     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4172     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4173     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4174     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4175     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4176     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4177     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4178     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4179     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4180     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4181     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4182     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4183     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4184     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4185     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4186     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4187
4188     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4189     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4190     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4191     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4192     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4193     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4194     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4195     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4196     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4197     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4198     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4199     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4200     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4201     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4202     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4203     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4204
4205     a += r_a;
4206     b += r_b;
4207     c += r_c;
4208     d += r_d;
4209
4210     COMPARE_S_SIMD (a, d, c, b);
4211   }
4212 }
4213
4214 void m11400s_1_0 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
4215 {
4216   /**
4217    * modifier
4218    */
4219
4220   const u32 gid = get_global_id (0);
4221   const u32 lid = get_local_id (0);
4222
4223   /**
4224    * digest
4225    */
4226
4227   const u32 search[4] =
4228   {
4229     digests_buf[digests_offset].digest_buf[DGST_R0],
4230     digests_buf[digests_offset].digest_buf[DGST_R1],
4231     digests_buf[digests_offset].digest_buf[DGST_R2],
4232     digests_buf[digests_offset].digest_buf[DGST_R3]
4233   };
4234
4235   /**
4236    * salt
4237    */
4238
4239   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
4240
4241   const u32 pw_salt_len = salt_len + pw_len;
4242
4243   u32 salt_buf0[16];
4244   u32 salt_buf1[16];
4245
4246   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
4247   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
4248   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
4249   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
4250   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
4251   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
4252   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
4253   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
4254   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
4255   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
4256   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
4257   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
4258   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
4259   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
4260   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
4261   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
4262   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
4263   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
4264   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
4265   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
4266   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
4267   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
4268   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
4269   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
4270   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
4271   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
4272   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
4273   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
4274   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
4275   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
4276   salt_buf1[14] = 0;
4277   salt_buf1[15] = 0;
4278
4279   /**
4280    * esalt
4281    */
4282
4283   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
4284
4285   u32 esalt_buf0[16];
4286   u32 esalt_buf1[16];
4287
4288   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
4289   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
4290   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
4291   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
4292   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
4293   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
4294   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
4295   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
4296   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
4297   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
4298   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
4299   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
4300   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
4301   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
4302   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
4303   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
4304   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
4305   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
4306   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
4307   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
4308   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
4309   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
4310   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
4311   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
4312   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
4313   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
4314   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
4315   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
4316   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
4317   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
4318   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
4319   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
4320
4321   const u32 digest_esalt_len = 32 + esalt_len;
4322
4323   /**
4324    * loop
4325    */
4326
4327   u32 w0l = w0[0];
4328
4329   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
4330   {
4331     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
4332
4333     const u32x w0lr = w0l | w0r;
4334
4335     /*
4336      * HA1 = md5 ($salt . $pass)
4337      */
4338
4339     // append the pass to the salt
4340
4341     u32x block0[16];
4342     u32x block1[16];
4343
4344     block0[ 0] = salt_buf0[ 0];
4345     block0[ 1] = salt_buf0[ 1];
4346     block0[ 2] = salt_buf0[ 2];
4347     block0[ 3] = salt_buf0[ 3];
4348     block0[ 4] = salt_buf0[ 4];
4349     block0[ 5] = salt_buf0[ 5];
4350     block0[ 6] = salt_buf0[ 6];
4351     block0[ 7] = salt_buf0[ 7];
4352     block0[ 8] = salt_buf0[ 8];
4353     block0[ 9] = salt_buf0[ 9];
4354     block0[10] = salt_buf0[10];
4355     block0[11] = salt_buf0[11];
4356     block0[12] = salt_buf0[12];
4357     block0[13] = salt_buf0[13];
4358     block0[14] = salt_buf0[14];
4359     block0[15] = salt_buf0[15];
4360     block1[ 0] = salt_buf1[ 0];
4361     block1[ 1] = salt_buf1[ 1];
4362     block1[ 2] = salt_buf1[ 2];
4363     block1[ 3] = salt_buf1[ 3];
4364     block1[ 4] = salt_buf1[ 4];
4365     block1[ 5] = salt_buf1[ 5];
4366     block1[ 6] = salt_buf1[ 6];
4367     block1[ 7] = salt_buf1[ 7];
4368     block1[ 8] = salt_buf1[ 8];
4369     block1[ 9] = salt_buf1[ 9];
4370     block1[10] = salt_buf1[10];
4371     block1[11] = salt_buf1[11];
4372     block1[12] = salt_buf1[12];
4373     block1[13] = salt_buf1[13];
4374     block1[14] = salt_buf1[14];
4375     block1[15] = salt_buf1[15];
4376
4377     u32x w0_t[4];
4378     u32x w1_t[4];
4379     u32x w2_t[4];
4380     u32x w3_t[4];
4381
4382     w0_t[0] = w0lr;
4383     w0_t[1] = w0[1];
4384     w0_t[2] = w0[2];
4385     w0_t[3] = w0[3];
4386     w1_t[0] = w1[0];
4387     w1_t[1] = w1[1];
4388     w1_t[2] = w1[2];
4389     w1_t[3] = w1[3];
4390     w2_t[0] = w2[0];
4391     w2_t[1] = w2[1];
4392     w2_t[2] = w2[2];
4393     w2_t[3] = w2[3];
4394     w3_t[0] = w3[0];
4395     w3_t[1] = w3[1];
4396     w3_t[2] = w3[2];
4397     w3_t[3] = w3[3];
4398
4399     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
4400
4401     w0_t[0] = block0[ 0];
4402     w0_t[1] = block0[ 1];
4403     w0_t[2] = block0[ 2];
4404     w0_t[3] = block0[ 3];
4405     w1_t[0] = block0[ 4];
4406     w1_t[1] = block0[ 5];
4407     w1_t[2] = block0[ 6];
4408     w1_t[3] = block0[ 7];
4409     w2_t[0] = block0[ 8];
4410     w2_t[1] = block0[ 9];
4411     w2_t[2] = block0[10];
4412     w2_t[3] = block0[11];
4413     w3_t[0] = block0[12];
4414     w3_t[1] = block0[13];
4415     w3_t[2] = block0[14];
4416     w3_t[3] = block0[15];
4417
4418     // md5
4419
4420     u32x a = MD5M_A;
4421     u32x b = MD5M_B;
4422     u32x c = MD5M_C;
4423     u32x d = MD5M_D;
4424
4425     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4426     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4427     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4428     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4429     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4430     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4431     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4432     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4433     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4434     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4435     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4436     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4437     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4438     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4439     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4440     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4441
4442     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4443     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4444     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4445     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4446     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4447     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4448     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4449     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4450     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4451     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4452     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4453     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4454     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4455     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4456     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4457     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4458
4459     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4460     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4461     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4462     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4463     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4464     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4465     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4466     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4467     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4468     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4469     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4470     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4471     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4472     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4473     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4474     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4475
4476     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4477     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4478     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4479     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4480     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4481     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4482     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4483     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4484     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4485     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4486     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4487     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4488     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4489     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4490     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4491     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4492
4493     a += MD5M_A;
4494     b += MD5M_B;
4495     c += MD5M_C;
4496     d += MD5M_D;
4497
4498     u32x r_a = a;
4499     u32x r_b = b;
4500     u32x r_c = c;
4501     u32x r_d = d;
4502
4503     w0_t[0] = block1[ 0];
4504     w0_t[1] = block1[ 1];
4505     w0_t[2] = block1[ 2];
4506     w0_t[3] = block1[ 3];
4507     w1_t[0] = block1[ 4];
4508     w1_t[1] = block1[ 5];
4509     w1_t[2] = block1[ 6];
4510     w1_t[3] = block1[ 7];
4511     w2_t[0] = block1[ 8];
4512     w2_t[1] = block1[ 9];
4513     w2_t[2] = block1[10];
4514     w2_t[3] = block1[11];
4515     w3_t[0] = block1[12];
4516     w3_t[1] = block1[13];
4517     w3_t[2] = pw_salt_len * 8;
4518     w3_t[3] = 0;
4519
4520     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4521     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4522     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4523     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4524     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4525     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4526     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4527     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4528     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4529     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4530     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4531     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4532     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4533     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4534     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4535     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4536
4537     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4538     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4539     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4540     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4541     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4542     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4543     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4544     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4545     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4546     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4547     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4548     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4549     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4550     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4551     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4552     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4553
4554     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4555     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4556     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4557     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4558     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4559     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4560     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4561     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4562     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4563     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4564     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4565     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4566     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4567     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4568     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4569     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4570
4571     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4572     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4573     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4574     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4575     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4576     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4577     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4578     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4579     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4580     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4581     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4582     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4583     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4584     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4585     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4586     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4587
4588     a += r_a;
4589     b += r_b;
4590     c += r_c;
4591     d += r_d;
4592
4593     /*
4594      * final = md5 ($HA1 . $esalt)
4595      * we have at least 2 MD5 blocks/transformations, but we might need 3
4596      */
4597
4598     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
4599             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
4600     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
4601             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
4602     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
4603             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
4604     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
4605             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
4606     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
4607             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
4608     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
4609             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
4610     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
4611             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
4612     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
4613             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
4614     w2_t[0] = esalt_buf0[0];
4615     w2_t[1] = esalt_buf0[1];
4616     w2_t[2] = esalt_buf0[2];
4617     w2_t[3] = esalt_buf0[3];
4618     w3_t[0] = esalt_buf0[4];
4619     w3_t[1] = esalt_buf0[5];
4620     w3_t[2] = esalt_buf0[6];
4621     w3_t[3] = esalt_buf0[7];
4622
4623     // md5
4624     // 1st transform
4625
4626     a = MD5M_A;
4627     b = MD5M_B;
4628     c = MD5M_C;
4629     d = MD5M_D;
4630
4631     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4632     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4633     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4634     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4635     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4636     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4637     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4638     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4639     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4640     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4641     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4642     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4643     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4644     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4645     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4646     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4647
4648     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4649     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4650     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4651     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4652     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4653     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4654     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4655     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4656     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4657     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4658     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4659     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4660     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4661     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4662     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4663     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4664
4665     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4666     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4667     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4668     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4669     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4670     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4671     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4672     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4673     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4674     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4675     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4676     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4677     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4678     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4679     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4680     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4681
4682     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4683     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4684     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4685     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4686     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4687     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4688     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4689     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4690     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4691     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4692     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4693     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4694     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4695     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4696     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4697     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4698
4699     a += MD5M_A;
4700     b += MD5M_B;
4701     c += MD5M_C;
4702     d += MD5M_D;
4703
4704     r_a = a;
4705     r_b = b;
4706     r_c = c;
4707     r_d = d;
4708
4709     // 2nd transform
4710
4711     w0_t[0] = esalt_buf0[ 8];
4712     w0_t[1] = esalt_buf0[ 9];
4713     w0_t[2] = esalt_buf0[10];
4714     w0_t[3] = esalt_buf0[11];
4715     w1_t[0] = esalt_buf0[12];
4716     w1_t[1] = esalt_buf0[13];
4717     w1_t[2] = esalt_buf0[14];
4718     w1_t[3] = esalt_buf0[15];
4719     w2_t[0] = esalt_buf1[ 0];
4720     w2_t[1] = esalt_buf1[ 1];
4721     w2_t[2] = esalt_buf1[ 2];
4722     w2_t[3] = esalt_buf1[ 3];
4723     w3_t[0] = esalt_buf1[ 4];
4724     w3_t[1] = esalt_buf1[ 5];
4725     w3_t[2] = digest_esalt_len * 8;
4726     w3_t[3] = 0;
4727
4728     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
4729     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
4730     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
4731     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
4732     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
4733     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
4734     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
4735     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
4736     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
4737     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
4738     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
4739     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
4740     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
4741     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
4742     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
4743     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
4744
4745     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
4746     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
4747     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
4748     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
4749     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
4750     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
4751     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
4752     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
4753     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
4754     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
4755     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
4756     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
4757     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
4758     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
4759     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
4760     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
4761
4762     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
4763     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
4764     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
4765     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
4766     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
4767     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
4768     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
4769     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
4770     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
4771     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
4772     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
4773     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
4774     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
4775     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
4776     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
4777     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
4778
4779     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
4780     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
4781     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
4782     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
4783     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
4784     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
4785     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
4786     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
4787     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
4788     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
4789     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
4790     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
4791     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
4792     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
4793     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
4794     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
4795
4796     a += r_a;
4797     b += r_b;
4798     c += r_c;
4799     d += r_d;
4800
4801     COMPARE_S_SIMD (a, d, c, b);
4802   }
4803 }
4804
4805 void m11400s_1_1 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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, __local u32 *l_bin2asc)
4806 {
4807   /**
4808    * modifier
4809    */
4810
4811   const u32 gid = get_global_id (0);
4812   const u32 lid = get_local_id (0);
4813
4814   /**
4815    * digest
4816    */
4817
4818   const u32 search[4] =
4819   {
4820     digests_buf[digests_offset].digest_buf[DGST_R0],
4821     digests_buf[digests_offset].digest_buf[DGST_R1],
4822     digests_buf[digests_offset].digest_buf[DGST_R2],
4823     digests_buf[digests_offset].digest_buf[DGST_R3]
4824   };
4825
4826   /**
4827    * salt
4828    */
4829
4830   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
4831
4832   const u32 pw_salt_len = salt_len + pw_len;
4833
4834   u32 salt_buf0[16];
4835   u32 salt_buf1[16];
4836
4837   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
4838   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
4839   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
4840   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
4841   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
4842   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
4843   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
4844   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
4845   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
4846   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
4847   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
4848   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
4849   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
4850   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
4851   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
4852   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
4853   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
4854   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
4855   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
4856   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
4857   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
4858   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
4859   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
4860   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
4861   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
4862   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
4863   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
4864   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
4865   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
4866   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
4867   salt_buf1[14] = 0;
4868   salt_buf1[15] = 0;
4869
4870   /**
4871    * esalt
4872    */
4873
4874   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
4875
4876   u32 esalt_buf0[16];
4877   u32 esalt_buf1[16];
4878   u32 esalt_buf2[16];
4879
4880   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
4881   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
4882   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
4883   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
4884   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
4885   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
4886   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
4887   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
4888   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
4889   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
4890   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
4891   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
4892   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
4893   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
4894   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
4895   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
4896   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
4897   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
4898   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
4899   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
4900   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
4901   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
4902   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
4903   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
4904   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
4905   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
4906   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
4907   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
4908   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
4909   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
4910   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
4911   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
4912   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
4913   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
4914   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
4915   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
4916   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
4917   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
4918   esalt_buf2[ 6] = 0;
4919   esalt_buf2[ 7] = 0;
4920   esalt_buf2[ 8] = 0;
4921   esalt_buf2[ 9] = 0;
4922   esalt_buf2[10] = 0;
4923   esalt_buf2[11] = 0;
4924   esalt_buf2[12] = 0;
4925   esalt_buf2[13] = 0;
4926   esalt_buf2[14] = 0;
4927   esalt_buf2[15] = 0;
4928
4929   const u32 digest_esalt_len = 32 + esalt_len;
4930
4931   /**
4932    * loop
4933    */
4934
4935   u32 w0l = w0[0];
4936
4937   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
4938   {
4939     const u32x w0r = ix_create_bft (bfs_buf, il_pos);
4940
4941     const u32x w0lr = w0l | w0r;
4942
4943     /*
4944      * HA1 = md5 ($salt . $pass)
4945      */
4946
4947     // append the pass to the salt
4948
4949     u32x block0[16];
4950     u32x block1[16];
4951
4952     block0[ 0] = salt_buf0[ 0];
4953     block0[ 1] = salt_buf0[ 1];
4954     block0[ 2] = salt_buf0[ 2];
4955     block0[ 3] = salt_buf0[ 3];
4956     block0[ 4] = salt_buf0[ 4];
4957     block0[ 5] = salt_buf0[ 5];
4958     block0[ 6] = salt_buf0[ 6];
4959     block0[ 7] = salt_buf0[ 7];
4960     block0[ 8] = salt_buf0[ 8];
4961     block0[ 9] = salt_buf0[ 9];
4962     block0[10] = salt_buf0[10];
4963     block0[11] = salt_buf0[11];
4964     block0[12] = salt_buf0[12];
4965     block0[13] = salt_buf0[13];
4966     block0[14] = salt_buf0[14];
4967     block0[15] = salt_buf0[15];
4968     block1[ 0] = salt_buf1[ 0];
4969     block1[ 1] = salt_buf1[ 1];
4970     block1[ 2] = salt_buf1[ 2];
4971     block1[ 3] = salt_buf1[ 3];
4972     block1[ 4] = salt_buf1[ 4];
4973     block1[ 5] = salt_buf1[ 5];
4974     block1[ 6] = salt_buf1[ 6];
4975     block1[ 7] = salt_buf1[ 7];
4976     block1[ 8] = salt_buf1[ 8];
4977     block1[ 9] = salt_buf1[ 9];
4978     block1[10] = salt_buf1[10];
4979     block1[11] = salt_buf1[11];
4980     block1[12] = salt_buf1[12];
4981     block1[13] = salt_buf1[13];
4982     block1[14] = salt_buf1[14];
4983     block1[15] = salt_buf1[15];
4984
4985     u32x w0_t[4];
4986     u32x w1_t[4];
4987     u32x w2_t[4];
4988     u32x w3_t[4];
4989
4990     w0_t[0] = w0lr;
4991     w0_t[1] = w0[1];
4992     w0_t[2] = w0[2];
4993     w0_t[3] = w0[3];
4994     w1_t[0] = w1[0];
4995     w1_t[1] = w1[1];
4996     w1_t[2] = w1[2];
4997     w1_t[3] = w1[3];
4998     w2_t[0] = w2[0];
4999     w2_t[1] = w2[1];
5000     w2_t[2] = w2[2];
5001     w2_t[3] = w2[3];
5002     w3_t[0] = w3[0];
5003     w3_t[1] = w3[1];
5004     w3_t[2] = w3[2];
5005     w3_t[3] = w3[3];
5006
5007     memcat32 (block0, block1, salt_len, w0_t, w1_t, w2_t, w3_t, pw_len);
5008
5009     w0_t[0] = block0[ 0];
5010     w0_t[1] = block0[ 1];
5011     w0_t[2] = block0[ 2];
5012     w0_t[3] = block0[ 3];
5013     w1_t[0] = block0[ 4];
5014     w1_t[1] = block0[ 5];
5015     w1_t[2] = block0[ 6];
5016     w1_t[3] = block0[ 7];
5017     w2_t[0] = block0[ 8];
5018     w2_t[1] = block0[ 9];
5019     w2_t[2] = block0[10];
5020     w2_t[3] = block0[11];
5021     w3_t[0] = block0[12];
5022     w3_t[1] = block0[13];
5023     w3_t[2] = block0[14];
5024     w3_t[3] = block0[15];
5025
5026     // md5
5027
5028     u32x a = MD5M_A;
5029     u32x b = MD5M_B;
5030     u32x c = MD5M_C;
5031     u32x d = MD5M_D;
5032
5033     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5034     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5035     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5036     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5037     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5038     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5039     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5040     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5041     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5042     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5043     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5044     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5045     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5046     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5047     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5048     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5049
5050     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5051     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5052     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5053     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5054     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5055     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5056     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5057     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5058     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5059     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5060     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5061     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5062     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5063     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5064     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5065     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5066
5067     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
5068     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
5069     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
5070     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
5071     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
5072     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
5073     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
5074     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
5075     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
5076     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
5077     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5078     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5079     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5080     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5081     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5082     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5083
5084     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5085     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5086     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5087     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5088     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5089     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5090     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5091     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5092     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5093     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5094     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5095     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5096     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5097     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5098     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5099     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5100
5101     a += MD5M_A;
5102     b += MD5M_B;
5103     c += MD5M_C;
5104     d += MD5M_D;
5105
5106     u32x r_a = a;
5107     u32x r_b = b;
5108     u32x r_c = c;
5109     u32x r_d = d;
5110
5111     w0_t[0] = block1[ 0];
5112     w0_t[1] = block1[ 1];
5113     w0_t[2] = block1[ 2];
5114     w0_t[3] = block1[ 3];
5115     w1_t[0] = block1[ 4];
5116     w1_t[1] = block1[ 5];
5117     w1_t[2] = block1[ 6];
5118     w1_t[3] = block1[ 7];
5119     w2_t[0] = block1[ 8];
5120     w2_t[1] = block1[ 9];
5121     w2_t[2] = block1[10];
5122     w2_t[3] = block1[11];
5123     w3_t[0] = block1[12];
5124     w3_t[1] = block1[13];
5125     w3_t[2] = pw_salt_len * 8;
5126     w3_t[3] = 0;
5127
5128     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5129     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5130     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5131     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5132     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5133     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5134     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5135     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5136     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5137     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5138     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5139     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5140     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5141     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5142     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5143     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5144
5145     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5146     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5147     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5148     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5149     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5150     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5151     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5152     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5153     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5154     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5155     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5156     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5157     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5158     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5159     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5160     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5161
5162     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
5163     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
5164     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
5165     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
5166     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
5167     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
5168     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
5169     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
5170     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
5171     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
5172     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5173     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5174     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5175     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5176     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5177     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5178
5179     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5180     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5181     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5182     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5183     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5184     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5185     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5186     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5187     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5188     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5189     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5190     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5191     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5192     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5193     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5194     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5195
5196     a += r_a;
5197     b += r_b;
5198     c += r_c;
5199     d += r_d;
5200
5201     /*
5202      * final = md5 ($HA1 . $esalt)
5203      * we have at least 2 MD5 blocks/transformations, but we might need 3
5204      */
5205
5206     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
5207             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
5208     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
5209             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
5210     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
5211             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
5212     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
5213             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
5214     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
5215             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
5216     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
5217             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
5218     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
5219             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
5220     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
5221             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
5222     w2_t[0] = esalt_buf0[0];
5223     w2_t[1] = esalt_buf0[1];
5224     w2_t[2] = esalt_buf0[2];
5225     w2_t[3] = esalt_buf0[3];
5226     w3_t[0] = esalt_buf0[4];
5227     w3_t[1] = esalt_buf0[5];
5228     w3_t[2] = esalt_buf0[6];
5229     w3_t[3] = esalt_buf0[7];
5230
5231     // md5
5232     // 1st transform
5233
5234     a = MD5M_A;
5235     b = MD5M_B;
5236     c = MD5M_C;
5237     d = MD5M_D;
5238
5239     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5240     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5241     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5242     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5243     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5244     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5245     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5246     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5247     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5248     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5249     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5250     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5251     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5252     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5253     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5254     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5255
5256     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5257     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5258     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5259     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5260     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5261     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5262     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5263     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5264     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5265     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5266     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5267     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5268     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5269     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5270     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5271     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5272
5273     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
5274     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
5275     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
5276     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
5277     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
5278     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
5279     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
5280     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
5281     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
5282     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
5283     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5284     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5285     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5286     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5287     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5288     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5289
5290     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5291     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5292     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5293     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5294     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5295     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5296     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5297     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5298     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5299     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5300     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5301     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5302     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5303     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5304     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5305     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5306
5307     a += MD5M_A;
5308     b += MD5M_B;
5309     c += MD5M_C;
5310     d += MD5M_D;
5311
5312     r_a = a;
5313     r_b = b;
5314     r_c = c;
5315     r_d = d;
5316
5317     // 2nd transform
5318
5319     w0_t[0] = esalt_buf0[ 8];
5320     w0_t[1] = esalt_buf0[ 9];
5321     w0_t[2] = esalt_buf0[10];
5322     w0_t[3] = esalt_buf0[11];
5323     w1_t[0] = esalt_buf0[12];
5324     w1_t[1] = esalt_buf0[13];
5325     w1_t[2] = esalt_buf0[14];
5326     w1_t[3] = esalt_buf0[15];
5327     w2_t[0] = esalt_buf1[ 0];
5328     w2_t[1] = esalt_buf1[ 1];
5329     w2_t[2] = esalt_buf1[ 2];
5330     w2_t[3] = esalt_buf1[ 3];
5331     w3_t[0] = esalt_buf1[ 4];
5332     w3_t[1] = esalt_buf1[ 5];
5333     w3_t[2] = esalt_buf1[ 6];
5334     w3_t[3] = esalt_buf1[ 7];
5335
5336     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5337     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5338     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5339     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5340     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5341     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5342     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5343     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5344     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5345     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5346     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5347     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5348     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5349     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5350     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5351     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5352
5353     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5354     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5355     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5356     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5357     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5358     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5359     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5360     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5361     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5362     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5363     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5364     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5365     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5366     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5367     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5368     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5369
5370     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
5371     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
5372     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
5373     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
5374     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
5375     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
5376     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
5377     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
5378     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
5379     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
5380     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5381     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5382     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5383     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5384     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5385     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5386
5387     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5388     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5389     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5390     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5391     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5392     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5393     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5394     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5395     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5396     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5397     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5398     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5399     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5400     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5401     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5402     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5403
5404     // this is for sure the final block
5405
5406     a += r_a;
5407     b += r_b;
5408     c += r_c;
5409     d += r_d;
5410
5411     r_a = a;
5412     r_b = b;
5413     r_c = c;
5414     r_d = d;
5415
5416     w0_t[0] = esalt_buf1[ 8];
5417     w0_t[1] = esalt_buf1[ 9];
5418     w0_t[2] = esalt_buf1[10];
5419     w0_t[3] = esalt_buf1[11];
5420     w1_t[0] = esalt_buf1[12];
5421     w1_t[1] = esalt_buf1[13];
5422     w1_t[2] = esalt_buf1[14];
5423     w1_t[3] = esalt_buf1[15];
5424     w2_t[0] = esalt_buf2[ 0];
5425     w2_t[1] = esalt_buf2[ 1];
5426     w2_t[2] = esalt_buf2[ 2];
5427     w2_t[3] = esalt_buf2[ 3];
5428     w3_t[0] = esalt_buf2[ 4];
5429     w3_t[1] = esalt_buf2[ 5];
5430     w3_t[2] = digest_esalt_len * 8;
5431     w3_t[3] = 0;
5432
5433     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
5434     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
5435     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
5436     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
5437     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
5438     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
5439     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
5440     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
5441     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
5442     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
5443     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
5444     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
5445     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
5446     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
5447     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
5448     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
5449
5450     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
5451     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
5452     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
5453     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
5454     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
5455     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
5456     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
5457     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
5458     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
5459     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
5460     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
5461     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
5462     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
5463     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
5464     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
5465     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
5466
5467     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
5468     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
5469     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
5470     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
5471     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
5472     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
5473     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
5474     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
5475     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
5476     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
5477     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
5478     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
5479     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
5480     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
5481     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
5482     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
5483
5484     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
5485     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
5486     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
5487     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
5488     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
5489     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
5490     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
5491     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
5492     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
5493     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
5494     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
5495     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
5496     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
5497     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
5498     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
5499     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
5500
5501     a += r_a;
5502     b += r_b;
5503     c += r_c;
5504     d += r_d;
5505
5506     COMPARE_S_SIMD (a, d, c, b);
5507   }
5508 }
5509
5510 __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)
5511 {
5512   /**
5513    * modifier
5514    */
5515
5516   const u32 gid = get_global_id (0);
5517   const u32 lid = get_local_id (0);
5518   const u32 lsz = get_local_size (0);
5519
5520   /**
5521    * bin2asc table
5522    */
5523
5524   __local u32 l_bin2asc[256];
5525
5526   for (u32 i = lid; i < 256; i += lsz)
5527   {
5528     const u32 i0 = (i >> 0) & 15;
5529     const u32 i1 = (i >> 4) & 15;
5530
5531     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5532                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5533   }
5534
5535   barrier (CLK_LOCAL_MEM_FENCE);
5536
5537   if (gid >= gid_max) return;
5538
5539   /**
5540    * modifier
5541    */
5542
5543   u32 w0[4];
5544
5545   w0[0] = pws[gid].i[ 0];
5546   w0[1] = pws[gid].i[ 1];
5547   w0[2] = pws[gid].i[ 2];
5548   w0[3] = pws[gid].i[ 3];
5549
5550   u32 w1[4];
5551
5552   w1[0] = 0;
5553   w1[1] = 0;
5554   w1[2] = 0;
5555   w1[3] = 0;
5556
5557   u32 w2[4];
5558
5559   w2[0] = 0;
5560   w2[1] = 0;
5561   w2[2] = 0;
5562   w2[3] = 0;
5563
5564   u32 w3[4];
5565
5566   w3[0] = 0;
5567   w3[1] = 0;
5568   w3[2] = pws[gid].i[14];
5569   w3[3] = 0;
5570
5571   const u32 pw_len = pws[gid].pw_len;
5572
5573   /**
5574    * main
5575    */
5576
5577   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5578   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5579
5580   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5581   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5582
5583   switch (sw_1 | sw_2)
5584   {
5585     case 0:
5586       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5587       break;
5588     case 1:
5589       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5590       break;
5591     case 2:
5592       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5593       break;
5594     case 3:
5595       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5596       break;
5597   }
5598 }
5599
5600 __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)
5601 {
5602   /**
5603    * modifier
5604    */
5605
5606   const u32 gid = get_global_id (0);
5607   const u32 lid = get_local_id (0);
5608   const u32 lsz = get_local_size (0);
5609
5610   /**
5611    * bin2asc table
5612    */
5613
5614   __local u32 l_bin2asc[256];
5615
5616   for (u32 i = lid; i < 256; i += lsz)
5617   {
5618     const u32 i0 = (i >> 0) & 15;
5619     const u32 i1 = (i >> 4) & 15;
5620
5621     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5622                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5623   }
5624
5625   barrier (CLK_LOCAL_MEM_FENCE);
5626
5627   if (gid >= gid_max) return;
5628
5629   /**
5630    * modifier
5631    */
5632
5633   u32 w0[4];
5634
5635   w0[0] = pws[gid].i[ 0];
5636   w0[1] = pws[gid].i[ 1];
5637   w0[2] = pws[gid].i[ 2];
5638   w0[3] = pws[gid].i[ 3];
5639
5640   u32 w1[4];
5641
5642   w1[0] = pws[gid].i[ 4];
5643   w1[1] = pws[gid].i[ 5];
5644   w1[2] = pws[gid].i[ 6];
5645   w1[3] = pws[gid].i[ 7];
5646
5647   u32 w2[4];
5648
5649   w2[0] = 0;
5650   w2[1] = 0;
5651   w2[2] = 0;
5652   w2[3] = 0;
5653
5654   u32 w3[4];
5655
5656   w3[0] = 0;
5657   w3[1] = 0;
5658   w3[2] = pws[gid].i[14];
5659   w3[3] = 0;
5660
5661   const u32 pw_len = pws[gid].pw_len;
5662
5663   /**
5664    * main
5665    */
5666
5667   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5668   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5669
5670   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5671   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5672
5673   switch (sw_1 | sw_2)
5674   {
5675     case 0:
5676       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5677       break;
5678     case 1:
5679       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5680       break;
5681     case 2:
5682       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5683       break;
5684     case 3:
5685       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5686       break;
5687   }
5688 }
5689
5690 __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)
5691 {
5692   /**
5693    * modifier
5694    */
5695
5696   const u32 gid = get_global_id (0);
5697   const u32 lid = get_local_id (0);
5698   const u32 lsz = get_local_size (0);
5699
5700   /**
5701    * bin2asc table
5702    */
5703
5704   __local u32 l_bin2asc[256];
5705
5706   for (u32 i = lid; i < 256; i += lsz)
5707   {
5708     const u32 i0 = (i >> 0) & 15;
5709     const u32 i1 = (i >> 4) & 15;
5710
5711     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5712                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5713   }
5714
5715   barrier (CLK_LOCAL_MEM_FENCE);
5716
5717   if (gid >= gid_max) return;
5718
5719   /**
5720    * modifier
5721    */
5722
5723   u32 w0[4];
5724
5725   w0[0] = pws[gid].i[ 0];
5726   w0[1] = pws[gid].i[ 1];
5727   w0[2] = pws[gid].i[ 2];
5728   w0[3] = pws[gid].i[ 3];
5729
5730   u32 w1[4];
5731
5732   w1[0] = pws[gid].i[ 4];
5733   w1[1] = pws[gid].i[ 5];
5734   w1[2] = pws[gid].i[ 6];
5735   w1[3] = pws[gid].i[ 7];
5736
5737   u32 w2[4];
5738
5739   w2[0] = pws[gid].i[ 8];
5740   w2[1] = pws[gid].i[ 9];
5741   w2[2] = pws[gid].i[10];
5742   w2[3] = pws[gid].i[11];
5743
5744   u32 w3[4];
5745
5746   w3[0] = pws[gid].i[12];
5747   w3[1] = pws[gid].i[13];
5748   w3[2] = pws[gid].i[14];
5749   w3[3] = pws[gid].i[15];
5750
5751   const u32 pw_len = pws[gid].pw_len;
5752
5753   /**
5754    * main
5755    */
5756
5757   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5758   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5759
5760   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5761   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5762
5763   switch (sw_1 | sw_2)
5764   {
5765     case 0:
5766       m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5767       break;
5768     case 1:
5769       m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5770       break;
5771     case 2:
5772       m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5773       break;
5774     case 3:
5775       m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5776       break;
5777   }
5778 }
5779
5780 __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)
5781 {
5782   /**
5783    * modifier
5784    */
5785
5786   const u32 gid = get_global_id (0);
5787   const u32 lid = get_local_id (0);
5788   const u32 lsz = get_local_size (0);
5789
5790   /**
5791    * bin2asc table
5792    */
5793
5794   __local u32 l_bin2asc[256];
5795
5796   for (u32 i = lid; i < 256; i += lsz)
5797   {
5798     const u32 i0 = (i >> 0) & 15;
5799     const u32 i1 = (i >> 4) & 15;
5800
5801     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5802                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5803   }
5804
5805   barrier (CLK_LOCAL_MEM_FENCE);
5806
5807   if (gid >= gid_max) return;
5808
5809   /**
5810    * modifier
5811    */
5812
5813   u32 w0[4];
5814
5815   w0[0] = pws[gid].i[ 0];
5816   w0[1] = pws[gid].i[ 1];
5817   w0[2] = pws[gid].i[ 2];
5818   w0[3] = pws[gid].i[ 3];
5819
5820   u32 w1[4];
5821
5822   w1[0] = 0;
5823   w1[1] = 0;
5824   w1[2] = 0;
5825   w1[3] = 0;
5826
5827   u32 w2[4];
5828
5829   w2[0] = 0;
5830   w2[1] = 0;
5831   w2[2] = 0;
5832   w2[3] = 0;
5833
5834   u32 w3[4];
5835
5836   w3[0] = 0;
5837   w3[1] = 0;
5838   w3[2] = pws[gid].i[14];
5839   w3[3] = 0;
5840
5841   const u32 pw_len = pws[gid].pw_len;
5842
5843   /**
5844    * main
5845    */
5846
5847   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5848   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5849
5850   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5851   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5852
5853   switch (sw_1 | sw_2)
5854   {
5855     case 0:
5856       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5857       break;
5858     case 1:
5859       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5860       break;
5861     case 2:
5862       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5863       break;
5864     case 3:
5865       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5866       break;
5867   }
5868 }
5869
5870 __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)
5871 {
5872   /**
5873    * modifier
5874    */
5875
5876   const u32 gid = get_global_id (0);
5877   const u32 lid = get_local_id (0);
5878   const u32 lsz = get_local_size (0);
5879
5880   /**
5881    * bin2asc table
5882    */
5883
5884   __local u32 l_bin2asc[256];
5885
5886   for (u32 i = lid; i < 256; i += lsz)
5887   {
5888     const u32 i0 = (i >> 0) & 15;
5889     const u32 i1 = (i >> 4) & 15;
5890
5891     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5892                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5893   }
5894
5895   barrier (CLK_LOCAL_MEM_FENCE);
5896
5897   if (gid >= gid_max) return;
5898
5899   /**
5900    * modifier
5901    */
5902
5903   u32 w0[4];
5904
5905   w0[0] = pws[gid].i[ 0];
5906   w0[1] = pws[gid].i[ 1];
5907   w0[2] = pws[gid].i[ 2];
5908   w0[3] = pws[gid].i[ 3];
5909
5910   u32 w1[4];
5911
5912   w1[0] = pws[gid].i[ 4];
5913   w1[1] = pws[gid].i[ 5];
5914   w1[2] = pws[gid].i[ 6];
5915   w1[3] = pws[gid].i[ 7];
5916
5917   u32 w2[4];
5918
5919   w2[0] = 0;
5920   w2[1] = 0;
5921   w2[2] = 0;
5922   w2[3] = 0;
5923
5924   u32 w3[4];
5925
5926   w3[0] = 0;
5927   w3[1] = 0;
5928   w3[2] = pws[gid].i[14];
5929   w3[3] = 0;
5930
5931   const u32 pw_len = pws[gid].pw_len;
5932
5933   /**
5934    * main
5935    */
5936
5937   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
5938   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
5939
5940   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
5941   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
5942
5943   switch (sw_1 | sw_2)
5944   {
5945     case 0:
5946       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5947       break;
5948     case 1:
5949       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5950       break;
5951     case 2:
5952       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5953       break;
5954     case 3:
5955       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
5956       break;
5957   }
5958 }
5959
5960 __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)
5961 {
5962   /**
5963    * modifier
5964    */
5965
5966   const u32 gid = get_global_id (0);
5967   const u32 lid = get_local_id (0);
5968   const u32 lsz = get_local_size (0);
5969
5970   /**
5971    * bin2asc table
5972    */
5973
5974   __local u32 l_bin2asc[256];
5975
5976   for (u32 i = lid; i < 256; i += lsz)
5977   {
5978     const u32 i0 = (i >> 0) & 15;
5979     const u32 i1 = (i >> 4) & 15;
5980
5981     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
5982                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
5983   }
5984
5985   barrier (CLK_LOCAL_MEM_FENCE);
5986
5987   if (gid >= gid_max) return;
5988
5989   /**
5990    * modifier
5991    */
5992
5993   u32 w0[4];
5994
5995   w0[0] = pws[gid].i[ 0];
5996   w0[1] = pws[gid].i[ 1];
5997   w0[2] = pws[gid].i[ 2];
5998   w0[3] = pws[gid].i[ 3];
5999
6000   u32 w1[4];
6001
6002   w1[0] = pws[gid].i[ 4];
6003   w1[1] = pws[gid].i[ 5];
6004   w1[2] = pws[gid].i[ 6];
6005   w1[3] = pws[gid].i[ 7];
6006
6007   u32 w2[4];
6008
6009   w2[0] = pws[gid].i[ 8];
6010   w2[1] = pws[gid].i[ 9];
6011   w2[2] = pws[gid].i[10];
6012   w2[3] = pws[gid].i[11];
6013
6014   u32 w3[4];
6015
6016   w3[0] = pws[gid].i[12];
6017   w3[1] = pws[gid].i[13];
6018   w3[2] = pws[gid].i[14];
6019   w3[3] = pws[gid].i[15];
6020
6021   const u32 pw_len = pws[gid].pw_len;
6022
6023   /**
6024    * main
6025    */
6026
6027   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
6028   const u32 salt_len  = esalt_bufs[salt_pos].salt_len;
6029
6030   const u32 sw_1 = ((32 + esalt_len + 1) > 119);
6031   const u32 sw_2 = ((pw_len + salt_len)  >  55) << 1;
6032
6033   switch (sw_1 | sw_2)
6034   {
6035     case 0:
6036       m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
6037       break;
6038     case 1:
6039       m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
6040       break;
6041     case 2:
6042       m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
6043       break;
6044     case 3:
6045       m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV0_buf, d_scryptV1_buf, d_scryptV2_buf, d_scryptV3_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset, l_bin2asc);
6046       break;
6047   }
6048 }