- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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 #ifdef VECT_SIZE1
294 #define BOX(i,n,S) (u32x) ((S)[(n)][(i)])
295 #endif
296
297 #ifdef VECT_SIZE2
298 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
299 #endif
300
301 #define round(k1,k2,tbl)                  \
302 {                                         \
303   u32 t;                                \
304   t = (k1) + r;                           \
305   l ^= BOX (amd_bfe (t,  0, 8), 0, tbl) ^ \
306        BOX (amd_bfe (t,  8, 8), 1, tbl) ^ \
307        BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \
308        BOX (amd_bfe (t, 24, 8), 3, tbl);  \
309   t = (k2) + l;                           \
310   r ^= BOX (amd_bfe (t,  0, 8), 0, tbl) ^ \
311        BOX (amd_bfe (t,  8, 8), 1, tbl) ^ \
312        BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \
313        BOX (amd_bfe (t, 24, 8), 3, tbl);  \
314 }
315
316 #define R(k,h,s,i,t)      \
317 {                         \
318   u32 r;                \
319   u32 l;                \
320   r = h[i + 0];           \
321   l = h[i + 1];           \
322   round (k[0], k[1], t);  \
323   round (k[2], k[3], t);  \
324   round (k[4], k[5], t);  \
325   round (k[6], k[7], t);  \
326   round (k[0], k[1], t);  \
327   round (k[2], k[3], t);  \
328   round (k[4], k[5], t);  \
329   round (k[6], k[7], t);  \
330   round (k[0], k[1], t);  \
331   round (k[2], k[3], t);  \
332   round (k[4], k[5], t);  \
333   round (k[6], k[7], t);  \
334   round (k[7], k[6], t);  \
335   round (k[5], k[4], t);  \
336   round (k[3], k[2], t);  \
337   round (k[1], k[0], t);  \
338   s[i + 0] = l;           \
339   s[i + 1] = r;           \
340 }
341
342 #define X(w,u,v)      \
343   w[0] = u[0] ^ v[0]; \
344   w[1] = u[1] ^ v[1]; \
345   w[2] = u[2] ^ v[2]; \
346   w[3] = u[3] ^ v[3]; \
347   w[4] = u[4] ^ v[4]; \
348   w[5] = u[5] ^ v[5]; \
349   w[6] = u[6] ^ v[6]; \
350   w[7] = u[7] ^ v[7];
351
352 #define P(k,w)                        \
353   k[0] = ((w[0] & 0x000000ff) <<  0)  \
354        | ((w[2] & 0x000000ff) <<  8)  \
355        | ((w[4] & 0x000000ff) << 16)  \
356        | ((w[6] & 0x000000ff) << 24); \
357   k[1] = ((w[0] & 0x0000ff00) >>  8)  \
358        | ((w[2] & 0x0000ff00) >>  0)  \
359        | ((w[4] & 0x0000ff00) <<  8)  \
360        | ((w[6] & 0x0000ff00) << 16); \
361   k[2] = ((w[0] & 0x00ff0000) >> 16)  \
362        | ((w[2] & 0x00ff0000) >>  8)  \
363        | ((w[4] & 0x00ff0000) <<  0)  \
364        | ((w[6] & 0x00ff0000) <<  8); \
365   k[3] = ((w[0] & 0xff000000) >> 24)  \
366        | ((w[2] & 0xff000000) >> 16)  \
367        | ((w[4] & 0xff000000) >>  8)  \
368        | ((w[6] & 0xff000000) >>  0); \
369   k[4] = ((w[1] & 0x000000ff) <<  0)  \
370        | ((w[3] & 0x000000ff) <<  8)  \
371        | ((w[5] & 0x000000ff) << 16)  \
372        | ((w[7] & 0x000000ff) << 24); \
373   k[5] = ((w[1] & 0x0000ff00) >>  8)  \
374        | ((w[3] & 0x0000ff00) >>  0)  \
375        | ((w[5] & 0x0000ff00) <<  8)  \
376        | ((w[7] & 0x0000ff00) << 16); \
377   k[6] = ((w[1] & 0x00ff0000) >> 16)  \
378        | ((w[3] & 0x00ff0000) >>  8)  \
379        | ((w[5] & 0x00ff0000) <<  0)  \
380        | ((w[7] & 0x00ff0000) <<  8); \
381   k[7] = ((w[1] & 0xff000000) >> 24)  \
382        | ((w[3] & 0xff000000) >> 16)  \
383        | ((w[5] & 0xff000000) >>  8)  \
384        | ((w[7] & 0xff000000) >>  0);
385
386 #define A(x)        \
387 {                   \
388   u32 l;          \
389   u32 r;          \
390   l = x[0] ^ x[2];  \
391   r = x[1] ^ x[3];  \
392   x[0] = x[2];      \
393   x[1] = x[3];      \
394   x[2] = x[4];      \
395   x[3] = x[5];      \
396   x[4] = x[6];      \
397   x[5] = x[7];      \
398   x[6] = l;         \
399   x[7] = r;         \
400 }
401
402 #define AA(x)       \
403 {                   \
404   u32 l;          \
405   u32 r;          \
406   l    = x[0];      \
407   r    = x[2];      \
408   x[0] = x[4];      \
409   x[2] = x[6];      \
410   x[4] = l ^ r;     \
411   x[6] = x[0] ^ r;  \
412   l    = x[1];      \
413   r    = x[3];      \
414   x[1] = x[5];      \
415   x[3] = x[7];      \
416   x[5] = l ^ r;     \
417   x[7] = x[1] ^ r;  \
418 }
419
420 #define C(x)          \
421   x[0] ^= 0xff00ff00; \
422   x[1] ^= 0xff00ff00; \
423   x[2] ^= 0x00ff00ff; \
424   x[3] ^= 0x00ff00ff; \
425   x[4] ^= 0x00ffff00; \
426   x[5] ^= 0xff0000ff; \
427   x[6] ^= 0x000000ff; \
428   x[7] ^= 0xff00ffff;
429
430 #define SHIFT12(u,m,s)              \
431   u[0] = m[0] ^ s[6];               \
432   u[1] = m[1] ^ s[7];               \
433   u[2] = m[2] ^ (s[0] << 16)        \
434               ^ (s[0] >> 16)        \
435               ^ (s[0] & 0x0000ffff) \
436               ^ (s[1] & 0x0000ffff) \
437               ^ (s[1] >> 16)        \
438               ^ (s[2] << 16)        \
439               ^ s[6]                \
440               ^ (s[6] << 16)        \
441               ^ (s[7] & 0xffff0000) \
442               ^ (s[7] >> 16);       \
443   u[3] = m[3] ^ (s[0] & 0x0000ffff) \
444               ^ (s[0] << 16)        \
445               ^ (s[1] & 0x0000ffff) \
446               ^ (s[1] << 16)        \
447               ^ (s[1] >> 16)        \
448               ^ (s[2] << 16)        \
449               ^ (s[2] >> 16)        \
450               ^ (s[3] << 16)        \
451               ^ s[6]                \
452               ^ (s[6] << 16)        \
453               ^ (s[6] >> 16)        \
454               ^ (s[7] & 0x0000ffff) \
455               ^ (s[7] << 16)        \
456               ^ (s[7] >> 16);       \
457   u[4] = m[4] ^ (s[0] & 0xffff0000) \
458               ^ (s[0] << 16)        \
459               ^ (s[0] >> 16)        \
460               ^ (s[1] & 0xffff0000) \
461               ^ (s[1] >> 16)        \
462               ^ (s[2] << 16)        \
463               ^ (s[2] >> 16)        \
464               ^ (s[3] << 16)        \
465               ^ (s[3] >> 16)        \
466               ^ (s[4] << 16)        \
467               ^ (s[6] << 16)        \
468               ^ (s[6] >> 16)        \
469               ^ (s[7] & 0x0000ffff) \
470               ^ (s[7] << 16)        \
471               ^ (s[7] >> 16);       \
472   u[5] = m[5] ^ (s[0] << 16)        \
473               ^ (s[0] >> 16)        \
474               ^ (s[0] & 0xffff0000) \
475               ^ (s[1] & 0x0000ffff) \
476               ^ s[2]                \
477               ^ (s[2] >> 16)        \
478               ^ (s[3] << 16)        \
479               ^ (s[3] >> 16)        \
480               ^ (s[4] << 16)        \
481               ^ (s[4] >> 16)        \
482               ^ (s[5] << 16)        \
483               ^ (s[6] << 16)        \
484               ^ (s[6] >> 16)        \
485               ^ (s[7] & 0xffff0000) \
486               ^ (s[7] << 16)        \
487               ^ (s[7] >> 16);       \
488   u[6] = m[6] ^ s[0]                \
489               ^ (s[1] >> 16)        \
490               ^ (s[2] << 16)        \
491               ^ s[3]                \
492               ^ (s[3] >> 16)        \
493               ^ (s[4] << 16)        \
494               ^ (s[4] >> 16)        \
495               ^ (s[5] << 16)        \
496               ^ (s[5] >> 16)        \
497               ^ s[6]                \
498               ^ (s[6] << 16)        \
499               ^ (s[6] >> 16)        \
500               ^ (s[7] << 16);       \
501   u[7] = m[7] ^ (s[0] & 0xffff0000) \
502               ^ (s[0] << 16)        \
503               ^ (s[1] & 0x0000ffff) \
504               ^ (s[1] << 16)        \
505               ^ (s[2] >> 16)        \
506               ^ (s[3] << 16)        \
507               ^ s[4]                \
508               ^ (s[4] >> 16)        \
509               ^ (s[5] << 16)        \
510               ^ (s[5] >> 16)        \
511               ^ (s[6] >> 16)        \
512               ^ (s[7] & 0x0000ffff) \
513               ^ (s[7] << 16)        \
514               ^ (s[7] >> 16);
515
516 #define SHIFT16(h,v,u)              \
517   v[0] = h[0] ^ (u[1] << 16)        \
518               ^ (u[0] >> 16);       \
519   v[1] = h[1] ^ (u[2] << 16)        \
520               ^ (u[1] >> 16);       \
521   v[2] = h[2] ^ (u[3] << 16)        \
522               ^ (u[2] >> 16);       \
523   v[3] = h[3] ^ (u[4] << 16)        \
524               ^ (u[3] >> 16);       \
525   v[4] = h[4] ^ (u[5] << 16)        \
526               ^ (u[4] >> 16);       \
527   v[5] = h[5] ^ (u[6] << 16)        \
528               ^ (u[5] >> 16);       \
529   v[6] = h[6] ^ (u[7] << 16)        \
530               ^ (u[6] >> 16);       \
531   v[7] = h[7] ^ (u[0] & 0xffff0000) \
532               ^ (u[0] << 16)        \
533               ^ (u[7] >> 16)        \
534               ^ (u[1] & 0xffff0000) \
535               ^ (u[1] << 16)        \
536               ^ (u[6] << 16)        \
537               ^ (u[7] & 0xffff0000);
538
539 #define SHIFT61(h,v)          \
540   h[0] = (v[0] & 0xffff0000)  \
541        ^ (v[0] << 16)         \
542        ^ (v[0] >> 16)         \
543        ^ (v[1] >> 16)         \
544        ^ (v[1] & 0xffff0000)  \
545        ^ (v[2] << 16)         \
546        ^ (v[3] >> 16)         \
547        ^ (v[4] << 16)         \
548        ^ (v[5] >> 16)         \
549        ^ v[5]                 \
550        ^ (v[6] >> 16)         \
551        ^ (v[7] << 16)         \
552        ^ (v[7] >> 16)         \
553        ^ (v[7] & 0x0000ffff); \
554   h[1] = (v[0] << 16)         \
555        ^ (v[0] >> 16)         \
556        ^ (v[0] & 0xffff0000)  \
557        ^ (v[1] & 0x0000ffff)  \
558        ^ v[2]                 \
559        ^ (v[2] >> 16)         \
560        ^ (v[3] << 16)         \
561        ^ (v[4] >> 16)         \
562        ^ (v[5] << 16)         \
563        ^ (v[6] << 16)         \
564        ^ v[6]                 \
565        ^ (v[7] & 0xffff0000)  \
566        ^ (v[7] >> 16);        \
567   h[2] = (v[0] & 0x0000ffff)  \
568        ^ (v[0] << 16)         \
569        ^ (v[1] << 16)         \
570        ^ (v[1] >> 16)         \
571        ^ (v[1] & 0xffff0000)  \
572        ^ (v[2] << 16)         \
573        ^ (v[3] >> 16)         \
574        ^ v[3]                 \
575        ^ (v[4] << 16)         \
576        ^ (v[5] >> 16)         \
577        ^ v[6]                 \
578        ^ (v[6] >> 16)         \
579        ^ (v[7] & 0x0000ffff)  \
580        ^ (v[7] << 16)         \
581        ^ (v[7] >> 16);        \
582   h[3] = (v[0] << 16)         \
583        ^ (v[0] >> 16)         \
584        ^ (v[0] & 0xffff0000)  \
585        ^ (v[1] & 0xffff0000)  \
586        ^ (v[1] >> 16)         \
587        ^ (v[2] << 16)         \
588        ^ (v[2] >> 16)         \
589        ^ v[2]                 \
590        ^ (v[3] << 16)         \
591        ^ (v[4] >> 16)         \
592        ^ v[4]                 \
593        ^ (v[5] << 16)         \
594        ^ (v[6] << 16)         \
595        ^ (v[7] & 0x0000ffff)  \
596        ^ (v[7] >> 16);        \
597   h[4] = (v[0] >> 16)         \
598        ^ (v[1] << 16)         \
599        ^ v[1]                 \
600        ^ (v[2] >> 16)         \
601        ^ v[2]                 \
602        ^ (v[3] << 16)         \
603        ^ (v[3] >> 16)         \
604        ^ v[3]                 \
605        ^ (v[4] << 16)         \
606        ^ (v[5] >> 16)         \
607        ^ v[5]                 \
608        ^ (v[6] << 16)         \
609        ^ (v[6] >> 16)         \
610        ^ (v[7] << 16);        \
611   h[5] = (v[0] << 16)         \
612        ^ (v[0] & 0xffff0000)  \
613        ^ (v[1] << 16)         \
614        ^ (v[1] >> 16)         \
615        ^ (v[1] & 0xffff0000)  \
616        ^ (v[2] << 16)         \
617        ^ v[2]                 \
618        ^ (v[3] >> 16)         \
619        ^ v[3]                 \
620        ^ (v[4] << 16)         \
621        ^ (v[4] >> 16)         \
622        ^ v[4]                 \
623        ^ (v[5] << 16)         \
624        ^ (v[6] << 16)         \
625        ^ (v[6] >> 16)         \
626        ^ v[6]                 \
627        ^ (v[7] << 16)         \
628        ^ (v[7] >> 16)         \
629        ^ (v[7] & 0xffff0000); \
630   h[6] = v[0]                 \
631        ^ v[2]                 \
632        ^ (v[2] >> 16)         \
633        ^ v[3]                 \
634        ^ (v[3] << 16)         \
635        ^ v[4]                 \
636        ^ (v[4] >> 16)         \
637        ^ (v[5] << 16)         \
638        ^ (v[5] >> 16)         \
639        ^ v[5]                 \
640        ^ (v[6] << 16)         \
641        ^ (v[6] >> 16)         \
642        ^ v[6]                 \
643        ^ (v[7] << 16)         \
644        ^ v[7];                \
645   h[7] = v[0]                 \
646        ^ (v[0] >> 16)         \
647        ^ (v[1] << 16)         \
648        ^ (v[1] >> 16)         \
649        ^ (v[2] << 16)         \
650        ^ (v[3] >> 16)         \
651        ^ v[3]                 \
652        ^ (v[4] << 16)         \
653        ^ v[4]                 \
654        ^ (v[5] >> 16)         \
655        ^ v[5]                 \
656        ^ (v[6] << 16)         \
657        ^ (v[6] >> 16)         \
658        ^ (v[7] << 16)         \
659        ^ v[7];
660
661 #define PASS0(h,s,u,v,t)  \
662 {                         \
663   u32 k[8];             \
664   u32 w[8];             \
665   X (w, u, v);            \
666   P (k, w);               \
667   R (k, h, s, 0, t);      \
668   A (u);                  \
669   AA (v);                 \
670 }
671
672 #define PASS2(h,s,u,v,t)  \
673 {                         \
674   u32 k[8];             \
675   u32 w[8];             \
676   X (w, u, v);            \
677   P (k, w);               \
678   R (k, h, s, 2, t);      \
679   A (u);                  \
680   C (u);                  \
681   AA (v);                 \
682 }
683
684 #define PASS4(h,s,u,v,t)  \
685 {                         \
686   u32 k[8];             \
687   u32 w[8];             \
688   X (w, u, v);            \
689   P (k, w);               \
690   R (k, h, s, 4, t);      \
691   A (u);                  \
692   AA (v);                 \
693 }
694
695 #define PASS6(h,s,u,v,t)  \
696 {                         \
697   u32 k[8];             \
698   u32 w[8];             \
699   X (w, u, v);            \
700   P (k, w);               \
701   R (k, h, s, 6, t);      \
702 }
703
704 __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)
705 {
706   /**
707    * modifier
708    */
709
710   const u32 lid = get_local_id (0);
711
712   /**
713    * base
714    */
715
716   const u32 gid = get_global_id (0);
717
718   u32 pw_buf0[4];
719
720   pw_buf0[0] = pws[gid].i[ 0];
721   pw_buf0[1] = pws[gid].i[ 1];
722   pw_buf0[2] = pws[gid].i[ 2];
723   pw_buf0[3] = pws[gid].i[ 3];
724
725   u32 pw_buf1[4];
726
727   pw_buf1[0] = pws[gid].i[ 4];
728   pw_buf1[1] = pws[gid].i[ 5];
729   pw_buf1[2] = pws[gid].i[ 6];
730   pw_buf1[3] = pws[gid].i[ 7];
731
732   const u32 pw_len = pws[gid].pw_len;
733
734   /**
735    * sbox
736    */
737
738   __local u32 s_tables[4][256];
739
740   const u32 lid4 = lid * 4;
741
742   s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0];
743   s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1];
744   s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2];
745   s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3];
746
747   s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0];
748   s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1];
749   s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2];
750   s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3];
751
752   s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0];
753   s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1];
754   s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2];
755   s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3];
756
757   s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0];
758   s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1];
759   s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2];
760   s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3];
761
762   barrier (CLK_LOCAL_MEM_FENCE);
763
764   if (gid >= gid_max) return;
765
766   /**
767    * loop
768    */
769
770   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
771   {
772     u32 w0[4];
773
774     w0[0] = pw_buf0[0];
775     w0[1] = pw_buf0[1];
776     w0[2] = pw_buf0[2];
777     w0[3] = pw_buf0[3];
778
779     u32 w1[4];
780
781     w1[0] = pw_buf1[0];
782     w1[1] = pw_buf1[1];
783     w1[2] = pw_buf1[2];
784     w1[3] = pw_buf1[3];
785
786     u32 w2[4];
787
788     w2[0] = 0;
789     w2[1] = 0;
790     w2[2] = 0;
791     w2[3] = 0;
792
793     u32 w3[4];
794
795     w3[0] = 0;
796     w3[1] = 0;
797     w3[2] = 0;
798     w3[3] = 0;
799
800     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
801
802     u32 w14 = out_len * 8;
803
804     u32 data[8];
805
806     data[0] = w0[0];
807     data[1] = w0[1];
808     data[2] = w0[2];
809     data[3] = w0[3];
810     data[4] = w1[0];
811     data[5] = w1[1];
812     data[6] = w1[2];
813     data[7] = w1[3];
814
815     u32 state[16];
816
817     state[ 0] = 0;
818     state[ 1] = 0;
819     state[ 2] = 0;
820     state[ 3] = 0;
821     state[ 4] = 0;
822     state[ 5] = 0;
823     state[ 6] = 0;
824     state[ 7] = 0;
825     state[ 8] = data[0];
826     state[ 9] = data[1];
827     state[10] = data[2];
828     state[11] = data[3];
829     state[12] = data[4];
830     state[13] = data[5];
831     state[14] = data[6];
832     state[15] = data[7];
833
834     u32 state_m[8];
835     u32 data_m[8];
836
837     /* gost1 */
838
839     state_m[0] = state[0];
840     state_m[1] = state[1];
841     state_m[2] = state[2];
842     state_m[3] = state[3];
843     state_m[4] = state[4];
844     state_m[5] = state[5];
845     state_m[6] = state[6];
846     state_m[7] = state[7];
847
848     data_m[0] = data[0];
849     data_m[1] = data[1];
850     data_m[2] = data[2];
851     data_m[3] = data[3];
852     data_m[4] = data[4];
853     data_m[5] = data[5];
854     data_m[6] = data[6];
855     data_m[7] = data[7];
856
857     u32 tmp[8];
858
859     PASS0 (state, tmp, state_m, data_m, s_tables);
860     PASS2 (state, tmp, state_m, data_m, s_tables);
861     PASS4 (state, tmp, state_m, data_m, s_tables);
862     PASS6 (state, tmp, state_m, data_m, s_tables);
863
864     SHIFT12 (state_m, data, tmp);
865     SHIFT16 (state, data_m, state_m);
866     SHIFT61 (state, data_m);
867
868     data[0] = w14;
869     data[1] = 0;
870     data[2] = 0;
871     data[3] = 0;
872     data[4] = 0;
873     data[5] = 0;
874     data[6] = 0;
875     data[7] = 0;
876
877     /* gost2 */
878
879     state_m[0] = state[0];
880     state_m[1] = state[1];
881     state_m[2] = state[2];
882     state_m[3] = state[3];
883     state_m[4] = state[4];
884     state_m[5] = state[5];
885     state_m[6] = state[6];
886     state_m[7] = state[7];
887
888     data_m[0] = data[0];
889     data_m[1] = data[1];
890     data_m[2] = data[2];
891     data_m[3] = data[3];
892     data_m[4] = data[4];
893     data_m[5] = data[5];
894     data_m[6] = data[6];
895     data_m[7] = data[7];
896
897     PASS0 (state, tmp, state_m, data_m, s_tables);
898     PASS2 (state, tmp, state_m, data_m, s_tables);
899     PASS4 (state, tmp, state_m, data_m, s_tables);
900     PASS6 (state, tmp, state_m, data_m, s_tables);
901
902     SHIFT12 (state_m, data, tmp);
903     SHIFT16 (state, data_m, state_m);
904     SHIFT61 (state, data_m);
905
906     /* gost3 */
907
908     data[0] = state[ 8];
909     data[1] = state[ 9];
910     data[2] = state[10];
911     data[3] = state[11];
912     data[4] = state[12];
913     data[5] = state[13];
914     data[6] = state[14];
915     data[7] = state[15];
916
917     state_m[0] = state[0];
918     state_m[1] = state[1];
919     state_m[2] = state[2];
920     state_m[3] = state[3];
921     state_m[4] = state[4];
922     state_m[5] = state[5];
923     state_m[6] = state[6];
924     state_m[7] = state[7];
925
926     data_m[0] = data[0];
927     data_m[1] = data[1];
928     data_m[2] = data[2];
929     data_m[3] = data[3];
930     data_m[4] = data[4];
931     data_m[5] = data[5];
932     data_m[6] = data[6];
933     data_m[7] = data[7];
934
935     PASS0 (state, tmp, state_m, data_m, s_tables);
936     PASS2 (state, tmp, state_m, data_m, s_tables);
937     PASS4 (state, tmp, state_m, data_m, s_tables);
938     PASS6 (state, tmp, state_m, data_m, s_tables);
939
940     SHIFT12 (state_m, data, tmp);
941     SHIFT16 (state, data_m, state_m);
942     SHIFT61 (state, data_m);
943
944     /* store */
945
946     const u32 r0 = state[0];
947     const u32 r1 = state[1];
948     const u32 r2 = state[2];
949     const u32 r3 = state[3];
950
951     #include COMPARE_M
952   }
953 }
954
955 __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)
956 {
957 }
958
959 __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)
960 {
961 }
962
963 __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)
964 {
965   /**
966    * modifier
967    */
968
969   const u32 lid = get_local_id (0);
970
971   /**
972    * base
973    */
974
975   const u32 gid = get_global_id (0);
976
977   u32 pw_buf0[4];
978
979   pw_buf0[0] = pws[gid].i[ 0];
980   pw_buf0[1] = pws[gid].i[ 1];
981   pw_buf0[2] = pws[gid].i[ 2];
982   pw_buf0[3] = pws[gid].i[ 3];
983
984   u32 pw_buf1[4];
985
986   pw_buf1[0] = pws[gid].i[ 4];
987   pw_buf1[1] = pws[gid].i[ 5];
988   pw_buf1[2] = pws[gid].i[ 6];
989   pw_buf1[3] = pws[gid].i[ 7];
990
991   const u32 pw_len = pws[gid].pw_len;
992
993   /**
994    * sbox
995    */
996
997   __local u32 s_tables[4][256];
998
999   const u32 lid4 = lid * 4;
1000
1001   s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0];
1002   s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1];
1003   s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2];
1004   s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3];
1005
1006   s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0];
1007   s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1];
1008   s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2];
1009   s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3];
1010
1011   s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0];
1012   s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1];
1013   s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2];
1014   s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3];
1015
1016   s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0];
1017   s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1];
1018   s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2];
1019   s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3];
1020
1021   barrier (CLK_LOCAL_MEM_FENCE);
1022
1023   if (gid >= gid_max) return;
1024
1025   /**
1026    * digest
1027    */
1028
1029   const u32 search[4] =
1030   {
1031     digests_buf[digests_offset].digest_buf[DGST_R0],
1032     digests_buf[digests_offset].digest_buf[DGST_R1],
1033     digests_buf[digests_offset].digest_buf[DGST_R2],
1034     digests_buf[digests_offset].digest_buf[DGST_R3]
1035   };
1036
1037   /**
1038    * loop
1039    */
1040
1041   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
1042   {
1043     u32 w0[4];
1044
1045     w0[0] = pw_buf0[0];
1046     w0[1] = pw_buf0[1];
1047     w0[2] = pw_buf0[2];
1048     w0[3] = pw_buf0[3];
1049
1050     u32 w1[4];
1051
1052     w1[0] = pw_buf1[0];
1053     w1[1] = pw_buf1[1];
1054     w1[2] = pw_buf1[2];
1055     w1[3] = pw_buf1[3];
1056
1057     u32 w2[4];
1058
1059     w2[0] = 0;
1060     w2[1] = 0;
1061     w2[2] = 0;
1062     w2[3] = 0;
1063
1064     u32 w3[4];
1065
1066     w3[0] = 0;
1067     w3[1] = 0;
1068     w3[2] = 0;
1069     w3[3] = 0;
1070
1071     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
1072
1073     u32 w14 = out_len * 8;
1074
1075     u32 data[8];
1076
1077     data[0] = w0[0];
1078     data[1] = w0[1];
1079     data[2] = w0[2];
1080     data[3] = w0[3];
1081     data[4] = w1[0];
1082     data[5] = w1[1];
1083     data[6] = w1[2];
1084     data[7] = w1[3];
1085
1086     u32 state[16];
1087
1088     state[ 0] = 0;
1089     state[ 1] = 0;
1090     state[ 2] = 0;
1091     state[ 3] = 0;
1092     state[ 4] = 0;
1093     state[ 5] = 0;
1094     state[ 6] = 0;
1095     state[ 7] = 0;
1096     state[ 8] = data[0];
1097     state[ 9] = data[1];
1098     state[10] = data[2];
1099     state[11] = data[3];
1100     state[12] = data[4];
1101     state[13] = data[5];
1102     state[14] = data[6];
1103     state[15] = data[7];
1104
1105     u32 state_m[8];
1106     u32 data_m[8];
1107
1108     /* gost1 */
1109
1110     state_m[0] = state[0];
1111     state_m[1] = state[1];
1112     state_m[2] = state[2];
1113     state_m[3] = state[3];
1114     state_m[4] = state[4];
1115     state_m[5] = state[5];
1116     state_m[6] = state[6];
1117     state_m[7] = state[7];
1118
1119     data_m[0] = data[0];
1120     data_m[1] = data[1];
1121     data_m[2] = data[2];
1122     data_m[3] = data[3];
1123     data_m[4] = data[4];
1124     data_m[5] = data[5];
1125     data_m[6] = data[6];
1126     data_m[7] = data[7];
1127
1128     u32 tmp[8];
1129
1130     PASS0 (state, tmp, state_m, data_m, s_tables);
1131     PASS2 (state, tmp, state_m, data_m, s_tables);
1132     PASS4 (state, tmp, state_m, data_m, s_tables);
1133     PASS6 (state, tmp, state_m, data_m, s_tables);
1134
1135     SHIFT12 (state_m, data, tmp);
1136     SHIFT16 (state, data_m, state_m);
1137     SHIFT61 (state, data_m);
1138
1139     data[0] = w14;
1140     data[1] = 0;
1141     data[2] = 0;
1142     data[3] = 0;
1143     data[4] = 0;
1144     data[5] = 0;
1145     data[6] = 0;
1146     data[7] = 0;
1147
1148     /* gost2 */
1149
1150     state_m[0] = state[0];
1151     state_m[1] = state[1];
1152     state_m[2] = state[2];
1153     state_m[3] = state[3];
1154     state_m[4] = state[4];
1155     state_m[5] = state[5];
1156     state_m[6] = state[6];
1157     state_m[7] = state[7];
1158
1159     data_m[0] = data[0];
1160     data_m[1] = data[1];
1161     data_m[2] = data[2];
1162     data_m[3] = data[3];
1163     data_m[4] = data[4];
1164     data_m[5] = data[5];
1165     data_m[6] = data[6];
1166     data_m[7] = data[7];
1167
1168     PASS0 (state, tmp, state_m, data_m, s_tables);
1169     PASS2 (state, tmp, state_m, data_m, s_tables);
1170     PASS4 (state, tmp, state_m, data_m, s_tables);
1171     PASS6 (state, tmp, state_m, data_m, s_tables);
1172
1173     SHIFT12 (state_m, data, tmp);
1174     SHIFT16 (state, data_m, state_m);
1175     SHIFT61 (state, data_m);
1176
1177     /* gost3 */
1178
1179     data[0] = state[ 8];
1180     data[1] = state[ 9];
1181     data[2] = state[10];
1182     data[3] = state[11];
1183     data[4] = state[12];
1184     data[5] = state[13];
1185     data[6] = state[14];
1186     data[7] = state[15];
1187
1188     state_m[0] = state[0];
1189     state_m[1] = state[1];
1190     state_m[2] = state[2];
1191     state_m[3] = state[3];
1192     state_m[4] = state[4];
1193     state_m[5] = state[5];
1194     state_m[6] = state[6];
1195     state_m[7] = state[7];
1196
1197     data_m[0] = data[0];
1198     data_m[1] = data[1];
1199     data_m[2] = data[2];
1200     data_m[3] = data[3];
1201     data_m[4] = data[4];
1202     data_m[5] = data[5];
1203     data_m[6] = data[6];
1204     data_m[7] = data[7];
1205
1206     PASS0 (state, tmp, state_m, data_m, s_tables);
1207     PASS2 (state, tmp, state_m, data_m, s_tables);
1208     PASS4 (state, tmp, state_m, data_m, s_tables);
1209     PASS6 (state, tmp, state_m, data_m, s_tables);
1210
1211     SHIFT12 (state_m, data, tmp);
1212     SHIFT16 (state, data_m, state_m);
1213     SHIFT61 (state, data_m);
1214
1215     /* store */
1216
1217     const u32 r0 = state[0];
1218     const u32 r1 = state[1];
1219     const u32 r2 = state[2];
1220     const u32 r3 = state[3];
1221
1222     #include COMPARE_S
1223   }
1224 }
1225
1226 __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)
1227 {
1228 }
1229
1230 __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)
1231 {
1232 }