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