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