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