Fixed two major problems
[hashcat.git] / OpenCL / m06900_a1.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _GOST_
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21
22 #define COMPARE_S "OpenCL/check_single_comp4.c"
23 #define COMPARE_M "OpenCL/check_multi_comp4.c"
24
25 __constant u32 c_tables[4][256] =
26 {
27   {
28     0x00072000, 0x00075000, 0x00074800, 0x00071000,
29     0x00076800, 0x00074000, 0x00070000, 0x00077000,
30     0x00073000, 0x00075800, 0x00070800, 0x00076000,
31     0x00073800, 0x00077800, 0x00072800, 0x00071800,
32     0x0005a000, 0x0005d000, 0x0005c800, 0x00059000,
33     0x0005e800, 0x0005c000, 0x00058000, 0x0005f000,
34     0x0005b000, 0x0005d800, 0x00058800, 0x0005e000,
35     0x0005b800, 0x0005f800, 0x0005a800, 0x00059800,
36     0x00022000, 0x00025000, 0x00024800, 0x00021000,
37     0x00026800, 0x00024000, 0x00020000, 0x00027000,
38     0x00023000, 0x00025800, 0x00020800, 0x00026000,
39     0x00023800, 0x00027800, 0x00022800, 0x00021800,
40     0x00062000, 0x00065000, 0x00064800, 0x00061000,
41     0x00066800, 0x00064000, 0x00060000, 0x00067000,
42     0x00063000, 0x00065800, 0x00060800, 0x00066000,
43     0x00063800, 0x00067800, 0x00062800, 0x00061800,
44     0x00032000, 0x00035000, 0x00034800, 0x00031000,
45     0x00036800, 0x00034000, 0x00030000, 0x00037000,
46     0x00033000, 0x00035800, 0x00030800, 0x00036000,
47     0x00033800, 0x00037800, 0x00032800, 0x00031800,
48     0x0006a000, 0x0006d000, 0x0006c800, 0x00069000,
49     0x0006e800, 0x0006c000, 0x00068000, 0x0006f000,
50     0x0006b000, 0x0006d800, 0x00068800, 0x0006e000,
51     0x0006b800, 0x0006f800, 0x0006a800, 0x00069800,
52     0x0007a000, 0x0007d000, 0x0007c800, 0x00079000,
53     0x0007e800, 0x0007c000, 0x00078000, 0x0007f000,
54     0x0007b000, 0x0007d800, 0x00078800, 0x0007e000,
55     0x0007b800, 0x0007f800, 0x0007a800, 0x00079800,
56     0x00052000, 0x00055000, 0x00054800, 0x00051000,
57     0x00056800, 0x00054000, 0x00050000, 0x00057000,
58     0x00053000, 0x00055800, 0x00050800, 0x00056000,
59     0x00053800, 0x00057800, 0x00052800, 0x00051800,
60     0x00012000, 0x00015000, 0x00014800, 0x00011000,
61     0x00016800, 0x00014000, 0x00010000, 0x00017000,
62     0x00013000, 0x00015800, 0x00010800, 0x00016000,
63     0x00013800, 0x00017800, 0x00012800, 0x00011800,
64     0x0001a000, 0x0001d000, 0x0001c800, 0x00019000,
65     0x0001e800, 0x0001c000, 0x00018000, 0x0001f000,
66     0x0001b000, 0x0001d800, 0x00018800, 0x0001e000,
67     0x0001b800, 0x0001f800, 0x0001a800, 0x00019800,
68     0x00042000, 0x00045000, 0x00044800, 0x00041000,
69     0x00046800, 0x00044000, 0x00040000, 0x00047000,
70     0x00043000, 0x00045800, 0x00040800, 0x00046000,
71     0x00043800, 0x00047800, 0x00042800, 0x00041800,
72     0x0000a000, 0x0000d000, 0x0000c800, 0x00009000,
73     0x0000e800, 0x0000c000, 0x00008000, 0x0000f000,
74     0x0000b000, 0x0000d800, 0x00008800, 0x0000e000,
75     0x0000b800, 0x0000f800, 0x0000a800, 0x00009800,
76     0x00002000, 0x00005000, 0x00004800, 0x00001000,
77     0x00006800, 0x00004000, 0x00000000, 0x00007000,
78     0x00003000, 0x00005800, 0x00000800, 0x00006000,
79     0x00003800, 0x00007800, 0x00002800, 0x00001800,
80     0x0003a000, 0x0003d000, 0x0003c800, 0x00039000,
81     0x0003e800, 0x0003c000, 0x00038000, 0x0003f000,
82     0x0003b000, 0x0003d800, 0x00038800, 0x0003e000,
83     0x0003b800, 0x0003f800, 0x0003a800, 0x00039800,
84     0x0002a000, 0x0002d000, 0x0002c800, 0x00029000,
85     0x0002e800, 0x0002c000, 0x00028000, 0x0002f000,
86     0x0002b000, 0x0002d800, 0x00028800, 0x0002e000,
87     0x0002b800, 0x0002f800, 0x0002a800, 0x00029800,
88     0x0004a000, 0x0004d000, 0x0004c800, 0x00049000,
89     0x0004e800, 0x0004c000, 0x00048000, 0x0004f000,
90     0x0004b000, 0x0004d800, 0x00048800, 0x0004e000,
91     0x0004b800, 0x0004f800, 0x0004a800, 0x00049800,
92   },
93   {
94     0x03a80000, 0x03c00000, 0x03880000, 0x03e80000,
95     0x03d00000, 0x03980000, 0x03a00000, 0x03900000,
96     0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000,
97     0x03b00000, 0x03800000, 0x03c80000, 0x03d80000,
98     0x06a80000, 0x06c00000, 0x06880000, 0x06e80000,
99     0x06d00000, 0x06980000, 0x06a00000, 0x06900000,
100     0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000,
101     0x06b00000, 0x06800000, 0x06c80000, 0x06d80000,
102     0x05280000, 0x05400000, 0x05080000, 0x05680000,
103     0x05500000, 0x05180000, 0x05200000, 0x05100000,
104     0x05700000, 0x05780000, 0x05600000, 0x05380000,
105     0x05300000, 0x05000000, 0x05480000, 0x05580000,
106     0x00a80000, 0x00c00000, 0x00880000, 0x00e80000,
107     0x00d00000, 0x00980000, 0x00a00000, 0x00900000,
108     0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000,
109     0x00b00000, 0x00800000, 0x00c80000, 0x00d80000,
110     0x00280000, 0x00400000, 0x00080000, 0x00680000,
111     0x00500000, 0x00180000, 0x00200000, 0x00100000,
112     0x00700000, 0x00780000, 0x00600000, 0x00380000,
113     0x00300000, 0x00000000, 0x00480000, 0x00580000,
114     0x04280000, 0x04400000, 0x04080000, 0x04680000,
115     0x04500000, 0x04180000, 0x04200000, 0x04100000,
116     0x04700000, 0x04780000, 0x04600000, 0x04380000,
117     0x04300000, 0x04000000, 0x04480000, 0x04580000,
118     0x04a80000, 0x04c00000, 0x04880000, 0x04e80000,
119     0x04d00000, 0x04980000, 0x04a00000, 0x04900000,
120     0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000,
121     0x04b00000, 0x04800000, 0x04c80000, 0x04d80000,
122     0x07a80000, 0x07c00000, 0x07880000, 0x07e80000,
123     0x07d00000, 0x07980000, 0x07a00000, 0x07900000,
124     0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000,
125     0x07b00000, 0x07800000, 0x07c80000, 0x07d80000,
126     0x07280000, 0x07400000, 0x07080000, 0x07680000,
127     0x07500000, 0x07180000, 0x07200000, 0x07100000,
128     0x07700000, 0x07780000, 0x07600000, 0x07380000,
129     0x07300000, 0x07000000, 0x07480000, 0x07580000,
130     0x02280000, 0x02400000, 0x02080000, 0x02680000,
131     0x02500000, 0x02180000, 0x02200000, 0x02100000,
132     0x02700000, 0x02780000, 0x02600000, 0x02380000,
133     0x02300000, 0x02000000, 0x02480000, 0x02580000,
134     0x03280000, 0x03400000, 0x03080000, 0x03680000,
135     0x03500000, 0x03180000, 0x03200000, 0x03100000,
136     0x03700000, 0x03780000, 0x03600000, 0x03380000,
137     0x03300000, 0x03000000, 0x03480000, 0x03580000,
138     0x06280000, 0x06400000, 0x06080000, 0x06680000,
139     0x06500000, 0x06180000, 0x06200000, 0x06100000,
140     0x06700000, 0x06780000, 0x06600000, 0x06380000,
141     0x06300000, 0x06000000, 0x06480000, 0x06580000,
142     0x05a80000, 0x05c00000, 0x05880000, 0x05e80000,
143     0x05d00000, 0x05980000, 0x05a00000, 0x05900000,
144     0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000,
145     0x05b00000, 0x05800000, 0x05c80000, 0x05d80000,
146     0x01280000, 0x01400000, 0x01080000, 0x01680000,
147     0x01500000, 0x01180000, 0x01200000, 0x01100000,
148     0x01700000, 0x01780000, 0x01600000, 0x01380000,
149     0x01300000, 0x01000000, 0x01480000, 0x01580000,
150     0x02a80000, 0x02c00000, 0x02880000, 0x02e80000,
151     0x02d00000, 0x02980000, 0x02a00000, 0x02900000,
152     0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000,
153     0x02b00000, 0x02800000, 0x02c80000, 0x02d80000,
154     0x01a80000, 0x01c00000, 0x01880000, 0x01e80000,
155     0x01d00000, 0x01980000, 0x01a00000, 0x01900000,
156     0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000,
157     0x01b00000, 0x01800000, 0x01c80000, 0x01d80000,
158   },
159   {
160     0x30000002, 0x60000002, 0x38000002, 0x08000002,
161     0x28000002, 0x78000002, 0x68000002, 0x40000002,
162     0x20000002, 0x50000002, 0x48000002, 0x70000002,
163     0x00000002, 0x18000002, 0x58000002, 0x10000002,
164     0xb0000005, 0xe0000005, 0xb8000005, 0x88000005,
165     0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005,
166     0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005,
167     0x80000005, 0x98000005, 0xd8000005, 0x90000005,
168     0x30000005, 0x60000005, 0x38000005, 0x08000005,
169     0x28000005, 0x78000005, 0x68000005, 0x40000005,
170     0x20000005, 0x50000005, 0x48000005, 0x70000005,
171     0x00000005, 0x18000005, 0x58000005, 0x10000005,
172     0x30000000, 0x60000000, 0x38000000, 0x08000000,
173     0x28000000, 0x78000000, 0x68000000, 0x40000000,
174     0x20000000, 0x50000000, 0x48000000, 0x70000000,
175     0x00000000, 0x18000000, 0x58000000, 0x10000000,
176     0xb0000003, 0xe0000003, 0xb8000003, 0x88000003,
177     0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003,
178     0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003,
179     0x80000003, 0x98000003, 0xd8000003, 0x90000003,
180     0x30000001, 0x60000001, 0x38000001, 0x08000001,
181     0x28000001, 0x78000001, 0x68000001, 0x40000001,
182     0x20000001, 0x50000001, 0x48000001, 0x70000001,
183     0x00000001, 0x18000001, 0x58000001, 0x10000001,
184     0xb0000000, 0xe0000000, 0xb8000000, 0x88000000,
185     0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000,
186     0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000,
187     0x80000000, 0x98000000, 0xd8000000, 0x90000000,
188     0xb0000006, 0xe0000006, 0xb8000006, 0x88000006,
189     0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006,
190     0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006,
191     0x80000006, 0x98000006, 0xd8000006, 0x90000006,
192     0xb0000001, 0xe0000001, 0xb8000001, 0x88000001,
193     0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001,
194     0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001,
195     0x80000001, 0x98000001, 0xd8000001, 0x90000001,
196     0x30000003, 0x60000003, 0x38000003, 0x08000003,
197     0x28000003, 0x78000003, 0x68000003, 0x40000003,
198     0x20000003, 0x50000003, 0x48000003, 0x70000003,
199     0x00000003, 0x18000003, 0x58000003, 0x10000003,
200     0x30000004, 0x60000004, 0x38000004, 0x08000004,
201     0x28000004, 0x78000004, 0x68000004, 0x40000004,
202     0x20000004, 0x50000004, 0x48000004, 0x70000004,
203     0x00000004, 0x18000004, 0x58000004, 0x10000004,
204     0xb0000002, 0xe0000002, 0xb8000002, 0x88000002,
205     0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002,
206     0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002,
207     0x80000002, 0x98000002, 0xd8000002, 0x90000002,
208     0xb0000004, 0xe0000004, 0xb8000004, 0x88000004,
209     0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004,
210     0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004,
211     0x80000004, 0x98000004, 0xd8000004, 0x90000004,
212     0x30000006, 0x60000006, 0x38000006, 0x08000006,
213     0x28000006, 0x78000006, 0x68000006, 0x40000006,
214     0x20000006, 0x50000006, 0x48000006, 0x70000006,
215     0x00000006, 0x18000006, 0x58000006, 0x10000006,
216     0xb0000007, 0xe0000007, 0xb8000007, 0x88000007,
217     0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007,
218     0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007,
219     0x80000007, 0x98000007, 0xd8000007, 0x90000007,
220     0x30000007, 0x60000007, 0x38000007, 0x08000007,
221     0x28000007, 0x78000007, 0x68000007, 0x40000007,
222     0x20000007, 0x50000007, 0x48000007, 0x70000007,
223     0x00000007, 0x18000007, 0x58000007, 0x10000007,
224   },
225   {
226     0x000000e8, 0x000000d8, 0x000000a0, 0x00000088,
227     0x00000098, 0x000000f8, 0x000000a8, 0x000000c8,
228     0x00000080, 0x000000d0, 0x000000f0, 0x000000b8,
229     0x000000b0, 0x000000c0, 0x00000090, 0x000000e0,
230     0x000007e8, 0x000007d8, 0x000007a0, 0x00000788,
231     0x00000798, 0x000007f8, 0x000007a8, 0x000007c8,
232     0x00000780, 0x000007d0, 0x000007f0, 0x000007b8,
233     0x000007b0, 0x000007c0, 0x00000790, 0x000007e0,
234     0x000006e8, 0x000006d8, 0x000006a0, 0x00000688,
235     0x00000698, 0x000006f8, 0x000006a8, 0x000006c8,
236     0x00000680, 0x000006d0, 0x000006f0, 0x000006b8,
237     0x000006b0, 0x000006c0, 0x00000690, 0x000006e0,
238     0x00000068, 0x00000058, 0x00000020, 0x00000008,
239     0x00000018, 0x00000078, 0x00000028, 0x00000048,
240     0x00000000, 0x00000050, 0x00000070, 0x00000038,
241     0x00000030, 0x00000040, 0x00000010, 0x00000060,
242     0x000002e8, 0x000002d8, 0x000002a0, 0x00000288,
243     0x00000298, 0x000002f8, 0x000002a8, 0x000002c8,
244     0x00000280, 0x000002d0, 0x000002f0, 0x000002b8,
245     0x000002b0, 0x000002c0, 0x00000290, 0x000002e0,
246     0x000003e8, 0x000003d8, 0x000003a0, 0x00000388,
247     0x00000398, 0x000003f8, 0x000003a8, 0x000003c8,
248     0x00000380, 0x000003d0, 0x000003f0, 0x000003b8,
249     0x000003b0, 0x000003c0, 0x00000390, 0x000003e0,
250     0x00000568, 0x00000558, 0x00000520, 0x00000508,
251     0x00000518, 0x00000578, 0x00000528, 0x00000548,
252     0x00000500, 0x00000550, 0x00000570, 0x00000538,
253     0x00000530, 0x00000540, 0x00000510, 0x00000560,
254     0x00000268, 0x00000258, 0x00000220, 0x00000208,
255     0x00000218, 0x00000278, 0x00000228, 0x00000248,
256     0x00000200, 0x00000250, 0x00000270, 0x00000238,
257     0x00000230, 0x00000240, 0x00000210, 0x00000260,
258     0x000004e8, 0x000004d8, 0x000004a0, 0x00000488,
259     0x00000498, 0x000004f8, 0x000004a8, 0x000004c8,
260     0x00000480, 0x000004d0, 0x000004f0, 0x000004b8,
261     0x000004b0, 0x000004c0, 0x00000490, 0x000004e0,
262     0x00000168, 0x00000158, 0x00000120, 0x00000108,
263     0x00000118, 0x00000178, 0x00000128, 0x00000148,
264     0x00000100, 0x00000150, 0x00000170, 0x00000138,
265     0x00000130, 0x00000140, 0x00000110, 0x00000160,
266     0x000001e8, 0x000001d8, 0x000001a0, 0x00000188,
267     0x00000198, 0x000001f8, 0x000001a8, 0x000001c8,
268     0x00000180, 0x000001d0, 0x000001f0, 0x000001b8,
269     0x000001b0, 0x000001c0, 0x00000190, 0x000001e0,
270     0x00000768, 0x00000758, 0x00000720, 0x00000708,
271     0x00000718, 0x00000778, 0x00000728, 0x00000748,
272     0x00000700, 0x00000750, 0x00000770, 0x00000738,
273     0x00000730, 0x00000740, 0x00000710, 0x00000760,
274     0x00000368, 0x00000358, 0x00000320, 0x00000308,
275     0x00000318, 0x00000378, 0x00000328, 0x00000348,
276     0x00000300, 0x00000350, 0x00000370, 0x00000338,
277     0x00000330, 0x00000340, 0x00000310, 0x00000360,
278     0x000005e8, 0x000005d8, 0x000005a0, 0x00000588,
279     0x00000598, 0x000005f8, 0x000005a8, 0x000005c8,
280     0x00000580, 0x000005d0, 0x000005f0, 0x000005b8,
281     0x000005b0, 0x000005c0, 0x00000590, 0x000005e0,
282     0x00000468, 0x00000458, 0x00000420, 0x00000408,
283     0x00000418, 0x00000478, 0x00000428, 0x00000448,
284     0x00000400, 0x00000450, 0x00000470, 0x00000438,
285     0x00000430, 0x00000440, 0x00000410, 0x00000460,
286     0x00000668, 0x00000658, 0x00000620, 0x00000608,
287     0x00000618, 0x00000678, 0x00000628, 0x00000648,
288     0x00000600, 0x00000650, 0x00000670, 0x00000638,
289     0x00000630, 0x00000640, 0x00000610, 0x00000660,
290   }
291 };
292
293 #define BOX(i,n,S) (S)[(n)][(i)]
294
295 #define _round(k1,k2,tbl)                 \
296 {                                         \
297   u32 t;                                  \
298   t = (k1) + r;                           \
299   l ^= BOX (((t >>  0) & 0xff), 0, tbl) ^ \
300        BOX (((t >>  8) & 0xff), 1, tbl) ^ \
301        BOX (((t >> 16) & 0xff), 2, tbl) ^ \
302        BOX (((t >> 24) & 0xff), 3, tbl);  \
303   t = (k2) + l;                           \
304   r ^= BOX (((t >>  0) & 0xff), 0, tbl) ^ \
305        BOX (((t >>  8) & 0xff), 1, tbl) ^ \
306        BOX (((t >> 16) & 0xff), 2, tbl) ^ \
307        BOX (((t >> 24) & 0xff), 3, tbl);  \
308 }
309
310 #define R(k,h,s,i,t)      \
311 {                         \
312   u32 r;                  \
313   u32 l;                  \
314   r = h[i + 0];           \
315   l = h[i + 1];           \
316   _round (k[0], k[1], t);  \
317   _round (k[2], k[3], t);  \
318   _round (k[4], k[5], t);  \
319   _round (k[6], k[7], t);  \
320   _round (k[0], k[1], t);  \
321   _round (k[2], k[3], t);  \
322   _round (k[4], k[5], t);  \
323   _round (k[6], k[7], t);  \
324   _round (k[0], k[1], t);  \
325   _round (k[2], k[3], t);  \
326   _round (k[4], k[5], t);  \
327   _round (k[6], k[7], t);  \
328   _round (k[7], k[6], t);  \
329   _round (k[5], k[4], t);  \
330   _round (k[3], k[2], t);  \
331   _round (k[1], k[0], t);  \
332   s[i + 0] = l;           \
333   s[i + 1] = r;           \
334 }
335
336 #define X(w,u,v)      \
337   w[0] = u[0] ^ v[0]; \
338   w[1] = u[1] ^ v[1]; \
339   w[2] = u[2] ^ v[2]; \
340   w[3] = u[3] ^ v[3]; \
341   w[4] = u[4] ^ v[4]; \
342   w[5] = u[5] ^ v[5]; \
343   w[6] = u[6] ^ v[6]; \
344   w[7] = u[7] ^ v[7];
345
346 #define P(k,w)                        \
347   k[0] = ((w[0] & 0x000000ff) <<  0)  \
348        | ((w[2] & 0x000000ff) <<  8)  \
349        | ((w[4] & 0x000000ff) << 16)  \
350        | ((w[6] & 0x000000ff) << 24); \
351   k[1] = ((w[0] & 0x0000ff00) >>  8)  \
352        | ((w[2] & 0x0000ff00) >>  0)  \
353        | ((w[4] & 0x0000ff00) <<  8)  \
354        | ((w[6] & 0x0000ff00) << 16); \
355   k[2] = ((w[0] & 0x00ff0000) >> 16)  \
356        | ((w[2] & 0x00ff0000) >>  8)  \
357        | ((w[4] & 0x00ff0000) <<  0)  \
358        | ((w[6] & 0x00ff0000) <<  8); \
359   k[3] = ((w[0] & 0xff000000) >> 24)  \
360        | ((w[2] & 0xff000000) >> 16)  \
361        | ((w[4] & 0xff000000) >>  8)  \
362        | ((w[6] & 0xff000000) >>  0); \
363   k[4] = ((w[1] & 0x000000ff) <<  0)  \
364        | ((w[3] & 0x000000ff) <<  8)  \
365        | ((w[5] & 0x000000ff) << 16)  \
366        | ((w[7] & 0x000000ff) << 24); \
367   k[5] = ((w[1] & 0x0000ff00) >>  8)  \
368        | ((w[3] & 0x0000ff00) >>  0)  \
369        | ((w[5] & 0x0000ff00) <<  8)  \
370        | ((w[7] & 0x0000ff00) << 16); \
371   k[6] = ((w[1] & 0x00ff0000) >> 16)  \
372        | ((w[3] & 0x00ff0000) >>  8)  \
373        | ((w[5] & 0x00ff0000) <<  0)  \
374        | ((w[7] & 0x00ff0000) <<  8); \
375   k[7] = ((w[1] & 0xff000000) >> 24)  \
376        | ((w[3] & 0xff000000) >> 16)  \
377        | ((w[5] & 0xff000000) >>  8)  \
378        | ((w[7] & 0xff000000) >>  0);
379
380 #define A(x)        \
381 {                   \
382   u32 l;          \
383   u32 r;          \
384   l = x[0] ^ x[2];  \
385   r = x[1] ^ x[3];  \
386   x[0] = x[2];      \
387   x[1] = x[3];      \
388   x[2] = x[4];      \
389   x[3] = x[5];      \
390   x[4] = x[6];      \
391   x[5] = x[7];      \
392   x[6] = l;         \
393   x[7] = r;         \
394 }
395
396 #define AA(x)       \
397 {                   \
398   u32 l;          \
399   u32 r;          \
400   l    = x[0];      \
401   r    = x[2];      \
402   x[0] = x[4];      \
403   x[2] = x[6];      \
404   x[4] = l ^ r;     \
405   x[6] = x[0] ^ r;  \
406   l    = x[1];      \
407   r    = x[3];      \
408   x[1] = x[5];      \
409   x[3] = x[7];      \
410   x[5] = l ^ r;     \
411   x[7] = x[1] ^ r;  \
412 }
413
414 #define C(x)          \
415   x[0] ^= 0xff00ff00; \
416   x[1] ^= 0xff00ff00; \
417   x[2] ^= 0x00ff00ff; \
418   x[3] ^= 0x00ff00ff; \
419   x[4] ^= 0x00ffff00; \
420   x[5] ^= 0xff0000ff; \
421   x[6] ^= 0x000000ff; \
422   x[7] ^= 0xff00ffff;
423
424 #define SHIFT12(u,m,s)              \
425   u[0] = m[0] ^ s[6];               \
426   u[1] = m[1] ^ s[7];               \
427   u[2] = m[2] ^ (s[0] << 16)        \
428               ^ (s[0] >> 16)        \
429               ^ (s[0] & 0x0000ffff) \
430               ^ (s[1] & 0x0000ffff) \
431               ^ (s[1] >> 16)        \
432               ^ (s[2] << 16)        \
433               ^ s[6]                \
434               ^ (s[6] << 16)        \
435               ^ (s[7] & 0xffff0000) \
436               ^ (s[7] >> 16);       \
437   u[3] = m[3] ^ (s[0] & 0x0000ffff) \
438               ^ (s[0] << 16)        \
439               ^ (s[1] & 0x0000ffff) \
440               ^ (s[1] << 16)        \
441               ^ (s[1] >> 16)        \
442               ^ (s[2] << 16)        \
443               ^ (s[2] >> 16)        \
444               ^ (s[3] << 16)        \
445               ^ s[6]                \
446               ^ (s[6] << 16)        \
447               ^ (s[6] >> 16)        \
448               ^ (s[7] & 0x0000ffff) \
449               ^ (s[7] << 16)        \
450               ^ (s[7] >> 16);       \
451   u[4] = m[4] ^ (s[0] & 0xffff0000) \
452               ^ (s[0] << 16)        \
453               ^ (s[0] >> 16)        \
454               ^ (s[1] & 0xffff0000) \
455               ^ (s[1] >> 16)        \
456               ^ (s[2] << 16)        \
457               ^ (s[2] >> 16)        \
458               ^ (s[3] << 16)        \
459               ^ (s[3] >> 16)        \
460               ^ (s[4] << 16)        \
461               ^ (s[6] << 16)        \
462               ^ (s[6] >> 16)        \
463               ^ (s[7] & 0x0000ffff) \
464               ^ (s[7] << 16)        \
465               ^ (s[7] >> 16);       \
466   u[5] = m[5] ^ (s[0] << 16)        \
467               ^ (s[0] >> 16)        \
468               ^ (s[0] & 0xffff0000) \
469               ^ (s[1] & 0x0000ffff) \
470               ^ s[2]                \
471               ^ (s[2] >> 16)        \
472               ^ (s[3] << 16)        \
473               ^ (s[3] >> 16)        \
474               ^ (s[4] << 16)        \
475               ^ (s[4] >> 16)        \
476               ^ (s[5] << 16)        \
477               ^ (s[6] << 16)        \
478               ^ (s[6] >> 16)        \
479               ^ (s[7] & 0xffff0000) \
480               ^ (s[7] << 16)        \
481               ^ (s[7] >> 16);       \
482   u[6] = m[6] ^ s[0]                \
483               ^ (s[1] >> 16)        \
484               ^ (s[2] << 16)        \
485               ^ s[3]                \
486               ^ (s[3] >> 16)        \
487               ^ (s[4] << 16)        \
488               ^ (s[4] >> 16)        \
489               ^ (s[5] << 16)        \
490               ^ (s[5] >> 16)        \
491               ^ s[6]                \
492               ^ (s[6] << 16)        \
493               ^ (s[6] >> 16)        \
494               ^ (s[7] << 16);       \
495   u[7] = m[7] ^ (s[0] & 0xffff0000) \
496               ^ (s[0] << 16)        \
497               ^ (s[1] & 0x0000ffff) \
498               ^ (s[1] << 16)        \
499               ^ (s[2] >> 16)        \
500               ^ (s[3] << 16)        \
501               ^ s[4]                \
502               ^ (s[4] >> 16)        \
503               ^ (s[5] << 16)        \
504               ^ (s[5] >> 16)        \
505               ^ (s[6] >> 16)        \
506               ^ (s[7] & 0x0000ffff) \
507               ^ (s[7] << 16)        \
508               ^ (s[7] >> 16);
509
510 #define SHIFT16(h,v,u)              \
511   v[0] = h[0] ^ (u[1] << 16)        \
512               ^ (u[0] >> 16);       \
513   v[1] = h[1] ^ (u[2] << 16)        \
514               ^ (u[1] >> 16);       \
515   v[2] = h[2] ^ (u[3] << 16)        \
516               ^ (u[2] >> 16);       \
517   v[3] = h[3] ^ (u[4] << 16)        \
518               ^ (u[3] >> 16);       \
519   v[4] = h[4] ^ (u[5] << 16)        \
520               ^ (u[4] >> 16);       \
521   v[5] = h[5] ^ (u[6] << 16)        \
522               ^ (u[5] >> 16);       \
523   v[6] = h[6] ^ (u[7] << 16)        \
524               ^ (u[6] >> 16);       \
525   v[7] = h[7] ^ (u[0] & 0xffff0000) \
526               ^ (u[0] << 16)        \
527               ^ (u[7] >> 16)        \
528               ^ (u[1] & 0xffff0000) \
529               ^ (u[1] << 16)        \
530               ^ (u[6] << 16)        \
531               ^ (u[7] & 0xffff0000);
532
533 #define SHIFT61(h,v)          \
534   h[0] = (v[0] & 0xffff0000)  \
535        ^ (v[0] << 16)         \
536        ^ (v[0] >> 16)         \
537        ^ (v[1] >> 16)         \
538        ^ (v[1] & 0xffff0000)  \
539        ^ (v[2] << 16)         \
540        ^ (v[3] >> 16)         \
541        ^ (v[4] << 16)         \
542        ^ (v[5] >> 16)         \
543        ^ v[5]                 \
544        ^ (v[6] >> 16)         \
545        ^ (v[7] << 16)         \
546        ^ (v[7] >> 16)         \
547        ^ (v[7] & 0x0000ffff); \
548   h[1] = (v[0] << 16)         \
549        ^ (v[0] >> 16)         \
550        ^ (v[0] & 0xffff0000)  \
551        ^ (v[1] & 0x0000ffff)  \
552        ^ v[2]                 \
553        ^ (v[2] >> 16)         \
554        ^ (v[3] << 16)         \
555        ^ (v[4] >> 16)         \
556        ^ (v[5] << 16)         \
557        ^ (v[6] << 16)         \
558        ^ v[6]                 \
559        ^ (v[7] & 0xffff0000)  \
560        ^ (v[7] >> 16);        \
561   h[2] = (v[0] & 0x0000ffff)  \
562        ^ (v[0] << 16)         \
563        ^ (v[1] << 16)         \
564        ^ (v[1] >> 16)         \
565        ^ (v[1] & 0xffff0000)  \
566        ^ (v[2] << 16)         \
567        ^ (v[3] >> 16)         \
568        ^ v[3]                 \
569        ^ (v[4] << 16)         \
570        ^ (v[5] >> 16)         \
571        ^ v[6]                 \
572        ^ (v[6] >> 16)         \
573        ^ (v[7] & 0x0000ffff)  \
574        ^ (v[7] << 16)         \
575        ^ (v[7] >> 16);        \
576   h[3] = (v[0] << 16)         \
577        ^ (v[0] >> 16)         \
578        ^ (v[0] & 0xffff0000)  \
579        ^ (v[1] & 0xffff0000)  \
580        ^ (v[1] >> 16)         \
581        ^ (v[2] << 16)         \
582        ^ (v[2] >> 16)         \
583        ^ v[2]                 \
584        ^ (v[3] << 16)         \
585        ^ (v[4] >> 16)         \
586        ^ v[4]                 \
587        ^ (v[5] << 16)         \
588        ^ (v[6] << 16)         \
589        ^ (v[7] & 0x0000ffff)  \
590        ^ (v[7] >> 16);        \
591   h[4] = (v[0] >> 16)         \
592        ^ (v[1] << 16)         \
593        ^ v[1]                 \
594        ^ (v[2] >> 16)         \
595        ^ v[2]                 \
596        ^ (v[3] << 16)         \
597        ^ (v[3] >> 16)         \
598        ^ v[3]                 \
599        ^ (v[4] << 16)         \
600        ^ (v[5] >> 16)         \
601        ^ v[5]                 \
602        ^ (v[6] << 16)         \
603        ^ (v[6] >> 16)         \
604        ^ (v[7] << 16);        \
605   h[5] = (v[0] << 16)         \
606        ^ (v[0] & 0xffff0000)  \
607        ^ (v[1] << 16)         \
608        ^ (v[1] >> 16)         \
609        ^ (v[1] & 0xffff0000)  \
610        ^ (v[2] << 16)         \
611        ^ v[2]                 \
612        ^ (v[3] >> 16)         \
613        ^ v[3]                 \
614        ^ (v[4] << 16)         \
615        ^ (v[4] >> 16)         \
616        ^ v[4]                 \
617        ^ (v[5] << 16)         \
618        ^ (v[6] << 16)         \
619        ^ (v[6] >> 16)         \
620        ^ v[6]                 \
621        ^ (v[7] << 16)         \
622        ^ (v[7] >> 16)         \
623        ^ (v[7] & 0xffff0000); \
624   h[6] = v[0]                 \
625        ^ v[2]                 \
626        ^ (v[2] >> 16)         \
627        ^ v[3]                 \
628        ^ (v[3] << 16)         \
629        ^ v[4]                 \
630        ^ (v[4] >> 16)         \
631        ^ (v[5] << 16)         \
632        ^ (v[5] >> 16)         \
633        ^ v[5]                 \
634        ^ (v[6] << 16)         \
635        ^ (v[6] >> 16)         \
636        ^ v[6]                 \
637        ^ (v[7] << 16)         \
638        ^ v[7];                \
639   h[7] = v[0]                 \
640        ^ (v[0] >> 16)         \
641        ^ (v[1] << 16)         \
642        ^ (v[1] >> 16)         \
643        ^ (v[2] << 16)         \
644        ^ (v[3] >> 16)         \
645        ^ v[3]                 \
646        ^ (v[4] << 16)         \
647        ^ v[4]                 \
648        ^ (v[5] >> 16)         \
649        ^ v[5]                 \
650        ^ (v[6] << 16)         \
651        ^ (v[6] >> 16)         \
652        ^ (v[7] << 16)         \
653        ^ v[7];
654
655 #define PASS0(h,s,u,v,t)  \
656 {                         \
657   u32 k[8];             \
658   u32 w[8];             \
659   X (w, u, v);            \
660   P (k, w);               \
661   R (k, h, s, 0, t);      \
662   A (u);                  \
663   AA (v);                 \
664 }
665
666 #define PASS2(h,s,u,v,t)  \
667 {                         \
668   u32 k[8];             \
669   u32 w[8];             \
670   X (w, u, v);            \
671   P (k, w);               \
672   R (k, h, s, 2, t);      \
673   A (u);                  \
674   C (u);                  \
675   AA (v);                 \
676 }
677
678 #define PASS4(h,s,u,v,t)  \
679 {                         \
680   u32 k[8];             \
681   u32 w[8];             \
682   X (w, u, v);            \
683   P (k, w);               \
684   R (k, h, s, 4, t);      \
685   A (u);                  \
686   AA (v);                 \
687 }
688
689 #define PASS6(h,s,u,v,t)  \
690 {                         \
691   u32 k[8];             \
692   u32 w[8];             \
693   X (w, u, v);            \
694   P (k, w);               \
695   R (k, h, s, 6, t);      \
696 }
697
698 __kernel void m06900_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
699 {
700   /**
701    * base
702    */
703
704   const u32 gid = get_global_id (0);
705   const u32 lid = get_local_id (0);
706   const u32 lsz = get_local_size (0);
707
708   /**
709    * sbox
710    */
711
712   __local u32 s_tables[4][256];
713
714   for (u32 i = lid; i < 256; i += lsz)
715   {
716     s_tables[0][i] = c_tables[0][i];
717     s_tables[1][i] = c_tables[1][i];
718     s_tables[2][i] = c_tables[2][i];
719     s_tables[3][i] = c_tables[3][i];
720   }
721
722   barrier (CLK_LOCAL_MEM_FENCE);
723
724   if (gid >= gid_max) return;
725
726   /**
727    * base
728    */
729
730   u32 wordl0[4];
731
732   wordl0[0] = pws[gid].i[ 0];
733   wordl0[1] = pws[gid].i[ 1];
734   wordl0[2] = pws[gid].i[ 2];
735   wordl0[3] = pws[gid].i[ 3];
736
737   u32 wordl1[4];
738
739   wordl1[0] = pws[gid].i[ 4];
740   wordl1[1] = pws[gid].i[ 5];
741   wordl1[2] = pws[gid].i[ 6];
742   wordl1[3] = pws[gid].i[ 7];
743
744   u32 wordl2[4];
745
746   wordl2[0] = 0;
747   wordl2[1] = 0;
748   wordl2[2] = 0;
749   wordl2[3] = 0;
750
751   u32 wordl3[4];
752
753   wordl3[0] = 0;
754   wordl3[1] = 0;
755   wordl3[2] = 0;
756   wordl3[3] = 0;
757
758   const u32 pw_l_len = pws[gid].pw_len;
759
760   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
761   {
762     switch_buffer_by_offset_le (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
763   }
764
765   /**
766    * loop
767    */
768
769   for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
770   {
771     const u32 pw_r_len = combs_buf[il_pos].pw_len;
772
773     const u32 pw_len = pw_l_len + pw_r_len;
774
775     u32 wordr0[4];
776
777     wordr0[0] = combs_buf[il_pos].i[0];
778     wordr0[1] = combs_buf[il_pos].i[1];
779     wordr0[2] = combs_buf[il_pos].i[2];
780     wordr0[3] = combs_buf[il_pos].i[3];
781
782     u32 wordr1[4];
783
784     wordr1[0] = combs_buf[il_pos].i[4];
785     wordr1[1] = combs_buf[il_pos].i[5];
786     wordr1[2] = combs_buf[il_pos].i[6];
787     wordr1[3] = combs_buf[il_pos].i[7];
788
789     u32 wordr2[4];
790
791     wordr2[0] = 0;
792     wordr2[1] = 0;
793     wordr2[2] = 0;
794     wordr2[3] = 0;
795
796     u32 wordr3[4];
797
798     wordr3[0] = 0;
799     wordr3[1] = 0;
800     wordr3[2] = 0;
801     wordr3[3] = 0;
802
803     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
804     {
805       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
806     }
807
808     u32 w0[4];
809
810     w0[0] = wordl0[0] | wordr0[0];
811     w0[1] = wordl0[1] | wordr0[1];
812     w0[2] = wordl0[2] | wordr0[2];
813     w0[3] = wordl0[3] | wordr0[3];
814
815     u32 w1[4];
816
817     w1[0] = wordl1[0] | wordr1[0];
818     w1[1] = wordl1[1] | wordr1[1];
819     w1[2] = wordl1[2] | wordr1[2];
820     w1[3] = wordl1[3] | wordr1[3];
821
822     u32 w2[4];
823
824     w2[0] = wordl2[0] | wordr2[0];
825     w2[1] = wordl2[1] | wordr2[1];
826     w2[2] = wordl2[2] | wordr2[2];
827     w2[3] = wordl2[3] | wordr2[3];
828
829     u32 w3[4];
830
831     w3[0] = wordl3[0] | wordr3[0];
832     w3[1] = wordl3[1] | wordr3[1];
833     w3[2] = pw_len * 8;
834     w3[3] = 0;
835
836     const u32 w14 = pw_len * 8;
837
838     u32 data[8];
839
840     data[0] = w0[0];
841     data[1] = w0[1];
842     data[2] = w0[2];
843     data[3] = w0[3];
844     data[4] = w1[0];
845     data[5] = w1[1];
846     data[6] = w1[2];
847     data[7] = w1[3];
848
849     u32 state[16];
850
851     state[ 0] = 0;
852     state[ 1] = 0;
853     state[ 2] = 0;
854     state[ 3] = 0;
855     state[ 4] = 0;
856     state[ 5] = 0;
857     state[ 6] = 0;
858     state[ 7] = 0;
859     state[ 8] = data[0];
860     state[ 9] = data[1];
861     state[10] = data[2];
862     state[11] = data[3];
863     state[12] = data[4];
864     state[13] = data[5];
865     state[14] = data[6];
866     state[15] = data[7];
867
868     u32 state_m[8];
869     u32 data_m[8];
870
871     /* gost1 */
872
873     state_m[0] = state[0];
874     state_m[1] = state[1];
875     state_m[2] = state[2];
876     state_m[3] = state[3];
877     state_m[4] = state[4];
878     state_m[5] = state[5];
879     state_m[6] = state[6];
880     state_m[7] = state[7];
881
882     data_m[0] = data[0];
883     data_m[1] = data[1];
884     data_m[2] = data[2];
885     data_m[3] = data[3];
886     data_m[4] = data[4];
887     data_m[5] = data[5];
888     data_m[6] = data[6];
889     data_m[7] = data[7];
890
891     u32 tmp[8];
892
893     if (pw_len > 0)
894     {
895       PASS0 (state, tmp, state_m, data_m, s_tables);
896       PASS2 (state, tmp, state_m, data_m, s_tables);
897       PASS4 (state, tmp, state_m, data_m, s_tables);
898       PASS6 (state, tmp, state_m, data_m, s_tables);
899
900       SHIFT12 (state_m, data, tmp);
901       SHIFT16 (state, data_m, state_m);
902       SHIFT61 (state, data_m);
903     }
904
905     data[0] = w14;
906     data[1] = 0;
907     data[2] = 0;
908     data[3] = 0;
909     data[4] = 0;
910     data[5] = 0;
911     data[6] = 0;
912     data[7] = 0;
913
914     /* gost2 */
915
916     state_m[0] = state[0];
917     state_m[1] = state[1];
918     state_m[2] = state[2];
919     state_m[3] = state[3];
920     state_m[4] = state[4];
921     state_m[5] = state[5];
922     state_m[6] = state[6];
923     state_m[7] = state[7];
924
925     data_m[0] = data[0];
926     data_m[1] = data[1];
927     data_m[2] = data[2];
928     data_m[3] = data[3];
929     data_m[4] = data[4];
930     data_m[5] = data[5];
931     data_m[6] = data[6];
932     data_m[7] = data[7];
933
934     PASS0 (state, tmp, state_m, data_m, s_tables);
935     PASS2 (state, tmp, state_m, data_m, s_tables);
936     PASS4 (state, tmp, state_m, data_m, s_tables);
937     PASS6 (state, tmp, state_m, data_m, s_tables);
938
939     SHIFT12 (state_m, data, tmp);
940     SHIFT16 (state, data_m, state_m);
941     SHIFT61 (state, data_m);
942
943     /* gost3 */
944
945     data[0] = state[ 8];
946     data[1] = state[ 9];
947     data[2] = state[10];
948     data[3] = state[11];
949     data[4] = state[12];
950     data[5] = state[13];
951     data[6] = state[14];
952     data[7] = state[15];
953
954     state_m[0] = state[0];
955     state_m[1] = state[1];
956     state_m[2] = state[2];
957     state_m[3] = state[3];
958     state_m[4] = state[4];
959     state_m[5] = state[5];
960     state_m[6] = state[6];
961     state_m[7] = state[7];
962
963     data_m[0] = data[0];
964     data_m[1] = data[1];
965     data_m[2] = data[2];
966     data_m[3] = data[3];
967     data_m[4] = data[4];
968     data_m[5] = data[5];
969     data_m[6] = data[6];
970     data_m[7] = data[7];
971
972     PASS0 (state, tmp, state_m, data_m, s_tables);
973     PASS2 (state, tmp, state_m, data_m, s_tables);
974     PASS4 (state, tmp, state_m, data_m, s_tables);
975     PASS6 (state, tmp, state_m, data_m, s_tables);
976
977     SHIFT12 (state_m, data, tmp);
978     SHIFT16 (state, data_m, state_m);
979     SHIFT61 (state, data_m);
980
981     /* store */
982
983     const u32 r0 = state[0];
984     const u32 r1 = state[1];
985     const u32 r2 = state[2];
986     const u32 r3 = state[3];
987
988     #include COMPARE_M
989   }
990 }
991
992 __kernel void m06900_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
993 {
994 }
995
996 __kernel void m06900_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
997 {
998 }
999
1000 __kernel void m06900_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1001 {
1002   /**
1003    * base
1004    */
1005
1006   const u32 gid = get_global_id (0);
1007   const u32 lid = get_local_id (0);
1008   const u32 lsz = get_local_size (0);
1009
1010   /**
1011    * sbox
1012    */
1013
1014   __local u32 s_tables[4][256];
1015
1016   for (u32 i = lid; i < 256; i += lsz)
1017   {
1018     s_tables[0][i] = c_tables[0][i];
1019     s_tables[1][i] = c_tables[1][i];
1020     s_tables[2][i] = c_tables[2][i];
1021     s_tables[3][i] = c_tables[3][i];
1022   }
1023
1024   barrier (CLK_LOCAL_MEM_FENCE);
1025
1026   if (gid >= gid_max) return;
1027
1028   /**
1029    * base
1030    */
1031
1032   u32 wordl0[4];
1033
1034   wordl0[0] = pws[gid].i[ 0];
1035   wordl0[1] = pws[gid].i[ 1];
1036   wordl0[2] = pws[gid].i[ 2];
1037   wordl0[3] = pws[gid].i[ 3];
1038
1039   u32 wordl1[4];
1040
1041   wordl1[0] = pws[gid].i[ 4];
1042   wordl1[1] = pws[gid].i[ 5];
1043   wordl1[2] = pws[gid].i[ 6];
1044   wordl1[3] = pws[gid].i[ 7];
1045
1046   u32 wordl2[4];
1047
1048   wordl2[0] = 0;
1049   wordl2[1] = 0;
1050   wordl2[2] = 0;
1051   wordl2[3] = 0;
1052
1053   u32 wordl3[4];
1054
1055   wordl3[0] = 0;
1056   wordl3[1] = 0;
1057   wordl3[2] = 0;
1058   wordl3[3] = 0;
1059
1060   const u32 pw_l_len = pws[gid].pw_len;
1061
1062   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
1063   {
1064     switch_buffer_by_offset_le (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
1065   }
1066
1067   /**
1068    * digest
1069    */
1070
1071   const u32 search[4] =
1072   {
1073     digests_buf[digests_offset].digest_buf[DGST_R0],
1074     digests_buf[digests_offset].digest_buf[DGST_R1],
1075     digests_buf[digests_offset].digest_buf[DGST_R2],
1076     digests_buf[digests_offset].digest_buf[DGST_R3]
1077   };
1078
1079   /**
1080    * loop
1081    */
1082
1083   for (u32 il_pos = 0; il_pos < il_cnt; il_pos++)
1084   {
1085     const u32 pw_r_len = combs_buf[il_pos].pw_len;
1086
1087     const u32 pw_len = pw_l_len + pw_r_len;
1088
1089     u32 wordr0[4];
1090
1091     wordr0[0] = combs_buf[il_pos].i[0];
1092     wordr0[1] = combs_buf[il_pos].i[1];
1093     wordr0[2] = combs_buf[il_pos].i[2];
1094     wordr0[3] = combs_buf[il_pos].i[3];
1095
1096     u32 wordr1[4];
1097
1098     wordr1[0] = combs_buf[il_pos].i[4];
1099     wordr1[1] = combs_buf[il_pos].i[5];
1100     wordr1[2] = combs_buf[il_pos].i[6];
1101     wordr1[3] = combs_buf[il_pos].i[7];
1102
1103     u32 wordr2[4];
1104
1105     wordr2[0] = 0;
1106     wordr2[1] = 0;
1107     wordr2[2] = 0;
1108     wordr2[3] = 0;
1109
1110     u32 wordr3[4];
1111
1112     wordr3[0] = 0;
1113     wordr3[1] = 0;
1114     wordr3[2] = 0;
1115     wordr3[3] = 0;
1116
1117     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1118     {
1119       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1120     }
1121
1122     u32 w0[4];
1123
1124     w0[0] = wordl0[0] | wordr0[0];
1125     w0[1] = wordl0[1] | wordr0[1];
1126     w0[2] = wordl0[2] | wordr0[2];
1127     w0[3] = wordl0[3] | wordr0[3];
1128
1129     u32 w1[4];
1130
1131     w1[0] = wordl1[0] | wordr1[0];
1132     w1[1] = wordl1[1] | wordr1[1];
1133     w1[2] = wordl1[2] | wordr1[2];
1134     w1[3] = wordl1[3] | wordr1[3];
1135
1136     u32 w2[4];
1137
1138     w2[0] = wordl2[0] | wordr2[0];
1139     w2[1] = wordl2[1] | wordr2[1];
1140     w2[2] = wordl2[2] | wordr2[2];
1141     w2[3] = wordl2[3] | wordr2[3];
1142
1143     u32 w3[4];
1144
1145     w3[0] = wordl3[0] | wordr3[0];
1146     w3[1] = wordl3[1] | wordr3[1];
1147     w3[2] = pw_len * 8;
1148     w3[3] = 0;
1149
1150     const u32 w14 = pw_len * 8;
1151
1152     u32 data[8];
1153
1154     data[0] = w0[0];
1155     data[1] = w0[1];
1156     data[2] = w0[2];
1157     data[3] = w0[3];
1158     data[4] = w1[0];
1159     data[5] = w1[1];
1160     data[6] = w1[2];
1161     data[7] = w1[3];
1162
1163     u32 state[16];
1164
1165     state[ 0] = 0;
1166     state[ 1] = 0;
1167     state[ 2] = 0;
1168     state[ 3] = 0;
1169     state[ 4] = 0;
1170     state[ 5] = 0;
1171     state[ 6] = 0;
1172     state[ 7] = 0;
1173     state[ 8] = data[0];
1174     state[ 9] = data[1];
1175     state[10] = data[2];
1176     state[11] = data[3];
1177     state[12] = data[4];
1178     state[13] = data[5];
1179     state[14] = data[6];
1180     state[15] = data[7];
1181
1182     u32 state_m[8];
1183     u32 data_m[8];
1184
1185     /* gost1 */
1186
1187     state_m[0] = state[0];
1188     state_m[1] = state[1];
1189     state_m[2] = state[2];
1190     state_m[3] = state[3];
1191     state_m[4] = state[4];
1192     state_m[5] = state[5];
1193     state_m[6] = state[6];
1194     state_m[7] = state[7];
1195
1196     data_m[0] = data[0];
1197     data_m[1] = data[1];
1198     data_m[2] = data[2];
1199     data_m[3] = data[3];
1200     data_m[4] = data[4];
1201     data_m[5] = data[5];
1202     data_m[6] = data[6];
1203     data_m[7] = data[7];
1204
1205     u32 tmp[8];
1206
1207     if (pw_len > 0)
1208     {
1209       PASS0 (state, tmp, state_m, data_m, s_tables);
1210       PASS2 (state, tmp, state_m, data_m, s_tables);
1211       PASS4 (state, tmp, state_m, data_m, s_tables);
1212       PASS6 (state, tmp, state_m, data_m, s_tables);
1213
1214       SHIFT12 (state_m, data, tmp);
1215       SHIFT16 (state, data_m, state_m);
1216       SHIFT61 (state, data_m);
1217     }
1218
1219     data[0] = w14;
1220     data[1] = 0;
1221     data[2] = 0;
1222     data[3] = 0;
1223     data[4] = 0;
1224     data[5] = 0;
1225     data[6] = 0;
1226     data[7] = 0;
1227
1228     /* gost2 */
1229
1230     state_m[0] = state[0];
1231     state_m[1] = state[1];
1232     state_m[2] = state[2];
1233     state_m[3] = state[3];
1234     state_m[4] = state[4];
1235     state_m[5] = state[5];
1236     state_m[6] = state[6];
1237     state_m[7] = state[7];
1238
1239     data_m[0] = data[0];
1240     data_m[1] = data[1];
1241     data_m[2] = data[2];
1242     data_m[3] = data[3];
1243     data_m[4] = data[4];
1244     data_m[5] = data[5];
1245     data_m[6] = data[6];
1246     data_m[7] = data[7];
1247
1248     PASS0 (state, tmp, state_m, data_m, s_tables);
1249     PASS2 (state, tmp, state_m, data_m, s_tables);
1250     PASS4 (state, tmp, state_m, data_m, s_tables);
1251     PASS6 (state, tmp, state_m, data_m, s_tables);
1252
1253     SHIFT12 (state_m, data, tmp);
1254     SHIFT16 (state, data_m, state_m);
1255     SHIFT61 (state, data_m);
1256
1257     /* gost3 */
1258
1259     data[0] = state[ 8];
1260     data[1] = state[ 9];
1261     data[2] = state[10];
1262     data[3] = state[11];
1263     data[4] = state[12];
1264     data[5] = state[13];
1265     data[6] = state[14];
1266     data[7] = state[15];
1267
1268     state_m[0] = state[0];
1269     state_m[1] = state[1];
1270     state_m[2] = state[2];
1271     state_m[3] = state[3];
1272     state_m[4] = state[4];
1273     state_m[5] = state[5];
1274     state_m[6] = state[6];
1275     state_m[7] = state[7];
1276
1277     data_m[0] = data[0];
1278     data_m[1] = data[1];
1279     data_m[2] = data[2];
1280     data_m[3] = data[3];
1281     data_m[4] = data[4];
1282     data_m[5] = data[5];
1283     data_m[6] = data[6];
1284     data_m[7] = data[7];
1285
1286     PASS0 (state, tmp, state_m, data_m, s_tables);
1287     PASS2 (state, tmp, state_m, data_m, s_tables);
1288     PASS4 (state, tmp, state_m, data_m, s_tables);
1289     PASS6 (state, tmp, state_m, data_m, s_tables);
1290
1291     SHIFT12 (state_m, data, tmp);
1292     SHIFT16 (state, data_m, state_m);
1293     SHIFT61 (state, data_m);
1294
1295     /* store */
1296
1297     const u32 r0 = state[0];
1298     const u32 r1 = state[1];
1299     const u32 r2 = state[2];
1300     const u32 r3 = state[3];
1301
1302     #include COMPARE_S
1303   }
1304 }
1305
1306 __kernel void m06900_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1307 {
1308 }
1309
1310 __kernel void m06900_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1311 {
1312 }