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