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