69ce7ee3bc7e1baa69c1fb48353a3635ba23b38b
[hashcat.git] / OpenCL / m09700_a3.cl
1 /**
2  * Authors.....: Jens Steube <jens.steube@gmail.com>
3  *               Gabriele Gristina <matrix@hashcat.net>
4  *
5  * License.....: MIT
6  */
7
8 #define _OLDOFFICE01_
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 "OpenCL/simd.c"
22
23 typedef struct
24 {
25   u8 S[256];
26
27   u32 wtf_its_faster;
28
29 } RC4_KEY;
30
31 static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j)
32 {
33   u8 tmp;
34
35   tmp           = rc4_key->S[i];
36   rc4_key->S[i] = rc4_key->S[j];
37   rc4_key->S[j] = tmp;
38 }
39
40 static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4])
41 {
42   u32 v = 0x03020100;
43   u32 a = 0x04040404;
44
45   __local u32 *ptr = (__local u32 *) rc4_key->S;
46
47   #pragma unroll
48   for (u32 i = 0; i < 64; i++)
49   {
50     *ptr++ = v; v += a;
51   }
52
53   u32 j = 0;
54
55   for (u32 i = 0; i < 16; i++)
56   {
57     u32 idx = i * 16;
58
59     u32 v;
60
61     v = data[0];
62
63     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
64     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
65     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
66     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
67
68     v = data[1];
69
70     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
71     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
72     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
73     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
74
75     v = data[2];
76
77     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
78     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
79     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
80     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
81
82     v = data[3];
83
84     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
85     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
86     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
87     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
88   }
89 }
90
91 static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4])
92 {
93   #pragma unroll
94   for (u32 k = 0; k < 4; k++)
95   {
96     u32 xor4 = 0;
97
98     u8 idx;
99
100     i += 1;
101     j += rc4_key->S[i];
102
103     swap (rc4_key, i, j);
104
105     idx = rc4_key->S[i] + rc4_key->S[j];
106
107     xor4 |= rc4_key->S[idx] <<  0;
108
109     i += 1;
110     j += rc4_key->S[i];
111
112     swap (rc4_key, i, j);
113
114     idx = rc4_key->S[i] + rc4_key->S[j];
115
116     xor4 |= rc4_key->S[idx] <<  8;
117
118     i += 1;
119     j += rc4_key->S[i];
120
121     swap (rc4_key, i, j);
122
123     idx = rc4_key->S[i] + rc4_key->S[j];
124
125     xor4 |= rc4_key->S[idx] << 16;
126
127     i += 1;
128     j += rc4_key->S[i];
129
130     swap (rc4_key, i, j);
131
132     idx = rc4_key->S[i] + rc4_key->S[j];
133
134     xor4 |= rc4_key->S[idx] << 24;
135
136     out[k] = in[k] ^ xor4;
137   }
138
139   return j;
140 }
141
142 static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[4])
143 {
144   u32 a = digest[0];
145   u32 b = digest[1];
146   u32 c = digest[2];
147   u32 d = digest[3];
148
149   u32 w0_t = w0[0];
150   u32 w1_t = w0[1];
151   u32 w2_t = w0[2];
152   u32 w3_t = w0[3];
153   u32 w4_t = w1[0];
154   u32 w5_t = w1[1];
155   u32 w6_t = w1[2];
156   u32 w7_t = w1[3];
157   u32 w8_t = w2[0];
158   u32 w9_t = w2[1];
159   u32 wa_t = w2[2];
160   u32 wb_t = w2[3];
161   u32 wc_t = w3[0];
162   u32 wd_t = w3[1];
163   u32 we_t = w3[2];
164   u32 wf_t = w3[3];
165
166   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
167   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
168   MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
169   MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
170   MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
171   MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
172   MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
173   MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
174   MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
175   MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
176   MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
177   MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
178   MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
179   MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
180   MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
181   MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
182
183   MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
184   MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
185   MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
186   MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
187   MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
188   MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
189   MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
190   MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
191   MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
192   MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
193   MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
194   MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
195   MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
196   MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
197   MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
198   MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
199
200   MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
201   MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
202   MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
203   MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
204   MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
205   MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
206   MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
207   MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
208   MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
209   MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
210   MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
211   MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
212   MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
213   MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
214   MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
215   MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
216
217   MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
218   MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
219   MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
220   MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
221   MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
222   MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
223   MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
224   MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
225   MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
226   MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
227   MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
228   MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
229   MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
230   MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
231   MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
232   MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
233
234   digest[0] += a;
235   digest[1] += b;
236   digest[2] += c;
237   digest[3] += d;
238 }
239
240 static void m09700m (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
241 {
242   /**
243    * modifier
244    */
245
246   const u32 gid = get_global_id (0);
247   const u32 lid = get_local_id (0);
248
249   /**
250    * shared
251    */
252
253   __local RC4_KEY *rc4_key = &rc4_keys[lid];
254
255   /**
256    * salt
257    */
258
259   u32 salt_buf_t0[4];
260
261   salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0];
262   salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1];
263   salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2];
264   salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3];
265
266   u32 salt_buf_t1[5];
267
268   salt_buf_t1[0] =                        salt_buf_t0[0] <<  8;
269   salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] <<  8;
270   salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] <<  8;
271   salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] <<  8;
272   salt_buf_t1[4] = salt_buf_t0[3] >> 24;
273
274   u32 salt_buf_t2[5];
275
276   salt_buf_t2[0] =                        salt_buf_t0[0] << 16;
277   salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16;
278   salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16;
279   salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16;
280   salt_buf_t2[4] = salt_buf_t0[3] >> 16;
281
282   u32 salt_buf_t3[5];
283
284   salt_buf_t3[0] =                        salt_buf_t0[0] << 24;
285   salt_buf_t3[1] = salt_buf_t0[0] >>  8 | salt_buf_t0[1] << 24;
286   salt_buf_t3[2] = salt_buf_t0[1] >>  8 | salt_buf_t0[2] << 24;
287   salt_buf_t3[3] = salt_buf_t0[2] >>  8 | salt_buf_t0[3] << 24;
288   salt_buf_t3[4] = salt_buf_t0[3] >>  8;
289
290   const u32 salt_len = 16;
291
292   /**
293    * esalt
294    */
295
296   const u32 version = oldoffice01_bufs[salt_pos].version;
297
298   u32 encryptedVerifier[4];
299
300   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
301   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
302   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
303   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
304
305   /**
306    * loop
307    */
308
309   u32 w0l = w0[0];
310
311   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
312   {
313     const u32 w0r = ix_create_bft (bfs_buf, il_pos);
314
315     const u32 w0lr = w0l | w0r;
316
317     /**
318      * md5
319      */
320
321     u32 w0_t[4];
322     u32 w1_t[4];
323     u32 w2_t[4];
324     u32 w3_t[4];
325
326     w0_t[0] = w0lr;
327     w0_t[1] = w0[1];
328     w0_t[2] = w0[2];
329     w0_t[3] = w0[3];
330     w1_t[0] = w1[0];
331     w1_t[1] = w1[1];
332     w1_t[2] = w1[2];
333     w1_t[3] = w1[3];
334     w2_t[0] = w2[0];
335     w2_t[1] = w2[1];
336     w2_t[2] = w2[2];
337     w2_t[3] = w2[3];
338     w3_t[0] = w3[0];
339     w3_t[1] = w3[1];
340     w3_t[2] = pw_len * 8;
341     w3_t[3] = 0;
342
343     u32 digest_t0[4];
344     u32 digest_t1[2]; // need only first 5 byte
345     u32 digest_t2[2];
346     u32 digest_t3[2];
347
348     digest_t0[0] = MD5M_A;
349     digest_t0[1] = MD5M_B;
350     digest_t0[2] = MD5M_C;
351     digest_t0[3] = MD5M_D;
352
353     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0);
354
355     // prepare 16 * 21 buffer stuff
356
357     u32 digest[4];
358
359     digest[0] = MD5M_A;
360     digest[1] = MD5M_B;
361     digest[2] = MD5M_C;
362     digest[3] = MD5M_D;
363
364     // offsets
365
366     digest_t0[0] &= 0xffffffff;
367     digest_t0[1] &= 0x000000ff;
368     digest_t0[2] &= 0x00000000;
369     digest_t0[3] &= 0x00000000;
370
371     digest_t1[0] =                      digest_t0[0] <<  8;
372     digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] <<  8;
373
374     digest_t2[0] =                      digest_t0[0] << 16;
375     digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16;
376
377     digest_t3[0] =                      digest_t0[0] << 24;
378     digest_t3[1] = digest_t0[0] >>  8 | digest_t0[1] << 24;
379
380     // generate the 16 * 21 buffer
381
382     // 0..5
383     w0_t[0]  = digest_t0[0];
384     w0_t[1]  = digest_t0[1];
385
386     // 5..21
387     w0_t[1] |= salt_buf_t1[0];
388     w0_t[2]  = salt_buf_t1[1];
389     w0_t[3]  = salt_buf_t1[2];
390     w1_t[0]  = salt_buf_t1[3];
391     w1_t[1]  = salt_buf_t1[4];
392
393     // 21..26
394     w1_t[1] |= digest_t1[0];
395     w1_t[2]  = digest_t1[1];
396
397     // 26..42
398     w1_t[2] |= salt_buf_t2[0];
399     w1_t[3]  = salt_buf_t2[1];
400     w2_t[0]  = salt_buf_t2[2];
401     w2_t[1]  = salt_buf_t2[3];
402     w2_t[2]  = salt_buf_t2[4];
403
404     // 42..47
405     w2_t[2] |= digest_t2[0];
406     w2_t[3]  = digest_t2[1];
407
408     // 47..63
409     w2_t[3] |= salt_buf_t3[0];
410     w3_t[0]  = salt_buf_t3[1];
411     w3_t[1]  = salt_buf_t3[2];
412     w3_t[2]  = salt_buf_t3[3];
413     w3_t[3]  = salt_buf_t3[4];
414
415     // 63..
416
417     w3_t[3] |= digest_t3[0];
418
419     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
420
421     // 0..4
422     w0_t[0]  = digest_t3[1];
423
424     // 4..20
425     w0_t[1]  = salt_buf_t0[0];
426     w0_t[2]  = salt_buf_t0[1];
427     w0_t[3]  = salt_buf_t0[2];
428     w1_t[0]  = salt_buf_t0[3];
429
430     // 20..25
431     w1_t[1]  = digest_t0[0];
432     w1_t[2]  = digest_t0[1];
433
434     // 25..41
435     w1_t[2] |= salt_buf_t1[0];
436     w1_t[3]  = salt_buf_t1[1];
437     w2_t[0]  = salt_buf_t1[2];
438     w2_t[1]  = salt_buf_t1[3];
439     w2_t[2]  = salt_buf_t1[4];
440
441     // 41..46
442     w2_t[2] |= digest_t1[0];
443     w2_t[3]  = digest_t1[1];
444
445     // 46..62
446     w2_t[3] |= salt_buf_t2[0];
447     w3_t[0]  = salt_buf_t2[1];
448     w3_t[1]  = salt_buf_t2[2];
449     w3_t[2]  = salt_buf_t2[3];
450     w3_t[3]  = salt_buf_t2[4];
451
452     // 62..
453     w3_t[3] |= digest_t2[0];
454
455     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
456
457     // 0..3
458     w0_t[0]  = digest_t2[1];
459
460     // 3..19
461     w0_t[0] |= salt_buf_t3[0];
462     w0_t[1]  = salt_buf_t3[1];
463     w0_t[2]  = salt_buf_t3[2];
464     w0_t[3]  = salt_buf_t3[3];
465     w1_t[0]  = salt_buf_t3[4];
466
467     // 19..24
468     w1_t[0] |= digest_t3[0];
469     w1_t[1]  = digest_t3[1];
470
471     // 24..40
472     w1_t[2]  = salt_buf_t0[0];
473     w1_t[3]  = salt_buf_t0[1];
474     w2_t[0]  = salt_buf_t0[2];
475     w2_t[1]  = salt_buf_t0[3];
476
477     // 40..45
478     w2_t[2]  = digest_t0[0];
479     w2_t[3]  = digest_t0[1];
480
481     // 45..61
482     w2_t[3] |= salt_buf_t1[0];
483     w3_t[0]  = salt_buf_t1[1];
484     w3_t[1]  = salt_buf_t1[2];
485     w3_t[2]  = salt_buf_t1[3];
486     w3_t[3]  = salt_buf_t1[4];
487
488     // 61..
489     w3_t[3] |= digest_t1[0];
490
491     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
492
493     // 0..2
494     w0_t[0]  = digest_t1[1];
495
496     // 2..18
497     w0_t[0] |= salt_buf_t2[0];
498     w0_t[1]  = salt_buf_t2[1];
499     w0_t[2]  = salt_buf_t2[2];
500     w0_t[3]  = salt_buf_t2[3];
501     w1_t[0]  = salt_buf_t2[4];
502
503     // 18..23
504     w1_t[0] |= digest_t2[0];
505     w1_t[1]  = digest_t2[1];
506
507     // 23..39
508     w1_t[1] |= salt_buf_t3[0];
509     w1_t[2]  = salt_buf_t3[1];
510     w1_t[3]  = salt_buf_t3[2];
511     w2_t[0]  = salt_buf_t3[3];
512     w2_t[1]  = salt_buf_t3[4];
513
514     // 39..44
515     w2_t[1] |= digest_t3[0];
516     w2_t[2]  = digest_t3[1];
517
518     // 44..60
519     w2_t[3]  = salt_buf_t0[0];
520     w3_t[0]  = salt_buf_t0[1];
521     w3_t[1]  = salt_buf_t0[2];
522     w3_t[2]  = salt_buf_t0[3];
523
524     // 60..
525     w3_t[3]  = digest_t0[0];
526
527     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
528
529     // 0..1
530     w0_t[0]  = digest_t0[1];
531
532     // 1..17
533     w0_t[0] |= salt_buf_t1[0];
534     w0_t[1]  = salt_buf_t1[1];
535     w0_t[2]  = salt_buf_t1[2];
536     w0_t[3]  = salt_buf_t1[3];
537     w1_t[0]  = salt_buf_t1[4];
538
539     // 17..22
540     w1_t[0] |= digest_t1[0];
541     w1_t[1]  = digest_t1[1];
542
543     // 22..38
544     w1_t[1] |= salt_buf_t2[0];
545     w1_t[2]  = salt_buf_t2[1];
546     w1_t[3]  = salt_buf_t2[2];
547     w2_t[0]  = salt_buf_t2[3];
548     w2_t[1]  = salt_buf_t2[4];
549
550     // 38..43
551     w2_t[1] |= digest_t2[0];
552     w2_t[2]  = digest_t2[1];
553
554     // 43..59
555     w2_t[2] |= salt_buf_t3[0];
556     w2_t[3]  = salt_buf_t3[1];
557     w3_t[0]  = salt_buf_t3[2];
558     w3_t[1]  = salt_buf_t3[3];
559     w3_t[2]  = salt_buf_t3[4];
560
561     // 59..
562     w3_t[2] |= digest_t3[0];
563     w3_t[3]  = digest_t3[1];
564
565     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
566
567     w0_t[0]  = salt_buf_t0[0];
568     w0_t[1]  = salt_buf_t0[1];
569     w0_t[2]  = salt_buf_t0[2];
570     w0_t[3]  = salt_buf_t0[3];
571     w1_t[0]  = 0x80;
572     w1_t[1]  = 0;
573     w1_t[2]  = 0;
574     w1_t[3]  = 0;
575     w2_t[0]  = 0;
576     w2_t[1]  = 0;
577     w2_t[2]  = 0;
578     w2_t[3]  = 0;
579     w3_t[0]  = 0;
580     w3_t[1]  = 0;
581     w3_t[2]  = 21 * 16 * 8;
582     w3_t[3]  = 0;
583
584     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
585
586     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
587
588     w0_t[0]  = digest[0];
589     w0_t[1]  = digest[1] & 0xff;
590     w0_t[2]  = 0x8000;
591     w0_t[3]  = 0;
592     w1_t[0]  = 0;
593     w1_t[1]  = 0;
594     w1_t[2]  = 0;
595     w1_t[3]  = 0;
596     w2_t[0]  = 0;
597     w2_t[1]  = 0;
598     w2_t[2]  = 0;
599     w2_t[3]  = 0;
600     w3_t[0]  = 0;
601     w3_t[1]  = 0;
602     w3_t[2]  = 9 * 8;
603     w3_t[3]  = 0;
604
605     digest[0] = MD5M_A;
606     digest[1] = MD5M_B;
607     digest[2] = MD5M_C;
608     digest[3] = MD5M_D;
609
610     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
611
612     // now the RC4 part
613
614     rc4_init_16 (rc4_key, digest);
615
616     u32 out[4];
617
618     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
619
620     w0_t[0] = out[0];
621     w0_t[1] = out[1];
622     w0_t[2] = out[2];
623     w0_t[3] = out[3];
624     w1_t[0] = 0x80;
625     w1_t[1] = 0;
626     w1_t[2] = 0;
627     w1_t[3] = 0;
628     w2_t[0] = 0;
629     w2_t[1] = 0;
630     w2_t[2] = 0;
631     w2_t[3] = 0;
632     w3_t[0] = 0;
633     w3_t[1] = 0;
634     w3_t[2] = 16 * 8;
635     w3_t[3] = 0;
636
637     digest[0] = MD5M_A;
638     digest[1] = MD5M_B;
639     digest[2] = MD5M_C;
640     digest[3] = MD5M_D;
641
642     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
643
644     rc4_next_16 (rc4_key, 16, j, digest, out);
645
646     COMPARE_M_SIMD (out[0], out[1], out[2], out[3]);
647   }
648 }
649
650 static void m09700s (__local RC4_KEY *rc4_keys, u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 pw_len, __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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset)
651 {
652   /**
653    * modifier
654    */
655
656   const u32 gid = get_global_id (0);
657   const u32 lid = get_local_id (0);
658
659   /**
660    * shared
661    */
662
663   __local RC4_KEY *rc4_key = &rc4_keys[lid];
664
665   /**
666    * salt
667    */
668
669   u32 salt_buf_t0[4];
670
671   salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0];
672   salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1];
673   salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2];
674   salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3];
675
676   u32 salt_buf_t1[5];
677
678   salt_buf_t1[0] =                        salt_buf_t0[0] <<  8;
679   salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] <<  8;
680   salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] <<  8;
681   salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] <<  8;
682   salt_buf_t1[4] = salt_buf_t0[3] >> 24;
683
684   u32 salt_buf_t2[5];
685
686   salt_buf_t2[0] =                        salt_buf_t0[0] << 16;
687   salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16;
688   salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16;
689   salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16;
690   salt_buf_t2[4] = salt_buf_t0[3] >> 16;
691
692   u32 salt_buf_t3[5];
693
694   salt_buf_t3[0] =                        salt_buf_t0[0] << 24;
695   salt_buf_t3[1] = salt_buf_t0[0] >>  8 | salt_buf_t0[1] << 24;
696   salt_buf_t3[2] = salt_buf_t0[1] >>  8 | salt_buf_t0[2] << 24;
697   salt_buf_t3[3] = salt_buf_t0[2] >>  8 | salt_buf_t0[3] << 24;
698   salt_buf_t3[4] = salt_buf_t0[3] >>  8;
699
700   const u32 salt_len = 16;
701
702   /**
703    * esalt
704    */
705
706   const u32 version = oldoffice01_bufs[salt_pos].version;
707
708   u32 encryptedVerifier[4];
709
710   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
711   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
712   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
713   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
714
715   /**
716    * digest
717    */
718
719   const u32 search[4] =
720   {
721     digests_buf[digests_offset].digest_buf[DGST_R0],
722     digests_buf[digests_offset].digest_buf[DGST_R1],
723     digests_buf[digests_offset].digest_buf[DGST_R2],
724     digests_buf[digests_offset].digest_buf[DGST_R3]
725   };
726
727   /**
728    * loop
729    */
730
731   u32 w0l = w0[0];
732
733   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
734   {
735     const u32 w0r = ix_create_bft (bfs_buf, il_pos);
736
737     const u32 w0lr = w0l | w0r;
738
739     /**
740      * md5
741      */
742
743     u32 w0_t[4];
744     u32 w1_t[4];
745     u32 w2_t[4];
746     u32 w3_t[4];
747
748     w0_t[0] = w0lr;
749     w0_t[1] = w0[1];
750     w0_t[2] = w0[2];
751     w0_t[3] = w0[3];
752     w1_t[0] = w1[0];
753     w1_t[1] = w1[1];
754     w1_t[2] = w1[2];
755     w1_t[3] = w1[3];
756     w2_t[0] = w2[0];
757     w2_t[1] = w2[1];
758     w2_t[2] = w2[2];
759     w2_t[3] = w2[3];
760     w3_t[0] = w3[0];
761     w3_t[1] = w3[1];
762     w3_t[2] = pw_len * 8;
763     w3_t[3] = 0;
764
765     u32 digest_t0[4];
766     u32 digest_t1[2]; // need only first 5 byte
767     u32 digest_t2[2];
768     u32 digest_t3[2];
769
770     digest_t0[0] = MD5M_A;
771     digest_t0[1] = MD5M_B;
772     digest_t0[2] = MD5M_C;
773     digest_t0[3] = MD5M_D;
774
775     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0);
776
777     // prepare 16 * 21 buffer stuff
778
779     u32 digest[4];
780
781     digest[0] = MD5M_A;
782     digest[1] = MD5M_B;
783     digest[2] = MD5M_C;
784     digest[3] = MD5M_D;
785
786     // offsets
787
788     digest_t0[0] &= 0xffffffff;
789     digest_t0[1] &= 0x000000ff;
790     digest_t0[2] &= 0x00000000;
791     digest_t0[3] &= 0x00000000;
792
793     digest_t1[0] =                      digest_t0[0] <<  8;
794     digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] <<  8;
795
796     digest_t2[0] =                      digest_t0[0] << 16;
797     digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16;
798
799     digest_t3[0] =                      digest_t0[0] << 24;
800     digest_t3[1] = digest_t0[0] >>  8 | digest_t0[1] << 24;
801
802     // generate the 16 * 21 buffer
803
804     // 0..5
805     w0_t[0]  = digest_t0[0];
806     w0_t[1]  = digest_t0[1];
807
808     // 5..21
809     w0_t[1] |= salt_buf_t1[0];
810     w0_t[2]  = salt_buf_t1[1];
811     w0_t[3]  = salt_buf_t1[2];
812     w1_t[0]  = salt_buf_t1[3];
813     w1_t[1]  = salt_buf_t1[4];
814
815     // 21..26
816     w1_t[1] |= digest_t1[0];
817     w1_t[2]  = digest_t1[1];
818
819     // 26..42
820     w1_t[2] |= salt_buf_t2[0];
821     w1_t[3]  = salt_buf_t2[1];
822     w2_t[0]  = salt_buf_t2[2];
823     w2_t[1]  = salt_buf_t2[3];
824     w2_t[2]  = salt_buf_t2[4];
825
826     // 42..47
827     w2_t[2] |= digest_t2[0];
828     w2_t[3]  = digest_t2[1];
829
830     // 47..63
831     w2_t[3] |= salt_buf_t3[0];
832     w3_t[0]  = salt_buf_t3[1];
833     w3_t[1]  = salt_buf_t3[2];
834     w3_t[2]  = salt_buf_t3[3];
835     w3_t[3]  = salt_buf_t3[4];
836
837     // 63..
838
839     w3_t[3] |= digest_t3[0];
840
841     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
842
843     // 0..4
844     w0_t[0]  = digest_t3[1];
845
846     // 4..20
847     w0_t[1]  = salt_buf_t0[0];
848     w0_t[2]  = salt_buf_t0[1];
849     w0_t[3]  = salt_buf_t0[2];
850     w1_t[0]  = salt_buf_t0[3];
851
852     // 20..25
853     w1_t[1]  = digest_t0[0];
854     w1_t[2]  = digest_t0[1];
855
856     // 25..41
857     w1_t[2] |= salt_buf_t1[0];
858     w1_t[3]  = salt_buf_t1[1];
859     w2_t[0]  = salt_buf_t1[2];
860     w2_t[1]  = salt_buf_t1[3];
861     w2_t[2]  = salt_buf_t1[4];
862
863     // 41..46
864     w2_t[2] |= digest_t1[0];
865     w2_t[3]  = digest_t1[1];
866
867     // 46..62
868     w2_t[3] |= salt_buf_t2[0];
869     w3_t[0]  = salt_buf_t2[1];
870     w3_t[1]  = salt_buf_t2[2];
871     w3_t[2]  = salt_buf_t2[3];
872     w3_t[3]  = salt_buf_t2[4];
873
874     // 62..
875     w3_t[3] |= digest_t2[0];
876
877     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
878
879     // 0..3
880     w0_t[0]  = digest_t2[1];
881
882     // 3..19
883     w0_t[0] |= salt_buf_t3[0];
884     w0_t[1]  = salt_buf_t3[1];
885     w0_t[2]  = salt_buf_t3[2];
886     w0_t[3]  = salt_buf_t3[3];
887     w1_t[0]  = salt_buf_t3[4];
888
889     // 19..24
890     w1_t[0] |= digest_t3[0];
891     w1_t[1]  = digest_t3[1];
892
893     // 24..40
894     w1_t[2]  = salt_buf_t0[0];
895     w1_t[3]  = salt_buf_t0[1];
896     w2_t[0]  = salt_buf_t0[2];
897     w2_t[1]  = salt_buf_t0[3];
898
899     // 40..45
900     w2_t[2]  = digest_t0[0];
901     w2_t[3]  = digest_t0[1];
902
903     // 45..61
904     w2_t[3] |= salt_buf_t1[0];
905     w3_t[0]  = salt_buf_t1[1];
906     w3_t[1]  = salt_buf_t1[2];
907     w3_t[2]  = salt_buf_t1[3];
908     w3_t[3]  = salt_buf_t1[4];
909
910     // 61..
911     w3_t[3] |= digest_t1[0];
912
913     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
914
915     // 0..2
916     w0_t[0]  = digest_t1[1];
917
918     // 2..18
919     w0_t[0] |= salt_buf_t2[0];
920     w0_t[1]  = salt_buf_t2[1];
921     w0_t[2]  = salt_buf_t2[2];
922     w0_t[3]  = salt_buf_t2[3];
923     w1_t[0]  = salt_buf_t2[4];
924
925     // 18..23
926     w1_t[0] |= digest_t2[0];
927     w1_t[1]  = digest_t2[1];
928
929     // 23..39
930     w1_t[1] |= salt_buf_t3[0];
931     w1_t[2]  = salt_buf_t3[1];
932     w1_t[3]  = salt_buf_t3[2];
933     w2_t[0]  = salt_buf_t3[3];
934     w2_t[1]  = salt_buf_t3[4];
935
936     // 39..44
937     w2_t[1] |= digest_t3[0];
938     w2_t[2]  = digest_t3[1];
939
940     // 44..60
941     w2_t[3]  = salt_buf_t0[0];
942     w3_t[0]  = salt_buf_t0[1];
943     w3_t[1]  = salt_buf_t0[2];
944     w3_t[2]  = salt_buf_t0[3];
945
946     // 60..
947     w3_t[3]  = digest_t0[0];
948
949     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
950
951     // 0..1
952     w0_t[0]  = digest_t0[1];
953
954     // 1..17
955     w0_t[0] |= salt_buf_t1[0];
956     w0_t[1]  = salt_buf_t1[1];
957     w0_t[2]  = salt_buf_t1[2];
958     w0_t[3]  = salt_buf_t1[3];
959     w1_t[0]  = salt_buf_t1[4];
960
961     // 17..22
962     w1_t[0] |= digest_t1[0];
963     w1_t[1]  = digest_t1[1];
964
965     // 22..38
966     w1_t[1] |= salt_buf_t2[0];
967     w1_t[2]  = salt_buf_t2[1];
968     w1_t[3]  = salt_buf_t2[2];
969     w2_t[0]  = salt_buf_t2[3];
970     w2_t[1]  = salt_buf_t2[4];
971
972     // 38..43
973     w2_t[1] |= digest_t2[0];
974     w2_t[2]  = digest_t2[1];
975
976     // 43..59
977     w2_t[2] |= salt_buf_t3[0];
978     w2_t[3]  = salt_buf_t3[1];
979     w3_t[0]  = salt_buf_t3[2];
980     w3_t[1]  = salt_buf_t3[3];
981     w3_t[2]  = salt_buf_t3[4];
982
983     // 59..
984     w3_t[2] |= digest_t3[0];
985     w3_t[3]  = digest_t3[1];
986
987     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
988
989     w0_t[0]  = salt_buf_t0[0];
990     w0_t[1]  = salt_buf_t0[1];
991     w0_t[2]  = salt_buf_t0[2];
992     w0_t[3]  = salt_buf_t0[3];
993     w1_t[0]  = 0x80;
994     w1_t[1]  = 0;
995     w1_t[2]  = 0;
996     w1_t[3]  = 0;
997     w2_t[0]  = 0;
998     w2_t[1]  = 0;
999     w2_t[2]  = 0;
1000     w2_t[3]  = 0;
1001     w3_t[0]  = 0;
1002     w3_t[1]  = 0;
1003     w3_t[2]  = 21 * 16 * 8;
1004     w3_t[3]  = 0;
1005
1006     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1007
1008     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
1009
1010     w0_t[0]  = digest[0];
1011     w0_t[1]  = digest[1] & 0xff;
1012     w0_t[2]  = 0x8000;
1013     w0_t[3]  = 0;
1014     w1_t[0]  = 0;
1015     w1_t[1]  = 0;
1016     w1_t[2]  = 0;
1017     w1_t[3]  = 0;
1018     w2_t[0]  = 0;
1019     w2_t[1]  = 0;
1020     w2_t[2]  = 0;
1021     w2_t[3]  = 0;
1022     w3_t[0]  = 0;
1023     w3_t[1]  = 0;
1024     w3_t[2]  = 9 * 8;
1025     w3_t[3]  = 0;
1026
1027     digest[0] = MD5M_A;
1028     digest[1] = MD5M_B;
1029     digest[2] = MD5M_C;
1030     digest[3] = MD5M_D;
1031
1032     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1033
1034     // now the RC4 part
1035
1036     rc4_init_16 (rc4_key, digest);
1037
1038     u32 out[4];
1039
1040     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
1041
1042     w0_t[0] = out[0];
1043     w0_t[1] = out[1];
1044     w0_t[2] = out[2];
1045     w0_t[3] = out[3];
1046     w1_t[0] = 0x80;
1047     w1_t[1] = 0;
1048     w1_t[2] = 0;
1049     w1_t[3] = 0;
1050     w2_t[0] = 0;
1051     w2_t[1] = 0;
1052     w2_t[2] = 0;
1053     w2_t[3] = 0;
1054     w3_t[0] = 0;
1055     w3_t[1] = 0;
1056     w3_t[2] = 16 * 8;
1057     w3_t[3] = 0;
1058
1059     digest[0] = MD5M_A;
1060     digest[1] = MD5M_B;
1061     digest[2] = MD5M_C;
1062     digest[3] = MD5M_D;
1063
1064     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1065
1066     rc4_next_16 (rc4_key, 16, j, digest, out);
1067
1068     COMPARE_S_SIMD (out[0], out[1], out[2], out[3]);
1069   }
1070 }
1071
1072 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1073 {
1074   /**
1075    * base
1076    */
1077
1078   const u32 gid = get_global_id (0);
1079
1080   if (gid >= gid_max) return;
1081
1082   u32 w0[4];
1083
1084   w0[0] = pws[gid].i[ 0];
1085   w0[1] = pws[gid].i[ 1];
1086   w0[2] = pws[gid].i[ 2];
1087   w0[3] = pws[gid].i[ 3];
1088
1089   u32 w1[4];
1090
1091   w1[0] = 0;
1092   w1[1] = 0;
1093   w1[2] = 0;
1094   w1[3] = 0;
1095
1096   u32 w2[4];
1097
1098   w2[0] = 0;
1099   w2[1] = 0;
1100   w2[2] = 0;
1101   w2[3] = 0;
1102
1103   u32 w3[4];
1104
1105   w3[0] = 0;
1106   w3[1] = 0;
1107   w3[2] = 0;
1108   w3[3] = 0;
1109
1110   const u32 pw_len = pws[gid].pw_len;
1111
1112   /**
1113    * main
1114    */
1115
1116   __local RC4_KEY rc4_keys[64];
1117
1118   m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1119 }
1120
1121 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1122 {
1123   /**
1124    * base
1125    */
1126
1127   const u32 gid = get_global_id (0);
1128
1129   if (gid >= gid_max) return;
1130
1131   u32 w0[4];
1132
1133   w0[0] = pws[gid].i[ 0];
1134   w0[1] = pws[gid].i[ 1];
1135   w0[2] = pws[gid].i[ 2];
1136   w0[3] = pws[gid].i[ 3];
1137
1138   u32 w1[4];
1139
1140   w1[0] = pws[gid].i[ 4];
1141   w1[1] = pws[gid].i[ 5];
1142   w1[2] = pws[gid].i[ 6];
1143   w1[3] = pws[gid].i[ 7];
1144
1145   u32 w2[4];
1146
1147   w2[0] = 0;
1148   w2[1] = 0;
1149   w2[2] = 0;
1150   w2[3] = 0;
1151
1152   u32 w3[4];
1153
1154   w3[0] = 0;
1155   w3[1] = 0;
1156   w3[2] = 0;
1157   w3[3] = 0;
1158
1159   const u32 pw_len = pws[gid].pw_len;
1160
1161   /**
1162    * main
1163    */
1164
1165   __local RC4_KEY rc4_keys[64];
1166
1167   m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1168 }
1169
1170 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1171 {
1172   /**
1173    * base
1174    */
1175
1176   const u32 gid = get_global_id (0);
1177
1178   if (gid >= gid_max) return;
1179
1180   u32 w0[4];
1181
1182   w0[0] = pws[gid].i[ 0];
1183   w0[1] = pws[gid].i[ 1];
1184   w0[2] = pws[gid].i[ 2];
1185   w0[3] = pws[gid].i[ 3];
1186
1187   u32 w1[4];
1188
1189   w1[0] = pws[gid].i[ 4];
1190   w1[1] = pws[gid].i[ 5];
1191   w1[2] = pws[gid].i[ 6];
1192   w1[3] = pws[gid].i[ 7];
1193
1194   u32 w2[4];
1195
1196   w2[0] = pws[gid].i[ 8];
1197   w2[1] = pws[gid].i[ 9];
1198   w2[2] = pws[gid].i[10];
1199   w2[3] = pws[gid].i[11];
1200
1201   u32 w3[4];
1202
1203   w3[0] = pws[gid].i[12];
1204   w3[1] = pws[gid].i[13];
1205   w3[2] = 0;
1206   w3[3] = 0;
1207
1208   const u32 pw_len = pws[gid].pw_len;
1209
1210   /**
1211    * main
1212    */
1213
1214   __local RC4_KEY rc4_keys[64];
1215
1216   m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1217 }
1218
1219 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1220 {
1221   /**
1222    * base
1223    */
1224
1225   const u32 gid = get_global_id (0);
1226
1227   if (gid >= gid_max) return;
1228
1229   u32 w0[4];
1230
1231   w0[0] = pws[gid].i[ 0];
1232   w0[1] = pws[gid].i[ 1];
1233   w0[2] = pws[gid].i[ 2];
1234   w0[3] = pws[gid].i[ 3];
1235
1236   u32 w1[4];
1237
1238   w1[0] = 0;
1239   w1[1] = 0;
1240   w1[2] = 0;
1241   w1[3] = 0;
1242
1243   u32 w2[4];
1244
1245   w2[0] = 0;
1246   w2[1] = 0;
1247   w2[2] = 0;
1248   w2[3] = 0;
1249
1250   u32 w3[4];
1251
1252   w3[0] = 0;
1253   w3[1] = 0;
1254   w3[2] = 0;
1255   w3[3] = 0;
1256
1257   const u32 pw_len = pws[gid].pw_len;
1258
1259   /**
1260    * main
1261    */
1262
1263   __local RC4_KEY rc4_keys[64];
1264
1265   m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1266 }
1267
1268 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1269 {
1270   /**
1271    * base
1272    */
1273
1274   const u32 gid = get_global_id (0);
1275
1276   if (gid >= gid_max) return;
1277
1278   u32 w0[4];
1279
1280   w0[0] = pws[gid].i[ 0];
1281   w0[1] = pws[gid].i[ 1];
1282   w0[2] = pws[gid].i[ 2];
1283   w0[3] = pws[gid].i[ 3];
1284
1285   u32 w1[4];
1286
1287   w1[0] = pws[gid].i[ 4];
1288   w1[1] = pws[gid].i[ 5];
1289   w1[2] = pws[gid].i[ 6];
1290   w1[3] = pws[gid].i[ 7];
1291
1292   u32 w2[4];
1293
1294   w2[0] = 0;
1295   w2[1] = 0;
1296   w2[2] = 0;
1297   w2[3] = 0;
1298
1299   u32 w3[4];
1300
1301   w3[0] = 0;
1302   w3[1] = 0;
1303   w3[2] = 0;
1304   w3[3] = 0;
1305
1306   const u32 pw_len = pws[gid].pw_len;
1307
1308   /**
1309    * main
1310    */
1311
1312   __local RC4_KEY rc4_keys[64];
1313
1314   m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1315 }
1316
1317 __kernel void m09700_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 oldoffice01_t *oldoffice01_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 il_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1318 {
1319   /**
1320    * base
1321    */
1322
1323   const u32 gid = get_global_id (0);
1324
1325   if (gid >= gid_max) return;
1326
1327   u32 w0[4];
1328
1329   w0[0] = pws[gid].i[ 0];
1330   w0[1] = pws[gid].i[ 1];
1331   w0[2] = pws[gid].i[ 2];
1332   w0[3] = pws[gid].i[ 3];
1333
1334   u32 w1[4];
1335
1336   w1[0] = pws[gid].i[ 4];
1337   w1[1] = pws[gid].i[ 5];
1338   w1[2] = pws[gid].i[ 6];
1339   w1[3] = pws[gid].i[ 7];
1340
1341   u32 w2[4];
1342
1343   w2[0] = pws[gid].i[ 8];
1344   w2[1] = pws[gid].i[ 9];
1345   w2[2] = pws[gid].i[10];
1346   w2[3] = pws[gid].i[11];
1347
1348   u32 w3[4];
1349
1350   w3[0] = pws[gid].i[12];
1351   w3[1] = pws[gid].i[13];
1352   w3[2] = 0;
1353   w3[3] = 0;
1354
1355   const u32 pw_len = pws[gid].pw_len;
1356
1357   /**
1358    * main
1359    */
1360
1361   __local RC4_KEY rc4_keys[64];
1362
1363   m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, il_cnt, digests_cnt, digests_offset);
1364 }