Remove MD4/MD5 *H1/*H2 functions and use original H functions. Modern compilers will...
[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 a = MD5M_A;
1031     u32 b = MD5M_B;
1032     u32 c = MD5M_C;
1033     u32 d = MD5M_D;
1034
1035     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1036     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1037     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1038     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1039     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1040     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1041     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1042     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1043     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1044     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1045     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1046     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1047     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1048     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1049     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1050     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1051
1052     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1053     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1054     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1055     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1056     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1057     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1058     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1059     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1060     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1061     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1062     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1063     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1064     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1065     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1066     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1067     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1068
1069     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1070     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1071     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1072     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1073     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1074     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1075     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1076     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1077     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1078     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1079     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1080     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1081     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1082     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1083     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1084     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1085
1086     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1087     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1088     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1089     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1090     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1091     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1092     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1093     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1094     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1095     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1096     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1097     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1098     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1099     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1100     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1101     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1102
1103     a += MD5M_A;
1104     b += MD5M_B;
1105     c += MD5M_C;
1106     d += MD5M_D;
1107
1108     if (block_len > 55)
1109     {
1110       u32 r_a = a;
1111       u32 r_b = b;
1112       u32 r_c = c;
1113       u32 r_d = d;
1114
1115       w0_t[0] = block1[ 0];
1116       w0_t[1] = block1[ 1];
1117       w0_t[2] = block1[ 2];
1118       w0_t[3] = block1[ 3];
1119
1120       w1_t[0] = block1[ 4];
1121       w1_t[1] = block1[ 5];
1122       w1_t[2] = block1[ 6];
1123       w1_t[3] = block1[ 7];
1124
1125       w2_t[0] = block1[ 8];
1126       w2_t[1] = block1[ 9];
1127       w2_t[2] = block1[10];
1128       w2_t[3] = block1[11];
1129
1130       w3_t[0] = block1[12];
1131       w3_t[1] = block1[13];
1132       w3_t[2] = pw_salt_len * 8;
1133       w3_t[3] = 0;
1134
1135       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1136       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1137       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1138       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1139       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1140       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1141       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1142       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1143       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1144       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1145       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1146       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1147       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1148       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1149       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1150       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1151
1152       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1153       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1154       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1155       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1156       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1157       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1158       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1159       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1160       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1161       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1162       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1163       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1164       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1165       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1166       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1167       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1168
1169       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1170       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1171       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1172       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1173       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1174       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1175       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1176       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1177       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1178       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1179       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1180       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1181       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1182       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1183       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1184       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1185
1186       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1187       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1188       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1189       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1190       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1191       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1192       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1193       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1194       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1195       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1196       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1197       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1198       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1199       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1200       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1201       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1202
1203       a += r_a;
1204       b += r_b;
1205       c += r_c;
1206       d += r_d;
1207     }
1208
1209     /*
1210      * final = md5 ($HA1 . $esalt)
1211      * we have at least 2 MD5 blocks/transformations, but we might need 3
1212      */
1213
1214     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
1215             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
1216     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
1217             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1218     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
1219             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
1220     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
1221             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1222     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
1223             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
1224     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
1225             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1226     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
1227             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
1228     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
1229             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1230
1231     w2_t[0] = esalt_buf0[0];
1232     w2_t[1] = esalt_buf0[1];
1233     w2_t[2] = esalt_buf0[2];
1234     w2_t[3] = esalt_buf0[3];
1235
1236     w3_t[0] = esalt_buf0[4];
1237     w3_t[1] = esalt_buf0[5];
1238     w3_t[2] = esalt_buf0[6];
1239     w3_t[3] = esalt_buf0[7];
1240
1241     // md5
1242     // 1st transform
1243
1244     a = MD5M_A;
1245     b = MD5M_B;
1246     c = MD5M_C;
1247     d = MD5M_D;
1248
1249     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1250     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1251     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1252     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1253     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1254     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1255     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1256     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1257     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1258     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1259     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1260     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1261     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1262     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1263     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1264     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1265
1266     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1267     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1268     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1269     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1270     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1271     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1272     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1273     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1274     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1275     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1276     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1277     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1278     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1279     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1280     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1281     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1282
1283     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1284     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1285     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1286     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1287     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1288     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1289     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1290     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1291     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1292     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1293     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1294     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1295     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1296     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1297     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1298     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1299
1300     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1301     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1302     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1303     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1304     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1305     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1306     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1307     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1308     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1309     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1310     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1311     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1312     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1313     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1314     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1315     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1316
1317     a += MD5M_A;
1318     b += MD5M_B;
1319     c += MD5M_C;
1320     d += MD5M_D;
1321
1322     u32 r_a = a;
1323     u32 r_b = b;
1324     u32 r_c = c;
1325     u32 r_d = d;
1326
1327     // 2nd transform
1328
1329     w0_t[0] = esalt_buf0[ 8];
1330     w0_t[1] = esalt_buf0[ 9];
1331     w0_t[2] = esalt_buf0[10];
1332     w0_t[3] = esalt_buf0[11];
1333
1334     w1_t[0] = esalt_buf0[12];
1335     w1_t[1] = esalt_buf0[13];
1336     w1_t[2] = esalt_buf0[14];
1337     w1_t[3] = esalt_buf0[15];
1338
1339     w2_t[0] = esalt_buf1[ 0];
1340     w2_t[1] = esalt_buf1[ 1];
1341     w2_t[2] = esalt_buf1[ 2];
1342     w2_t[3] = esalt_buf1[ 3];
1343
1344     w3_t[0] = esalt_buf1[ 4];
1345     w3_t[1] = esalt_buf1[ 5];
1346     w3_t[2] = esalt_buf1[ 6];
1347     w3_t[3] = esalt_buf1[ 7];
1348
1349     // it is the final block when no more than 55 bytes left
1350
1351     if (remaining_bytes < 56)
1352     {
1353       // it is the last block !
1354
1355       w3_t[2] = digest_esalt_len * 8;
1356     }
1357
1358     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1359     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1360     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1361     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1362     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1363     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1364     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1365     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1366     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1367     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1368     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1369     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1370     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1371     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1372     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1373     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1374
1375     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1376     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1377     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1378     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1379     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1380     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1381     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1382     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1383     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1384     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1385     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1386     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1387     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1388     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1389     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1390     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1391
1392     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1393     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1394     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1395     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1396     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1397     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1398     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1399     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1400     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1401     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1402     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1403     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1404     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1405     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1406     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1407     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1408
1409     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1410     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1411     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1412     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1413     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1414     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1415     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1416     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1417     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1418     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1419     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1420     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1421     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1422     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1423     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1424     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1425
1426     // sometimes (not rare at all) we need a third block :(
1427
1428     if (remaining_bytes > 55)
1429     {
1430       // this is for sure the final block
1431
1432       a += r_a;
1433       b += r_b;
1434       c += r_c;
1435       d += r_d;
1436
1437       r_a = a;
1438       r_b = b;
1439       r_c = c;
1440       r_d = d;
1441
1442       w0_t[0] = esalt_buf1[ 8];
1443       w0_t[1] = esalt_buf1[ 9];
1444       w0_t[2] = esalt_buf1[10];
1445       w0_t[3] = esalt_buf1[11];
1446
1447       w1_t[0] = esalt_buf1[12];
1448       w1_t[1] = esalt_buf1[13];
1449       w1_t[2] = esalt_buf1[14];
1450       w1_t[3] = esalt_buf1[15];
1451
1452       w2_t[0] = esalt_buf2[ 0];
1453       w2_t[1] = esalt_buf2[ 1];
1454       w2_t[2] = esalt_buf2[ 2];
1455       w2_t[3] = esalt_buf2[ 3];
1456
1457       w3_t[0] = esalt_buf2[ 4];
1458       w3_t[1] = esalt_buf2[ 5];
1459       w3_t[2] = digest_esalt_len * 8;
1460       w3_t[3] = 0;
1461
1462       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1463       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1464       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1465       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1466       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1467       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1468       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1469       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1470       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1471       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1472       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1473       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1474       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1475       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1476       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1477       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1478
1479       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1480       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1481       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1482       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1483       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1484       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1485       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1486       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1487       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1488       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1489       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1490       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1491       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1492       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1493       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1494       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1495
1496       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1497       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1498       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1499       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1500       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1501       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1502       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1503       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1504       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1505       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1506       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1507       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1508       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1509       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1510       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1511       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1512
1513       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1514       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1515       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1516       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1517       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1518       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1519       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1520       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1521       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1522       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1523       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1524       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1525       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1526       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1527       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1528       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1529     }
1530
1531     a += r_a;
1532     b += r_b;
1533     c += r_c;
1534     d += r_d;
1535
1536     const u32 r0 = a;
1537     const u32 r1 = d;
1538     const u32 r2 = c;
1539     const u32 r3 = b;
1540
1541     #include COMPARE_M
1542   }
1543 }
1544
1545 __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)
1546 {
1547 }
1548
1549 __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)
1550 {
1551 }
1552
1553 __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)
1554 {
1555   /**
1556    * modifier
1557    */
1558
1559   const u32 gid = get_global_id (0);
1560   const u32 lid = get_local_id (0);
1561   const u32 lsz = get_local_size (0);
1562
1563   /**
1564    * bin2asc table
1565    */
1566
1567   __local u32 l_bin2asc[256];
1568
1569   for (u32 i = lid; i < 256; i += lsz)
1570   {
1571     const u32 i0 = (i >> 0) & 15;
1572     const u32 i1 = (i >> 4) & 15;
1573
1574     l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8
1575                  | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0;
1576   }
1577
1578   barrier (CLK_LOCAL_MEM_FENCE);
1579
1580   if (gid >= gid_max) return;
1581
1582   /**
1583    * base
1584    */
1585
1586   u32 pw_buf0[4];
1587
1588   pw_buf0[0] = pws[gid].i[ 0];
1589   pw_buf0[1] = pws[gid].i[ 1];
1590   pw_buf0[2] = pws[gid].i[ 2];
1591   pw_buf0[3] = pws[gid].i[ 3];
1592
1593   u32 pw_buf1[4];
1594
1595   pw_buf1[0] = pws[gid].i[ 4];
1596   pw_buf1[1] = pws[gid].i[ 5];
1597   pw_buf1[2] = pws[gid].i[ 6];
1598   pw_buf1[3] = pws[gid].i[ 7];
1599
1600   const u32 pw_len = pws[gid].pw_len;
1601
1602   /**
1603    * salt
1604    */
1605
1606   const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1607
1608   u32 salt_buf0[16];
1609
1610   salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1611   salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1612   salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1613   salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1614   salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1615   salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1616   salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1617   salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1618   salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1619   salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1620   salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1621   salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1622   salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1623   salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1624   salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1625   salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1626
1627   u32 salt_buf1[16];
1628
1629   salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1630   salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1631   salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1632   salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1633   salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1634   salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1635   salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1636   salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1637   salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1638   salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1639   salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1640   salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1641   salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1642   salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1643   salt_buf1[14] = 0;
1644   salt_buf1[15] = 0;
1645
1646   /**
1647    * esalt
1648    */
1649
1650   const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1651
1652   u32 esalt_buf0[16];
1653
1654   esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1655   esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1656   esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1657   esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1658   esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1659   esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1660   esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1661   esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1662   esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1663   esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1664   esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1665   esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1666   esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1667   esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1668   esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1669   esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1670
1671   u32 esalt_buf1[16];
1672
1673   esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1674   esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1675   esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1676   esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1677   esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1678   esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1679   esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1680   esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1681   esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1682   esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1683   esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1684   esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1685   esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1686   esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1687   esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1688   esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1689
1690   u32 esalt_buf2[16];
1691
1692   esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1693   esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1694   esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1695   esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1696   esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1697   esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1698   esalt_buf2[ 6] = 0;
1699   esalt_buf2[ 7] = 0;
1700   esalt_buf2[ 8] = 0;
1701   esalt_buf2[ 9] = 0;
1702   esalt_buf2[10] = 0;
1703   esalt_buf2[11] = 0;
1704   esalt_buf2[12] = 0;
1705   esalt_buf2[13] = 0;
1706   esalt_buf2[14] = 0;
1707   esalt_buf2[15] = 0;
1708
1709   const u32 digest_esalt_len = 32 + esalt_len;
1710   const u32 remaining_bytes  = digest_esalt_len + 1 - 64; // substract previous block
1711
1712   /**
1713    * digest
1714    */
1715
1716   const u32 search[4] =
1717   {
1718     digests_buf[digests_offset].digest_buf[DGST_R0],
1719     digests_buf[digests_offset].digest_buf[DGST_R1],
1720     digests_buf[digests_offset].digest_buf[DGST_R2],
1721     digests_buf[digests_offset].digest_buf[DGST_R3]
1722   };
1723
1724   /**
1725    * loop
1726    */
1727
1728   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
1729   {
1730     u32 w0[4];
1731
1732     w0[0] = pw_buf0[0];
1733     w0[1] = pw_buf0[1];
1734     w0[2] = pw_buf0[2];
1735     w0[3] = pw_buf0[3];
1736
1737     u32 w1[4];
1738
1739     w1[0] = pw_buf1[0];
1740     w1[1] = pw_buf1[1];
1741     w1[2] = pw_buf1[2];
1742     w1[3] = pw_buf1[3];
1743
1744     u32 w2[4];
1745
1746     w2[0] = 0;
1747     w2[1] = 0;
1748     w2[2] = 0;
1749     w2[3] = 0;
1750
1751     u32 w3[4];
1752
1753     w3[0] = 0;
1754     w3[1] = 0;
1755     w3[2] = 0;
1756     w3[3] = 0;
1757
1758     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
1759
1760     append_0x80_2x4 (w0, w1, out_len);
1761
1762     const u32 pw_salt_len = salt_len + out_len;
1763
1764     /*
1765      * HA1 = md5 ($salt . $pass)
1766      */
1767
1768     // append the pass to the salt
1769
1770     u32 block0[16];
1771
1772     block0[ 0] = salt_buf0[ 0];
1773     block0[ 1] = salt_buf0[ 1];
1774     block0[ 2] = salt_buf0[ 2];
1775     block0[ 3] = salt_buf0[ 3];
1776     block0[ 4] = salt_buf0[ 4];
1777     block0[ 5] = salt_buf0[ 5];
1778     block0[ 6] = salt_buf0[ 6];
1779     block0[ 7] = salt_buf0[ 7];
1780     block0[ 8] = salt_buf0[ 8];
1781     block0[ 9] = salt_buf0[ 9];
1782     block0[10] = salt_buf0[10];
1783     block0[11] = salt_buf0[11];
1784     block0[12] = salt_buf0[12];
1785     block0[13] = salt_buf0[13];
1786     block0[14] = salt_buf0[14];
1787     block0[15] = salt_buf0[15];
1788
1789     u32 block1[16];
1790
1791     block1[ 0] = salt_buf1[ 0];
1792     block1[ 1] = salt_buf1[ 1];
1793     block1[ 2] = salt_buf1[ 2];
1794     block1[ 3] = salt_buf1[ 3];
1795     block1[ 4] = salt_buf1[ 4];
1796     block1[ 5] = salt_buf1[ 5];
1797     block1[ 6] = salt_buf1[ 6];
1798     block1[ 7] = salt_buf1[ 7];
1799     block1[ 8] = salt_buf1[ 8];
1800     block1[ 9] = salt_buf1[ 9];
1801     block1[10] = salt_buf1[10];
1802     block1[11] = salt_buf1[11];
1803     block1[12] = salt_buf1[12];
1804     block1[13] = salt_buf1[13];
1805     block1[14] = salt_buf1[14];
1806     block1[15] = salt_buf1[15];
1807
1808     u32 block_len = 0;
1809
1810     block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, out_len);
1811
1812     u32 w0_t[4];
1813
1814     w0_t[0] = block0[ 0];
1815     w0_t[1] = block0[ 1];
1816     w0_t[2] = block0[ 2];
1817     w0_t[3] = block0[ 3];
1818
1819     u32 w1_t[4];
1820
1821     w1_t[0] = block0[ 4];
1822     w1_t[1] = block0[ 5];
1823     w1_t[2] = block0[ 6];
1824     w1_t[3] = block0[ 7];
1825
1826     u32 w2_t[4];
1827
1828     w2_t[0] = block0[ 8];
1829     w2_t[1] = block0[ 9];
1830     w2_t[2] = block0[10];
1831     w2_t[3] = block0[11];
1832
1833     u32 w3_t[4];
1834
1835     w3_t[0] = block0[12];
1836     w3_t[1] = block0[13];
1837     w3_t[2] = block0[14];
1838     w3_t[3] = block0[15];
1839
1840     if (block_len < 56)
1841     {
1842       w3_t[2] = pw_salt_len * 8;
1843     }
1844
1845     // md5
1846
1847     u32 a = MD5M_A;
1848     u32 b = MD5M_B;
1849     u32 c = MD5M_C;
1850     u32 d = MD5M_D;
1851
1852     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1853     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1854     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1855     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1856     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1857     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1858     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1859     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1860     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1861     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1862     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1863     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1864     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1865     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1866     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1867     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1868
1869     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1870     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1871     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1872     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1873     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1874     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1875     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1876     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1877     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1878     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1879     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1880     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1881     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1882     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1883     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1884     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1885
1886     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1887     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1888     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1889     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1890     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1891     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1892     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1893     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1894     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1895     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1896     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1897     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1898     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1899     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1900     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1901     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1902
1903     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1904     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1905     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1906     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1907     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1908     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1909     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1910     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1911     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1912     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1913     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1914     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1915     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1916     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1917     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1918     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1919
1920     a += MD5M_A;
1921     b += MD5M_B;
1922     c += MD5M_C;
1923     d += MD5M_D;
1924
1925     if (block_len > 55)
1926     {
1927       u32 r_a = a;
1928       u32 r_b = b;
1929       u32 r_c = c;
1930       u32 r_d = d;
1931
1932       w0_t[0] = block1[ 0];
1933       w0_t[1] = block1[ 1];
1934       w0_t[2] = block1[ 2];
1935       w0_t[3] = block1[ 3];
1936
1937       w1_t[0] = block1[ 4];
1938       w1_t[1] = block1[ 5];
1939       w1_t[2] = block1[ 6];
1940       w1_t[3] = block1[ 7];
1941
1942       w2_t[0] = block1[ 8];
1943       w2_t[1] = block1[ 9];
1944       w2_t[2] = block1[10];
1945       w2_t[3] = block1[11];
1946
1947       w3_t[0] = block1[12];
1948       w3_t[1] = block1[13];
1949       w3_t[2] = pw_salt_len * 8;
1950       w3_t[3] = 0;
1951
1952       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1953       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1954       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1955       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1956       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1957       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1958       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1959       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1960       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1961       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1962       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1963       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1964       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1965       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1966       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1967       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1968
1969       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1970       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1971       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1972       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1973       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1974       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1975       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1976       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1977       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1978       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1979       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1980       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1981       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1982       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1983       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1984       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1985
1986       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
1987       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
1988       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
1989       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
1990       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
1991       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
1992       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
1993       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
1994       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
1995       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
1996       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1997       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1998       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1999       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2000       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2001       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2002
2003       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2004       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2005       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2006       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2007       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2008       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2009       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2010       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2011       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2012       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2013       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2014       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2015       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2016       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2017       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2018       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2019
2020       a += r_a;
2021       b += r_b;
2022       c += r_c;
2023       d += r_d;
2024     }
2025
2026     /*
2027      * final = md5 ($HA1 . $esalt)
2028      * we have at least 2 MD5 blocks/transformations, but we might need 3
2029      */
2030
2031     w0_t[0] = uint_to_hex_lower8 ((a >>  0) & 255) <<  0
2032             | uint_to_hex_lower8 ((a >>  8) & 255) << 16;
2033     w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) <<  0
2034             | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2035     w0_t[2] = uint_to_hex_lower8 ((b >>  0) & 255) <<  0
2036             | uint_to_hex_lower8 ((b >>  8) & 255) << 16;
2037     w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) <<  0
2038             | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2039     w1_t[0] = uint_to_hex_lower8 ((c >>  0) & 255) <<  0
2040             | uint_to_hex_lower8 ((c >>  8) & 255) << 16;
2041     w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) <<  0
2042             | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2043     w1_t[2] = uint_to_hex_lower8 ((d >>  0) & 255) <<  0
2044             | uint_to_hex_lower8 ((d >>  8) & 255) << 16;
2045     w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) <<  0
2046             | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2047
2048     w2_t[0] = esalt_buf0[0];
2049     w2_t[1] = esalt_buf0[1];
2050     w2_t[2] = esalt_buf0[2];
2051     w2_t[3] = esalt_buf0[3];
2052
2053     w3_t[0] = esalt_buf0[4];
2054     w3_t[1] = esalt_buf0[5];
2055     w3_t[2] = esalt_buf0[6];
2056     w3_t[3] = esalt_buf0[7];
2057
2058     // md5
2059     // 1st transform
2060
2061     a = MD5M_A;
2062     b = MD5M_B;
2063     c = MD5M_C;
2064     d = MD5M_D;
2065
2066     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2067     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2068     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2069     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2070     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2071     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2072     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2073     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2074     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2075     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2076     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2077     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2078     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2079     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2080     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2081     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2082
2083     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2084     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2085     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2086     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2087     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2088     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2089     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2090     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2091     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2092     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2093     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2094     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2095     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2096     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2097     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2098     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2099
2100     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2101     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2102     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2103     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2104     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2105     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2106     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2107     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2108     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2109     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2110     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2111     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2112     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2113     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2114     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2115     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2116
2117     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2118     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2119     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2120     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2121     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2122     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2123     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2124     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2125     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2126     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2127     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2128     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2129     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2130     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2131     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2132     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2133
2134     a += MD5M_A;
2135     b += MD5M_B;
2136     c += MD5M_C;
2137     d += MD5M_D;
2138
2139     u32 r_a = a;
2140     u32 r_b = b;
2141     u32 r_c = c;
2142     u32 r_d = d;
2143
2144     // 2nd transform
2145
2146     w0_t[0] = esalt_buf0[ 8];
2147     w0_t[1] = esalt_buf0[ 9];
2148     w0_t[2] = esalt_buf0[10];
2149     w0_t[3] = esalt_buf0[11];
2150
2151     w1_t[0] = esalt_buf0[12];
2152     w1_t[1] = esalt_buf0[13];
2153     w1_t[2] = esalt_buf0[14];
2154     w1_t[3] = esalt_buf0[15];
2155
2156     w2_t[0] = esalt_buf1[ 0];
2157     w2_t[1] = esalt_buf1[ 1];
2158     w2_t[2] = esalt_buf1[ 2];
2159     w2_t[3] = esalt_buf1[ 3];
2160
2161     w3_t[0] = esalt_buf1[ 4];
2162     w3_t[1] = esalt_buf1[ 5];
2163     w3_t[2] = esalt_buf1[ 6];
2164     w3_t[3] = esalt_buf1[ 7];
2165
2166     // it is the final block when no more than 55 bytes left
2167
2168     if (remaining_bytes < 56)
2169     {
2170       // it is the last block !
2171
2172       w3_t[2] = digest_esalt_len * 8;
2173     }
2174
2175     MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2176     MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2177     MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2178     MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2179     MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2180     MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2181     MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2182     MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2183     MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2184     MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2185     MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2186     MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2187     MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2188     MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2189     MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2190     MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2191
2192     MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2193     MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2194     MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2195     MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2196     MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2197     MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2198     MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2199     MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2200     MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2201     MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2202     MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2203     MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2204     MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2205     MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2206     MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2207     MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2208
2209     MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2210     MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2211     MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2212     MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2213     MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2214     MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2215     MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2216     MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2217     MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2218     MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2219     MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2220     MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2221     MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2222     MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2223     MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2224     MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2225
2226     MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2227     MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2228     MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2229     MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2230     MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2231     MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2232     MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2233     MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2234     MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2235     MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2236     MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2237     MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2238     MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2239     MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2240     MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2241     MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2242
2243     // sometimes (not rare at all) we need a third block :(
2244
2245     if (remaining_bytes > 55)
2246     {
2247       // this is for sure the final block
2248
2249       a += r_a;
2250       b += r_b;
2251       c += r_c;
2252       d += r_d;
2253
2254       r_a = a;
2255       r_b = b;
2256       r_c = c;
2257       r_d = d;
2258
2259       w0_t[0] = esalt_buf1[ 8];
2260       w0_t[1] = esalt_buf1[ 9];
2261       w0_t[2] = esalt_buf1[10];
2262       w0_t[3] = esalt_buf1[11];
2263
2264       w1_t[0] = esalt_buf1[12];
2265       w1_t[1] = esalt_buf1[13];
2266       w1_t[2] = esalt_buf1[14];
2267       w1_t[3] = esalt_buf1[15];
2268
2269       w2_t[0] = esalt_buf2[ 0];
2270       w2_t[1] = esalt_buf2[ 1];
2271       w2_t[2] = esalt_buf2[ 2];
2272       w2_t[3] = esalt_buf2[ 3];
2273
2274       w3_t[0] = esalt_buf2[ 4];
2275       w3_t[1] = esalt_buf2[ 5];
2276       w3_t[2] = digest_esalt_len * 8;
2277       w3_t[3] = 0;
2278
2279       MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2280       MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2281       MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2282       MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2283       MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2284       MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2285       MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2286       MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2287       MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2288       MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2289       MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2290       MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2291       MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2292       MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2293       MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2294       MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2295
2296       MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2297       MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2298       MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2299       MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2300       MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2301       MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2302       MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2303       MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2304       MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2305       MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2306       MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2307       MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2308       MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2309       MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2310       MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2311       MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2312
2313       MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20);
2314       MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21);
2315       MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22);
2316       MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23);
2317       MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20);
2318       MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21);
2319       MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22);
2320       MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23);
2321       MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20);
2322       MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21);
2323       MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2324       MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2325       MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2326       MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2327       MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2328       MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2329
2330       MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2331       MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2332       MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2333       MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2334       MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2335       MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2336       MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2337       MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2338       MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2339       MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2340       MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2341       MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2342       MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2343       MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2344       MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2345       MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2346     }
2347
2348     a += r_a;
2349     b += r_b;
2350     c += r_c;
2351     d += r_d;
2352
2353     const u32 r0 = a;
2354     const u32 r1 = d;
2355     const u32 r2 = c;
2356     const u32 r3 = b;
2357
2358     #include COMPARE_S
2359   }
2360 }
2361
2362 __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)
2363 {
2364 }
2365
2366 __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)
2367 {
2368 }