Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m10410_a0.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _MD5_
9
10 //too much register pressure
11 //#define NEW_SIMD_CODE
12
13 #include "inc_vendor.cl"
14 #include "inc_hash_constants.h"
15 #include "inc_hash_functions.cl"
16 #include "inc_types.cl"
17 #include "inc_common.cl"
18 #include "inc_rp.h"
19 #include "inc_rp.cl"
20 #include "inc_simd.cl"
21
22 __constant u32 padding[8] =
23 {
24   0x5e4ebf28,
25   0x418a754e,
26   0x564e0064,
27   0x0801faff,
28   0xb6002e2e,
29   0x803e68d0,
30   0xfea90c2f,
31   0x7a695364
32 };
33
34 typedef struct
35 {
36   u8 S[256];
37
38   u32 wtf_its_faster;
39
40 } RC4_KEY;
41
42 void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j)
43 {
44   u8 tmp;
45
46   tmp           = rc4_key->S[i];
47   rc4_key->S[i] = rc4_key->S[j];
48   rc4_key->S[j] = tmp;
49 }
50
51 void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4])
52 {
53   u32 v = 0x03020100;
54   u32 a = 0x04040404;
55
56   __local u32 *ptr = (__local u32 *) rc4_key->S;
57
58   #ifdef _unroll
59   #pragma unroll
60   #endif
61   for (u32 i = 0; i < 64; i++)
62   {
63     ptr[i] = v; v += a;
64   }
65
66   const u32 d0 = data[0] >>  0;
67   const u32 d1 = data[0] >>  8;
68   const u32 d2 = data[0] >> 16;
69   const u32 d3 = data[0] >> 24;
70   const u32 d4 = data[1] >>  0;
71
72   u32 j = 0;
73
74   #ifdef _unroll
75   #pragma unroll
76   #endif
77   for (u32 i = 0; i < 255; i += 5)
78   {
79     j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j);
80     j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j);
81     j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j);
82     j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j);
83     j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j);
84   }
85
86   j += rc4_key->S[255] + d0; swap (rc4_key, 255, j);
87 }
88
89 u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 *in, u32 out[4])
90 {
91   #ifdef _unroll
92   #pragma unroll
93   #endif
94   for (u32 k = 0; k < 4; k++)
95   {
96     u32 xor4 = 0;
97
98     u8 idx;
99
100     i += 1;
101     j += rc4_key->S[i];
102
103     swap (rc4_key, i, j);
104
105     idx = rc4_key->S[i] + rc4_key->S[j];
106
107     xor4 |= rc4_key->S[idx] <<  0;
108
109     i += 1;
110     j += rc4_key->S[i];
111
112     swap (rc4_key, i, j);
113
114     idx = rc4_key->S[i] + rc4_key->S[j];
115
116     xor4 |= rc4_key->S[idx] <<  8;
117
118     i += 1;
119     j += rc4_key->S[i];
120
121     swap (rc4_key, i, j);
122
123     idx = rc4_key->S[i] + rc4_key->S[j];
124
125     xor4 |= rc4_key->S[idx] << 16;
126
127     i += 1;
128     j += rc4_key->S[i];
129
130     swap (rc4_key, i, j);
131
132     idx = rc4_key->S[i] + rc4_key->S[j];
133
134     xor4 |= rc4_key->S[idx] << 24;
135
136     out[k] = in[k] ^ xor4;
137   }
138
139   return j;
140 }
141
142 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
143 {
144   /**
145    * modifier
146    */
147
148   const u32 lid = get_local_id (0);
149
150   /**
151    * base
152    */
153
154   const u32 gid = get_global_id (0);
155
156   if (gid >= gid_max) return;
157
158   u32 pw_buf0[4];
159   u32 pw_buf1[4];
160
161   pw_buf0[0] = pws[gid].i[ 0];
162   pw_buf0[1] = pws[gid].i[ 1];
163   pw_buf0[2] = pws[gid].i[ 2];
164   pw_buf0[3] = pws[gid].i[ 3];
165   pw_buf1[0] = pws[gid].i[ 4];
166   pw_buf1[1] = pws[gid].i[ 5];
167   pw_buf1[2] = pws[gid].i[ 6];
168   pw_buf1[3] = pws[gid].i[ 7];
169
170   const u32 pw_len = pws[gid].pw_len;
171
172   /**
173    * shared
174    */
175
176   __local RC4_KEY rc4_keys[64];
177   __local RC4_KEY *rc4_key = &rc4_keys[lid];
178
179   /**
180    * loop
181    */
182
183   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
184   {
185     u32x w0[4] = { 0 };
186     u32x w1[4] = { 0 };
187     u32x w2[4] = { 0 };
188     u32x w3[4] = { 0 };
189
190     apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
191
192     /**
193      * pdf
194      */
195
196     rc4_init_16 (rc4_key, w0);
197
198     u32 out[4];
199
200     rc4_next_16 (rc4_key, 0, 0, padding, out);
201
202     COMPARE_M_SIMD (out[0], out[1], out[2], out[3]);
203   }
204 }
205
206 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
207 {
208 }
209
210 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
211 {
212 }
213
214 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
215 {
216   /**
217    * modifier
218    */
219
220   const u32 lid = get_local_id (0);
221
222   /**
223    * base
224    */
225
226   const u32 gid = get_global_id (0);
227
228   if (gid >= gid_max) return;
229
230   u32 pw_buf0[4];
231   u32 pw_buf1[4];
232
233   pw_buf0[0] = pws[gid].i[ 0];
234   pw_buf0[1] = pws[gid].i[ 1];
235   pw_buf0[2] = pws[gid].i[ 2];
236   pw_buf0[3] = pws[gid].i[ 3];
237   pw_buf1[0] = pws[gid].i[ 4];
238   pw_buf1[1] = pws[gid].i[ 5];
239   pw_buf1[2] = pws[gid].i[ 6];
240   pw_buf1[3] = pws[gid].i[ 7];
241
242   const u32 pw_len = pws[gid].pw_len;
243
244   /**
245    * shared
246    */
247
248   __local RC4_KEY rc4_keys[64];
249   __local RC4_KEY *rc4_key = &rc4_keys[lid];
250
251   /**
252    * digest
253    */
254
255   const u32 search[4] =
256   {
257     digests_buf[digests_offset].digest_buf[DGST_R0],
258     digests_buf[digests_offset].digest_buf[DGST_R1],
259     digests_buf[digests_offset].digest_buf[DGST_R2],
260     digests_buf[digests_offset].digest_buf[DGST_R3]
261   };
262
263   /**
264    * loop
265    */
266
267   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
268   {
269     u32x w0[4] = { 0 };
270     u32x w1[4] = { 0 };
271     u32x w2[4] = { 0 };
272     u32x w3[4] = { 0 };
273
274     apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
275
276     /**
277      * pdf
278      */
279
280     rc4_init_16 (rc4_key, w0);
281
282     u32 out[4];
283
284     rc4_next_16 (rc4_key, 0, 0, padding, out);
285
286     COMPARE_S_SIMD (out[0], out[1], out[2], out[3]);
287   }
288 }
289
290 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
291 {
292 }
293
294 __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_scryptV0_buf, __global u32 *d_scryptV1_buf, __global u32 *d_scryptV2_buf, __global u32 *d_scryptV3_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
295 {
296 }