fixed -m 6900
[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     PASS0 (state, tmp, state_m, data_m, s_tables);
906     PASS2 (state, tmp, state_m, data_m, s_tables);
907     PASS4 (state, tmp, state_m, data_m, s_tables);
908     PASS6 (state, tmp, state_m, data_m, s_tables);
909
910     SHIFT12 (state_m, data, tmp);
911     SHIFT16 (state, data_m, state_m);
912     SHIFT61 (state, data_m);
913
914     data[0] = w14;
915     data[1] = 0;
916     data[2] = 0;
917     data[3] = 0;
918     data[4] = 0;
919     data[5] = 0;
920     data[6] = 0;
921     data[7] = 0;
922
923     /* gost2 */
924
925     state_m[0] = state[0];
926     state_m[1] = state[1];
927     state_m[2] = state[2];
928     state_m[3] = state[3];
929     state_m[4] = state[4];
930     state_m[5] = state[5];
931     state_m[6] = state[6];
932     state_m[7] = state[7];
933
934     data_m[0] = data[0];
935     data_m[1] = data[1];
936     data_m[2] = data[2];
937     data_m[3] = data[3];
938     data_m[4] = data[4];
939     data_m[5] = data[5];
940     data_m[6] = data[6];
941     data_m[7] = data[7];
942
943     PASS0 (state, tmp, state_m, data_m, s_tables);
944     PASS2 (state, tmp, state_m, data_m, s_tables);
945     PASS4 (state, tmp, state_m, data_m, s_tables);
946     PASS6 (state, tmp, state_m, data_m, s_tables);
947
948     SHIFT12 (state_m, data, tmp);
949     SHIFT16 (state, data_m, state_m);
950     SHIFT61 (state, data_m);
951
952     /* gost3 */
953
954     data[0] = state[ 8];
955     data[1] = state[ 9];
956     data[2] = state[10];
957     data[3] = state[11];
958     data[4] = state[12];
959     data[5] = state[13];
960     data[6] = state[14];
961     data[7] = state[15];
962
963     state_m[0] = state[0];
964     state_m[1] = state[1];
965     state_m[2] = state[2];
966     state_m[3] = state[3];
967     state_m[4] = state[4];
968     state_m[5] = state[5];
969     state_m[6] = state[6];
970     state_m[7] = state[7];
971
972     data_m[0] = data[0];
973     data_m[1] = data[1];
974     data_m[2] = data[2];
975     data_m[3] = data[3];
976     data_m[4] = data[4];
977     data_m[5] = data[5];
978     data_m[6] = data[6];
979     data_m[7] = data[7];
980
981     PASS0 (state, tmp, state_m, data_m, s_tables);
982     PASS2 (state, tmp, state_m, data_m, s_tables);
983     PASS4 (state, tmp, state_m, data_m, s_tables);
984     PASS6 (state, tmp, state_m, data_m, s_tables);
985
986     SHIFT12 (state_m, data, tmp);
987     SHIFT16 (state, data_m, state_m);
988     SHIFT61 (state, data_m);
989
990     /* store */
991
992     const u32 r0 = state[0];
993     const u32 r1 = state[1];
994     const u32 r2 = state[2];
995     const u32 r3 = state[3];
996
997     #include COMPARE_M
998   }
999 }
1000
1001 __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)
1002 {
1003 }
1004
1005 __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)
1006 {
1007 }
1008
1009 __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)
1010 {
1011   /**
1012    * modifier
1013    */
1014
1015   const u32 lid = get_local_id (0);
1016
1017   /**
1018    * base
1019    */
1020
1021   const u32 gid = get_global_id (0);
1022
1023   u32 wordl0[4];
1024
1025   wordl0[0] = pws[gid].i[ 0];
1026   wordl0[1] = pws[gid].i[ 1];
1027   wordl0[2] = pws[gid].i[ 2];
1028   wordl0[3] = pws[gid].i[ 3];
1029
1030   u32 wordl1[4];
1031
1032   wordl1[0] = pws[gid].i[ 4];
1033   wordl1[1] = pws[gid].i[ 5];
1034   wordl1[2] = pws[gid].i[ 6];
1035   wordl1[3] = pws[gid].i[ 7];
1036
1037   u32 wordl2[4];
1038
1039   wordl2[0] = 0;
1040   wordl2[1] = 0;
1041   wordl2[2] = 0;
1042   wordl2[3] = 0;
1043
1044   u32 wordl3[4];
1045
1046   wordl3[0] = 0;
1047   wordl3[1] = 0;
1048   wordl3[2] = 0;
1049   wordl3[3] = 0;
1050
1051   const u32 pw_l_len = pws[gid].pw_len;
1052
1053   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
1054   {
1055     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
1056   }
1057
1058   /**
1059    * sbox
1060    */
1061
1062   __local u32 s_tables[4][256];
1063
1064   const u32 lid4 = lid * 4;
1065
1066   s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0];
1067   s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1];
1068   s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2];
1069   s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3];
1070
1071   s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0];
1072   s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1];
1073   s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2];
1074   s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3];
1075
1076   s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0];
1077   s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1];
1078   s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2];
1079   s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3];
1080
1081   s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0];
1082   s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1];
1083   s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2];
1084   s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3];
1085
1086   barrier (CLK_LOCAL_MEM_FENCE);
1087
1088   if (gid >= gid_max) return;
1089
1090   /**
1091    * digest
1092    */
1093
1094   const u32 search[4] =
1095   {
1096     digests_buf[digests_offset].digest_buf[DGST_R0],
1097     digests_buf[digests_offset].digest_buf[DGST_R1],
1098     digests_buf[digests_offset].digest_buf[DGST_R2],
1099     digests_buf[digests_offset].digest_buf[DGST_R3]
1100   };
1101
1102   /**
1103    * loop
1104    */
1105
1106   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
1107   {
1108     const u32 pw_r_len = combs_buf[il_pos].pw_len;
1109
1110     const u32 pw_len = pw_l_len + pw_r_len;
1111
1112     u32 wordr0[4];
1113
1114     wordr0[0] = combs_buf[il_pos].i[0];
1115     wordr0[1] = combs_buf[il_pos].i[1];
1116     wordr0[2] = combs_buf[il_pos].i[2];
1117     wordr0[3] = combs_buf[il_pos].i[3];
1118
1119     u32 wordr1[4];
1120
1121     wordr1[0] = combs_buf[il_pos].i[4];
1122     wordr1[1] = combs_buf[il_pos].i[5];
1123     wordr1[2] = combs_buf[il_pos].i[6];
1124     wordr1[3] = combs_buf[il_pos].i[7];
1125
1126     u32 wordr2[4];
1127
1128     wordr2[0] = 0;
1129     wordr2[1] = 0;
1130     wordr2[2] = 0;
1131     wordr2[3] = 0;
1132
1133     u32 wordr3[4];
1134
1135     wordr3[0] = 0;
1136     wordr3[1] = 0;
1137     wordr3[2] = 0;
1138     wordr3[3] = 0;
1139
1140     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1141     {
1142       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1143     }
1144
1145     u32 w0[4];
1146
1147     w0[0] = wordl0[0] | wordr0[0];
1148     w0[1] = wordl0[1] | wordr0[1];
1149     w0[2] = wordl0[2] | wordr0[2];
1150     w0[3] = wordl0[3] | wordr0[3];
1151
1152     u32 w1[4];
1153
1154     w1[0] = wordl1[0] | wordr1[0];
1155     w1[1] = wordl1[1] | wordr1[1];
1156     w1[2] = wordl1[2] | wordr1[2];
1157     w1[3] = wordl1[3] | wordr1[3];
1158
1159     u32 w2[4];
1160
1161     w2[0] = wordl2[0] | wordr2[0];
1162     w2[1] = wordl2[1] | wordr2[1];
1163     w2[2] = wordl2[2] | wordr2[2];
1164     w2[3] = wordl2[3] | wordr2[3];
1165
1166     u32 w3[4];
1167
1168     w3[0] = wordl3[0] | wordr3[0];
1169     w3[1] = wordl3[1] | wordr3[1];
1170     w3[2] = pw_len * 8;
1171     w3[3] = 0;
1172
1173     const u32 w14 = pw_len * 8;
1174
1175     u32 data[8];
1176
1177     data[0] = w0[0];
1178     data[1] = w0[1];
1179     data[2] = w0[2];
1180     data[3] = w0[3];
1181     data[4] = w1[0];
1182     data[5] = w1[1];
1183     data[6] = w1[2];
1184     data[7] = w1[3];
1185
1186     u32 state[16];
1187
1188     state[ 0] = 0;
1189     state[ 1] = 0;
1190     state[ 2] = 0;
1191     state[ 3] = 0;
1192     state[ 4] = 0;
1193     state[ 5] = 0;
1194     state[ 6] = 0;
1195     state[ 7] = 0;
1196     state[ 8] = data[0];
1197     state[ 9] = data[1];
1198     state[10] = data[2];
1199     state[11] = data[3];
1200     state[12] = data[4];
1201     state[13] = data[5];
1202     state[14] = data[6];
1203     state[15] = data[7];
1204
1205     u32 state_m[8];
1206     u32 data_m[8];
1207
1208     /* gost1 */
1209
1210     state_m[0] = state[0];
1211     state_m[1] = state[1];
1212     state_m[2] = state[2];
1213     state_m[3] = state[3];
1214     state_m[4] = state[4];
1215     state_m[5] = state[5];
1216     state_m[6] = state[6];
1217     state_m[7] = state[7];
1218
1219     data_m[0] = data[0];
1220     data_m[1] = data[1];
1221     data_m[2] = data[2];
1222     data_m[3] = data[3];
1223     data_m[4] = data[4];
1224     data_m[5] = data[5];
1225     data_m[6] = data[6];
1226     data_m[7] = data[7];
1227
1228     u32 tmp[8];
1229
1230     PASS0 (state, tmp, state_m, data_m, s_tables);
1231     PASS2 (state, tmp, state_m, data_m, s_tables);
1232     PASS4 (state, tmp, state_m, data_m, s_tables);
1233     PASS6 (state, tmp, state_m, data_m, s_tables);
1234
1235     SHIFT12 (state_m, data, tmp);
1236     SHIFT16 (state, data_m, state_m);
1237     SHIFT61 (state, data_m);
1238
1239     data[0] = w14;
1240     data[1] = 0;
1241     data[2] = 0;
1242     data[3] = 0;
1243     data[4] = 0;
1244     data[5] = 0;
1245     data[6] = 0;
1246     data[7] = 0;
1247
1248     /* gost2 */
1249
1250     state_m[0] = state[0];
1251     state_m[1] = state[1];
1252     state_m[2] = state[2];
1253     state_m[3] = state[3];
1254     state_m[4] = state[4];
1255     state_m[5] = state[5];
1256     state_m[6] = state[6];
1257     state_m[7] = state[7];
1258
1259     data_m[0] = data[0];
1260     data_m[1] = data[1];
1261     data_m[2] = data[2];
1262     data_m[3] = data[3];
1263     data_m[4] = data[4];
1264     data_m[5] = data[5];
1265     data_m[6] = data[6];
1266     data_m[7] = data[7];
1267
1268     PASS0 (state, tmp, state_m, data_m, s_tables);
1269     PASS2 (state, tmp, state_m, data_m, s_tables);
1270     PASS4 (state, tmp, state_m, data_m, s_tables);
1271     PASS6 (state, tmp, state_m, data_m, s_tables);
1272
1273     SHIFT12 (state_m, data, tmp);
1274     SHIFT16 (state, data_m, state_m);
1275     SHIFT61 (state, data_m);
1276
1277     /* gost3 */
1278
1279     data[0] = state[ 8];
1280     data[1] = state[ 9];
1281     data[2] = state[10];
1282     data[3] = state[11];
1283     data[4] = state[12];
1284     data[5] = state[13];
1285     data[6] = state[14];
1286     data[7] = state[15];
1287
1288     state_m[0] = state[0];
1289     state_m[1] = state[1];
1290     state_m[2] = state[2];
1291     state_m[3] = state[3];
1292     state_m[4] = state[4];
1293     state_m[5] = state[5];
1294     state_m[6] = state[6];
1295     state_m[7] = state[7];
1296
1297     data_m[0] = data[0];
1298     data_m[1] = data[1];
1299     data_m[2] = data[2];
1300     data_m[3] = data[3];
1301     data_m[4] = data[4];
1302     data_m[5] = data[5];
1303     data_m[6] = data[6];
1304     data_m[7] = data[7];
1305
1306     PASS0 (state, tmp, state_m, data_m, s_tables);
1307     PASS2 (state, tmp, state_m, data_m, s_tables);
1308     PASS4 (state, tmp, state_m, data_m, s_tables);
1309     PASS6 (state, tmp, state_m, data_m, s_tables);
1310
1311     SHIFT12 (state_m, data, tmp);
1312     SHIFT16 (state, data_m, state_m);
1313     SHIFT61 (state, data_m);
1314
1315     /* store */
1316
1317     const u32 r0 = state[0];
1318     const u32 r1 = state[1];
1319     const u32 r2 = state[2];
1320     const u32 r3 = state[3];
1321
1322     #include COMPARE_S
1323   }
1324 }
1325
1326 __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)
1327 {
1328 }
1329
1330 __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)
1331 {
1332 }