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