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