Initial commit
[hashcat.git] / amd / m10410_a0.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 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE1
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE1
21 #endif
22
23 #define DGST_R0 0
24 #define DGST_R1 1
25 #define DGST_R2 2
26 #define DGST_R3 3
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31 #include "include/rp_gpu.h"
32 #include "rp_amd.c"
33
34 #ifdef  VECT_SIZE1
35 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
36 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
37 #endif
38
39 #ifdef  VECT_SIZE4
40 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
41 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
42 #endif
43
44 __constant u32 padding[8] =
45 {
46   0x5e4ebf28,
47   0x418a754e,
48   0x564e0064,
49   0x0801faff,
50   0xb6002e2e,
51   0x803e68d0,
52   0xfea90c2f,
53   0x7a695364
54 };
55
56 typedef struct
57 {
58   u8 S[256];
59
60   u32 wtf_its_faster;
61
62 } RC4_KEY;
63
64 static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j)
65 {
66   u8 tmp;
67
68   tmp           = rc4_key->S[i];
69   rc4_key->S[i] = rc4_key->S[j];
70   rc4_key->S[j] = tmp;
71 }
72
73 static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4])
74 {
75   u32 v = 0x03020100;
76   u32 a = 0x04040404;
77
78   __local u32 *ptr = (__local u32 *) rc4_key->S;
79
80   #pragma unroll
81   for (u32 i = 0; i < 64; i++)
82   {
83     ptr[i] = v; v += a;
84   }
85
86   const u32 d0 = data[0] >>  0;
87   const u32 d1 = data[0] >>  8;
88   const u32 d2 = data[0] >> 16;
89   const u32 d3 = data[0] >> 24;
90   const u32 d4 = data[1] >>  0;
91
92   u32 j = 0;
93
94   #pragma unroll
95   for (u32 i = 0; i < 255; i += 5)
96   {
97     j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j);
98     j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j);
99     j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j);
100     j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j);
101     j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j);
102   }
103
104   j += rc4_key->S[255] + d0; swap (rc4_key, 255, j);
105 }
106
107 static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4])
108 {
109   for (u32 k = 0; k < 4; k++)
110   {
111     u32 xor4 = 0;
112
113     u8 idx;
114
115     i += 1;
116     j += rc4_key->S[i];
117
118     swap (rc4_key, i, j);
119
120     idx = rc4_key->S[i] + rc4_key->S[j];
121
122     xor4 |= rc4_key->S[idx] <<  0;
123
124     i += 1;
125     j += rc4_key->S[i];
126
127     swap (rc4_key, i, j);
128
129     idx = rc4_key->S[i] + rc4_key->S[j];
130
131     xor4 |= rc4_key->S[idx] <<  8;
132
133     i += 1;
134     j += rc4_key->S[i];
135
136     swap (rc4_key, i, j);
137
138     idx = rc4_key->S[i] + rc4_key->S[j];
139
140     xor4 |= rc4_key->S[idx] << 16;
141
142     i += 1;
143     j += rc4_key->S[i];
144
145     swap (rc4_key, i, j);
146
147     idx = rc4_key->S[i] + rc4_key->S[j];
148
149     xor4 |= rc4_key->S[idx] << 24;
150
151     out[k] = in[k] ^ xor4;
152   }
153
154   return j;
155 }
156
157 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m04 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
158 {
159   /**
160    * modifier
161    */
162
163   const u32 lid = get_local_id (0);
164
165   /**
166    * base
167    */
168
169   const u32 gid = get_global_id (0);
170
171   if (gid >= gid_max) return;
172
173   u32x pw_buf0[4];
174
175   pw_buf0[0] = pws[gid].i[ 0];
176   pw_buf0[1] = pws[gid].i[ 1];
177   pw_buf0[2] = pws[gid].i[ 2];
178   pw_buf0[3] = pws[gid].i[ 3];
179
180   u32x pw_buf1[4];
181
182   pw_buf1[0] = pws[gid].i[ 4];
183   pw_buf1[1] = pws[gid].i[ 5];
184   pw_buf1[2] = pws[gid].i[ 6];
185   pw_buf1[3] = pws[gid].i[ 7];
186
187   const u32 pw_len = pws[gid].pw_len;
188
189   /**
190    * key
191    */
192
193   __local RC4_KEY rc4_keys[64];
194   __local RC4_KEY *rc4_key = &rc4_keys[lid];
195
196   /**
197    * loop
198    */
199
200   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
201   {
202     u32x w0[4];
203
204     w0[0] = pw_buf0[0];
205     w0[1] = pw_buf0[1];
206     w0[2] = pw_buf0[2];
207     w0[3] = pw_buf0[3];
208
209     u32x w1[4];
210
211     w1[0] = pw_buf1[0];
212     w1[1] = pw_buf1[1];
213     w1[2] = pw_buf1[2];
214     w1[3] = pw_buf1[3];
215
216     u32x w2[4];
217
218     w2[0] = 0;
219     w2[1] = 0;
220     w2[2] = 0;
221     w2[3] = 0;
222
223     u32x w3[4];
224
225     w3[0] = 0;
226     w3[1] = 0;
227     w3[2] = 0;
228     w3[3] = 0;
229
230     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
231
232     // now the RC4 part
233
234     u32x key[4];
235
236     key[0] = w0[0];
237     key[1] = w0[1];
238     key[2] = 0;
239     key[3] = 0;
240
241     rc4_init_16 (rc4_key, key);
242
243     u32x out[4];
244
245     rc4_next_16 (rc4_key, 0, 0, padding, out);
246
247     const u32x r0 = out[0];
248     const u32x r1 = out[1];
249     const u32x r2 = out[2];
250     const u32x r3 = out[3];
251
252     #include VECT_COMPARE_M
253   }
254 }
255
256 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m08 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
257 {
258 }
259
260 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m16 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
261 {
262 }
263
264 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s04 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
265 {
266   /**
267    * modifier
268    */
269
270   const u32 lid = get_local_id (0);
271
272   /**
273    * base
274    */
275
276   const u32 gid = get_global_id (0);
277
278   if (gid >= gid_max) return;
279
280   u32x pw_buf0[4];
281
282   pw_buf0[0] = pws[gid].i[ 0];
283   pw_buf0[1] = pws[gid].i[ 1];
284   pw_buf0[2] = pws[gid].i[ 2];
285   pw_buf0[3] = pws[gid].i[ 3];
286
287   u32x pw_buf1[4];
288
289   pw_buf1[0] = pws[gid].i[ 4];
290   pw_buf1[1] = pws[gid].i[ 5];
291   pw_buf1[2] = pws[gid].i[ 6];
292   pw_buf1[3] = pws[gid].i[ 7];
293
294   const u32 pw_len = pws[gid].pw_len;
295
296   /**
297    * digest
298    */
299
300   const u32 search[4] =
301   {
302     digests_buf[digests_offset].digest_buf[DGST_R0],
303     digests_buf[digests_offset].digest_buf[DGST_R1],
304     digests_buf[digests_offset].digest_buf[DGST_R2],
305     digests_buf[digests_offset].digest_buf[DGST_R3]
306   };
307
308   /**
309    * key
310    */
311
312   __local RC4_KEY rc4_keys[64];
313   __local RC4_KEY *rc4_key = &rc4_keys[lid];
314
315   /**
316    * loop
317    */
318
319   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
320   {
321     u32x w0[4];
322
323     w0[0] = pw_buf0[0];
324     w0[1] = pw_buf0[1];
325     w0[2] = pw_buf0[2];
326     w0[3] = pw_buf0[3];
327
328     u32x w1[4];
329
330     w1[0] = pw_buf1[0];
331     w1[1] = pw_buf1[1];
332     w1[2] = pw_buf1[2];
333     w1[3] = pw_buf1[3];
334
335     u32x w2[4];
336
337     w2[0] = 0;
338     w2[1] = 0;
339     w2[2] = 0;
340     w2[3] = 0;
341
342     u32x w3[4];
343
344     w3[0] = 0;
345     w3[1] = 0;
346     w3[2] = 0;
347     w3[3] = 0;
348
349     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
350
351     // now the RC4 part
352
353     u32x key[4];
354
355     key[0] = w0[0];
356     key[1] = w0[1];
357     key[2] = 0;
358     key[3] = 0;
359
360     rc4_init_16 (rc4_key, key);
361
362     u32x out[4];
363
364     rc4_next_16 (rc4_key, 0, 0, padding, out);
365
366     const u32x r0 = out[0];
367     const u32x r1 = out[1];
368     const u32x r2 = out[2];
369     const u32x r3 = out[3];
370
371     #include VECT_COMPARE_S
372   }
373 }
374
375 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s08 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
376 {
377 }
378
379 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s16 (__global pw_t *pws, __global gpu_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
380 {
381 }