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