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