Merge pull request #202 from magnumripper/master
[hashcat.git] / OpenCL / m10100_a0.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 "include/rp_kernel.h"
22 #include "OpenCL/rp.c"
23 #include "OpenCL/simd.c"
24
25 #define SIPROUND(v0,v1,v2,v3) \
26   (v0) += (v1);               \
27   (v1)  = rotl64 ((v1), 13);  \
28   (v1) ^= (v0);               \
29   (v0)  = rotl64 ((v0), 32);  \
30   (v2) += (v3);               \
31   (v3)  = rotl64 ((v3), 16);  \
32   (v3) ^= (v2);               \
33   (v0) += (v3);               \
34   (v3)  = rotl64 ((v3), 21);  \
35   (v3) ^= (v0);               \
36   (v2) += (v1);               \
37   (v1)  = rotl64 ((v1), 17);  \
38   (v1) ^= (v2);               \
39   (v2)  = rotl64 ((v2), 32)
40
41 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
42 {
43   /**
44    * modifier
45    */
46
47   const u32 lid = get_local_id (0);
48
49   /**
50    * base
51    */
52
53   const u32 gid = get_global_id (0);
54
55   if (gid >= gid_max) return;
56
57   u32 pw_buf0[4];
58
59   pw_buf0[0] = pws[gid].i[ 0];
60   pw_buf0[1] = pws[gid].i[ 1];
61   pw_buf0[2] = pws[gid].i[ 2];
62   pw_buf0[3] = pws[gid].i[ 3];
63
64   u32 pw_buf1[4];
65
66   pw_buf1[0] = pws[gid].i[ 4];
67   pw_buf1[1] = pws[gid].i[ 5];
68   pw_buf1[2] = pws[gid].i[ 6];
69   pw_buf1[3] = pws[gid].i[ 7];
70
71   const u32 pw_len = pws[gid].pw_len;
72
73   /**
74    * base
75    */
76
77   u64x v0p = SIPHASHM_0;
78   u64x v1p = SIPHASHM_1;
79   u64x v2p = SIPHASHM_2;
80   u64x v3p = SIPHASHM_3;
81
82   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
83   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
84   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
85   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
86
87   /**
88    * loop
89    */
90
91   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos += VECT_SIZE)
92   {
93     u32x w0[4] = { 0 };
94     u32x w1[4] = { 0 };
95     u32x w2[4] = { 0 };
96     u32x w3[4] = { 0 };
97
98     const u32 out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
99
100     switch (out_len / 8)
101     {
102       case 0: w0[1] |= out_len << 24; break;
103       case 1: w0[3] |= out_len << 24; break;
104       case 2: w1[1] |= out_len << 24; break;
105       case 3: w1[3] |= out_len << 24; break;
106     }
107
108     u64x v0 = v0p;
109     u64x v1 = v1p;
110     u64x v2 = v2p;
111     u64x v3 = v3p;
112
113     int i;
114     int j;
115
116     for (i = 0, j = 0; i <= out_len && i < 16; i += 8, j += 2)
117     {
118       u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]);
119
120       v3 ^= m;
121
122       SIPROUND (v0, v1, v2, v3);
123       SIPROUND (v0, v1, v2, v3);
124
125       v0 ^= m;
126     }
127
128     for (       j = 0; i <= out_len && i < 32; i += 8, j += 2)
129     {
130       u64x m = hl32_to_64 (w1[j + 1], w1[j + 0]);
131
132       v3 ^= m;
133
134       SIPROUND (v0, v1, v2, v3);
135       SIPROUND (v0, v1, v2, v3);
136
137       v0 ^= m;
138     }
139
140     v2 ^= 0xff;
141
142     SIPROUND (v0, v1, v2, v3);
143     SIPROUND (v0, v1, v2, v3);
144     SIPROUND (v0, v1, v2, v3);
145     SIPROUND (v0, v1, v2, v3);
146
147     const u64x v = v0 ^ v1 ^ v2 ^ v3;
148
149     const u32x a = l32_from_64 (v);
150     const u32x b = h32_from_64 (v);
151     const u32x c = 0;
152     const u32x d = 0;
153
154     COMPARE_M_SIMD (a, b, c, d);
155   }
156 }
157
158 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
159 {
160 }
161
162 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
163 {
164 }
165
166 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
167 {
168   /**
169    * modifier
170    */
171
172   const u32 lid = get_local_id (0);
173
174   /**
175    * base
176    */
177
178   const u32 gid = get_global_id (0);
179
180   if (gid >= gid_max) return;
181
182   u32 pw_buf0[4];
183
184   pw_buf0[0] = pws[gid].i[ 0];
185   pw_buf0[1] = pws[gid].i[ 1];
186   pw_buf0[2] = pws[gid].i[ 2];
187   pw_buf0[3] = pws[gid].i[ 3];
188
189   u32 pw_buf1[4];
190
191   pw_buf1[0] = pws[gid].i[ 4];
192   pw_buf1[1] = pws[gid].i[ 5];
193   pw_buf1[2] = pws[gid].i[ 6];
194   pw_buf1[3] = pws[gid].i[ 7];
195
196   const u32 pw_len = pws[gid].pw_len;
197
198   /**
199    * base
200    */
201
202   u64x v0p = SIPHASHM_0;
203   u64x v1p = SIPHASHM_1;
204   u64x v2p = SIPHASHM_2;
205   u64x v3p = SIPHASHM_3;
206
207   v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
208   v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
209   v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]);
210   v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]);
211
212   /**
213    * digest
214    */
215
216   const u32 search[4] =
217   {
218     digests_buf[digests_offset].digest_buf[DGST_R0],
219     digests_buf[digests_offset].digest_buf[DGST_R1],
220     digests_buf[digests_offset].digest_buf[DGST_R2],
221     digests_buf[digests_offset].digest_buf[DGST_R3]
222   };
223
224   /**
225    * loop
226    */
227
228   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos += VECT_SIZE)
229   {
230     u32x w0[4] = { 0 };
231     u32x w1[4] = { 0 };
232     u32x w2[4] = { 0 };
233     u32x w3[4] = { 0 };
234
235     const u32 out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
236
237     switch (out_len / 8)
238     {
239       case 0: w0[1] |= out_len << 24; break;
240       case 1: w0[3] |= out_len << 24; break;
241       case 2: w1[1] |= out_len << 24; break;
242       case 3: w1[3] |= out_len << 24; break;
243     }
244
245     u64x v0 = v0p;
246     u64x v1 = v1p;
247     u64x v2 = v2p;
248     u64x v3 = v3p;
249
250     int i;
251     int j;
252
253     for (i = 0, j = 0; i <= out_len && i < 16; i += 8, j += 2)
254     {
255       u64x m = hl32_to_64 (w0[j + 1], w0[j + 0]);
256
257       v3 ^= m;
258
259       SIPROUND (v0, v1, v2, v3);
260       SIPROUND (v0, v1, v2, v3);
261
262       v0 ^= m;
263     }
264
265     for (       j = 0; i <= out_len && i < 32; i += 8, j += 2)
266     {
267       u64x m = hl32_to_64 (w1[j + 1], w1[j + 0]);
268
269       v3 ^= m;
270
271       SIPROUND (v0, v1, v2, v3);
272       SIPROUND (v0, v1, v2, v3);
273
274       v0 ^= m;
275     }
276
277     v2 ^= 0xff;
278
279     SIPROUND (v0, v1, v2, v3);
280     SIPROUND (v0, v1, v2, v3);
281     SIPROUND (v0, v1, v2, v3);
282     SIPROUND (v0, v1, v2, v3);
283
284     const u64x v = v0 ^ v1 ^ v2 ^ v3;
285
286     const u32x a = l32_from_64 (v);
287     const u32x b = h32_from_64 (v);
288     const u32x c = 0;
289     const u32x d = 0;
290
291     COMPARE_S_SIMD (a, b, c, d);
292   }
293 }
294
295 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
296 {
297 }
298
299 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
300 {
301 }