- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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 #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 "types_ocl.c"
18 #include "common.c"
19
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "check_multi_comp4.c"
22
23 #ifdef VECT_SIZE1
24 #define SIPROUND(v0,v1,v2,v3) \
25   (v0) += (v1);               \
26   (v1)  = rotl64 ((v1), 13);  \
27   (v1) ^= (v0);               \
28   (v0)  = as_ulong (as_uint2 ((v0)).s10); \
29   (v2) += (v3);               \
30   (v3)  = rotl64 ((v3), 16);  \
31   (v3) ^= (v2);               \
32   (v0) += (v3);               \
33   (v3)  = rotl64 ((v3), 21);  \
34   (v3) ^= (v0);               \
35   (v2) += (v1);               \
36   (v1)  = rotl64 ((v1), 17);  \
37   (v1) ^= (v2);               \
38   (v2)  = as_ulong (as_uint2 ((v2)).s10);
39 #else
40 #define SIPROUND(v0,v1,v2,v3) \
41   (v0) += (v1);               \
42   (v1)  = rotl64 ((v1), 13);  \
43   (v1) ^= (v0);               \
44   (v0)  = rotl64 ((v0), 32);  \
45   (v2) += (v3);               \
46   (v3)  = rotl64 ((v3), 16);  \
47   (v3) ^= (v2);               \
48   (v0) += (v3);               \
49   (v3)  = rotl64 ((v3), 21);  \
50   (v3) ^= (v0);               \
51   (v2) += (v1);               \
52   (v1)  = rotl64 ((v1), 17);  \
53   (v1) ^= (v2);               \
54   (v2)  = rotl64 ((v2), 32);
55 #endif
56
57 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
58 {
59   /**
60    * modifier
61    */
62
63   const u32 lid = get_local_id (0);
64
65   /**
66    * base
67    */
68
69   const u32 gid = get_global_id (0);
70
71   if (gid >= gid_max) return;
72
73   u32 wordl0[4];
74
75   wordl0[0] = pws[gid].i[ 0];
76   wordl0[1] = pws[gid].i[ 1];
77   wordl0[2] = pws[gid].i[ 2];
78   wordl0[3] = pws[gid].i[ 3];
79
80   u32 wordl1[4];
81
82   wordl1[0] = pws[gid].i[ 4];
83   wordl1[1] = pws[gid].i[ 5];
84   wordl1[2] = pws[gid].i[ 6];
85   wordl1[3] = pws[gid].i[ 7];
86
87   u32 wordl2[4];
88
89   wordl2[0] = 0;
90   wordl2[1] = 0;
91   wordl2[2] = 0;
92   wordl2[3] = 0;
93
94   u32 wordl3[4];
95
96   wordl3[0] = 0;
97   wordl3[1] = 0;
98   wordl3[2] = 0;
99   wordl3[3] = 0;
100
101   const u32 pw_l_len = pws[gid].pw_len;
102
103   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
104   {
105     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
106   }
107
108   /**
109    * base
110    */
111
112   u64 v0p = SIPHASHM_0;
113   u64 v1p = SIPHASHM_1;
114   u64 v2p = SIPHASHM_2;
115   u64 v3p = SIPHASHM_3;
116
117   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
118   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
119   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
120   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
121
122   /**
123    * loop
124    */
125
126   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
127   {
128     const u32 pw_r_len = combs_buf[il_pos].pw_len;
129
130     const u32 pw_len = pw_l_len + pw_r_len;
131
132     u32 wordr0[4];
133
134     wordr0[0] = combs_buf[il_pos].i[0];
135     wordr0[1] = combs_buf[il_pos].i[1];
136     wordr0[2] = combs_buf[il_pos].i[2];
137     wordr0[3] = combs_buf[il_pos].i[3];
138
139     u32 wordr1[4];
140
141     wordr1[0] = combs_buf[il_pos].i[4];
142     wordr1[1] = combs_buf[il_pos].i[5];
143     wordr1[2] = combs_buf[il_pos].i[6];
144     wordr1[3] = combs_buf[il_pos].i[7];
145
146     u32 wordr2[4];
147
148     wordr2[0] = 0;
149     wordr2[1] = 0;
150     wordr2[2] = 0;
151     wordr2[3] = 0;
152
153     u32 wordr3[4];
154
155     wordr3[0] = 0;
156     wordr3[1] = 0;
157     wordr3[2] = 0;
158     wordr3[3] = 0;
159
160     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
161     {
162       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
163     }
164
165     u32 w[16];
166
167     w[ 0] = wordl0[0] | wordr0[0];
168     w[ 1] = wordl0[1] | wordr0[1];
169     w[ 2] = wordl0[2] | wordr0[2];
170     w[ 3] = wordl0[3] | wordr0[3];
171     w[ 4] = wordl1[0] | wordr1[0];
172     w[ 5] = wordl1[1] | wordr1[1];
173     w[ 6] = wordl1[2] | wordr1[2];
174     w[ 7] = wordl1[3] | wordr1[3];
175     w[ 8] = wordl2[0] | wordr2[0];
176     w[ 9] = wordl2[1] | wordr2[1];
177     w[10] = wordl2[2] | wordr2[2];
178     w[11] = wordl2[3] | wordr2[3];
179     w[12] = wordl3[0] | wordr3[0];
180     w[13] = wordl3[1] | wordr3[1];
181     w[14] = wordl3[2] | wordr3[2];
182     w[15] = wordl3[3] | wordr3[3];
183
184     u64 *w_ptr = (u64 *) w;
185
186     w_ptr[pw_len / 8] |= (u64) pw_len << 56;
187
188     u64 v0 = v0p;
189     u64 v1 = v1p;
190     u64 v2 = v2p;
191     u64 v3 = v3p;
192
193     int i;
194     int j;
195
196     for (i = 0, j = 0; i <= pw_len; i += 8, j += 2)
197     {
198       u64 m = hl32_to_64 (w[j + 1], w[j + 0]);
199
200       v3 ^= m;
201
202       SIPROUND (v0, v1, v2, v3);
203       SIPROUND (v0, v1, v2, v3);
204
205       v0 ^= m;
206     }
207
208     v2 ^= 0xff;
209
210     SIPROUND (v0, v1, v2, v3);
211     SIPROUND (v0, v1, v2, v3);
212     SIPROUND (v0, v1, v2, v3);
213     SIPROUND (v0, v1, v2, v3);
214
215     const u64 v = v0 ^ v1 ^ v2 ^ v3;
216
217     const u32 a = l32_from_64 (v);
218     const u32 b = h32_from_64 (v);
219
220     const u32 r0 = a;
221     const u32 r1 = b;
222     const u32 r2 = 0;
223     const u32 r3 = 0;
224
225     #include COMPARE_M
226   }
227 }
228
229 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
230 {
231 }
232
233 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
234 {
235 }
236
237 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
238 {
239   /**
240    * modifier
241    */
242
243   const u32 lid = get_local_id (0);
244
245   /**
246    * base
247    */
248
249   const u32 gid = get_global_id (0);
250
251   if (gid >= gid_max) return;
252
253   u32 wordl0[4];
254
255   wordl0[0] = pws[gid].i[ 0];
256   wordl0[1] = pws[gid].i[ 1];
257   wordl0[2] = pws[gid].i[ 2];
258   wordl0[3] = pws[gid].i[ 3];
259
260   u32 wordl1[4];
261
262   wordl1[0] = pws[gid].i[ 4];
263   wordl1[1] = pws[gid].i[ 5];
264   wordl1[2] = pws[gid].i[ 6];
265   wordl1[3] = pws[gid].i[ 7];
266
267   u32 wordl2[4];
268
269   wordl2[0] = 0;
270   wordl2[1] = 0;
271   wordl2[2] = 0;
272   wordl2[3] = 0;
273
274   u32 wordl3[4];
275
276   wordl3[0] = 0;
277   wordl3[1] = 0;
278   wordl3[2] = 0;
279   wordl3[3] = 0;
280
281   const u32 pw_l_len = pws[gid].pw_len;
282
283   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
284   {
285     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
286   }
287
288   /**
289    * digest
290    */
291
292   const u32 search[4] =
293   {
294     digests_buf[digests_offset].digest_buf[DGST_R0],
295     digests_buf[digests_offset].digest_buf[DGST_R1],
296     digests_buf[digests_offset].digest_buf[DGST_R2],
297     digests_buf[digests_offset].digest_buf[DGST_R3]
298   };
299
300   /**
301    * base
302    */
303
304   u64 v0p = SIPHASHM_0;
305   u64 v1p = SIPHASHM_1;
306   u64 v2p = SIPHASHM_2;
307   u64 v3p = SIPHASHM_3;
308
309   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
310   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
311   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
312   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
313
314   /**
315    * loop
316    */
317
318   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
319   {
320     const u32 pw_r_len = combs_buf[il_pos].pw_len;
321
322     const u32 pw_len = pw_l_len + pw_r_len;
323
324     u32 wordr0[4];
325
326     wordr0[0] = combs_buf[il_pos].i[0];
327     wordr0[1] = combs_buf[il_pos].i[1];
328     wordr0[2] = combs_buf[il_pos].i[2];
329     wordr0[3] = combs_buf[il_pos].i[3];
330
331     u32 wordr1[4];
332
333     wordr1[0] = combs_buf[il_pos].i[4];
334     wordr1[1] = combs_buf[il_pos].i[5];
335     wordr1[2] = combs_buf[il_pos].i[6];
336     wordr1[3] = combs_buf[il_pos].i[7];
337
338     u32 wordr2[4];
339
340     wordr2[0] = 0;
341     wordr2[1] = 0;
342     wordr2[2] = 0;
343     wordr2[3] = 0;
344
345     u32 wordr3[4];
346
347     wordr3[0] = 0;
348     wordr3[1] = 0;
349     wordr3[2] = 0;
350     wordr3[3] = 0;
351
352     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
353     {
354       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
355     }
356
357     u32 w[16];
358
359     w[ 0] = wordl0[0] | wordr0[0];
360     w[ 1] = wordl0[1] | wordr0[1];
361     w[ 2] = wordl0[2] | wordr0[2];
362     w[ 3] = wordl0[3] | wordr0[3];
363     w[ 4] = wordl1[0] | wordr1[0];
364     w[ 5] = wordl1[1] | wordr1[1];
365     w[ 6] = wordl1[2] | wordr1[2];
366     w[ 7] = wordl1[3] | wordr1[3];
367     w[ 8] = wordl2[0] | wordr2[0];
368     w[ 9] = wordl2[1] | wordr2[1];
369     w[10] = wordl2[2] | wordr2[2];
370     w[11] = wordl2[3] | wordr2[3];
371     w[12] = wordl3[0] | wordr3[0];
372     w[13] = wordl3[1] | wordr3[1];
373     w[14] = wordl3[2] | wordr3[2];
374     w[15] = wordl3[3] | wordr3[3];
375
376     u64 *w_ptr = (u64 *) w;
377
378     w_ptr[pw_len / 8] |= (u64) pw_len << 56;
379
380     u64 v0 = v0p;
381     u64 v1 = v1p;
382     u64 v2 = v2p;
383     u64 v3 = v3p;
384
385     int i;
386     int j;
387
388     for (i = 0, j = 0; i <= pw_len; i += 8, j += 2)
389     {
390       u64 m = hl32_to_64 (w[j + 1], w[j + 0]);
391
392       v3 ^= m;
393
394       SIPROUND (v0, v1, v2, v3);
395       SIPROUND (v0, v1, v2, v3);
396
397       v0 ^= m;
398     }
399
400     v2 ^= 0xff;
401
402     SIPROUND (v0, v1, v2, v3);
403     SIPROUND (v0, v1, v2, v3);
404     SIPROUND (v0, v1, v2, v3);
405     SIPROUND (v0, v1, v2, v3);
406
407     const u64 v = v0 ^ v1 ^ v2 ^ v3;
408
409     const u32 a = l32_from_64 (v);
410     const u32 b = h32_from_64 (v);
411
412     const u32 r0 = a;
413     const u32 r1 = b;
414     const u32 r2 = 0;
415     const u32 r3 = 0;
416
417     #include COMPARE_S
418   }
419 }
420
421 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
422 {
423 }
424
425 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_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 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)
426 {
427 }