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