Upgrade kernel to support dynamic local work sizes
[hashcat.git] / OpenCL / m06900_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _GOST_
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 "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19 #include "include/rp_kernel.h"
20 #include "OpenCL/rp.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 rules_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 pw_buf0[4];
731
732   pw_buf0[0] = pws[gid].i[ 0];
733   pw_buf0[1] = pws[gid].i[ 1];
734   pw_buf0[2] = pws[gid].i[ 2];
735   pw_buf0[3] = pws[gid].i[ 3];
736
737   u32 pw_buf1[4];
738
739   pw_buf1[0] = pws[gid].i[ 4];
740   pw_buf1[1] = pws[gid].i[ 5];
741   pw_buf1[2] = pws[gid].i[ 6];
742   pw_buf1[3] = pws[gid].i[ 7];
743
744   const u32 pw_len = pws[gid].pw_len;
745
746   /**
747    * loop
748    */
749
750   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
751   {
752     u32 w0[4];
753
754     w0[0] = pw_buf0[0];
755     w0[1] = pw_buf0[1];
756     w0[2] = pw_buf0[2];
757     w0[3] = pw_buf0[3];
758
759     u32 w1[4];
760
761     w1[0] = pw_buf1[0];
762     w1[1] = pw_buf1[1];
763     w1[2] = pw_buf1[2];
764     w1[3] = pw_buf1[3];
765
766     u32 w2[4];
767
768     w2[0] = 0;
769     w2[1] = 0;
770     w2[2] = 0;
771     w2[3] = 0;
772
773     u32 w3[4];
774
775     w3[0] = 0;
776     w3[1] = 0;
777     w3[2] = 0;
778     w3[3] = 0;
779
780     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
781
782     u32 w14 = out_len * 8;
783
784     u32 data[8];
785
786     data[0] = w0[0];
787     data[1] = w0[1];
788     data[2] = w0[2];
789     data[3] = w0[3];
790     data[4] = w1[0];
791     data[5] = w1[1];
792     data[6] = w1[2];
793     data[7] = w1[3];
794
795     u32 state[16];
796
797     state[ 0] = 0;
798     state[ 1] = 0;
799     state[ 2] = 0;
800     state[ 3] = 0;
801     state[ 4] = 0;
802     state[ 5] = 0;
803     state[ 6] = 0;
804     state[ 7] = 0;
805     state[ 8] = data[0];
806     state[ 9] = data[1];
807     state[10] = data[2];
808     state[11] = data[3];
809     state[12] = data[4];
810     state[13] = data[5];
811     state[14] = data[6];
812     state[15] = data[7];
813
814     u32 state_m[8];
815     u32 data_m[8];
816
817     /* gost1 */
818
819     state_m[0] = state[0];
820     state_m[1] = state[1];
821     state_m[2] = state[2];
822     state_m[3] = state[3];
823     state_m[4] = state[4];
824     state_m[5] = state[5];
825     state_m[6] = state[6];
826     state_m[7] = state[7];
827
828     data_m[0] = data[0];
829     data_m[1] = data[1];
830     data_m[2] = data[2];
831     data_m[3] = data[3];
832     data_m[4] = data[4];
833     data_m[5] = data[5];
834     data_m[6] = data[6];
835     data_m[7] = data[7];
836
837     u32 tmp[8];
838
839     if (pw_len > 0)
840     {
841       PASS0 (state, tmp, state_m, data_m, s_tables);
842       PASS2 (state, tmp, state_m, data_m, s_tables);
843       PASS4 (state, tmp, state_m, data_m, s_tables);
844       PASS6 (state, tmp, state_m, data_m, s_tables);
845
846       SHIFT12 (state_m, data, tmp);
847       SHIFT16 (state, data_m, state_m);
848       SHIFT61 (state, data_m);
849     }
850
851     data[0] = w14;
852     data[1] = 0;
853     data[2] = 0;
854     data[3] = 0;
855     data[4] = 0;
856     data[5] = 0;
857     data[6] = 0;
858     data[7] = 0;
859
860     /* gost2 */
861
862     state_m[0] = state[0];
863     state_m[1] = state[1];
864     state_m[2] = state[2];
865     state_m[3] = state[3];
866     state_m[4] = state[4];
867     state_m[5] = state[5];
868     state_m[6] = state[6];
869     state_m[7] = state[7];
870
871     data_m[0] = data[0];
872     data_m[1] = data[1];
873     data_m[2] = data[2];
874     data_m[3] = data[3];
875     data_m[4] = data[4];
876     data_m[5] = data[5];
877     data_m[6] = data[6];
878     data_m[7] = data[7];
879
880     PASS0 (state, tmp, state_m, data_m, s_tables);
881     PASS2 (state, tmp, state_m, data_m, s_tables);
882     PASS4 (state, tmp, state_m, data_m, s_tables);
883     PASS6 (state, tmp, state_m, data_m, s_tables);
884
885     SHIFT12 (state_m, data, tmp);
886     SHIFT16 (state, data_m, state_m);
887     SHIFT61 (state, data_m);
888
889     /* gost3 */
890
891     data[0] = state[ 8];
892     data[1] = state[ 9];
893     data[2] = state[10];
894     data[3] = state[11];
895     data[4] = state[12];
896     data[5] = state[13];
897     data[6] = state[14];
898     data[7] = state[15];
899
900     state_m[0] = state[0];
901     state_m[1] = state[1];
902     state_m[2] = state[2];
903     state_m[3] = state[3];
904     state_m[4] = state[4];
905     state_m[5] = state[5];
906     state_m[6] = state[6];
907     state_m[7] = state[7];
908
909     data_m[0] = data[0];
910     data_m[1] = data[1];
911     data_m[2] = data[2];
912     data_m[3] = data[3];
913     data_m[4] = data[4];
914     data_m[5] = data[5];
915     data_m[6] = data[6];
916     data_m[7] = data[7];
917
918     PASS0 (state, tmp, state_m, data_m, s_tables);
919     PASS2 (state, tmp, state_m, data_m, s_tables);
920     PASS4 (state, tmp, state_m, data_m, s_tables);
921     PASS6 (state, tmp, state_m, data_m, s_tables);
922
923     SHIFT12 (state_m, data, tmp);
924     SHIFT16 (state, data_m, state_m);
925     SHIFT61 (state, data_m);
926
927     /* store */
928
929     const u32 r0 = state[0];
930     const u32 r1 = state[1];
931     const u32 r2 = state[2];
932     const u32 r3 = state[3];
933
934     #include COMPARE_M
935   }
936 }
937
938 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
939 {
940 }
941
942 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
943 {
944 }
945
946 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
947 {
948   /**
949    * base
950    */
951
952   const u32 gid = get_global_id (0);
953   const u32 lid = get_local_id (0);
954   const u32 lsz = get_local_size (0);
955
956   /**
957    * sbox
958    */
959
960   __local u32 s_tables[4][256];
961
962   for (u32 i = lid; i < 256; i += lsz)
963   {
964     s_tables[0][i] = c_tables[0][i];
965     s_tables[1][i] = c_tables[1][i];
966     s_tables[2][i] = c_tables[2][i];
967     s_tables[3][i] = c_tables[3][i];
968   }
969
970   barrier (CLK_LOCAL_MEM_FENCE);
971
972   if (gid >= gid_max) return;
973
974   /**
975    * base
976    */
977
978   u32 pw_buf0[4];
979
980   pw_buf0[0] = pws[gid].i[ 0];
981   pw_buf0[1] = pws[gid].i[ 1];
982   pw_buf0[2] = pws[gid].i[ 2];
983   pw_buf0[3] = pws[gid].i[ 3];
984
985   u32 pw_buf1[4];
986
987   pw_buf1[0] = pws[gid].i[ 4];
988   pw_buf1[1] = pws[gid].i[ 5];
989   pw_buf1[2] = pws[gid].i[ 6];
990   pw_buf1[3] = pws[gid].i[ 7];
991
992   const u32 pw_len = pws[gid].pw_len;
993
994   /**
995    * digest
996    */
997
998   const u32 search[4] =
999   {
1000     digests_buf[digests_offset].digest_buf[DGST_R0],
1001     digests_buf[digests_offset].digest_buf[DGST_R1],
1002     digests_buf[digests_offset].digest_buf[DGST_R2],
1003     digests_buf[digests_offset].digest_buf[DGST_R3]
1004   };
1005
1006   /**
1007    * loop
1008    */
1009
1010   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
1011   {
1012     u32 w0[4];
1013
1014     w0[0] = pw_buf0[0];
1015     w0[1] = pw_buf0[1];
1016     w0[2] = pw_buf0[2];
1017     w0[3] = pw_buf0[3];
1018
1019     u32 w1[4];
1020
1021     w1[0] = pw_buf1[0];
1022     w1[1] = pw_buf1[1];
1023     w1[2] = pw_buf1[2];
1024     w1[3] = pw_buf1[3];
1025
1026     u32 w2[4];
1027
1028     w2[0] = 0;
1029     w2[1] = 0;
1030     w2[2] = 0;
1031     w2[3] = 0;
1032
1033     u32 w3[4];
1034
1035     w3[0] = 0;
1036     w3[1] = 0;
1037     w3[2] = 0;
1038     w3[3] = 0;
1039
1040     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
1041
1042     u32 w14 = out_len * 8;
1043
1044     u32 data[8];
1045
1046     data[0] = w0[0];
1047     data[1] = w0[1];
1048     data[2] = w0[2];
1049     data[3] = w0[3];
1050     data[4] = w1[0];
1051     data[5] = w1[1];
1052     data[6] = w1[2];
1053     data[7] = w1[3];
1054
1055     u32 state[16];
1056
1057     state[ 0] = 0;
1058     state[ 1] = 0;
1059     state[ 2] = 0;
1060     state[ 3] = 0;
1061     state[ 4] = 0;
1062     state[ 5] = 0;
1063     state[ 6] = 0;
1064     state[ 7] = 0;
1065     state[ 8] = data[0];
1066     state[ 9] = data[1];
1067     state[10] = data[2];
1068     state[11] = data[3];
1069     state[12] = data[4];
1070     state[13] = data[5];
1071     state[14] = data[6];
1072     state[15] = data[7];
1073
1074     u32 state_m[8];
1075     u32 data_m[8];
1076
1077     /* gost1 */
1078
1079     state_m[0] = state[0];
1080     state_m[1] = state[1];
1081     state_m[2] = state[2];
1082     state_m[3] = state[3];
1083     state_m[4] = state[4];
1084     state_m[5] = state[5];
1085     state_m[6] = state[6];
1086     state_m[7] = state[7];
1087
1088     data_m[0] = data[0];
1089     data_m[1] = data[1];
1090     data_m[2] = data[2];
1091     data_m[3] = data[3];
1092     data_m[4] = data[4];
1093     data_m[5] = data[5];
1094     data_m[6] = data[6];
1095     data_m[7] = data[7];
1096
1097     u32 tmp[8];
1098
1099     if (pw_len > 0)
1100     {
1101       PASS0 (state, tmp, state_m, data_m, s_tables);
1102       PASS2 (state, tmp, state_m, data_m, s_tables);
1103       PASS4 (state, tmp, state_m, data_m, s_tables);
1104       PASS6 (state, tmp, state_m, data_m, s_tables);
1105
1106       SHIFT12 (state_m, data, tmp);
1107       SHIFT16 (state, data_m, state_m);
1108       SHIFT61 (state, data_m);
1109     }
1110
1111     data[0] = w14;
1112     data[1] = 0;
1113     data[2] = 0;
1114     data[3] = 0;
1115     data[4] = 0;
1116     data[5] = 0;
1117     data[6] = 0;
1118     data[7] = 0;
1119
1120     /* gost2 */
1121
1122     state_m[0] = state[0];
1123     state_m[1] = state[1];
1124     state_m[2] = state[2];
1125     state_m[3] = state[3];
1126     state_m[4] = state[4];
1127     state_m[5] = state[5];
1128     state_m[6] = state[6];
1129     state_m[7] = state[7];
1130
1131     data_m[0] = data[0];
1132     data_m[1] = data[1];
1133     data_m[2] = data[2];
1134     data_m[3] = data[3];
1135     data_m[4] = data[4];
1136     data_m[5] = data[5];
1137     data_m[6] = data[6];
1138     data_m[7] = data[7];
1139
1140     PASS0 (state, tmp, state_m, data_m, s_tables);
1141     PASS2 (state, tmp, state_m, data_m, s_tables);
1142     PASS4 (state, tmp, state_m, data_m, s_tables);
1143     PASS6 (state, tmp, state_m, data_m, s_tables);
1144
1145     SHIFT12 (state_m, data, tmp);
1146     SHIFT16 (state, data_m, state_m);
1147     SHIFT61 (state, data_m);
1148
1149     /* gost3 */
1150
1151     data[0] = state[ 8];
1152     data[1] = state[ 9];
1153     data[2] = state[10];
1154     data[3] = state[11];
1155     data[4] = state[12];
1156     data[5] = state[13];
1157     data[6] = state[14];
1158     data[7] = state[15];
1159
1160     state_m[0] = state[0];
1161     state_m[1] = state[1];
1162     state_m[2] = state[2];
1163     state_m[3] = state[3];
1164     state_m[4] = state[4];
1165     state_m[5] = state[5];
1166     state_m[6] = state[6];
1167     state_m[7] = state[7];
1168
1169     data_m[0] = data[0];
1170     data_m[1] = data[1];
1171     data_m[2] = data[2];
1172     data_m[3] = data[3];
1173     data_m[4] = data[4];
1174     data_m[5] = data[5];
1175     data_m[6] = data[6];
1176     data_m[7] = data[7];
1177
1178     PASS0 (state, tmp, state_m, data_m, s_tables);
1179     PASS2 (state, tmp, state_m, data_m, s_tables);
1180     PASS4 (state, tmp, state_m, data_m, s_tables);
1181     PASS6 (state, tmp, state_m, data_m, s_tables);
1182
1183     SHIFT12 (state_m, data, tmp);
1184     SHIFT16 (state, data_m, state_m);
1185     SHIFT61 (state, data_m);
1186
1187     /* store */
1188
1189     const u32 r0 = state[0];
1190     const u32 r1 = state[1];
1191     const u32 r2 = state[2];
1192     const u32 r3 = state[3];
1193
1194     #include COMPARE_S
1195   }
1196 }
1197
1198 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1199 {
1200 }
1201
1202 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1203 {
1204 }