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