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