Merge pull request #146 from gm4tr1x/master
[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 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.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 #if   VECT_SIZE == 1
292 #define BOX(i,n,S) (S)[(n)][(i)]
293 #elif VECT_SIZE == 2
294 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
295 #elif VECT_SIZE == 4
296 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
297 #elif VECT_SIZE == 8
298 #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])
299 #endif
300
301 #define round(k1,k2,tbl)                  \
302 {                                         \
303   u32x t;                                 \
304   t = (k1) + r;                           \
305   l ^= BOX (((t >>  0) & 0xff), 0, tbl) ^ \
306        BOX (((t >>  8) & 0xff), 1, tbl) ^ \
307        BOX (((t >> 16) & 0xff), 2, tbl) ^ \
308        BOX (((t >> 24) & 0xff), 3, tbl);  \
309   t = (k2) + l;                           \
310   r ^= BOX (((t >>  0) & 0xff), 0, tbl) ^ \
311        BOX (((t >>  8) & 0xff), 1, tbl) ^ \
312        BOX (((t >> 16) & 0xff), 2, tbl) ^ \
313        BOX (((t >> 24) & 0xff), 3, tbl);  \
314 }
315
316 #define R(k,h,s,i,t)      \
317 {                         \
318   u32x r;                 \
319   u32x l;                 \
320   r = h[i + 0];           \
321   l = h[i + 1];           \
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[0], k[1], t);  \
327   round (k[2], k[3], t);  \
328   round (k[4], k[5], t);  \
329   round (k[6], k[7], t);  \
330   round (k[0], k[1], t);  \
331   round (k[2], k[3], t);  \
332   round (k[4], k[5], t);  \
333   round (k[6], k[7], t);  \
334   round (k[7], k[6], t);  \
335   round (k[5], k[4], t);  \
336   round (k[3], k[2], t);  \
337   round (k[1], k[0], t);  \
338   s[i + 0] = l;           \
339   s[i + 1] = r;           \
340 }
341
342 #define X(w,u,v)      \
343   w[0] = u[0] ^ v[0]; \
344   w[1] = u[1] ^ v[1]; \
345   w[2] = u[2] ^ v[2]; \
346   w[3] = u[3] ^ v[3]; \
347   w[4] = u[4] ^ v[4]; \
348   w[5] = u[5] ^ v[5]; \
349   w[6] = u[6] ^ v[6]; \
350   w[7] = u[7] ^ v[7];
351
352 #define P(k,w)                        \
353   k[0] = ((w[0] & 0x000000ff) <<  0)  \
354        | ((w[2] & 0x000000ff) <<  8)  \
355        | ((w[4] & 0x000000ff) << 16)  \
356        | ((w[6] & 0x000000ff) << 24); \
357   k[1] = ((w[0] & 0x0000ff00) >>  8)  \
358        | ((w[2] & 0x0000ff00) >>  0)  \
359        | ((w[4] & 0x0000ff00) <<  8)  \
360        | ((w[6] & 0x0000ff00) << 16); \
361   k[2] = ((w[0] & 0x00ff0000) >> 16)  \
362        | ((w[2] & 0x00ff0000) >>  8)  \
363        | ((w[4] & 0x00ff0000) <<  0)  \
364        | ((w[6] & 0x00ff0000) <<  8); \
365   k[3] = ((w[0] & 0xff000000) >> 24)  \
366        | ((w[2] & 0xff000000) >> 16)  \
367        | ((w[4] & 0xff000000) >>  8)  \
368        | ((w[6] & 0xff000000) >>  0); \
369   k[4] = ((w[1] & 0x000000ff) <<  0)  \
370        | ((w[3] & 0x000000ff) <<  8)  \
371        | ((w[5] & 0x000000ff) << 16)  \
372        | ((w[7] & 0x000000ff) << 24); \
373   k[5] = ((w[1] & 0x0000ff00) >>  8)  \
374        | ((w[3] & 0x0000ff00) >>  0)  \
375        | ((w[5] & 0x0000ff00) <<  8)  \
376        | ((w[7] & 0x0000ff00) << 16); \
377   k[6] = ((w[1] & 0x00ff0000) >> 16)  \
378        | ((w[3] & 0x00ff0000) >>  8)  \
379        | ((w[5] & 0x00ff0000) <<  0)  \
380        | ((w[7] & 0x00ff0000) <<  8); \
381   k[7] = ((w[1] & 0xff000000) >> 24)  \
382        | ((w[3] & 0xff000000) >> 16)  \
383        | ((w[5] & 0xff000000) >>  8)  \
384        | ((w[7] & 0xff000000) >>  0);
385
386 #define A(x)        \
387 {                   \
388   u32x l;           \
389   u32x r;           \
390   l = x[0] ^ x[2];  \
391   r = x[1] ^ x[3];  \
392   x[0] = x[2];      \
393   x[1] = x[3];      \
394   x[2] = x[4];      \
395   x[3] = x[5];      \
396   x[4] = x[6];      \
397   x[5] = x[7];      \
398   x[6] = l;         \
399   x[7] = r;         \
400 }
401
402 #define AA(x)       \
403 {                   \
404   u32x l;           \
405   u32x r;           \
406   l    = x[0];      \
407   r    = x[2];      \
408   x[0] = x[4];      \
409   x[2] = x[6];      \
410   x[4] = l ^ r;     \
411   x[6] = x[0] ^ r;  \
412   l    = x[1];      \
413   r    = x[3];      \
414   x[1] = x[5];      \
415   x[3] = x[7];      \
416   x[5] = l ^ r;     \
417   x[7] = x[1] ^ r;  \
418 }
419
420 #define C(x)          \
421   x[0] ^= 0xff00ff00; \
422   x[1] ^= 0xff00ff00; \
423   x[2] ^= 0x00ff00ff; \
424   x[3] ^= 0x00ff00ff; \
425   x[4] ^= 0x00ffff00; \
426   x[5] ^= 0xff0000ff; \
427   x[6] ^= 0x000000ff; \
428   x[7] ^= 0xff00ffff;
429
430 #define SHIFT12(u,m,s)              \
431   u[0] = m[0] ^ s[6];               \
432   u[1] = m[1] ^ s[7];               \
433   u[2] = m[2] ^ (s[0] << 16)        \
434               ^ (s[0] >> 16)        \
435               ^ (s[0] & 0x0000ffff) \
436               ^ (s[1] & 0x0000ffff) \
437               ^ (s[1] >> 16)        \
438               ^ (s[2] << 16)        \
439               ^ s[6]                \
440               ^ (s[6] << 16)        \
441               ^ (s[7] & 0xffff0000) \
442               ^ (s[7] >> 16);       \
443   u[3] = m[3] ^ (s[0] & 0x0000ffff) \
444               ^ (s[0] << 16)        \
445               ^ (s[1] & 0x0000ffff) \
446               ^ (s[1] << 16)        \
447               ^ (s[1] >> 16)        \
448               ^ (s[2] << 16)        \
449               ^ (s[2] >> 16)        \
450               ^ (s[3] << 16)        \
451               ^ s[6]                \
452               ^ (s[6] << 16)        \
453               ^ (s[6] >> 16)        \
454               ^ (s[7] & 0x0000ffff) \
455               ^ (s[7] << 16)        \
456               ^ (s[7] >> 16);       \
457   u[4] = m[4] ^ (s[0] & 0xffff0000) \
458               ^ (s[0] << 16)        \
459               ^ (s[0] >> 16)        \
460               ^ (s[1] & 0xffff0000) \
461               ^ (s[1] >> 16)        \
462               ^ (s[2] << 16)        \
463               ^ (s[2] >> 16)        \
464               ^ (s[3] << 16)        \
465               ^ (s[3] >> 16)        \
466               ^ (s[4] << 16)        \
467               ^ (s[6] << 16)        \
468               ^ (s[6] >> 16)        \
469               ^ (s[7] & 0x0000ffff) \
470               ^ (s[7] << 16)        \
471               ^ (s[7] >> 16);       \
472   u[5] = m[5] ^ (s[0] << 16)        \
473               ^ (s[0] >> 16)        \
474               ^ (s[0] & 0xffff0000) \
475               ^ (s[1] & 0x0000ffff) \
476               ^ s[2]                \
477               ^ (s[2] >> 16)        \
478               ^ (s[3] << 16)        \
479               ^ (s[3] >> 16)        \
480               ^ (s[4] << 16)        \
481               ^ (s[4] >> 16)        \
482               ^ (s[5] << 16)        \
483               ^ (s[6] << 16)        \
484               ^ (s[6] >> 16)        \
485               ^ (s[7] & 0xffff0000) \
486               ^ (s[7] << 16)        \
487               ^ (s[7] >> 16);       \
488   u[6] = m[6] ^ s[0]                \
489               ^ (s[1] >> 16)        \
490               ^ (s[2] << 16)        \
491               ^ s[3]                \
492               ^ (s[3] >> 16)        \
493               ^ (s[4] << 16)        \
494               ^ (s[4] >> 16)        \
495               ^ (s[5] << 16)        \
496               ^ (s[5] >> 16)        \
497               ^ s[6]                \
498               ^ (s[6] << 16)        \
499               ^ (s[6] >> 16)        \
500               ^ (s[7] << 16);       \
501   u[7] = m[7] ^ (s[0] & 0xffff0000) \
502               ^ (s[0] << 16)        \
503               ^ (s[1] & 0x0000ffff) \
504               ^ (s[1] << 16)        \
505               ^ (s[2] >> 16)        \
506               ^ (s[3] << 16)        \
507               ^ s[4]                \
508               ^ (s[4] >> 16)        \
509               ^ (s[5] << 16)        \
510               ^ (s[5] >> 16)        \
511               ^ (s[6] >> 16)        \
512               ^ (s[7] & 0x0000ffff) \
513               ^ (s[7] << 16)        \
514               ^ (s[7] >> 16);
515
516 #define SHIFT16(h,v,u)              \
517   v[0] = h[0] ^ (u[1] << 16)        \
518               ^ (u[0] >> 16);       \
519   v[1] = h[1] ^ (u[2] << 16)        \
520               ^ (u[1] >> 16);       \
521   v[2] = h[2] ^ (u[3] << 16)        \
522               ^ (u[2] >> 16);       \
523   v[3] = h[3] ^ (u[4] << 16)        \
524               ^ (u[3] >> 16);       \
525   v[4] = h[4] ^ (u[5] << 16)        \
526               ^ (u[4] >> 16);       \
527   v[5] = h[5] ^ (u[6] << 16)        \
528               ^ (u[5] >> 16);       \
529   v[6] = h[6] ^ (u[7] << 16)        \
530               ^ (u[6] >> 16);       \
531   v[7] = h[7] ^ (u[0] & 0xffff0000) \
532               ^ (u[0] << 16)        \
533               ^ (u[7] >> 16)        \
534               ^ (u[1] & 0xffff0000) \
535               ^ (u[1] << 16)        \
536               ^ (u[6] << 16)        \
537               ^ (u[7] & 0xffff0000);
538
539 #define SHIFT61(h,v)          \
540   h[0] = (v[0] & 0xffff0000)  \
541        ^ (v[0] << 16)         \
542        ^ (v[0] >> 16)         \
543        ^ (v[1] >> 16)         \
544        ^ (v[1] & 0xffff0000)  \
545        ^ (v[2] << 16)         \
546        ^ (v[3] >> 16)         \
547        ^ (v[4] << 16)         \
548        ^ (v[5] >> 16)         \
549        ^ v[5]                 \
550        ^ (v[6] >> 16)         \
551        ^ (v[7] << 16)         \
552        ^ (v[7] >> 16)         \
553        ^ (v[7] & 0x0000ffff); \
554   h[1] = (v[0] << 16)         \
555        ^ (v[0] >> 16)         \
556        ^ (v[0] & 0xffff0000)  \
557        ^ (v[1] & 0x0000ffff)  \
558        ^ v[2]                 \
559        ^ (v[2] >> 16)         \
560        ^ (v[3] << 16)         \
561        ^ (v[4] >> 16)         \
562        ^ (v[5] << 16)         \
563        ^ (v[6] << 16)         \
564        ^ v[6]                 \
565        ^ (v[7] & 0xffff0000)  \
566        ^ (v[7] >> 16);        \
567   h[2] = (v[0] & 0x0000ffff)  \
568        ^ (v[0] << 16)         \
569        ^ (v[1] << 16)         \
570        ^ (v[1] >> 16)         \
571        ^ (v[1] & 0xffff0000)  \
572        ^ (v[2] << 16)         \
573        ^ (v[3] >> 16)         \
574        ^ v[3]                 \
575        ^ (v[4] << 16)         \
576        ^ (v[5] >> 16)         \
577        ^ v[6]                 \
578        ^ (v[6] >> 16)         \
579        ^ (v[7] & 0x0000ffff)  \
580        ^ (v[7] << 16)         \
581        ^ (v[7] >> 16);        \
582   h[3] = (v[0] << 16)         \
583        ^ (v[0] >> 16)         \
584        ^ (v[0] & 0xffff0000)  \
585        ^ (v[1] & 0xffff0000)  \
586        ^ (v[1] >> 16)         \
587        ^ (v[2] << 16)         \
588        ^ (v[2] >> 16)         \
589        ^ v[2]                 \
590        ^ (v[3] << 16)         \
591        ^ (v[4] >> 16)         \
592        ^ v[4]                 \
593        ^ (v[5] << 16)         \
594        ^ (v[6] << 16)         \
595        ^ (v[7] & 0x0000ffff)  \
596        ^ (v[7] >> 16);        \
597   h[4] = (v[0] >> 16)         \
598        ^ (v[1] << 16)         \
599        ^ v[1]                 \
600        ^ (v[2] >> 16)         \
601        ^ v[2]                 \
602        ^ (v[3] << 16)         \
603        ^ (v[3] >> 16)         \
604        ^ v[3]                 \
605        ^ (v[4] << 16)         \
606        ^ (v[5] >> 16)         \
607        ^ v[5]                 \
608        ^ (v[6] << 16)         \
609        ^ (v[6] >> 16)         \
610        ^ (v[7] << 16);        \
611   h[5] = (v[0] << 16)         \
612        ^ (v[0] & 0xffff0000)  \
613        ^ (v[1] << 16)         \
614        ^ (v[1] >> 16)         \
615        ^ (v[1] & 0xffff0000)  \
616        ^ (v[2] << 16)         \
617        ^ v[2]                 \
618        ^ (v[3] >> 16)         \
619        ^ v[3]                 \
620        ^ (v[4] << 16)         \
621        ^ (v[4] >> 16)         \
622        ^ v[4]                 \
623        ^ (v[5] << 16)         \
624        ^ (v[6] << 16)         \
625        ^ (v[6] >> 16)         \
626        ^ v[6]                 \
627        ^ (v[7] << 16)         \
628        ^ (v[7] >> 16)         \
629        ^ (v[7] & 0xffff0000); \
630   h[6] = v[0]                 \
631        ^ v[2]                 \
632        ^ (v[2] >> 16)         \
633        ^ v[3]                 \
634        ^ (v[3] << 16)         \
635        ^ v[4]                 \
636        ^ (v[4] >> 16)         \
637        ^ (v[5] << 16)         \
638        ^ (v[5] >> 16)         \
639        ^ v[5]                 \
640        ^ (v[6] << 16)         \
641        ^ (v[6] >> 16)         \
642        ^ v[6]                 \
643        ^ (v[7] << 16)         \
644        ^ v[7];                \
645   h[7] = v[0]                 \
646        ^ (v[0] >> 16)         \
647        ^ (v[1] << 16)         \
648        ^ (v[1] >> 16)         \
649        ^ (v[2] << 16)         \
650        ^ (v[3] >> 16)         \
651        ^ v[3]                 \
652        ^ (v[4] << 16)         \
653        ^ v[4]                 \
654        ^ (v[5] >> 16)         \
655        ^ v[5]                 \
656        ^ (v[6] << 16)         \
657        ^ (v[6] >> 16)         \
658        ^ (v[7] << 16)         \
659        ^ v[7];
660
661 #define PASS0(h,s,u,v,t)  \
662 {                         \
663   u32x k[8];              \
664   u32x w[8];              \
665   X (w, u, v);            \
666   P (k, w);               \
667   R (k, h, s, 0, t);      \
668   A (u);                  \
669   AA (v);                 \
670 }
671
672 #define PASS2(h,s,u,v,t)  \
673 {                         \
674   u32x k[8];              \
675   u32x w[8];              \
676   X (w, u, v);            \
677   P (k, w);               \
678   R (k, h, s, 2, t);      \
679   A (u);                  \
680   C (u);                  \
681   AA (v);                 \
682 }
683
684 #define PASS4(h,s,u,v,t)  \
685 {                         \
686   u32x k[8];              \
687   u32x w[8];              \
688   X (w, u, v);            \
689   P (k, w);               \
690   R (k, h, s, 4, t);      \
691   A (u);                  \
692   AA (v);                 \
693 }
694
695 #define PASS6(h,s,u,v,t)  \
696 {                         \
697   u32x k[8];              \
698   u32x w[8];              \
699   X (w, u, v);            \
700   P (k, w);               \
701   R (k, h, s, 6, t);      \
702 }
703
704 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])
705 {
706   /**
707    * modifier
708    */
709
710   const u32 gid = get_global_id (0);
711   const u32 lid = get_local_id (0);
712
713   /**
714    * base
715    */
716
717   const u32 w14 = pw_len * 8;
718
719   /**
720    * loop
721    */
722
723   u32 w0l = w0[0];
724
725   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
726   {
727     const u32x w0r = w0r_create_bft (bfs_buf, il_pos);
728
729     const u32x w0lr = w0l | w0r;
730
731     u32x data[8];
732
733     data[0] = w0lr;
734     data[1] = w0[1];
735     data[2] = w0[2];
736     data[3] = w0[3];
737     data[4] = w1[0];
738     data[5] = w1[1];
739     data[6] = w1[2];
740     data[7] = w1[3];
741
742     u32x state[16];
743
744     state[ 0] = 0;
745     state[ 1] = 0;
746     state[ 2] = 0;
747     state[ 3] = 0;
748     state[ 4] = 0;
749     state[ 5] = 0;
750     state[ 6] = 0;
751     state[ 7] = 0;
752     state[ 8] = data[0];
753     state[ 9] = data[1];
754     state[10] = data[2];
755     state[11] = data[3];
756     state[12] = data[4];
757     state[13] = data[5];
758     state[14] = data[6];
759     state[15] = data[7];
760
761     u32x state_m[8];
762     u32x data_m[8];
763
764     /* gost1 */
765
766     state_m[0] = state[0];
767     state_m[1] = state[1];
768     state_m[2] = state[2];
769     state_m[3] = state[3];
770     state_m[4] = state[4];
771     state_m[5] = state[5];
772     state_m[6] = state[6];
773     state_m[7] = state[7];
774
775     data_m[0] = data[0];
776     data_m[1] = data[1];
777     data_m[2] = data[2];
778     data_m[3] = data[3];
779     data_m[4] = data[4];
780     data_m[5] = data[5];
781     data_m[6] = data[6];
782     data_m[7] = data[7];
783
784     u32x tmp[8];
785
786     if (pw_len > 0)
787     {
788       PASS0 (state, tmp, state_m, data_m, s_tables);
789       PASS2 (state, tmp, state_m, data_m, s_tables);
790       PASS4 (state, tmp, state_m, data_m, s_tables);
791       PASS6 (state, tmp, state_m, data_m, s_tables);
792
793       SHIFT12 (state_m, data, tmp);
794       SHIFT16 (state, data_m, state_m);
795       SHIFT61 (state, data_m);
796     }
797
798     data[0] = w14;
799     data[1] = 0;
800     data[2] = 0;
801     data[3] = 0;
802     data[4] = 0;
803     data[5] = 0;
804     data[6] = 0;
805     data[7] = 0;
806
807     /* gost2 */
808
809     state_m[0] = state[0];
810     state_m[1] = state[1];
811     state_m[2] = state[2];
812     state_m[3] = state[3];
813     state_m[4] = state[4];
814     state_m[5] = state[5];
815     state_m[6] = state[6];
816     state_m[7] = state[7];
817
818     data_m[0] = data[0];
819     data_m[1] = data[1];
820     data_m[2] = data[2];
821     data_m[3] = data[3];
822     data_m[4] = data[4];
823     data_m[5] = data[5];
824     data_m[6] = data[6];
825     data_m[7] = data[7];
826
827     PASS0 (state, tmp, state_m, data_m, s_tables);
828     PASS2 (state, tmp, state_m, data_m, s_tables);
829     PASS4 (state, tmp, state_m, data_m, s_tables);
830     PASS6 (state, tmp, state_m, data_m, s_tables);
831
832     SHIFT12 (state_m, data, tmp);
833     SHIFT16 (state, data_m, state_m);
834     SHIFT61 (state, data_m);
835
836     /* gost3 */
837
838     data[0] = state[ 8];
839     data[1] = state[ 9];
840     data[2] = state[10];
841     data[3] = state[11];
842     data[4] = state[12];
843     data[5] = state[13];
844     data[6] = state[14];
845     data[7] = state[15];
846
847     state_m[0] = state[0];
848     state_m[1] = state[1];
849     state_m[2] = state[2];
850     state_m[3] = state[3];
851     state_m[4] = state[4];
852     state_m[5] = state[5];
853     state_m[6] = state[6];
854     state_m[7] = state[7];
855
856     data_m[0] = data[0];
857     data_m[1] = data[1];
858     data_m[2] = data[2];
859     data_m[3] = data[3];
860     data_m[4] = data[4];
861     data_m[5] = data[5];
862     data_m[6] = data[6];
863     data_m[7] = data[7];
864
865     PASS0 (state, tmp, state_m, data_m, s_tables);
866     PASS2 (state, tmp, state_m, data_m, s_tables);
867     PASS4 (state, tmp, state_m, data_m, s_tables);
868     PASS6 (state, tmp, state_m, data_m, s_tables);
869
870     SHIFT12 (state_m, data, tmp);
871     SHIFT16 (state, data_m, state_m);
872     SHIFT61 (state, data_m);
873
874     /* store */
875
876     COMPARE_M_SIMD (state[0], state[1], state[2], state[3]);
877   }
878 }
879
880 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])
881 {
882   /**
883    * modifier
884    */
885
886   const u32 gid = get_global_id (0);
887   const u32 lid = get_local_id (0);
888
889   /**
890    * base
891    */
892
893   const u32 w14 = pw_len * 8;
894
895   /**
896    * digest
897    */
898
899   const u32 search[4] =
900   {
901     digests_buf[digests_offset].digest_buf[DGST_R0],
902     digests_buf[digests_offset].digest_buf[DGST_R1],
903     digests_buf[digests_offset].digest_buf[DGST_R2],
904     digests_buf[digests_offset].digest_buf[DGST_R3]
905   };
906
907   /**
908    * loop
909    */
910
911   u32 w0l = w0[0];
912
913   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos += VECT_SIZE)
914   {
915     const u32x w0r = w0r_create_bft (bfs_buf, il_pos);
916
917     const u32x w0lr = w0l | w0r;
918
919     u32x data[8];
920
921     data[0] = w0lr;
922     data[1] = w0[1];
923     data[2] = w0[2];
924     data[3] = w0[3];
925     data[4] = w1[0];
926     data[5] = w1[1];
927     data[6] = w1[2];
928     data[7] = w1[3];
929
930     u32x state[16];
931
932     state[ 0] = 0;
933     state[ 1] = 0;
934     state[ 2] = 0;
935     state[ 3] = 0;
936     state[ 4] = 0;
937     state[ 5] = 0;
938     state[ 6] = 0;
939     state[ 7] = 0;
940     state[ 8] = data[0];
941     state[ 9] = data[1];
942     state[10] = data[2];
943     state[11] = data[3];
944     state[12] = data[4];
945     state[13] = data[5];
946     state[14] = data[6];
947     state[15] = data[7];
948
949     u32x state_m[8];
950     u32x data_m[8];
951
952     /* gost1 */
953
954     state_m[0] = state[0];
955     state_m[1] = state[1];
956     state_m[2] = state[2];
957     state_m[3] = state[3];
958     state_m[4] = state[4];
959     state_m[5] = state[5];
960     state_m[6] = state[6];
961     state_m[7] = state[7];
962
963     data_m[0] = data[0];
964     data_m[1] = data[1];
965     data_m[2] = data[2];
966     data_m[3] = data[3];
967     data_m[4] = data[4];
968     data_m[5] = data[5];
969     data_m[6] = data[6];
970     data_m[7] = data[7];
971
972     u32x tmp[8];
973
974     if (pw_len > 0)
975     {
976       PASS0 (state, tmp, state_m, data_m, s_tables);
977       PASS2 (state, tmp, state_m, data_m, s_tables);
978       PASS4 (state, tmp, state_m, data_m, s_tables);
979       PASS6 (state, tmp, state_m, data_m, s_tables);
980
981       SHIFT12 (state_m, data, tmp);
982       SHIFT16 (state, data_m, state_m);
983       SHIFT61 (state, data_m);
984     }
985
986     data[0] = w14;
987     data[1] = 0;
988     data[2] = 0;
989     data[3] = 0;
990     data[4] = 0;
991     data[5] = 0;
992     data[6] = 0;
993     data[7] = 0;
994
995     /* gost2 */
996
997     state_m[0] = state[0];
998     state_m[1] = state[1];
999     state_m[2] = state[2];
1000     state_m[3] = state[3];
1001     state_m[4] = state[4];
1002     state_m[5] = state[5];
1003     state_m[6] = state[6];
1004     state_m[7] = state[7];
1005
1006     data_m[0] = data[0];
1007     data_m[1] = data[1];
1008     data_m[2] = data[2];
1009     data_m[3] = data[3];
1010     data_m[4] = data[4];
1011     data_m[5] = data[5];
1012     data_m[6] = data[6];
1013     data_m[7] = data[7];
1014
1015     PASS0 (state, tmp, state_m, data_m, s_tables);
1016     PASS2 (state, tmp, state_m, data_m, s_tables);
1017     PASS4 (state, tmp, state_m, data_m, s_tables);
1018     PASS6 (state, tmp, state_m, data_m, s_tables);
1019
1020     SHIFT12 (state_m, data, tmp);
1021     SHIFT16 (state, data_m, state_m);
1022     SHIFT61 (state, data_m);
1023
1024     /* gost3 */
1025
1026     data[0] = state[ 8];
1027     data[1] = state[ 9];
1028     data[2] = state[10];
1029     data[3] = state[11];
1030     data[4] = state[12];
1031     data[5] = state[13];
1032     data[6] = state[14];
1033     data[7] = state[15];
1034
1035     state_m[0] = state[0];
1036     state_m[1] = state[1];
1037     state_m[2] = state[2];
1038     state_m[3] = state[3];
1039     state_m[4] = state[4];
1040     state_m[5] = state[5];
1041     state_m[6] = state[6];
1042     state_m[7] = state[7];
1043
1044     data_m[0] = data[0];
1045     data_m[1] = data[1];
1046     data_m[2] = data[2];
1047     data_m[3] = data[3];
1048     data_m[4] = data[4];
1049     data_m[5] = data[5];
1050     data_m[6] = data[6];
1051     data_m[7] = data[7];
1052
1053     PASS0 (state, tmp, state_m, data_m, s_tables);
1054     PASS2 (state, tmp, state_m, data_m, s_tables);
1055     PASS4 (state, tmp, state_m, data_m, s_tables);
1056     PASS6 (state, tmp, state_m, data_m, s_tables);
1057
1058     SHIFT12 (state_m, data, tmp);
1059     SHIFT16 (state, data_m, state_m);
1060     SHIFT61 (state, data_m);
1061
1062     /* store */
1063
1064     COMPARE_S_SIMD (state[0], state[1], state[2], state[3]);
1065   }
1066 }
1067
1068 __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)
1069 {
1070   /**
1071    * base
1072    */
1073
1074   const u32 gid = get_global_id (0);
1075   const u32 lid = get_local_id (0);
1076   const u32 lsz = get_local_size (0);
1077
1078   /**
1079    * sbox
1080    */
1081
1082   __local u32 s_tables[4][256];
1083
1084   for (u32 i = lid; i < 256; i += lsz)
1085   {
1086     s_tables[0][i] = c_tables[0][i];
1087     s_tables[1][i] = c_tables[1][i];
1088     s_tables[2][i] = c_tables[2][i];
1089     s_tables[3][i] = c_tables[3][i];
1090   }
1091
1092   barrier (CLK_LOCAL_MEM_FENCE);
1093
1094   if (gid >= gid_max) return;
1095
1096   /**
1097    * modifier
1098    */
1099
1100   u32 w0[4];
1101
1102   w0[0] = pws[gid].i[ 0];
1103   w0[1] = pws[gid].i[ 1];
1104   w0[2] = pws[gid].i[ 2];
1105   w0[3] = pws[gid].i[ 3];
1106
1107   u32 w1[4];
1108
1109   w1[0] = 0;
1110   w1[1] = 0;
1111   w1[2] = 0;
1112   w1[3] = 0;
1113
1114   u32 w2[4];
1115
1116   w2[0] = 0;
1117   w2[1] = 0;
1118   w2[2] = 0;
1119   w2[3] = 0;
1120
1121   u32 w3[4];
1122
1123   w3[0] = 0;
1124   w3[1] = 0;
1125   w3[2] = 0;
1126   w3[3] = 0;
1127
1128   const u32 pw_len = pws[gid].pw_len;
1129
1130   /**
1131    * main
1132    */
1133
1134   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);
1135 }
1136
1137 __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)
1138 {
1139   /**
1140    * base
1141    */
1142
1143   const u32 gid = get_global_id (0);
1144   const u32 lid = get_local_id (0);
1145   const u32 lsz = get_local_size (0);
1146
1147   /**
1148    * sbox
1149    */
1150
1151   __local u32 s_tables[4][256];
1152
1153   for (u32 i = lid; i < 256; i += lsz)
1154   {
1155     s_tables[0][i] = c_tables[0][i];
1156     s_tables[1][i] = c_tables[1][i];
1157     s_tables[2][i] = c_tables[2][i];
1158     s_tables[3][i] = c_tables[3][i];
1159   }
1160
1161   barrier (CLK_LOCAL_MEM_FENCE);
1162
1163   if (gid >= gid_max) return;
1164
1165   /**
1166    * modifier
1167    */
1168
1169   u32 w0[4];
1170
1171   w0[0] = pws[gid].i[ 0];
1172   w0[1] = pws[gid].i[ 1];
1173   w0[2] = pws[gid].i[ 2];
1174   w0[3] = pws[gid].i[ 3];
1175
1176   u32 w1[4];
1177
1178   w1[0] = pws[gid].i[ 4];
1179   w1[1] = pws[gid].i[ 5];
1180   w1[2] = pws[gid].i[ 6];
1181   w1[3] = pws[gid].i[ 7];
1182
1183   u32 w2[4];
1184
1185   w2[0] = 0;
1186   w2[1] = 0;
1187   w2[2] = 0;
1188   w2[3] = 0;
1189
1190   u32 w3[4];
1191
1192   w3[0] = 0;
1193   w3[1] = 0;
1194   w3[2] = 0;
1195   w3[3] = 0;
1196
1197   const u32 pw_len = pws[gid].pw_len;
1198
1199   /**
1200    * main
1201    */
1202
1203   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);
1204 }
1205
1206 __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)
1207 {
1208 }
1209
1210 __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)
1211 {
1212   /**
1213    * base
1214    */
1215
1216   const u32 gid = get_global_id (0);
1217   const u32 lid = get_local_id (0);
1218   const u32 lsz = get_local_size (0);
1219
1220   /**
1221    * sbox
1222    */
1223
1224   __local u32 s_tables[4][256];
1225
1226   for (u32 i = lid; i < 256; i += lsz)
1227   {
1228     s_tables[0][i] = c_tables[0][i];
1229     s_tables[1][i] = c_tables[1][i];
1230     s_tables[2][i] = c_tables[2][i];
1231     s_tables[3][i] = c_tables[3][i];
1232   }
1233
1234   barrier (CLK_LOCAL_MEM_FENCE);
1235
1236   if (gid >= gid_max) return;
1237
1238   /**
1239    * modifier
1240    */
1241
1242   u32 w0[4];
1243
1244   w0[0] = pws[gid].i[ 0];
1245   w0[1] = pws[gid].i[ 1];
1246   w0[2] = pws[gid].i[ 2];
1247   w0[3] = pws[gid].i[ 3];
1248
1249   u32 w1[4];
1250
1251   w1[0] = 0;
1252   w1[1] = 0;
1253   w1[2] = 0;
1254   w1[3] = 0;
1255
1256   u32 w2[4];
1257
1258   w2[0] = 0;
1259   w2[1] = 0;
1260   w2[2] = 0;
1261   w2[3] = 0;
1262
1263   u32 w3[4];
1264
1265   w3[0] = 0;
1266   w3[1] = 0;
1267   w3[2] = 0;
1268   w3[3] = 0;
1269
1270   const u32 pw_len = pws[gid].pw_len;
1271
1272   /**
1273    * main
1274    */
1275
1276   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);
1277 }
1278
1279 __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)
1280 {
1281   /**
1282    * base
1283    */
1284
1285   const u32 gid = get_global_id (0);
1286   const u32 lid = get_local_id (0);
1287   const u32 lsz = get_local_size (0);
1288
1289   /**
1290    * sbox
1291    */
1292
1293   __local u32 s_tables[4][256];
1294
1295   for (u32 i = lid; i < 256; i += lsz)
1296   {
1297     s_tables[0][i] = c_tables[0][i];
1298     s_tables[1][i] = c_tables[1][i];
1299     s_tables[2][i] = c_tables[2][i];
1300     s_tables[3][i] = c_tables[3][i];
1301   }
1302
1303   barrier (CLK_LOCAL_MEM_FENCE);
1304
1305   if (gid >= gid_max) return;
1306
1307   /**
1308    * modifier
1309    */
1310
1311   u32 w0[4];
1312
1313   w0[0] = pws[gid].i[ 0];
1314   w0[1] = pws[gid].i[ 1];
1315   w0[2] = pws[gid].i[ 2];
1316   w0[3] = pws[gid].i[ 3];
1317
1318   u32 w1[4];
1319
1320   w1[0] = pws[gid].i[ 4];
1321   w1[1] = pws[gid].i[ 5];
1322   w1[2] = pws[gid].i[ 6];
1323   w1[3] = pws[gid].i[ 7];
1324
1325   u32 w2[4];
1326
1327   w2[0] = 0;
1328   w2[1] = 0;
1329   w2[2] = 0;
1330   w2[3] = 0;
1331
1332   u32 w3[4];
1333
1334   w3[0] = 0;
1335   w3[1] = 0;
1336   w3[2] = 0;
1337   w3[3] = 0;
1338
1339   const u32 pw_len = pws[gid].pw_len;
1340
1341   /**
1342    * main
1343    */
1344
1345   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);
1346 }
1347
1348 __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)
1349 {
1350 }