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