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