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