Merge branch 'master' of https://github.com/hashcat/oclHashcat
[hashcat.git] / OpenCL / m06900_a3.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 "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19
20 #define COMPARE_S "OpenCL/check_single_comp4.c"
21 #define COMPARE_M "OpenCL/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 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[4][256])
697 {
698   /**
699    * modifier
700    */
701
702   const u32 gid = get_global_id (0);
703   const u32 lid = get_local_id (0);
704
705   /**
706    * base
707    */
708
709   const u32 w14 = pw_len * 8;
710
711   /**
712    * loop
713    */
714
715   u32 w0l = w0[0];
716
717   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
718   {
719     const u32 w0r = bfs_buf[il_pos].i;
720
721     w0[0] = w0l | w0r;
722
723     u32 data[8];
724
725     data[0] = w0[0];
726     data[1] = w0[1];
727     data[2] = w0[2];
728     data[3] = w0[3];
729     data[4] = w1[0];
730     data[5] = w1[1];
731     data[6] = w1[2];
732     data[7] = w1[3];
733
734     u32 state[16];
735
736     state[ 0] = 0;
737     state[ 1] = 0;
738     state[ 2] = 0;
739     state[ 3] = 0;
740     state[ 4] = 0;
741     state[ 5] = 0;
742     state[ 6] = 0;
743     state[ 7] = 0;
744     state[ 8] = data[0];
745     state[ 9] = data[1];
746     state[10] = data[2];
747     state[11] = data[3];
748     state[12] = data[4];
749     state[13] = data[5];
750     state[14] = data[6];
751     state[15] = data[7];
752
753     u32 state_m[8];
754     u32 data_m[8];
755
756     /* gost1 */
757
758     state_m[0] = state[0];
759     state_m[1] = state[1];
760     state_m[2] = state[2];
761     state_m[3] = state[3];
762     state_m[4] = state[4];
763     state_m[5] = state[5];
764     state_m[6] = state[6];
765     state_m[7] = state[7];
766
767     data_m[0] = data[0];
768     data_m[1] = data[1];
769     data_m[2] = data[2];
770     data_m[3] = data[3];
771     data_m[4] = data[4];
772     data_m[5] = data[5];
773     data_m[6] = data[6];
774     data_m[7] = data[7];
775
776     u32 tmp[8];
777
778     if (pw_len > 0)
779     {
780       PASS0 (state, tmp, state_m, data_m, s_tables);
781       PASS2 (state, tmp, state_m, data_m, s_tables);
782       PASS4 (state, tmp, state_m, data_m, s_tables);
783       PASS6 (state, tmp, state_m, data_m, s_tables);
784
785       SHIFT12 (state_m, data, tmp);
786       SHIFT16 (state, data_m, state_m);
787       SHIFT61 (state, data_m);
788     }
789
790     data[0] = w14;
791     data[1] = 0;
792     data[2] = 0;
793     data[3] = 0;
794     data[4] = 0;
795     data[5] = 0;
796     data[6] = 0;
797     data[7] = 0;
798
799     /* gost2 */
800
801     state_m[0] = state[0];
802     state_m[1] = state[1];
803     state_m[2] = state[2];
804     state_m[3] = state[3];
805     state_m[4] = state[4];
806     state_m[5] = state[5];
807     state_m[6] = state[6];
808     state_m[7] = state[7];
809
810     data_m[0] = data[0];
811     data_m[1] = data[1];
812     data_m[2] = data[2];
813     data_m[3] = data[3];
814     data_m[4] = data[4];
815     data_m[5] = data[5];
816     data_m[6] = data[6];
817     data_m[7] = data[7];
818
819     PASS0 (state, tmp, state_m, data_m, s_tables);
820     PASS2 (state, tmp, state_m, data_m, s_tables);
821     PASS4 (state, tmp, state_m, data_m, s_tables);
822     PASS6 (state, tmp, state_m, data_m, s_tables);
823
824     SHIFT12 (state_m, data, tmp);
825     SHIFT16 (state, data_m, state_m);
826     SHIFT61 (state, data_m);
827
828     /* gost3 */
829
830     data[0] = state[ 8];
831     data[1] = state[ 9];
832     data[2] = state[10];
833     data[3] = state[11];
834     data[4] = state[12];
835     data[5] = state[13];
836     data[6] = state[14];
837     data[7] = state[15];
838
839     state_m[0] = state[0];
840     state_m[1] = state[1];
841     state_m[2] = state[2];
842     state_m[3] = state[3];
843     state_m[4] = state[4];
844     state_m[5] = state[5];
845     state_m[6] = state[6];
846     state_m[7] = state[7];
847
848     data_m[0] = data[0];
849     data_m[1] = data[1];
850     data_m[2] = data[2];
851     data_m[3] = data[3];
852     data_m[4] = data[4];
853     data_m[5] = data[5];
854     data_m[6] = data[6];
855     data_m[7] = data[7];
856
857     PASS0 (state, tmp, state_m, data_m, s_tables);
858     PASS2 (state, tmp, state_m, data_m, s_tables);
859     PASS4 (state, tmp, state_m, data_m, s_tables);
860     PASS6 (state, tmp, state_m, data_m, s_tables);
861
862     SHIFT12 (state_m, data, tmp);
863     SHIFT16 (state, data_m, state_m);
864     SHIFT61 (state, data_m);
865
866     /* store */
867
868     const u32 r0 = state[0];
869     const u32 r1 = state[1];
870     const u32 r2 = state[2];
871     const u32 r3 = state[3];
872
873     #include COMPARE_M
874   }
875 }
876 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[4][256])
877 {
878   /**
879    * modifier
880    */
881
882   const u32 gid = get_global_id (0);
883   const u32 lid = get_local_id (0);
884
885   /**
886    * base
887    */
888
889   const u32 w14 = pw_len * 8;
890
891   /**
892    * digest
893    */
894
895   const u32 search[4] =
896   {
897     digests_buf[digests_offset].digest_buf[DGST_R0],
898     digests_buf[digests_offset].digest_buf[DGST_R1],
899     digests_buf[digests_offset].digest_buf[DGST_R2],
900     digests_buf[digests_offset].digest_buf[DGST_R3]
901   };
902
903   /**
904    * loop
905    */
906
907   u32 w0l = w0[0];
908
909   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
910   {
911     const u32 w0r = bfs_buf[il_pos].i;
912
913     w0[0] = w0l | w0r;
914
915     u32 data[8];
916
917     data[0] = w0[0];
918     data[1] = w0[1];
919     data[2] = w0[2];
920     data[3] = w0[3];
921     data[4] = w1[0];
922     data[5] = w1[1];
923     data[6] = w1[2];
924     data[7] = w1[3];
925
926     u32 state[16];
927
928     state[ 0] = 0;
929     state[ 1] = 0;
930     state[ 2] = 0;
931     state[ 3] = 0;
932     state[ 4] = 0;
933     state[ 5] = 0;
934     state[ 6] = 0;
935     state[ 7] = 0;
936     state[ 8] = data[0];
937     state[ 9] = data[1];
938     state[10] = data[2];
939     state[11] = data[3];
940     state[12] = data[4];
941     state[13] = data[5];
942     state[14] = data[6];
943     state[15] = data[7];
944
945     u32 state_m[8];
946     u32 data_m[8];
947
948     /* gost1 */
949
950     state_m[0] = state[0];
951     state_m[1] = state[1];
952     state_m[2] = state[2];
953     state_m[3] = state[3];
954     state_m[4] = state[4];
955     state_m[5] = state[5];
956     state_m[6] = state[6];
957     state_m[7] = state[7];
958
959     data_m[0] = data[0];
960     data_m[1] = data[1];
961     data_m[2] = data[2];
962     data_m[3] = data[3];
963     data_m[4] = data[4];
964     data_m[5] = data[5];
965     data_m[6] = data[6];
966     data_m[7] = data[7];
967
968     u32 tmp[8];
969
970     if (pw_len > 0)
971     {
972       PASS0 (state, tmp, state_m, data_m, s_tables);
973       PASS2 (state, tmp, state_m, data_m, s_tables);
974       PASS4 (state, tmp, state_m, data_m, s_tables);
975       PASS6 (state, tmp, state_m, data_m, s_tables);
976
977       SHIFT12 (state_m, data, tmp);
978       SHIFT16 (state, data_m, state_m);
979       SHIFT61 (state, data_m);
980     }
981
982     data[0] = w14;
983     data[1] = 0;
984     data[2] = 0;
985     data[3] = 0;
986     data[4] = 0;
987     data[5] = 0;
988     data[6] = 0;
989     data[7] = 0;
990
991     /* gost2 */
992
993     state_m[0] = state[0];
994     state_m[1] = state[1];
995     state_m[2] = state[2];
996     state_m[3] = state[3];
997     state_m[4] = state[4];
998     state_m[5] = state[5];
999     state_m[6] = state[6];
1000     state_m[7] = state[7];
1001
1002     data_m[0] = data[0];
1003     data_m[1] = data[1];
1004     data_m[2] = data[2];
1005     data_m[3] = data[3];
1006     data_m[4] = data[4];
1007     data_m[5] = data[5];
1008     data_m[6] = data[6];
1009     data_m[7] = data[7];
1010
1011     PASS0 (state, tmp, state_m, data_m, s_tables);
1012     PASS2 (state, tmp, state_m, data_m, s_tables);
1013     PASS4 (state, tmp, state_m, data_m, s_tables);
1014     PASS6 (state, tmp, state_m, data_m, s_tables);
1015
1016     SHIFT12 (state_m, data, tmp);
1017     SHIFT16 (state, data_m, state_m);
1018     SHIFT61 (state, data_m);
1019
1020     /* gost3 */
1021
1022     data[0] = state[ 8];
1023     data[1] = state[ 9];
1024     data[2] = state[10];
1025     data[3] = state[11];
1026     data[4] = state[12];
1027     data[5] = state[13];
1028     data[6] = state[14];
1029     data[7] = state[15];
1030
1031     state_m[0] = state[0];
1032     state_m[1] = state[1];
1033     state_m[2] = state[2];
1034     state_m[3] = state[3];
1035     state_m[4] = state[4];
1036     state_m[5] = state[5];
1037     state_m[6] = state[6];
1038     state_m[7] = state[7];
1039
1040     data_m[0] = data[0];
1041     data_m[1] = data[1];
1042     data_m[2] = data[2];
1043     data_m[3] = data[3];
1044     data_m[4] = data[4];
1045     data_m[5] = data[5];
1046     data_m[6] = data[6];
1047     data_m[7] = data[7];
1048
1049     PASS0 (state, tmp, state_m, data_m, s_tables);
1050     PASS2 (state, tmp, state_m, data_m, s_tables);
1051     PASS4 (state, tmp, state_m, data_m, s_tables);
1052     PASS6 (state, tmp, state_m, data_m, s_tables);
1053
1054     SHIFT12 (state_m, data, tmp);
1055     SHIFT16 (state, data_m, state_m);
1056     SHIFT61 (state, data_m);
1057
1058     /* store */
1059
1060     const u32 r0 = state[0];
1061     const u32 r1 = state[1];
1062     const u32 r2 = state[2];
1063     const u32 r3 = state[3];
1064
1065     #include COMPARE_S
1066   }
1067 }
1068
1069 __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)
1070 {
1071   /**
1072    * base
1073    */
1074
1075   const u32 gid = get_global_id (0);
1076   const u32 lid = get_local_id (0);
1077   const u32 lsz = get_local_size (0);
1078
1079   /**
1080    * sbox
1081    */
1082
1083   __local u32 s_tables[4][256];
1084
1085   for (u32 i = lid; i < 256; i += lsz)
1086   {
1087     s_tables[0][i] = c_tables[0][i];
1088     s_tables[1][i] = c_tables[1][i];
1089     s_tables[2][i] = c_tables[2][i];
1090     s_tables[3][i] = c_tables[3][i];
1091   }
1092
1093   barrier (CLK_LOCAL_MEM_FENCE);
1094
1095   if (gid >= gid_max) return;
1096
1097   /**
1098    * modifier
1099    */
1100
1101   u32 w0[4];
1102
1103   w0[0] = pws[gid].i[ 0];
1104   w0[1] = pws[gid].i[ 1];
1105   w0[2] = pws[gid].i[ 2];
1106   w0[3] = pws[gid].i[ 3];
1107
1108   u32 w1[4];
1109
1110   w1[0] = 0;
1111   w1[1] = 0;
1112   w1[2] = 0;
1113   w1[3] = 0;
1114
1115   u32 w2[4];
1116
1117   w2[0] = 0;
1118   w2[1] = 0;
1119   w2[2] = 0;
1120   w2[3] = 0;
1121
1122   u32 w3[4];
1123
1124   w3[0] = 0;
1125   w3[1] = 0;
1126   w3[2] = 0;
1127   w3[3] = 0;
1128
1129   const u32 pw_len = pws[gid].pw_len;
1130
1131   /**
1132    * main
1133    */
1134
1135   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);
1136 }
1137
1138 __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)
1139 {
1140   /**
1141    * base
1142    */
1143
1144   const u32 gid = get_global_id (0);
1145   const u32 lid = get_local_id (0);
1146   const u32 lsz = get_local_size (0);
1147
1148   /**
1149    * sbox
1150    */
1151
1152   __local u32 s_tables[4][256];
1153
1154   for (u32 i = lid; i < 256; i += lsz)
1155   {
1156     s_tables[0][i] = c_tables[0][i];
1157     s_tables[1][i] = c_tables[1][i];
1158     s_tables[2][i] = c_tables[2][i];
1159     s_tables[3][i] = c_tables[3][i];
1160   }
1161
1162   barrier (CLK_LOCAL_MEM_FENCE);
1163
1164   if (gid >= gid_max) return;
1165
1166   /**
1167    * modifier
1168    */
1169
1170   u32 w0[4];
1171
1172   w0[0] = pws[gid].i[ 0];
1173   w0[1] = pws[gid].i[ 1];
1174   w0[2] = pws[gid].i[ 2];
1175   w0[3] = pws[gid].i[ 3];
1176
1177   u32 w1[4];
1178
1179   w1[0] = pws[gid].i[ 4];
1180   w1[1] = pws[gid].i[ 5];
1181   w1[2] = pws[gid].i[ 6];
1182   w1[3] = pws[gid].i[ 7];
1183
1184   u32 w2[4];
1185
1186   w2[0] = 0;
1187   w2[1] = 0;
1188   w2[2] = 0;
1189   w2[3] = 0;
1190
1191   u32 w3[4];
1192
1193   w3[0] = 0;
1194   w3[1] = 0;
1195   w3[2] = 0;
1196   w3[3] = 0;
1197
1198   const u32 pw_len = pws[gid].pw_len;
1199
1200   /**
1201    * main
1202    */
1203
1204   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);
1205 }
1206
1207 __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)
1208 {
1209 }
1210
1211 __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)
1212 {
1213   /**
1214    * base
1215    */
1216
1217   const u32 gid = get_global_id (0);
1218   const u32 lid = get_local_id (0);
1219   const u32 lsz = get_local_size (0);
1220
1221   /**
1222    * sbox
1223    */
1224
1225   __local u32 s_tables[4][256];
1226
1227   for (u32 i = lid; i < 256; i += lsz)
1228   {
1229     s_tables[0][i] = c_tables[0][i];
1230     s_tables[1][i] = c_tables[1][i];
1231     s_tables[2][i] = c_tables[2][i];
1232     s_tables[3][i] = c_tables[3][i];
1233   }
1234
1235   barrier (CLK_LOCAL_MEM_FENCE);
1236
1237   if (gid >= gid_max) return;
1238
1239   /**
1240    * modifier
1241    */
1242
1243   u32 w0[4];
1244
1245   w0[0] = pws[gid].i[ 0];
1246   w0[1] = pws[gid].i[ 1];
1247   w0[2] = pws[gid].i[ 2];
1248   w0[3] = pws[gid].i[ 3];
1249
1250   u32 w1[4];
1251
1252   w1[0] = 0;
1253   w1[1] = 0;
1254   w1[2] = 0;
1255   w1[3] = 0;
1256
1257   u32 w2[4];
1258
1259   w2[0] = 0;
1260   w2[1] = 0;
1261   w2[2] = 0;
1262   w2[3] = 0;
1263
1264   u32 w3[4];
1265
1266   w3[0] = 0;
1267   w3[1] = 0;
1268   w3[2] = 0;
1269   w3[3] = 0;
1270
1271   const u32 pw_len = pws[gid].pw_len;
1272
1273   /**
1274    * main
1275    */
1276
1277   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);
1278 }
1279
1280 __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)
1281 {
1282   /**
1283    * base
1284    */
1285
1286   const u32 gid = get_global_id (0);
1287   const u32 lid = get_local_id (0);
1288   const u32 lsz = get_local_size (0);
1289
1290   /**
1291    * sbox
1292    */
1293
1294   __local u32 s_tables[4][256];
1295
1296   for (u32 i = lid; i < 256; i += lsz)
1297   {
1298     s_tables[0][i] = c_tables[0][i];
1299     s_tables[1][i] = c_tables[1][i];
1300     s_tables[2][i] = c_tables[2][i];
1301     s_tables[3][i] = c_tables[3][i];
1302   }
1303
1304   barrier (CLK_LOCAL_MEM_FENCE);
1305
1306   if (gid >= gid_max) return;
1307
1308   /**
1309    * modifier
1310    */
1311
1312   u32 w0[4];
1313
1314   w0[0] = pws[gid].i[ 0];
1315   w0[1] = pws[gid].i[ 1];
1316   w0[2] = pws[gid].i[ 2];
1317   w0[3] = pws[gid].i[ 3];
1318
1319   u32 w1[4];
1320
1321   w1[0] = pws[gid].i[ 4];
1322   w1[1] = pws[gid].i[ 5];
1323   w1[2] = pws[gid].i[ 6];
1324   w1[3] = pws[gid].i[ 7];
1325
1326   u32 w2[4];
1327
1328   w2[0] = 0;
1329   w2[1] = 0;
1330   w2[2] = 0;
1331   w2[3] = 0;
1332
1333   u32 w3[4];
1334
1335   w3[0] = 0;
1336   w3[1] = 0;
1337   w3[2] = 0;
1338   w3[3] = 0;
1339
1340   const u32 pw_len = pws[gid].pw_len;
1341
1342   /**
1343    * main
1344    */
1345
1346   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);
1347 }
1348
1349 __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)
1350 {
1351 }