Upgrade kernel to support dynamic local work sizes
[hashcat.git] / OpenCL / m00200_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MYSQL323_
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 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
24 {
25   /**
26    * modifier
27    */
28
29   const u32 lid = get_local_id (0);
30
31   /**
32    * base
33    */
34
35   const u32 gid = get_global_id (0);
36
37   if (gid >= gid_max) return;
38
39   u32 wordl0[4];
40
41   wordl0[0] = pws[gid].i[ 0];
42   wordl0[1] = pws[gid].i[ 1];
43   wordl0[2] = pws[gid].i[ 2];
44   wordl0[3] = pws[gid].i[ 3];
45
46   u32 wordl1[4];
47
48   wordl1[0] = pws[gid].i[ 4];
49   wordl1[1] = pws[gid].i[ 5];
50   wordl1[2] = pws[gid].i[ 6];
51   wordl1[3] = pws[gid].i[ 7];
52
53   u32 wordl2[4];
54
55   wordl2[0] = 0;
56   wordl2[1] = 0;
57   wordl2[2] = 0;
58   wordl2[3] = 0;
59
60   u32 wordl3[4];
61
62   wordl3[0] = 0;
63   wordl3[1] = 0;
64   wordl3[2] = 0;
65   wordl3[3] = 0;
66
67   const u32 pw_l_len = pws[gid].pw_len;
68
69   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
70   {
71     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
72   }
73
74   /**
75    * loop
76    */
77
78   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
79   {
80     const u32 pw_r_len = combs_buf[il_pos].pw_len;
81
82     const u32 pw_len = pw_l_len + pw_r_len;
83
84     u32 wordr0[4];
85
86     wordr0[0] = combs_buf[il_pos].i[0];
87     wordr0[1] = combs_buf[il_pos].i[1];
88     wordr0[2] = combs_buf[il_pos].i[2];
89     wordr0[3] = combs_buf[il_pos].i[3];
90
91     u32 wordr1[4];
92
93     wordr1[0] = combs_buf[il_pos].i[4];
94     wordr1[1] = combs_buf[il_pos].i[5];
95     wordr1[2] = combs_buf[il_pos].i[6];
96     wordr1[3] = combs_buf[il_pos].i[7];
97
98     u32 wordr2[4];
99
100     wordr2[0] = 0;
101     wordr2[1] = 0;
102     wordr2[2] = 0;
103     wordr2[3] = 0;
104
105     u32 wordr3[4];
106
107     wordr3[0] = 0;
108     wordr3[1] = 0;
109     wordr3[2] = 0;
110     wordr3[3] = 0;
111
112     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
113     {
114       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
115     }
116
117     u32 w_t[16];
118
119     w_t[ 0] = wordl0[0] | wordr0[0];
120     w_t[ 1] = wordl0[1] | wordr0[1];
121     w_t[ 2] = wordl0[2] | wordr0[2];
122     w_t[ 3] = wordl0[3] | wordr0[3];
123     w_t[ 4] = wordl1[0] | wordr1[0];
124     w_t[ 5] = wordl1[1] | wordr1[1];
125     w_t[ 6] = wordl1[2] | wordr1[2];
126     w_t[ 7] = wordl1[3] | wordr1[3];
127     w_t[ 8] = wordl2[0] | wordr2[0];
128     w_t[ 9] = wordl2[1] | wordr2[1];
129     w_t[10] = wordl2[2] | wordr2[2];
130     w_t[11] = wordl2[3] | wordr2[3];
131     w_t[12] = wordl3[0] | wordr3[0];
132     w_t[13] = wordl3[1] | wordr3[1];
133     w_t[14] = wordl3[2] | wordr3[2];
134     w_t[15] = 0;
135
136     u32 a = MYSQL323_A;
137     u32 b = MYSQL323_B;
138
139     u32 add = 7;
140
141     #define ROUND(v)                              \
142     {                                             \
143       a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \
144       b += (b << 8) ^ a;                          \
145       add += v;                                   \
146     }
147
148     int i;
149     int j;
150
151     for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1)
152     {
153       const u32 wj = w_t[j];
154
155       ROUND ((wj >>  0) & 0xff);
156       ROUND ((wj >>  8) & 0xff);
157       ROUND ((wj >> 16) & 0xff);
158       ROUND ((wj >> 24) & 0xff);
159     }
160
161     const u32 wj = w_t[j];
162
163     const u32 left = pw_len - i;
164
165     if (left == 3)
166     {
167       ROUND ((wj >>  0) & 0xff);
168       ROUND ((wj >>  8) & 0xff);
169       ROUND ((wj >> 16) & 0xff);
170     }
171     else if (left == 2)
172     {
173       ROUND ((wj >>  0) & 0xff);
174       ROUND ((wj >>  8) & 0xff);
175     }
176     else if (left == 1)
177     {
178       ROUND ((wj >>  0) & 0xff);
179     }
180
181     a &= 0x7fffffff;
182     b &= 0x7fffffff;
183
184     const u32 r0 = a;
185     const u32 r1 = b;
186     const u32 r2 = 0;
187     const u32 r3 = 0;
188
189     #include COMPARE_M
190   }
191 }
192
193 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
194 {
195 }
196
197 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
198 {
199 }
200
201 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
202 {
203   /**
204    * modifier
205    */
206
207   const u32 lid = get_local_id (0);
208
209   /**
210    * base
211    */
212
213   const u32 gid = get_global_id (0);
214
215   if (gid >= gid_max) return;
216
217   u32 wordl0[4];
218
219   wordl0[0] = pws[gid].i[ 0];
220   wordl0[1] = pws[gid].i[ 1];
221   wordl0[2] = pws[gid].i[ 2];
222   wordl0[3] = pws[gid].i[ 3];
223
224   u32 wordl1[4];
225
226   wordl1[0] = pws[gid].i[ 4];
227   wordl1[1] = pws[gid].i[ 5];
228   wordl1[2] = pws[gid].i[ 6];
229   wordl1[3] = pws[gid].i[ 7];
230
231   u32 wordl2[4];
232
233   wordl2[0] = 0;
234   wordl2[1] = 0;
235   wordl2[2] = 0;
236   wordl2[3] = 0;
237
238   u32 wordl3[4];
239
240   wordl3[0] = 0;
241   wordl3[1] = 0;
242   wordl3[2] = 0;
243   wordl3[3] = 0;
244
245   const u32 pw_l_len = pws[gid].pw_len;
246
247   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
248   {
249     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
250   }
251
252   /**
253    * digest
254    */
255
256   const u32 search[4] =
257   {
258     digests_buf[digests_offset].digest_buf[DGST_R0],
259     digests_buf[digests_offset].digest_buf[DGST_R1],
260     digests_buf[digests_offset].digest_buf[DGST_R2],
261     digests_buf[digests_offset].digest_buf[DGST_R3]
262   };
263
264   /**
265    * loop
266    */
267
268   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
269   {
270     const u32 pw_r_len = combs_buf[il_pos].pw_len;
271
272     const u32 pw_len = pw_l_len + pw_r_len;
273
274     u32 wordr0[4];
275
276     wordr0[0] = combs_buf[il_pos].i[0];
277     wordr0[1] = combs_buf[il_pos].i[1];
278     wordr0[2] = combs_buf[il_pos].i[2];
279     wordr0[3] = combs_buf[il_pos].i[3];
280
281     u32 wordr1[4];
282
283     wordr1[0] = combs_buf[il_pos].i[4];
284     wordr1[1] = combs_buf[il_pos].i[5];
285     wordr1[2] = combs_buf[il_pos].i[6];
286     wordr1[3] = combs_buf[il_pos].i[7];
287
288     u32 wordr2[4];
289
290     wordr2[0] = 0;
291     wordr2[1] = 0;
292     wordr2[2] = 0;
293     wordr2[3] = 0;
294
295     u32 wordr3[4];
296
297     wordr3[0] = 0;
298     wordr3[1] = 0;
299     wordr3[2] = 0;
300     wordr3[3] = 0;
301
302     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
303     {
304       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
305     }
306
307     u32 w_t[16];
308
309     w_t[ 0] = wordl0[0] | wordr0[0];
310     w_t[ 1] = wordl0[1] | wordr0[1];
311     w_t[ 2] = wordl0[2] | wordr0[2];
312     w_t[ 3] = wordl0[3] | wordr0[3];
313     w_t[ 4] = wordl1[0] | wordr1[0];
314     w_t[ 5] = wordl1[1] | wordr1[1];
315     w_t[ 6] = wordl1[2] | wordr1[2];
316     w_t[ 7] = wordl1[3] | wordr1[3];
317     w_t[ 8] = wordl2[0] | wordr2[0];
318     w_t[ 9] = wordl2[1] | wordr2[1];
319     w_t[10] = wordl2[2] | wordr2[2];
320     w_t[11] = wordl2[3] | wordr2[3];
321     w_t[12] = wordl3[0] | wordr3[0];
322     w_t[13] = wordl3[1] | wordr3[1];
323     w_t[14] = wordl3[2] | wordr3[2];
324     w_t[15] = 0;
325
326     u32 a = MYSQL323_A;
327     u32 b = MYSQL323_B;
328
329     u32 add = 7;
330
331     #define ROUND(v)                              \
332     {                                             \
333       a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \
334       b += (b << 8) ^ a;                          \
335       add += v;                                   \
336     }
337
338     int i;
339     int j;
340
341     for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1)
342     {
343       const u32 wj = w_t[j];
344
345       ROUND ((wj >>  0) & 0xff);
346       ROUND ((wj >>  8) & 0xff);
347       ROUND ((wj >> 16) & 0xff);
348       ROUND ((wj >> 24) & 0xff);
349     }
350
351     const u32 wj = w_t[j];
352
353     const u32 left = pw_len - i;
354
355     if (left == 3)
356     {
357       ROUND ((wj >>  0) & 0xff);
358       ROUND ((wj >>  8) & 0xff);
359       ROUND ((wj >> 16) & 0xff);
360     }
361     else if (left == 2)
362     {
363       ROUND ((wj >>  0) & 0xff);
364       ROUND ((wj >>  8) & 0xff);
365     }
366     else if (left == 1)
367     {
368       ROUND ((wj >>  0) & 0xff);
369     }
370
371     a &= 0x7fffffff;
372     b &= 0x7fffffff;
373
374     const u32 r0 = a;
375     const u32 r1 = b;
376     const u32 r2 = 0;
377     const u32 r3 = 0;
378
379     #include COMPARE_S
380   }
381 }
382
383 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
384 {
385 }
386
387 __kernel void m00200_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
388 {
389 }