Initial commit
[hashcat.git] / amd / m07800_a1.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SAPG_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE1
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE1
21 #endif
22
23 #define DGST_R0 3
24 #define DGST_R1 4
25 #define DGST_R2 2
26 #define DGST_R3 1
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31
32 #ifdef  VECT_SIZE1
33 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
34 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
35 #endif
36
37 #define GETSHIFTEDINT(a,n) amd_bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], (n))
38
39 #define SETSHIFTEDINT(a,n,v)        \
40 {                                   \
41   const u32 s = ((n) & 3) * 8;     \
42   const u64 x = (u64) (v) << s; \
43   (a)[((n)/4)+0] |= x;              \
44   (a)[((n)/4)+1]  = x >> 32;        \
45 }
46
47 __constant u32 theMagicArray[64] =
48 {
49   0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e,
50   0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b,
51   0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7,
52   0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235,
53   0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11,
54   0, 0, 0, 0, 0, 0, 0, 0,
55   0, 0, 0, 0, 0, 0, 0, 0,
56   0, 0, 0, 0, 0, 0, 0, 0
57 };
58
59 static void swap_buffer (u32x final[16])
60 {
61   final[ 0] = swap_workaround (final[ 0]);
62   final[ 1] = swap_workaround (final[ 1]);
63   final[ 2] = swap_workaround (final[ 2]);
64   final[ 3] = swap_workaround (final[ 3]);
65   final[ 4] = swap_workaround (final[ 4]);
66   final[ 5] = swap_workaround (final[ 5]);
67   final[ 6] = swap_workaround (final[ 6]);
68   final[ 7] = swap_workaround (final[ 7]);
69   final[ 8] = swap_workaround (final[ 8]);
70   final[ 9] = swap_workaround (final[ 9]);
71   final[10] = swap_workaround (final[10]);
72   final[11] = swap_workaround (final[11]);
73   final[12] = swap_workaround (final[12]);
74   final[13] = swap_workaround (final[13]);
75   final[14] = swap_workaround (final[14]);
76   final[15] = swap_workaround (final[15]);
77 }
78
79 static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5])
80 {
81   u32x A = digest[0];
82   u32x B = digest[1];
83   u32x C = digest[2];
84   u32x D = digest[3];
85   u32x E = digest[4];
86
87   u32x w0_t = w0[0];
88   u32x w1_t = w0[1];
89   u32x w2_t = w0[2];
90   u32x w3_t = w0[3];
91   u32x w4_t = w1[0];
92   u32x w5_t = w1[1];
93   u32x w6_t = w1[2];
94   u32x w7_t = w1[3];
95   u32x w8_t = w2[0];
96   u32x w9_t = w2[1];
97   u32x wa_t = w2[2];
98   u32x wb_t = w2[3];
99   u32x wc_t = w3[0];
100   u32x wd_t = w3[1];
101   u32x we_t = w3[2];
102   u32x wf_t = w3[3];
103
104   #undef K
105   #define K SHA1C00
106
107   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
108   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
109   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
110   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
111   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
112   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
113   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
114   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
115   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
116   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
117   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
118   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
119   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
120   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
121   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
122   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
123   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
124   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
125   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
126   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
127
128   #undef K
129   #define K SHA1C01
130
131   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
132   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
133   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
134   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
135   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
136   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
137   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
138   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
139   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
140   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
141   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
142   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
143   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
144   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
145   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
146   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
147   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
148   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
149   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
150   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
151
152   #undef K
153   #define K SHA1C02
154
155   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
156   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
157   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
158   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
159   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
160   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
161   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
162   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
163   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
164   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
165   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
166   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
167   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
168   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
169   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
170   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
171   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
172   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
173   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
174   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
175
176   #undef K
177   #define K SHA1C03
178
179   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
180   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
181   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
182   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
183   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
184   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
185   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
186   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
187   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
188   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
189   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
190   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
191   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
192   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
193   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
194   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
195   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
196   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
197   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
198   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
199
200   digest[0] += A;
201   digest[1] += B;
202   digest[2] += C;
203   digest[3] += D;
204   digest[4] += E;
205 }
206
207 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
208 {
209   /**
210    * modifier
211    */
212
213   const u32 lid = get_local_id (0);
214
215   /**
216    * base
217    */
218
219   const u32 gid = get_global_id (0);
220
221   if (gid >= gid_max) return;
222
223   u32x wordl0[4];
224
225   wordl0[0] = pws[gid].i[ 0];
226   wordl0[1] = pws[gid].i[ 1];
227   wordl0[2] = pws[gid].i[ 2];
228   wordl0[3] = pws[gid].i[ 3];
229
230   u32x wordl1[4];
231
232   wordl1[0] = pws[gid].i[ 4];
233   wordl1[1] = pws[gid].i[ 5];
234   wordl1[2] = pws[gid].i[ 6];
235   wordl1[3] = pws[gid].i[ 7];
236
237   u32x wordl2[4];
238
239   wordl2[0] = 0;
240   wordl2[1] = 0;
241   wordl2[2] = 0;
242   wordl2[3] = 0;
243
244   u32x wordl3[4];
245
246   wordl3[0] = 0;
247   wordl3[1] = 0;
248   wordl3[2] = 0;
249   wordl3[3] = 0;
250
251   const u32 pw_l_len = pws[gid].pw_len;
252
253   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
254   {
255     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
256   }
257
258   /**
259    * salt
260    */
261
262   u32 salt_buf[8];
263
264   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
265   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
266   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
267   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
268   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
269   salt_buf[5] = salt_bufs[salt_pos].salt_buf[5];
270   salt_buf[6] = salt_bufs[salt_pos].salt_buf[6];
271   salt_buf[7] = salt_bufs[salt_pos].salt_buf[7];
272
273   const u32 salt_len = salt_bufs[salt_pos].salt_len;
274
275   /**
276    * loop
277    */
278
279   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
280   {
281     const u32 pw_r_len = combs_buf[il_pos].pw_len;
282
283     const u32 pw_len = pw_l_len + pw_r_len;
284
285     u32 wordr0[4];
286
287     wordr0[0] = combs_buf[il_pos].i[0];
288     wordr0[1] = combs_buf[il_pos].i[1];
289     wordr0[2] = combs_buf[il_pos].i[2];
290     wordr0[3] = combs_buf[il_pos].i[3];
291
292     u32 wordr1[4];
293
294     wordr1[0] = combs_buf[il_pos].i[4];
295     wordr1[1] = combs_buf[il_pos].i[5];
296     wordr1[2] = combs_buf[il_pos].i[6];
297     wordr1[3] = combs_buf[il_pos].i[7];
298
299     u32 wordr2[4];
300
301     wordr2[0] = 0;
302     wordr2[1] = 0;
303     wordr2[2] = 0;
304     wordr2[3] = 0;
305
306     u32 wordr3[4];
307
308     wordr3[0] = 0;
309     wordr3[1] = 0;
310     wordr3[2] = 0;
311     wordr3[3] = 0;
312
313     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
314     {
315       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
316     }
317
318     /**
319      * append salt
320      */
321
322     u32 s0[4];
323
324     s0[0] = salt_buf[0];
325     s0[1] = salt_buf[1];
326     s0[2] = salt_buf[2];
327     s0[3] = salt_buf[3];
328
329     u32 s1[4];
330
331     s1[0] = salt_buf[4];
332     s1[1] = salt_buf[5];
333     s1[2] = salt_buf[6];
334     s1[3] = salt_buf[7];
335
336     u32 s2[4];
337
338     s2[0] = 0;
339     s2[1] = 0;
340     s2[2] = 0;
341     s2[3] = 0;
342
343     u32 s3[4];
344
345     s3[0] = 0;
346     s3[1] = 0;
347     s3[2] = 0;
348     s3[3] = 0;
349
350     switch_buffer_by_offset (s0, s1, s2, s3, pw_len);
351
352     const u32 pw_salt_len = pw_len + salt_len;
353
354     u32x w0[4];
355
356     w0[0] = wordl0[0] | wordr0[0];
357     w0[1] = wordl0[1] | wordr0[1];
358     w0[2] = wordl0[2] | wordr0[2];
359     w0[3] = wordl0[3] | wordr0[3];
360
361     u32x w1[4];
362
363     w1[0] = wordl1[0] | wordr1[0];
364     w1[1] = wordl1[1] | wordr1[1];
365     w1[2] = wordl1[2] | wordr1[2];
366     w1[3] = wordl1[3] | wordr1[3];
367
368     u32x w2[4];
369
370     w2[0] = wordl2[0] | wordr2[0];
371     w2[1] = wordl2[1] | wordr2[1];
372     w2[2] = wordl2[2] | wordr2[2];
373     w2[3] = wordl2[3] | wordr2[3];
374
375     u32x w3[4];
376
377     w3[0] = wordl3[0] | wordr3[0];
378     w3[1] = wordl3[1] | wordr3[1];
379     w3[2] = 0;
380     w3[3] = 0;
381
382     /**
383      * sha1
384      */
385
386     u32x final[256];
387
388     final[ 0] = swap_workaround (w0[0] | s0[0]);
389     final[ 1] = swap_workaround (w0[1] | s0[1]);
390     final[ 2] = swap_workaround (w0[2] | s0[2]);
391     final[ 3] = swap_workaround (w0[3] | s0[3]);
392     final[ 4] = swap_workaround (w1[0] | s1[0]);
393     final[ 5] = swap_workaround (w1[1] | s1[1]);
394     final[ 6] = swap_workaround (w1[2] | s1[2]);
395     final[ 7] = swap_workaround (w1[3] | s1[3]);
396     final[ 8] = swap_workaround (w2[0] | s2[0]);
397     final[ 9] = swap_workaround (w2[1] | s2[1]);
398     final[10] = swap_workaround (w2[2] | s2[2]);
399     final[11] = swap_workaround (w2[3] | s2[3]);
400     final[12] = swap_workaround (w3[0] | s3[0]);
401     final[13] = swap_workaround (w3[1] | s3[1]);
402     final[14] = 0;
403     final[15] = pw_salt_len * 8;
404
405     u32x digest[5];
406
407     digest[0] = SHA1M_A;
408     digest[1] = SHA1M_B;
409     digest[2] = SHA1M_C;
410     digest[3] = SHA1M_D;
411     digest[4] = SHA1M_E;
412
413     sha1_transform (&final[0], &final[4], &final[8], &final[12], digest);
414
415     // prepare magic array range
416
417     u32x lengthMagicArray = 0x20;
418     u32x offsetMagicArray = 0;
419
420     lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6;
421     lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6;
422     lengthMagicArray += ((digest[0] >>  8) & 0xff) % 6;
423     lengthMagicArray += ((digest[0] >>  0) & 0xff) % 6;
424     lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6;
425     lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6;
426     lengthMagicArray += ((digest[1] >>  8) & 0xff) % 6;
427     lengthMagicArray += ((digest[1] >>  0) & 0xff) % 6;
428     lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6;
429     lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6;
430     offsetMagicArray += ((digest[2] >>  8) & 0xff) % 8;
431     offsetMagicArray += ((digest[2] >>  0) & 0xff) % 8;
432     offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8;
433     offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8;
434     offsetMagicArray += ((digest[3] >>  8) & 0xff) % 8;
435     offsetMagicArray += ((digest[3] >>  0) & 0xff) % 8;
436     offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8;
437     offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8;
438     offsetMagicArray += ((digest[4] >>  8) & 0xff) % 8;
439     offsetMagicArray += ((digest[4] >>  0) & 0xff) % 8;
440
441     // final
442
443     digest[0] = SHA1M_A;
444     digest[1] = SHA1M_B;
445     digest[2] = SHA1M_C;
446     digest[3] = SHA1M_D;
447     digest[4] = SHA1M_E;
448
449     #pragma unroll 64
450     for (int i = 0; i < 64; i++) final[i] = 0;
451
452     final[0] = w0[0];
453     final[1] = w0[1];
454     final[2] = w0[2];
455     final[3] = w0[3];
456     final[4] = w1[0];
457     final[5] = w1[1];
458     final[6] = w1[2];
459     final[7] = w1[3];
460
461     u32 final_len = pw_len;
462
463     int i;
464
465     // append MagicArray
466
467     for (i = 0; i < lengthMagicArray - 4; i += 4)
468     {
469       const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i);
470
471       SETSHIFTEDINT (final, final_len + i, tmp);
472     }
473
474     const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8);
475
476     const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask;
477
478     SETSHIFTEDINT (final, final_len + i, tmp);
479
480     final_len += lengthMagicArray;
481
482     // append Salt
483
484     for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80
485     {
486       const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[]
487
488       SETSHIFTEDINT (final, final_len + i, tmp);
489     }
490
491     final_len += salt_len;
492
493     // calculate
494
495     int left;
496     int off;
497
498     for (left = final_len, off = 0; left >= 56; left -= 64, off += 16)
499     {
500       swap_buffer (&final[off]);
501
502       sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest);
503     }
504
505     swap_buffer (&final[off]);
506
507     final[off + 14] = 0;
508     final[off + 15] = final_len * 8;
509
510     sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest);
511
512     const u32x r0 = digest[3];
513     const u32x r1 = digest[4];
514     const u32x r2 = digest[2];
515     const u32x r3 = digest[1];
516
517     #include VECT_COMPARE_M
518   }
519 }
520
521 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
522 {
523 }
524
525 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
526 {
527 }
528
529 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
530 {
531   /**
532    * modifier
533    */
534
535   const u32 lid = get_local_id (0);
536
537   /**
538    * base
539    */
540
541   const u32 gid = get_global_id (0);
542
543   if (gid >= gid_max) return;
544
545   u32x wordl0[4];
546
547   wordl0[0] = pws[gid].i[ 0];
548   wordl0[1] = pws[gid].i[ 1];
549   wordl0[2] = pws[gid].i[ 2];
550   wordl0[3] = pws[gid].i[ 3];
551
552   u32x wordl1[4];
553
554   wordl1[0] = pws[gid].i[ 4];
555   wordl1[1] = pws[gid].i[ 5];
556   wordl1[2] = pws[gid].i[ 6];
557   wordl1[3] = pws[gid].i[ 7];
558
559   u32x wordl2[4];
560
561   wordl2[0] = 0;
562   wordl2[1] = 0;
563   wordl2[2] = 0;
564   wordl2[3] = 0;
565
566   u32x wordl3[4];
567
568   wordl3[0] = 0;
569   wordl3[1] = 0;
570   wordl3[2] = 0;
571   wordl3[3] = 0;
572
573   const u32 pw_l_len = pws[gid].pw_len;
574
575   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
576   {
577     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
578   }
579
580   const u32 search[4] =
581   {
582     digests_buf[digests_offset].digest_buf[DGST_R0],
583     digests_buf[digests_offset].digest_buf[DGST_R1],
584     digests_buf[digests_offset].digest_buf[DGST_R2],
585     digests_buf[digests_offset].digest_buf[DGST_R3]
586   };
587
588   /**
589    * salt
590    */
591
592   u32 salt_buf[8];
593
594   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
595   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
596   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
597   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
598   salt_buf[4] = salt_bufs[salt_pos].salt_buf[4];
599   salt_buf[5] = salt_bufs[salt_pos].salt_buf[5];
600   salt_buf[6] = salt_bufs[salt_pos].salt_buf[6];
601   salt_buf[7] = salt_bufs[salt_pos].salt_buf[7];
602
603   const u32 salt_len = salt_bufs[salt_pos].salt_len;
604
605   /**
606    * loop
607    */
608
609   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
610   {
611     const u32 pw_r_len = combs_buf[il_pos].pw_len;
612
613     const u32 pw_len = pw_l_len + pw_r_len;
614
615     u32 wordr0[4];
616
617     wordr0[0] = combs_buf[il_pos].i[0];
618     wordr0[1] = combs_buf[il_pos].i[1];
619     wordr0[2] = combs_buf[il_pos].i[2];
620     wordr0[3] = combs_buf[il_pos].i[3];
621
622     u32 wordr1[4];
623
624     wordr1[0] = combs_buf[il_pos].i[4];
625     wordr1[1] = combs_buf[il_pos].i[5];
626     wordr1[2] = combs_buf[il_pos].i[6];
627     wordr1[3] = combs_buf[il_pos].i[7];
628
629     u32 wordr2[4];
630
631     wordr2[0] = 0;
632     wordr2[1] = 0;
633     wordr2[2] = 0;
634     wordr2[3] = 0;
635
636     u32 wordr3[4];
637
638     wordr3[0] = 0;
639     wordr3[1] = 0;
640     wordr3[2] = 0;
641     wordr3[3] = 0;
642
643     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
644     {
645       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
646     }
647
648     /**
649      * append salt
650      */
651
652     u32 s0[4];
653
654     s0[0] = salt_buf[0];
655     s0[1] = salt_buf[1];
656     s0[2] = salt_buf[2];
657     s0[3] = salt_buf[3];
658
659     u32 s1[4];
660
661     s1[0] = salt_buf[4];
662     s1[1] = salt_buf[5];
663     s1[2] = salt_buf[6];
664     s1[3] = salt_buf[7];
665
666     u32 s2[4];
667
668     s2[0] = 0;
669     s2[1] = 0;
670     s2[2] = 0;
671     s2[3] = 0;
672
673     u32 s3[4];
674
675     s3[0] = 0;
676     s3[1] = 0;
677     s3[2] = 0;
678     s3[3] = 0;
679
680     switch_buffer_by_offset (s0, s1, s2, s3, pw_len);
681
682     const u32 pw_salt_len = pw_len + salt_len;
683
684     u32x w0[4];
685
686     w0[0] = wordl0[0] | wordr0[0];
687     w0[1] = wordl0[1] | wordr0[1];
688     w0[2] = wordl0[2] | wordr0[2];
689     w0[3] = wordl0[3] | wordr0[3];
690
691     u32x w1[4];
692
693     w1[0] = wordl1[0] | wordr1[0];
694     w1[1] = wordl1[1] | wordr1[1];
695     w1[2] = wordl1[2] | wordr1[2];
696     w1[3] = wordl1[3] | wordr1[3];
697
698     u32x w2[4];
699
700     w2[0] = wordl2[0] | wordr2[0];
701     w2[1] = wordl2[1] | wordr2[1];
702     w2[2] = wordl2[2] | wordr2[2];
703     w2[3] = wordl2[3] | wordr2[3];
704
705     u32x w3[4];
706
707     w3[0] = wordl3[0] | wordr3[0];
708     w3[1] = wordl3[1] | wordr3[1];
709     w3[2] = 0;
710     w3[3] = 0;
711
712     /**
713      * sha1
714      */
715
716     u32x final[256];
717
718     final[ 0] = swap_workaround (w0[0] | s0[0]);
719     final[ 1] = swap_workaround (w0[1] | s0[1]);
720     final[ 2] = swap_workaround (w0[2] | s0[2]);
721     final[ 3] = swap_workaround (w0[3] | s0[3]);
722     final[ 4] = swap_workaround (w1[0] | s1[0]);
723     final[ 5] = swap_workaround (w1[1] | s1[1]);
724     final[ 6] = swap_workaround (w1[2] | s1[2]);
725     final[ 7] = swap_workaround (w1[3] | s1[3]);
726     final[ 8] = swap_workaround (w2[0] | s2[0]);
727     final[ 9] = swap_workaround (w2[1] | s2[1]);
728     final[10] = swap_workaround (w2[2] | s2[2]);
729     final[11] = swap_workaround (w2[3] | s2[3]);
730     final[12] = swap_workaround (w3[0] | s3[0]);
731     final[13] = swap_workaround (w3[1] | s3[1]);
732     final[14] = 0;
733     final[15] = pw_salt_len * 8;
734
735     u32x digest[5];
736
737     digest[0] = SHA1M_A;
738     digest[1] = SHA1M_B;
739     digest[2] = SHA1M_C;
740     digest[3] = SHA1M_D;
741     digest[4] = SHA1M_E;
742
743     sha1_transform (&final[0], &final[4], &final[8], &final[12], digest);
744
745     // prepare magic array range
746
747     u32x lengthMagicArray = 0x20;
748     u32x offsetMagicArray = 0;
749
750     lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6;
751     lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6;
752     lengthMagicArray += ((digest[0] >>  8) & 0xff) % 6;
753     lengthMagicArray += ((digest[0] >>  0) & 0xff) % 6;
754     lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6;
755     lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6;
756     lengthMagicArray += ((digest[1] >>  8) & 0xff) % 6;
757     lengthMagicArray += ((digest[1] >>  0) & 0xff) % 6;
758     lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6;
759     lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6;
760     offsetMagicArray += ((digest[2] >>  8) & 0xff) % 8;
761     offsetMagicArray += ((digest[2] >>  0) & 0xff) % 8;
762     offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8;
763     offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8;
764     offsetMagicArray += ((digest[3] >>  8) & 0xff) % 8;
765     offsetMagicArray += ((digest[3] >>  0) & 0xff) % 8;
766     offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8;
767     offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8;
768     offsetMagicArray += ((digest[4] >>  8) & 0xff) % 8;
769     offsetMagicArray += ((digest[4] >>  0) & 0xff) % 8;
770
771     // final
772
773     digest[0] = SHA1M_A;
774     digest[1] = SHA1M_B;
775     digest[2] = SHA1M_C;
776     digest[3] = SHA1M_D;
777     digest[4] = SHA1M_E;
778
779     #pragma unroll 64
780     for (int i = 0; i < 64; i++) final[i] = 0;
781
782     final[0] = w0[0];
783     final[1] = w0[1];
784     final[2] = w0[2];
785     final[3] = w0[3];
786     final[4] = w1[0];
787     final[5] = w1[1];
788     final[6] = w1[2];
789     final[7] = w1[3];
790
791     u32 final_len = pw_len;
792
793     int i;
794
795     // append MagicArray
796
797     for (i = 0; i < lengthMagicArray - 4; i += 4)
798     {
799       const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i);
800
801       SETSHIFTEDINT (final, final_len + i, tmp);
802     }
803
804     const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8);
805
806     const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask;
807
808     SETSHIFTEDINT (final, final_len + i, tmp);
809
810     final_len += lengthMagicArray;
811
812     // append Salt
813
814     for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80
815     {
816       const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[]
817
818       SETSHIFTEDINT (final, final_len + i, tmp);
819     }
820
821     final_len += salt_len;
822
823     // calculate
824
825     int left;
826     int off;
827
828     for (left = final_len, off = 0; left >= 56; left -= 64, off += 16)
829     {
830       swap_buffer (&final[off]);
831
832       sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest);
833     }
834
835     swap_buffer (&final[off]);
836
837     final[off + 14] = 0;
838     final[off + 15] = final_len * 8;
839
840     sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest);
841
842     const u32x r0 = digest[3];
843     const u32x r1 = digest[4];
844     const u32x r2 = digest[2];
845     const u32x r3 = digest[1];
846
847     #include VECT_COMPARE_S
848   }
849 }
850
851 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
852 {
853 }
854
855 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_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)
856 {
857 }