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