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