Merge branch 'GetRidOfCUDA'
[hashcat.git] / OpenCL / m08300_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 3
12 #define DGST_R1 4
13 #define DGST_R2 2
14 #define DGST_R3 1
15
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
18 #include "common.c"
19 #include "include/rp_gpu.h"
20 #include "rp.c"
21
22 #define COMPARE_S "check_single_comp4.c"
23 #define COMPARE_M "check_multi_comp4.c"
24
25 static void sha1_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[5])
26 {
27   u32 A = digest[0];
28   u32 B = digest[1];
29   u32 C = digest[2];
30   u32 D = digest[3];
31   u32 E = digest[4];
32
33   u32 w0_t = w0[0];
34   u32 w1_t = w0[1];
35   u32 w2_t = w0[2];
36   u32 w3_t = w0[3];
37   u32 w4_t = w1[0];
38   u32 w5_t = w1[1];
39   u32 w6_t = w1[2];
40   u32 w7_t = w1[3];
41   u32 w8_t = w2[0];
42   u32 w9_t = w2[1];
43   u32 wa_t = w2[2];
44   u32 wb_t = w2[3];
45   u32 wc_t = w3[0];
46   u32 wd_t = w3[1];
47   u32 we_t = w3[2];
48   u32 wf_t = w3[3];
49
50   #undef K
51   #define K SHA1C00
52
53   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
54   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
55   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
56   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
57   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
58   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
59   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
60   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
61   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
62   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
63   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
64   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
65   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
66   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
67   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
68   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
69   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
70   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
71   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
72   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
73
74   #undef K
75   #define K SHA1C01
76
77   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
78   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
79   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
80   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
81   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
82   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
83   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
84   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
85   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
86   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
87   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
88   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
89   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
90   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
91   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
92   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
93   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
94   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
95   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
96   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
97
98   #undef K
99   #define K SHA1C02
100
101   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
102   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
103   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
104   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
105   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
106   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
107   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
108   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
109   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
110   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
111   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
112   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
113   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
114   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
115   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
116   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
117   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
118   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
119   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
120   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
121
122   #undef K
123   #define K SHA1C03
124
125   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
126   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
127   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
128   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
129   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
130   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
131   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
132   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
133   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
134   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
135   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
136   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
137   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
138   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
139   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
140   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
141   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
142   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
143   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
144   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
145
146   digest[0] += A;
147   digest[1] += B;
148   digest[2] += C;
149   digest[3] += D;
150   digest[4] += E;
151 }
152
153 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
154 {
155   /**
156    * modifier
157    */
158
159   const u32 lid = get_local_id (0);
160
161   /**
162    * base
163    */
164
165   const u32 gid = get_global_id (0);
166
167   if (gid >= gid_max) return;
168
169   u32 pw_buf0[4];
170
171   pw_buf0[0] = pws[gid].i[ 0];
172   pw_buf0[1] = pws[gid].i[ 1];
173   pw_buf0[2] = pws[gid].i[ 2];
174   pw_buf0[3] = pws[gid].i[ 3];
175
176   u32 pw_buf1[4];
177
178   pw_buf1[0] = pws[gid].i[ 4];
179   pw_buf1[1] = pws[gid].i[ 5];
180   pw_buf1[2] = pws[gid].i[ 6];
181   pw_buf1[3] = pws[gid].i[ 7];
182
183   const u32 pw_len = pws[gid].pw_len;
184
185   /**
186    * salt
187    */
188
189   const u32 salt_iter = salt_bufs[salt_pos].salt_iter;
190
191   u32 salt_buf0[4];
192
193   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
194   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
195   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
196   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
197
198   u32 salt_buf1[4];
199
200   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
201   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
202   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
203   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
204
205   const u32 salt_len = salt_bufs[salt_pos].salt_len;
206
207   u32 domain_buf0[4];
208
209   domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0];
210   domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1];
211   domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2];
212   domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3];
213
214   u32 domain_buf1[4];
215
216   domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4];
217   domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5];
218   domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6];
219   domain_buf1[3] = 0;
220
221   const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7];
222
223   /**
224    * loop
225    */
226
227   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
228   {
229     u32 w0[4];
230     u32 w1[4];
231     u32 w2[4];
232     u32 w3[4];
233
234     w0[0] = pw_buf0[0];
235     w0[1] = pw_buf0[1];
236     w0[2] = pw_buf0[2];
237     w0[3] = pw_buf0[3];
238     w1[0] = pw_buf1[0];
239     w1[1] = pw_buf1[1];
240     w1[2] = pw_buf1[2];
241     w1[3] = pw_buf1[3];
242     w2[0] = 0;
243     w2[1] = 0;
244     w2[2] = 0;
245     w2[3] = 0;
246     w3[0] = 0;
247     w3[1] = 0;
248     w3[2] = 0;
249     w3[3] = 0;
250
251     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
252
253     u32 w0_t[4];
254
255     w0_t[0] = w0[0];
256     w0_t[1] = w0[1];
257     w0_t[2] = w0[2];
258     w0_t[3] = w0[3];
259
260     u32 w1_t[4];
261
262     w1_t[0] = w1[0];
263     w1_t[1] = w1[1];
264     w1_t[2] = w1[2];
265     w1_t[3] = w1[3];
266
267     u32 w2_t[4];
268
269     w2_t[0] = w2[0];
270     w2_t[1] = w2[1];
271     w2_t[2] = w2[2];
272     w2_t[3] = w2[3];
273
274     u32 w3_t[4];
275
276     w3_t[0] = w3[0];
277     w3_t[1] = w3[1];
278     w3_t[2] = w3[2];
279     w3_t[3] = w3[3];
280
281     switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1);
282
283     w0_t[0] |= pw_len & 0xff;
284
285     /**
286      * salt
287      */
288
289     u32 s0[4];
290
291     s0[0] = salt_buf0[0];
292     s0[1] = salt_buf0[1];
293     s0[2] = salt_buf0[2];
294     s0[3] = salt_buf0[3];
295
296     u32 s1[4];
297
298     s1[0] = salt_buf1[0];
299     s1[1] = salt_buf1[1];
300     s1[2] = salt_buf1[2];
301     s1[3] = salt_buf1[3];
302
303     u32 s2[4];
304
305     s2[0] = 0;
306     s2[1] = 0;
307     s2[2] = 0;
308     s2[3] = 0;
309
310     u32 s3[4];
311
312     s3[0] = 0;
313     s3[1] = 0;
314     s3[2] = 0;
315     s3[3] = 0;
316
317     switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1);
318
319     u32 d0[4];
320
321     d0[0] = domain_buf0[0];
322     d0[1] = domain_buf0[1];
323     d0[2] = domain_buf0[2];
324     d0[3] = domain_buf0[3];
325
326     u32 d1[4];
327
328     d1[0] = domain_buf1[0];
329     d1[1] = domain_buf1[1];
330     d1[2] = domain_buf1[2];
331     d1[3] = 0;
332
333     u32 d2[4];
334
335     d2[0] = 0;
336     d2[1] = 0;
337     d2[2] = 0;
338     d2[3] = 0;
339
340     u32 d3[4];
341
342     d3[0] = 0;
343     d3[1] = 0;
344     d3[2] = 0;
345     d3[3] = 0;
346
347     switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len);
348
349     /**
350      * sha1
351      */
352
353     u32 w0_t2[4];
354
355     w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]);
356     w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]);
357     w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]);
358     w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]);
359
360     u32 w1_t2[4];
361
362     w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]);
363     w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]);
364     w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]);
365     w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]);
366
367     u32 w2_t2[4];
368
369     w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]);
370     w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]);
371     w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]);
372     w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]);
373
374     u32 w3_t2[4];
375
376     w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]);
377     w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]);
378     w3_t2[2] = 0;
379     w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8;
380
381     u32 digest[5];
382
383     digest[0] = SHA1M_A;
384     digest[1] = SHA1M_B;
385     digest[2] = SHA1M_C;
386     digest[3] = SHA1M_D;
387     digest[4] = SHA1M_E;
388
389     sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest);
390
391     // iterations
392
393     for (u32 i = 0; i < salt_iter; i++)
394     {
395       u32 w0_t3[4];
396
397       w0_t3[0] = digest[0];
398       w0_t3[1] = digest[1];
399       w0_t3[2] = digest[2];
400       w0_t3[3] = digest[3];
401
402       u32 w1_t3[4];
403
404       w1_t3[0] = digest[4];
405       w1_t3[1] = swap32 (salt_buf0[0]);
406       w1_t3[2] = swap32 (salt_buf0[1]);
407       w1_t3[3] = swap32 (salt_buf0[2]);
408
409       u32 w2_t3[4];
410
411       w2_t3[0] = swap32 (salt_buf0[3]);
412       w2_t3[1] = swap32 (salt_buf1[0]);
413       w2_t3[2] = swap32 (salt_buf1[1]);
414       w2_t3[3] = swap32 (salt_buf1[2]);
415
416       u32 w3_t3[4];
417
418       w3_t3[0] = swap32 (salt_buf1[3]);
419       w3_t3[1] = 0;
420       w3_t3[2] = 0;
421       w3_t3[3] = (20 + salt_len) * 8;
422
423       digest[0] = SHA1M_A;
424       digest[1] = SHA1M_B;
425       digest[2] = SHA1M_C;
426       digest[3] = SHA1M_D;
427       digest[4] = SHA1M_E;
428
429       sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest);
430     }
431
432     const u32 r0 = digest[3];
433     const u32 r1 = digest[4];
434     const u32 r2 = digest[2];
435     const u32 r3 = digest[1];
436
437     #include COMPARE_M
438   }
439 }
440
441 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
442 {
443 }
444
445 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
446 {
447 }
448
449 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
450 {
451   /**
452    * modifier
453    */
454
455   const u32 lid = get_local_id (0);
456
457   /**
458    * base
459    */
460
461   const u32 gid = get_global_id (0);
462
463   if (gid >= gid_max) return;
464
465   u32 pw_buf0[4];
466
467   pw_buf0[0] = pws[gid].i[ 0];
468   pw_buf0[1] = pws[gid].i[ 1];
469   pw_buf0[2] = pws[gid].i[ 2];
470   pw_buf0[3] = pws[gid].i[ 3];
471
472   u32 pw_buf1[4];
473
474   pw_buf1[0] = pws[gid].i[ 4];
475   pw_buf1[1] = pws[gid].i[ 5];
476   pw_buf1[2] = pws[gid].i[ 6];
477   pw_buf1[3] = pws[gid].i[ 7];
478
479   const u32 pw_len = pws[gid].pw_len;
480
481   /**
482    * salt
483    */
484
485   const u32 salt_iter = salt_bufs[salt_pos].salt_iter;
486
487   u32 salt_buf0[4];
488
489   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
490   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
491   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
492   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
493
494   u32 salt_buf1[4];
495
496   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
497   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
498   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
499   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
500
501   const u32 salt_len = salt_bufs[salt_pos].salt_len;
502
503   u32 domain_buf0[4];
504
505   domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0];
506   domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1];
507   domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2];
508   domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3];
509
510   u32 domain_buf1[4];
511
512   domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4];
513   domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5];
514   domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6];
515   domain_buf1[3] = 0;
516
517   const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7];
518
519   /**
520    * digest
521    */
522
523   const u32 search[4] =
524   {
525     digests_buf[digests_offset].digest_buf[DGST_R0],
526     digests_buf[digests_offset].digest_buf[DGST_R1],
527     digests_buf[digests_offset].digest_buf[DGST_R2],
528     digests_buf[digests_offset].digest_buf[DGST_R3]
529   };
530
531   /**
532    * loop
533    */
534
535   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
536   {
537     u32 w0[4];
538     u32 w1[4];
539     u32 w2[4];
540     u32 w3[4];
541
542     w0[0] = pw_buf0[0];
543     w0[1] = pw_buf0[1];
544     w0[2] = pw_buf0[2];
545     w0[3] = pw_buf0[3];
546     w1[0] = pw_buf1[0];
547     w1[1] = pw_buf1[1];
548     w1[2] = pw_buf1[2];
549     w1[3] = pw_buf1[3];
550     w2[0] = 0;
551     w2[1] = 0;
552     w2[2] = 0;
553     w2[3] = 0;
554     w3[0] = 0;
555     w3[1] = 0;
556     w3[2] = 0;
557     w3[3] = 0;
558
559     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
560
561     u32 w0_t[4];
562
563     w0_t[0] = w0[0];
564     w0_t[1] = w0[1];
565     w0_t[2] = w0[2];
566     w0_t[3] = w0[3];
567
568     u32 w1_t[4];
569
570     w1_t[0] = w1[0];
571     w1_t[1] = w1[1];
572     w1_t[2] = w1[2];
573     w1_t[3] = w1[3];
574
575     u32 w2_t[4];
576
577     w2_t[0] = w2[0];
578     w2_t[1] = w2[1];
579     w2_t[2] = w2[2];
580     w2_t[3] = w2[3];
581
582     u32 w3_t[4];
583
584     w3_t[0] = w3[0];
585     w3_t[1] = w3[1];
586     w3_t[2] = w3[2];
587     w3_t[3] = w3[3];
588
589     switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1);
590
591     w0_t[0] |= pw_len & 0xff;
592
593     /**
594      * salt
595      */
596
597     u32 s0[4];
598
599     s0[0] = salt_buf0[0];
600     s0[1] = salt_buf0[1];
601     s0[2] = salt_buf0[2];
602     s0[3] = salt_buf0[3];
603
604     u32 s1[4];
605
606     s1[0] = salt_buf1[0];
607     s1[1] = salt_buf1[1];
608     s1[2] = salt_buf1[2];
609     s1[3] = salt_buf1[3];
610
611     u32 s2[4];
612
613     s2[0] = 0;
614     s2[1] = 0;
615     s2[2] = 0;
616     s2[3] = 0;
617
618     u32 s3[4];
619
620     s3[0] = 0;
621     s3[1] = 0;
622     s3[2] = 0;
623     s3[3] = 0;
624
625     switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1);
626
627     u32 d0[4];
628
629     d0[0] = domain_buf0[0];
630     d0[1] = domain_buf0[1];
631     d0[2] = domain_buf0[2];
632     d0[3] = domain_buf0[3];
633
634     u32 d1[4];
635
636     d1[0] = domain_buf1[0];
637     d1[1] = domain_buf1[1];
638     d1[2] = domain_buf1[2];
639     d1[3] = 0;
640
641     u32 d2[4];
642
643     d2[0] = 0;
644     d2[1] = 0;
645     d2[2] = 0;
646     d2[3] = 0;
647
648     u32 d3[4];
649
650     d3[0] = 0;
651     d3[1] = 0;
652     d3[2] = 0;
653     d3[3] = 0;
654
655     switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len);
656
657     /**
658      * sha1
659      */
660
661     u32 w0_t2[4];
662
663     w0_t2[0] = swap32 (w0_t[0] | d0[0] | s0[0]);
664     w0_t2[1] = swap32 (w0_t[1] | d0[1] | s0[1]);
665     w0_t2[2] = swap32 (w0_t[2] | d0[2] | s0[2]);
666     w0_t2[3] = swap32 (w0_t[3] | d0[3] | s0[3]);
667
668     u32 w1_t2[4];
669
670     w1_t2[0] = swap32 (w1_t[0] | d1[0] | s1[0]);
671     w1_t2[1] = swap32 (w1_t[1] | d1[1] | s1[1]);
672     w1_t2[2] = swap32 (w1_t[2] | d1[2] | s1[2]);
673     w1_t2[3] = swap32 (w1_t[3] | d1[3] | s1[3]);
674
675     u32 w2_t2[4];
676
677     w2_t2[0] = swap32 (w2_t[0] | d2[0] | s2[0]);
678     w2_t2[1] = swap32 (w2_t[1] | d2[1] | s2[1]);
679     w2_t2[2] = swap32 (w2_t[2] | d2[2] | s2[2]);
680     w2_t2[3] = swap32 (w2_t[3] | d2[3] | s2[3]);
681
682     u32 w3_t2[4];
683
684     w3_t2[0] = swap32 (w3_t[0] | d3[0] | s3[0]);
685     w3_t2[1] = swap32 (w3_t[1] | d3[1] | s3[1]);
686     w3_t2[2] = 0;
687     w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8;
688
689     u32 digest[5];
690
691     digest[0] = SHA1M_A;
692     digest[1] = SHA1M_B;
693     digest[2] = SHA1M_C;
694     digest[3] = SHA1M_D;
695     digest[4] = SHA1M_E;
696
697     sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest);
698
699     // iterations
700
701     for (u32 i = 0; i < salt_iter; i++)
702     {
703       u32 w0_t3[4];
704
705       w0_t3[0] = digest[0];
706       w0_t3[1] = digest[1];
707       w0_t3[2] = digest[2];
708       w0_t3[3] = digest[3];
709
710       u32 w1_t3[4];
711
712       w1_t3[0] = digest[4];
713       w1_t3[1] = swap32 (salt_buf0[0]);
714       w1_t3[2] = swap32 (salt_buf0[1]);
715       w1_t3[3] = swap32 (salt_buf0[2]);
716
717       u32 w2_t3[4];
718
719       w2_t3[0] = swap32 (salt_buf0[3]);
720       w2_t3[1] = swap32 (salt_buf1[0]);
721       w2_t3[2] = swap32 (salt_buf1[1]);
722       w2_t3[3] = swap32 (salt_buf1[2]);
723
724       u32 w3_t3[4];
725
726       w3_t3[0] = swap32 (salt_buf1[3]);
727       w3_t3[1] = 0;
728       w3_t3[2] = 0;
729       w3_t3[3] = (20 + salt_len) * 8;
730
731       digest[0] = SHA1M_A;
732       digest[1] = SHA1M_B;
733       digest[2] = SHA1M_C;
734       digest[3] = SHA1M_D;
735       digest[4] = SHA1M_E;
736
737       sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest);
738     }
739
740     const u32 r0 = digest[3];
741     const u32 r1 = digest[4];
742     const u32 r2 = digest[2];
743     const u32 r3 = digest[1];
744
745     #include COMPARE_S
746   }
747 }
748
749 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
750 {
751 }
752
753 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
754 {
755 }