Zero pws_buf before reuse
[hashcat.git] / OpenCL / m10100_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SIPHASH_
7
8 #define NEW_SIMD_CODE
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21 #include "OpenCL/simd.c"
22
23 #define SIPROUND(v0,v1,v2,v3) \
24   (v0) += (v1);               \
25   (v1)  = rotl64 ((v1), 13);  \
26   (v1) ^= (v0);               \
27   (v0)  = as_ulong (as_uint2 ((v0)).s10); \
28   (v2) += (v3);               \
29   (v3)  = rotl64 ((v3), 16);  \
30   (v3) ^= (v2);               \
31   (v0) += (v3);               \
32   (v3)  = rotl64 ((v3), 21);  \
33   (v3) ^= (v0);               \
34   (v2) += (v1);               \
35   (v1)  = rotl64 ((v1), 17);  \
36   (v1) ^= (v2);               \
37   (v2)  = as_ulong (as_uint2 ((v2)).s10);
38
39 __kernel void m10100_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)
40 {
41   /**
42    * modifier
43    */
44
45   const u32 lid = get_local_id (0);
46
47   /**
48    * base
49    */
50
51   const u32 gid = get_global_id (0);
52
53   if (gid >= gid_max) return;
54
55   u32 pws0[4] = { 0 };
56   u32 pws1[4] = { 0 };
57
58   pws0[0] = pws[gid].i[0];
59   pws0[1] = pws[gid].i[1];
60   pws0[2] = pws[gid].i[2];
61   pws0[3] = pws[gid].i[3];
62   pws1[0] = pws[gid].i[4];
63   pws1[1] = pws[gid].i[5];
64   pws1[2] = pws[gid].i[6];
65   pws1[3] = pws[gid].i[7];
66
67   const u32 pw_l_len = pws[gid].pw_len;
68
69   /**
70    * base
71    */
72
73   u64 v0p = SIPHASHM_0;
74   u64 v1p = SIPHASHM_1;
75   u64 v2p = SIPHASHM_2;
76   u64 v3p = SIPHASHM_3;
77
78   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
79   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
80   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
81   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
82
83   /**
84    * loop
85    */
86
87   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
88   {
89     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
90
91     const u32x pw_len = pw_l_len + pw_r_len;
92
93     u32x wordr0[4] = { 0 };
94     u32x wordr1[4] = { 0 };
95     u32x wordr2[4] = { 0 };
96     u32x wordr3[4] = { 0 };
97
98     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
99     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
100     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
101     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
102     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
103     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
104     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
105     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
106
107     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
108     {
109       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
110     }
111
112     u32x w[16];
113
114     w[ 0] = wordl0[0] | wordr0[0];
115     w[ 1] = wordl0[1] | wordr0[1];
116     w[ 2] = wordl0[2] | wordr0[2];
117     w[ 3] = wordl0[3] | wordr0[3];
118     w[ 4] = wordl1[0] | wordr1[0];
119     w[ 5] = wordl1[1] | wordr1[1];
120     w[ 6] = wordl1[2] | wordr1[2];
121     w[ 7] = wordl1[3] | wordr1[3];
122     w[ 8] = wordl2[0] | wordr2[0];
123     w[ 9] = wordl2[1] | wordr2[1];
124     w[10] = wordl2[2] | wordr2[2];
125     w[11] = wordl2[3] | wordr2[3];
126     w[12] = wordl3[0] | wordr3[0];
127     w[13] = wordl3[1] | wordr3[1];
128     w[14] = wordl3[2] | wordr3[2];
129     w[15] = wordl3[3] | wordr3[3];
130
131     u64 *w_ptr = (u64 *) w;
132
133     w_ptr[pw_len / 8] |= (u64) pw_len << 56;
134
135     u64 v0 = v0p;
136     u64 v1 = v1p;
137     u64 v2 = v2p;
138     u64 v3 = v3p;
139
140     int i;
141     int j;
142
143     for (i = 0, j = 0; i <= pw_len; i += 8, j += 2)
144     {
145       u64 m = hl32_to_64 (w[j + 1], w[j + 0]);
146
147       v3 ^= m;
148
149       SIPROUND (v0, v1, v2, v3);
150       SIPROUND (v0, v1, v2, v3);
151
152       v0 ^= m;
153     }
154
155     v2 ^= 0xff;
156
157     SIPROUND (v0, v1, v2, v3);
158     SIPROUND (v0, v1, v2, v3);
159     SIPROUND (v0, v1, v2, v3);
160     SIPROUND (v0, v1, v2, v3);
161
162     const u64 v = v0 ^ v1 ^ v2 ^ v3;
163
164     const u32 a = l32_from_64 (v);
165     const u32 b = h32_from_64 (v);
166
167     const u32 r0 = a;
168     const u32 r1 = b;
169     const u32 r2 = 0;
170     const u32 r3 = 0;
171
172     #include COMPARE_M
173   }
174 }
175
176 __kernel void m10100_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)
177 {
178 }
179
180 __kernel void m10100_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)
181 {
182 }
183
184 __kernel void m10100_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)
185 {
186   /**
187    * modifier
188    */
189
190   const u32 lid = get_local_id (0);
191
192   /**
193    * base
194    */
195
196   const u32 gid = get_global_id (0);
197
198   if (gid >= gid_max) return;
199
200   u32 pws0[4] = { 0 };
201   u32 pws1[4] = { 0 };
202
203   pws0[0] = pws[gid].i[0];
204   pws0[1] = pws[gid].i[1];
205   pws0[2] = pws[gid].i[2];
206   pws0[3] = pws[gid].i[3];
207   pws1[0] = pws[gid].i[4];
208   pws1[1] = pws[gid].i[5];
209   pws1[2] = pws[gid].i[6];
210   pws1[3] = pws[gid].i[7];
211
212   const u32 pw_l_len = pws[gid].pw_len;
213
214   /**
215    * digest
216    */
217
218   const u32 search[4] =
219   {
220     digests_buf[digests_offset].digest_buf[DGST_R0],
221     digests_buf[digests_offset].digest_buf[DGST_R1],
222     digests_buf[digests_offset].digest_buf[DGST_R2],
223     digests_buf[digests_offset].digest_buf[DGST_R3]
224   };
225
226   /**
227    * base
228    */
229
230   u64 v0p = SIPHASHM_0;
231   u64 v1p = SIPHASHM_1;
232   u64 v2p = SIPHASHM_2;
233   u64 v3p = SIPHASHM_3;
234
235   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
236   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
237   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
238   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
239
240   /**
241    * loop
242    */
243
244   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos += VECT_SIZE)
245   {
246     const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos);
247
248     const u32x pw_len = pw_l_len + pw_r_len;
249
250     u32x wordr0[4] = { 0 };
251     u32x wordr1[4] = { 0 };
252     u32x wordr2[4] = { 0 };
253     u32x wordr3[4] = { 0 };
254
255     wordr0[0] = ix_create_combt (combs_buf, il_pos, 0);
256     wordr0[1] = ix_create_combt (combs_buf, il_pos, 1);
257     wordr0[2] = ix_create_combt (combs_buf, il_pos, 2);
258     wordr0[3] = ix_create_combt (combs_buf, il_pos, 3);
259     wordr1[0] = ix_create_combt (combs_buf, il_pos, 4);
260     wordr1[1] = ix_create_combt (combs_buf, il_pos, 5);
261     wordr1[2] = ix_create_combt (combs_buf, il_pos, 6);
262     wordr1[3] = ix_create_combt (combs_buf, il_pos, 7);
263
264     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
265     {
266       switch_buffer_by_offset_le (wordr0, wordr1, wordr2, wordr3, pw_l_len);
267     }
268
269     u32x w[16];
270
271     w[ 0] = wordl0[0] | wordr0[0];
272     w[ 1] = wordl0[1] | wordr0[1];
273     w[ 2] = wordl0[2] | wordr0[2];
274     w[ 3] = wordl0[3] | wordr0[3];
275     w[ 4] = wordl1[0] | wordr1[0];
276     w[ 5] = wordl1[1] | wordr1[1];
277     w[ 6] = wordl1[2] | wordr1[2];
278     w[ 7] = wordl1[3] | wordr1[3];
279     w[ 8] = wordl2[0] | wordr2[0];
280     w[ 9] = wordl2[1] | wordr2[1];
281     w[10] = wordl2[2] | wordr2[2];
282     w[11] = wordl2[3] | wordr2[3];
283     w[12] = wordl3[0] | wordr3[0];
284     w[13] = wordl3[1] | wordr3[1];
285     w[14] = wordl3[2] | wordr3[2];
286     w[15] = wordl3[3] | wordr3[3];
287
288     u64 *w_ptr = (u64 *) w;
289
290     w_ptr[pw_len / 8] |= (u64) pw_len << 56;
291
292     u64 v0 = v0p;
293     u64 v1 = v1p;
294     u64 v2 = v2p;
295     u64 v3 = v3p;
296
297     int i;
298     int j;
299
300     for (i = 0, j = 0; i <= pw_len; i += 8, j += 2)
301     {
302       u64 m = hl32_to_64 (w[j + 1], w[j + 0]);
303
304       v3 ^= m;
305
306       SIPROUND (v0, v1, v2, v3);
307       SIPROUND (v0, v1, v2, v3);
308
309       v0 ^= m;
310     }
311
312     v2 ^= 0xff;
313
314     SIPROUND (v0, v1, v2, v3);
315     SIPROUND (v0, v1, v2, v3);
316     SIPROUND (v0, v1, v2, v3);
317     SIPROUND (v0, v1, v2, v3);
318
319     const u64 v = v0 ^ v1 ^ v2 ^ v3;
320
321     const u32 a = l32_from_64 (v);
322     const u32 b = h32_from_64 (v);
323
324     const u32 r0 = a;
325     const u32 r1 = b;
326     const u32 r2 = 0;
327     const u32 r3 = 0;
328
329     #include COMPARE_S
330   }
331 }
332
333 __kernel void m10100_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)
334 {
335 }
336
337 __kernel void m10100_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)
338 {
339 }