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