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