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