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