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