Merge branch 'GetRidOfCUDA'
[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     if (pw_len > 0)
854     {
855       PASS0 (state, tmp, state_m, data_m, s_tables);
856       PASS2 (state, tmp, state_m, data_m, s_tables);
857       PASS4 (state, tmp, state_m, data_m, s_tables);
858       PASS6 (state, tmp, state_m, data_m, s_tables);
859
860       SHIFT12 (state_m, data, tmp);
861       SHIFT16 (state, data_m, state_m);
862       SHIFT61 (state, data_m);
863     }
864
865     data[0] = w14;
866     data[1] = 0;
867     data[2] = 0;
868     data[3] = 0;
869     data[4] = 0;
870     data[5] = 0;
871     data[6] = 0;
872     data[7] = 0;
873
874     /* gost2 */
875
876     state_m[0] = state[0];
877     state_m[1] = state[1];
878     state_m[2] = state[2];
879     state_m[3] = state[3];
880     state_m[4] = state[4];
881     state_m[5] = state[5];
882     state_m[6] = state[6];
883     state_m[7] = state[7];
884
885     data_m[0] = data[0];
886     data_m[1] = data[1];
887     data_m[2] = data[2];
888     data_m[3] = data[3];
889     data_m[4] = data[4];
890     data_m[5] = data[5];
891     data_m[6] = data[6];
892     data_m[7] = data[7];
893
894     PASS0 (state, tmp, state_m, data_m, s_tables);
895     PASS2 (state, tmp, state_m, data_m, s_tables);
896     PASS4 (state, tmp, state_m, data_m, s_tables);
897     PASS6 (state, tmp, state_m, data_m, s_tables);
898
899     SHIFT12 (state_m, data, tmp);
900     SHIFT16 (state, data_m, state_m);
901     SHIFT61 (state, data_m);
902
903     /* gost3 */
904
905     data[0] = state[ 8];
906     data[1] = state[ 9];
907     data[2] = state[10];
908     data[3] = state[11];
909     data[4] = state[12];
910     data[5] = state[13];
911     data[6] = state[14];
912     data[7] = state[15];
913
914     state_m[0] = state[0];
915     state_m[1] = state[1];
916     state_m[2] = state[2];
917     state_m[3] = state[3];
918     state_m[4] = state[4];
919     state_m[5] = state[5];
920     state_m[6] = state[6];
921     state_m[7] = state[7];
922
923     data_m[0] = data[0];
924     data_m[1] = data[1];
925     data_m[2] = data[2];
926     data_m[3] = data[3];
927     data_m[4] = data[4];
928     data_m[5] = data[5];
929     data_m[6] = data[6];
930     data_m[7] = data[7];
931
932     PASS0 (state, tmp, state_m, data_m, s_tables);
933     PASS2 (state, tmp, state_m, data_m, s_tables);
934     PASS4 (state, tmp, state_m, data_m, s_tables);
935     PASS6 (state, tmp, state_m, data_m, s_tables);
936
937     SHIFT12 (state_m, data, tmp);
938     SHIFT16 (state, data_m, state_m);
939     SHIFT61 (state, data_m);
940
941     /* store */
942
943     const u32 r0 = state[0];
944     const u32 r1 = state[1];
945     const u32 r2 = state[2];
946     const u32 r3 = state[3];
947
948     #include COMPARE_M
949   }
950 }
951
952 __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)
953 {
954 }
955
956 __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)
957 {
958 }
959
960 __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)
961 {
962   /**
963    * modifier
964    */
965
966   const u32 lid = get_local_id (0);
967
968   /**
969    * base
970    */
971
972   const u32 gid = get_global_id (0);
973
974   u32 pw_buf0[4];
975
976   pw_buf0[0] = pws[gid].i[ 0];
977   pw_buf0[1] = pws[gid].i[ 1];
978   pw_buf0[2] = pws[gid].i[ 2];
979   pw_buf0[3] = pws[gid].i[ 3];
980
981   u32 pw_buf1[4];
982
983   pw_buf1[0] = pws[gid].i[ 4];
984   pw_buf1[1] = pws[gid].i[ 5];
985   pw_buf1[2] = pws[gid].i[ 6];
986   pw_buf1[3] = pws[gid].i[ 7];
987
988   const u32 pw_len = pws[gid].pw_len;
989
990   /**
991    * sbox
992    */
993
994   __local u32 s_tables[4][256];
995
996   const u32 lid4 = lid * 4;
997
998   s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0];
999   s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1];
1000   s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2];
1001   s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3];
1002
1003   s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0];
1004   s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1];
1005   s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2];
1006   s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3];
1007
1008   s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0];
1009   s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1];
1010   s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2];
1011   s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3];
1012
1013   s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0];
1014   s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1];
1015   s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2];
1016   s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3];
1017
1018   barrier (CLK_LOCAL_MEM_FENCE);
1019
1020   if (gid >= gid_max) return;
1021
1022   /**
1023    * digest
1024    */
1025
1026   const u32 search[4] =
1027   {
1028     digests_buf[digests_offset].digest_buf[DGST_R0],
1029     digests_buf[digests_offset].digest_buf[DGST_R1],
1030     digests_buf[digests_offset].digest_buf[DGST_R2],
1031     digests_buf[digests_offset].digest_buf[DGST_R3]
1032   };
1033
1034   /**
1035    * loop
1036    */
1037
1038   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
1039   {
1040     u32 w0[4];
1041
1042     w0[0] = pw_buf0[0];
1043     w0[1] = pw_buf0[1];
1044     w0[2] = pw_buf0[2];
1045     w0[3] = pw_buf0[3];
1046
1047     u32 w1[4];
1048
1049     w1[0] = pw_buf1[0];
1050     w1[1] = pw_buf1[1];
1051     w1[2] = pw_buf1[2];
1052     w1[3] = pw_buf1[3];
1053
1054     u32 w2[4];
1055
1056     w2[0] = 0;
1057     w2[1] = 0;
1058     w2[2] = 0;
1059     w2[3] = 0;
1060
1061     u32 w3[4];
1062
1063     w3[0] = 0;
1064     w3[1] = 0;
1065     w3[2] = 0;
1066     w3[3] = 0;
1067
1068     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
1069
1070     u32 w14 = out_len * 8;
1071
1072     u32 data[8];
1073
1074     data[0] = w0[0];
1075     data[1] = w0[1];
1076     data[2] = w0[2];
1077     data[3] = w0[3];
1078     data[4] = w1[0];
1079     data[5] = w1[1];
1080     data[6] = w1[2];
1081     data[7] = w1[3];
1082
1083     u32 state[16];
1084
1085     state[ 0] = 0;
1086     state[ 1] = 0;
1087     state[ 2] = 0;
1088     state[ 3] = 0;
1089     state[ 4] = 0;
1090     state[ 5] = 0;
1091     state[ 6] = 0;
1092     state[ 7] = 0;
1093     state[ 8] = data[0];
1094     state[ 9] = data[1];
1095     state[10] = data[2];
1096     state[11] = data[3];
1097     state[12] = data[4];
1098     state[13] = data[5];
1099     state[14] = data[6];
1100     state[15] = data[7];
1101
1102     u32 state_m[8];
1103     u32 data_m[8];
1104
1105     /* gost1 */
1106
1107     state_m[0] = state[0];
1108     state_m[1] = state[1];
1109     state_m[2] = state[2];
1110     state_m[3] = state[3];
1111     state_m[4] = state[4];
1112     state_m[5] = state[5];
1113     state_m[6] = state[6];
1114     state_m[7] = state[7];
1115
1116     data_m[0] = data[0];
1117     data_m[1] = data[1];
1118     data_m[2] = data[2];
1119     data_m[3] = data[3];
1120     data_m[4] = data[4];
1121     data_m[5] = data[5];
1122     data_m[6] = data[6];
1123     data_m[7] = data[7];
1124
1125     u32 tmp[8];
1126
1127     if (pw_len > 0)
1128     {
1129       PASS0 (state, tmp, state_m, data_m, s_tables);
1130       PASS2 (state, tmp, state_m, data_m, s_tables);
1131       PASS4 (state, tmp, state_m, data_m, s_tables);
1132       PASS6 (state, tmp, state_m, data_m, s_tables);
1133
1134       SHIFT12 (state_m, data, tmp);
1135       SHIFT16 (state, data_m, state_m);
1136       SHIFT61 (state, data_m);
1137     }
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 }