Upgrade kernel to support dynamic local work sizes
[hashcat.git] / OpenCL / m09700_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _OLDOFFICE01_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "OpenCL/types_ocl.c"
18 #include "OpenCL/common.c"
19
20 #define COMPARE_S "OpenCL/check_single_comp4.c"
21 #define COMPARE_M "OpenCL/check_multi_comp4.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[64], 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 bfs_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   __local RC4_KEY *rc4_key = &rc4_keys[lid];
250
251   /**
252    * salt
253    */
254
255   u32 salt_buf_t0[4];
256   u32 salt_buf_t1[5];
257   u32 salt_buf_t2[5];
258   u32 salt_buf_t3[5];
259
260   salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0];
261   salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1];
262   salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2];
263   salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3];
264
265   salt_buf_t1[0] =                        salt_buf_t0[0] <<  8;
266   salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] <<  8;
267   salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] <<  8;
268   salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] <<  8;
269   salt_buf_t1[4] = salt_buf_t0[3] >> 24;
270
271   salt_buf_t2[0] =                        salt_buf_t0[0] << 16;
272   salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16;
273   salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16;
274   salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16;
275   salt_buf_t2[4] = salt_buf_t0[3] >> 16;
276
277   salt_buf_t3[0] =                        salt_buf_t0[0] << 24;
278   salt_buf_t3[1] = salt_buf_t0[0] >>  8 | salt_buf_t0[1] << 24;
279   salt_buf_t3[2] = salt_buf_t0[1] >>  8 | salt_buf_t0[2] << 24;
280   salt_buf_t3[3] = salt_buf_t0[2] >>  8 | salt_buf_t0[3] << 24;
281   salt_buf_t3[4] = salt_buf_t0[3] >>  8;
282
283   const u32 salt_len = 16;
284
285   /**
286    * esalt
287    */
288
289   const u32 version = oldoffice01_bufs[salt_pos].version;
290
291   u32 encryptedVerifier[4];
292
293   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
294   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
295   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
296   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
297
298   /**
299    * loop
300    */
301
302   u32 w0l = w0[0];
303
304   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
305   {
306     const u32 w0r = bfs_buf[il_pos].i;
307
308     w0[0] = w0l | w0r;
309
310     u32 w0_t[4];
311     u32 w1_t[4];
312     u32 w2_t[4];
313     u32 w3_t[4];
314
315     w0_t[0] = w0[0];
316     w0_t[1] = w0[1];
317     w0_t[2] = w0[2];
318     w0_t[3] = w0[3];
319     w1_t[0] = w1[0];
320     w1_t[1] = w1[1];
321     w1_t[2] = w1[2];
322     w1_t[3] = w1[3];
323     w2_t[0] = w2[0];
324     w2_t[1] = w2[1];
325     w2_t[2] = w2[2];
326     w2_t[3] = w2[3];
327     w3_t[0] = w3[0];
328     w3_t[1] = w3[1];
329     w3_t[2] = pw_len * 8;
330     w3_t[3] = 0;
331
332     u32 digest_t0[4];
333     u32 digest_t1[2]; // need only first 5 byte
334     u32 digest_t2[2];
335     u32 digest_t3[2];
336
337     digest_t0[0] = MD5M_A;
338     digest_t0[1] = MD5M_B;
339     digest_t0[2] = MD5M_C;
340     digest_t0[3] = MD5M_D;
341
342     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0);
343
344     // prepare 16 * 21 buffer stuff
345
346     u32 digest[4];
347
348     digest[0] = MD5M_A;
349     digest[1] = MD5M_B;
350     digest[2] = MD5M_C;
351     digest[3] = MD5M_D;
352
353     // offsets
354
355     digest_t0[0] &= 0xffffffff;
356     digest_t0[1] &= 0x000000ff;
357     digest_t0[2] &= 0x00000000;
358     digest_t0[3] &= 0x00000000;
359
360     digest_t1[0] =                      digest_t0[0] <<  8;
361     digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] <<  8;
362
363     digest_t2[0] =                      digest_t0[0] << 16;
364     digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16;
365
366     digest_t3[0] =                      digest_t0[0] << 24;
367     digest_t3[1] = digest_t0[0] >>  8 | digest_t0[1] << 24;
368
369     // generate the 16 * 21 buffer
370
371     w0_t[0] = 0;
372     w0_t[1] = 0;
373     w0_t[2] = 0;
374     w0_t[3] = 0;
375     w1_t[0] = 0;
376     w1_t[1] = 0;
377     w1_t[2] = 0;
378     w1_t[3] = 0;
379     w2_t[0] = 0;
380     w2_t[1] = 0;
381     w2_t[2] = 0;
382     w2_t[3] = 0;
383     w3_t[0] = 0;
384     w3_t[1] = 0;
385     w3_t[2] = 0;
386     w3_t[3] = 0;
387
388     // 0..5
389     w0_t[0]  = digest_t0[0];
390     w0_t[1]  = digest_t0[1];
391
392     // 5..21
393     w0_t[1] |= salt_buf_t1[0];
394     w0_t[2]  = salt_buf_t1[1];
395     w0_t[3]  = salt_buf_t1[2];
396     w1_t[0]  = salt_buf_t1[3];
397     w1_t[1]  = salt_buf_t1[4];
398
399     // 21..26
400     w1_t[1] |= digest_t1[0];
401     w1_t[2]  = digest_t1[1];
402
403     // 26..42
404     w1_t[2] |= salt_buf_t2[0];
405     w1_t[3]  = salt_buf_t2[1];
406     w2_t[0]  = salt_buf_t2[2];
407     w2_t[1]  = salt_buf_t2[3];
408     w2_t[2]  = salt_buf_t2[4];
409
410     // 42..47
411     w2_t[2] |= digest_t2[0];
412     w2_t[3]  = digest_t2[1];
413
414     // 47..63
415     w2_t[3] |= salt_buf_t3[0];
416     w3_t[0]  = salt_buf_t3[1];
417     w3_t[1]  = salt_buf_t3[2];
418     w3_t[2]  = salt_buf_t3[3];
419     w3_t[3]  = salt_buf_t3[4];
420
421     // 63..
422
423     w3_t[3] |= digest_t3[0];
424
425     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
426
427     w0_t[0] = 0;
428     w0_t[1] = 0;
429     w0_t[2] = 0;
430     w0_t[3] = 0;
431     w1_t[0] = 0;
432     w1_t[1] = 0;
433     w1_t[2] = 0;
434     w1_t[3] = 0;
435     w2_t[0] = 0;
436     w2_t[1] = 0;
437     w2_t[2] = 0;
438     w2_t[3] = 0;
439     w3_t[0] = 0;
440     w3_t[1] = 0;
441     w3_t[2] = 0;
442     w3_t[3] = 0;
443
444     // 0..4
445     w0_t[0]  = digest_t3[1];
446
447     // 4..20
448     w0_t[1]  = salt_buf_t0[0];
449     w0_t[2]  = salt_buf_t0[1];
450     w0_t[3]  = salt_buf_t0[2];
451     w1_t[0]  = salt_buf_t0[3];
452
453     // 20..25
454     w1_t[1]  = digest_t0[0];
455     w1_t[2]  = digest_t0[1];
456
457     // 25..41
458     w1_t[2] |= salt_buf_t1[0];
459     w1_t[3]  = salt_buf_t1[1];
460     w2_t[0]  = salt_buf_t1[2];
461     w2_t[1]  = salt_buf_t1[3];
462     w2_t[2]  = salt_buf_t1[4];
463
464     // 41..46
465     w2_t[2] |= digest_t1[0];
466     w2_t[3]  = digest_t1[1];
467
468     // 46..62
469     w2_t[3] |= salt_buf_t2[0];
470     w3_t[0]  = salt_buf_t2[1];
471     w3_t[1]  = salt_buf_t2[2];
472     w3_t[2]  = salt_buf_t2[3];
473     w3_t[3]  = salt_buf_t2[4];
474
475     // 62..
476     w3_t[3] |= digest_t2[0];
477
478     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
479
480     w0_t[0] = 0;
481     w0_t[1] = 0;
482     w0_t[2] = 0;
483     w0_t[3] = 0;
484     w1_t[0] = 0;
485     w1_t[1] = 0;
486     w1_t[2] = 0;
487     w1_t[3] = 0;
488     w2_t[0] = 0;
489     w2_t[1] = 0;
490     w2_t[2] = 0;
491     w2_t[3] = 0;
492     w3_t[0] = 0;
493     w3_t[1] = 0;
494     w3_t[2] = 0;
495     w3_t[3] = 0;
496
497     // 0..3
498     w0_t[0]  = digest_t2[1];
499
500     // 3..19
501     w0_t[0] |= salt_buf_t3[0];
502     w0_t[1]  = salt_buf_t3[1];
503     w0_t[2]  = salt_buf_t3[2];
504     w0_t[3]  = salt_buf_t3[3];
505     w1_t[0]  = salt_buf_t3[4];
506
507     // 19..24
508     w1_t[0] |= digest_t3[0];
509     w1_t[1]  = digest_t3[1];
510
511     // 24..40
512     w1_t[2]  = salt_buf_t0[0];
513     w1_t[3]  = salt_buf_t0[1];
514     w2_t[0]  = salt_buf_t0[2];
515     w2_t[1]  = salt_buf_t0[3];
516
517     // 40..45
518     w2_t[2]  = digest_t0[0];
519     w2_t[3]  = digest_t0[1];
520
521     // 45..61
522     w2_t[3] |= salt_buf_t1[0];
523     w3_t[0]  = salt_buf_t1[1];
524     w3_t[1]  = salt_buf_t1[2];
525     w3_t[2]  = salt_buf_t1[3];
526     w3_t[3]  = salt_buf_t1[4];
527
528     // 61..
529     w3_t[3] |= digest_t1[0];
530
531     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
532
533     w0_t[0] = 0;
534     w0_t[1] = 0;
535     w0_t[2] = 0;
536     w0_t[3] = 0;
537     w1_t[0] = 0;
538     w1_t[1] = 0;
539     w1_t[2] = 0;
540     w1_t[3] = 0;
541     w2_t[0] = 0;
542     w2_t[1] = 0;
543     w2_t[2] = 0;
544     w2_t[3] = 0;
545     w3_t[0] = 0;
546     w3_t[1] = 0;
547     w3_t[2] = 0;
548     w3_t[3] = 0;
549
550     // 0..2
551     w0_t[0]  = digest_t1[1];
552
553     // 2..18
554     w0_t[0] |= salt_buf_t2[0];
555     w0_t[1]  = salt_buf_t2[1];
556     w0_t[2]  = salt_buf_t2[2];
557     w0_t[3]  = salt_buf_t2[3];
558     w1_t[0]  = salt_buf_t2[4];
559
560     // 18..23
561     w1_t[0] |= digest_t2[0];
562     w1_t[1]  = digest_t2[1];
563
564     // 23..39
565     w1_t[1] |= salt_buf_t3[0];
566     w1_t[2]  = salt_buf_t3[1];
567     w1_t[3]  = salt_buf_t3[2];
568     w2_t[0]  = salt_buf_t3[3];
569     w2_t[1]  = salt_buf_t3[4];
570
571     // 39..44
572     w2_t[1] |= digest_t3[0];
573     w2_t[2]  = digest_t3[1];
574
575     // 44..60
576     w2_t[3]  = salt_buf_t0[0];
577     w3_t[0]  = salt_buf_t0[1];
578     w3_t[1]  = salt_buf_t0[2];
579     w3_t[2]  = salt_buf_t0[3];
580
581     // 60..
582     w3_t[3]  = digest_t0[0];
583
584     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
585
586     w0_t[0] = 0;
587     w0_t[1] = 0;
588     w0_t[2] = 0;
589     w0_t[3] = 0;
590     w1_t[0] = 0;
591     w1_t[1] = 0;
592     w1_t[2] = 0;
593     w1_t[3] = 0;
594     w2_t[0] = 0;
595     w2_t[1] = 0;
596     w2_t[2] = 0;
597     w2_t[3] = 0;
598     w3_t[0] = 0;
599     w3_t[1] = 0;
600     w3_t[2] = 0;
601     w3_t[3] = 0;
602
603     // 0..1
604     w0_t[0]  = digest_t0[1];
605
606     // 1..17
607     w0_t[0] |= salt_buf_t1[0];
608     w0_t[1]  = salt_buf_t1[1];
609     w0_t[2]  = salt_buf_t1[2];
610     w0_t[3]  = salt_buf_t1[3];
611     w1_t[0]  = salt_buf_t1[4];
612
613     // 17..22
614     w1_t[0] |= digest_t1[0];
615     w1_t[1]  = digest_t1[1];
616
617     // 22..38
618     w1_t[1] |= salt_buf_t2[0];
619     w1_t[2]  = salt_buf_t2[1];
620     w1_t[3]  = salt_buf_t2[2];
621     w2_t[0]  = salt_buf_t2[3];
622     w2_t[1]  = salt_buf_t2[4];
623
624     // 38..43
625     w2_t[1] |= digest_t2[0];
626     w2_t[2]  = digest_t2[1];
627
628     // 43..59
629     w2_t[2] |= salt_buf_t3[0];
630     w2_t[3]  = salt_buf_t3[1];
631     w3_t[0]  = salt_buf_t3[2];
632     w3_t[1]  = salt_buf_t3[3];
633     w3_t[2]  = salt_buf_t3[4];
634
635     // 59..
636     w3_t[2] |= digest_t3[0];
637     w3_t[3]  = digest_t3[1];
638
639     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
640
641     w0_t[0]  = salt_buf_t0[0];
642     w0_t[1]  = salt_buf_t0[1];
643     w0_t[2]  = salt_buf_t0[2];
644     w0_t[3]  = salt_buf_t0[3];
645     w1_t[0]  = 0x80;
646     w1_t[1]  = 0;
647     w1_t[2]  = 0;
648     w1_t[3]  = 0;
649     w2_t[0]  = 0;
650     w2_t[1]  = 0;
651     w2_t[2]  = 0;
652     w2_t[3]  = 0;
653     w3_t[0]  = 0;
654     w3_t[1]  = 0;
655     w3_t[2]  = 21 * 16 * 8;
656     w3_t[3]  = 0;
657
658     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
659
660     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
661
662     w0_t[0]  = digest[0];
663     w0_t[1]  = digest[1] & 0xff;
664     w0_t[2]  = 0x8000;
665     w0_t[3]  = 0;
666     w1_t[0]  = 0;
667     w1_t[1]  = 0;
668     w1_t[2]  = 0;
669     w1_t[3]  = 0;
670     w2_t[0]  = 0;
671     w2_t[1]  = 0;
672     w2_t[2]  = 0;
673     w2_t[3]  = 0;
674     w3_t[0]  = 0;
675     w3_t[1]  = 0;
676     w3_t[2]  = 9 * 8;
677     w3_t[3]  = 0;
678
679     digest[0] = MD5M_A;
680     digest[1] = MD5M_B;
681     digest[2] = MD5M_C;
682     digest[3] = MD5M_D;
683
684     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
685
686     // now the RC4 part
687
688     u32 key[4];
689
690     key[0] = digest[0];
691     key[1] = digest[1];
692     key[2] = digest[2];
693     key[3] = digest[3];
694
695     rc4_init_16 (rc4_key, key);
696
697     u32 out[4];
698
699     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
700
701     w0_t[0] = out[0];
702     w0_t[1] = out[1];
703     w0_t[2] = out[2];
704     w0_t[3] = out[3];
705     w1_t[0] = 0x80;
706     w1_t[1] = 0;
707     w1_t[2] = 0;
708     w1_t[3] = 0;
709     w2_t[0] = 0;
710     w2_t[1] = 0;
711     w2_t[2] = 0;
712     w2_t[3] = 0;
713     w3_t[0] = 0;
714     w3_t[1] = 0;
715     w3_t[2] = 16 * 8;
716     w3_t[3] = 0;
717
718     digest[0] = MD5M_A;
719     digest[1] = MD5M_B;
720     digest[2] = MD5M_C;
721     digest[3] = MD5M_D;
722
723     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
724
725     rc4_next_16 (rc4_key, 16, j, digest, out);
726
727     const u32 r0 = out[0];
728     const u32 r1 = out[1];
729     const u32 r2 = out[2];
730     const u32 r3 = out[3];
731
732     #include COMPARE_M
733   }
734 }
735
736 static void m09700s (__local RC4_KEY rc4_keys[64], 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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
737 {
738   /**
739    * modifier
740    */
741
742   const u32 gid = get_global_id (0);
743   const u32 lid = get_local_id (0);
744
745   __local RC4_KEY *rc4_key = &rc4_keys[lid];
746
747   /**
748    * digest
749    */
750
751   const u32 search[4] =
752   {
753     digests_buf[digests_offset].digest_buf[DGST_R0],
754     digests_buf[digests_offset].digest_buf[DGST_R1],
755     digests_buf[digests_offset].digest_buf[DGST_R2],
756     digests_buf[digests_offset].digest_buf[DGST_R3]
757   };
758
759   /**
760    * salt
761    */
762
763   u32 salt_buf_t0[4];
764   u32 salt_buf_t1[5];
765   u32 salt_buf_t2[5];
766   u32 salt_buf_t3[5];
767
768   salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0];
769   salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1];
770   salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2];
771   salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3];
772
773   salt_buf_t1[0] =                        salt_buf_t0[0] <<  8;
774   salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] <<  8;
775   salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] <<  8;
776   salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] <<  8;
777   salt_buf_t1[4] = salt_buf_t0[3] >> 24;
778
779   salt_buf_t2[0] =                        salt_buf_t0[0] << 16;
780   salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16;
781   salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16;
782   salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16;
783   salt_buf_t2[4] = salt_buf_t0[3] >> 16;
784
785   salt_buf_t3[0] =                        salt_buf_t0[0] << 24;
786   salt_buf_t3[1] = salt_buf_t0[0] >>  8 | salt_buf_t0[1] << 24;
787   salt_buf_t3[2] = salt_buf_t0[1] >>  8 | salt_buf_t0[2] << 24;
788   salt_buf_t3[3] = salt_buf_t0[2] >>  8 | salt_buf_t0[3] << 24;
789   salt_buf_t3[4] = salt_buf_t0[3] >>  8;
790
791   const u32 salt_len = 16;
792
793   /**
794    * esalt
795    */
796
797   const u32 version = oldoffice01_bufs[salt_pos].version;
798
799   u32 encryptedVerifier[4];
800
801   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
802   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
803   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
804   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
805
806   /**
807    * loop
808    */
809
810   u32 w0l = w0[0];
811
812   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
813   {
814     const u32 w0r = bfs_buf[il_pos].i;
815
816     w0[0] = w0l | w0r;
817
818     u32 w0_t[4];
819     u32 w1_t[4];
820     u32 w2_t[4];
821     u32 w3_t[4];
822
823     w0_t[0] = w0[0];
824     w0_t[1] = w0[1];
825     w0_t[2] = w0[2];
826     w0_t[3] = w0[3];
827     w1_t[0] = w1[0];
828     w1_t[1] = w1[1];
829     w1_t[2] = w1[2];
830     w1_t[3] = w1[3];
831     w2_t[0] = w2[0];
832     w2_t[1] = w2[1];
833     w2_t[2] = w2[2];
834     w2_t[3] = w2[3];
835     w3_t[0] = w3[0];
836     w3_t[1] = w3[1];
837     w3_t[2] = pw_len * 8;
838     w3_t[3] = 0;
839
840     u32 digest_t0[4];
841     u32 digest_t1[2]; // need only first 5 byte
842     u32 digest_t2[2];
843     u32 digest_t3[2];
844
845     digest_t0[0] = MD5M_A;
846     digest_t0[1] = MD5M_B;
847     digest_t0[2] = MD5M_C;
848     digest_t0[3] = MD5M_D;
849
850     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0);
851
852     // prepare 16 * 21 buffer stuff
853
854     u32 digest[4];
855
856     digest[0] = MD5M_A;
857     digest[1] = MD5M_B;
858     digest[2] = MD5M_C;
859     digest[3] = MD5M_D;
860
861     // offsets
862
863     digest_t0[0] &= 0xffffffff;
864     digest_t0[1] &= 0x000000ff;
865     digest_t0[2] &= 0x00000000;
866     digest_t0[3] &= 0x00000000;
867
868     digest_t1[0] =                      digest_t0[0] <<  8;
869     digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] <<  8;
870
871     digest_t2[0] =                      digest_t0[0] << 16;
872     digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16;
873
874     digest_t3[0] =                      digest_t0[0] << 24;
875     digest_t3[1] = digest_t0[0] >>  8 | digest_t0[1] << 24;
876
877     // generate the 16 * 21 buffer
878
879     w0_t[0] = 0;
880     w0_t[1] = 0;
881     w0_t[2] = 0;
882     w0_t[3] = 0;
883     w1_t[0] = 0;
884     w1_t[1] = 0;
885     w1_t[2] = 0;
886     w1_t[3] = 0;
887     w2_t[0] = 0;
888     w2_t[1] = 0;
889     w2_t[2] = 0;
890     w2_t[3] = 0;
891     w3_t[0] = 0;
892     w3_t[1] = 0;
893     w3_t[2] = 0;
894     w3_t[3] = 0;
895
896     // 0..5
897     w0_t[0]  = digest_t0[0];
898     w0_t[1]  = digest_t0[1];
899
900     // 5..21
901     w0_t[1] |= salt_buf_t1[0];
902     w0_t[2]  = salt_buf_t1[1];
903     w0_t[3]  = salt_buf_t1[2];
904     w1_t[0]  = salt_buf_t1[3];
905     w1_t[1]  = salt_buf_t1[4];
906
907     // 21..26
908     w1_t[1] |= digest_t1[0];
909     w1_t[2]  = digest_t1[1];
910
911     // 26..42
912     w1_t[2] |= salt_buf_t2[0];
913     w1_t[3]  = salt_buf_t2[1];
914     w2_t[0]  = salt_buf_t2[2];
915     w2_t[1]  = salt_buf_t2[3];
916     w2_t[2]  = salt_buf_t2[4];
917
918     // 42..47
919     w2_t[2] |= digest_t2[0];
920     w2_t[3]  = digest_t2[1];
921
922     // 47..63
923     w2_t[3] |= salt_buf_t3[0];
924     w3_t[0]  = salt_buf_t3[1];
925     w3_t[1]  = salt_buf_t3[2];
926     w3_t[2]  = salt_buf_t3[3];
927     w3_t[3]  = salt_buf_t3[4];
928
929     // 63..
930
931     w3_t[3] |= digest_t3[0];
932
933     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
934
935     w0_t[0] = 0;
936     w0_t[1] = 0;
937     w0_t[2] = 0;
938     w0_t[3] = 0;
939     w1_t[0] = 0;
940     w1_t[1] = 0;
941     w1_t[2] = 0;
942     w1_t[3] = 0;
943     w2_t[0] = 0;
944     w2_t[1] = 0;
945     w2_t[2] = 0;
946     w2_t[3] = 0;
947     w3_t[0] = 0;
948     w3_t[1] = 0;
949     w3_t[2] = 0;
950     w3_t[3] = 0;
951
952     // 0..4
953     w0_t[0]  = digest_t3[1];
954
955     // 4..20
956     w0_t[1]  = salt_buf_t0[0];
957     w0_t[2]  = salt_buf_t0[1];
958     w0_t[3]  = salt_buf_t0[2];
959     w1_t[0]  = salt_buf_t0[3];
960
961     // 20..25
962     w1_t[1]  = digest_t0[0];
963     w1_t[2]  = digest_t0[1];
964
965     // 25..41
966     w1_t[2] |= salt_buf_t1[0];
967     w1_t[3]  = salt_buf_t1[1];
968     w2_t[0]  = salt_buf_t1[2];
969     w2_t[1]  = salt_buf_t1[3];
970     w2_t[2]  = salt_buf_t1[4];
971
972     // 41..46
973     w2_t[2] |= digest_t1[0];
974     w2_t[3]  = digest_t1[1];
975
976     // 46..62
977     w2_t[3] |= salt_buf_t2[0];
978     w3_t[0]  = salt_buf_t2[1];
979     w3_t[1]  = salt_buf_t2[2];
980     w3_t[2]  = salt_buf_t2[3];
981     w3_t[3]  = salt_buf_t2[4];
982
983     // 62..
984     w3_t[3] |= digest_t2[0];
985
986     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
987
988     w0_t[0] = 0;
989     w0_t[1] = 0;
990     w0_t[2] = 0;
991     w0_t[3] = 0;
992     w1_t[0] = 0;
993     w1_t[1] = 0;
994     w1_t[2] = 0;
995     w1_t[3] = 0;
996     w2_t[0] = 0;
997     w2_t[1] = 0;
998     w2_t[2] = 0;
999     w2_t[3] = 0;
1000     w3_t[0] = 0;
1001     w3_t[1] = 0;
1002     w3_t[2] = 0;
1003     w3_t[3] = 0;
1004
1005     // 0..3
1006     w0_t[0]  = digest_t2[1];
1007
1008     // 3..19
1009     w0_t[0] |= salt_buf_t3[0];
1010     w0_t[1]  = salt_buf_t3[1];
1011     w0_t[2]  = salt_buf_t3[2];
1012     w0_t[3]  = salt_buf_t3[3];
1013     w1_t[0]  = salt_buf_t3[4];
1014
1015     // 19..24
1016     w1_t[0] |= digest_t3[0];
1017     w1_t[1]  = digest_t3[1];
1018
1019     // 24..40
1020     w1_t[2]  = salt_buf_t0[0];
1021     w1_t[3]  = salt_buf_t0[1];
1022     w2_t[0]  = salt_buf_t0[2];
1023     w2_t[1]  = salt_buf_t0[3];
1024
1025     // 40..45
1026     w2_t[2]  = digest_t0[0];
1027     w2_t[3]  = digest_t0[1];
1028
1029     // 45..61
1030     w2_t[3] |= salt_buf_t1[0];
1031     w3_t[0]  = salt_buf_t1[1];
1032     w3_t[1]  = salt_buf_t1[2];
1033     w3_t[2]  = salt_buf_t1[3];
1034     w3_t[3]  = salt_buf_t1[4];
1035
1036     // 61..
1037     w3_t[3] |= digest_t1[0];
1038
1039     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1040
1041     w0_t[0] = 0;
1042     w0_t[1] = 0;
1043     w0_t[2] = 0;
1044     w0_t[3] = 0;
1045     w1_t[0] = 0;
1046     w1_t[1] = 0;
1047     w1_t[2] = 0;
1048     w1_t[3] = 0;
1049     w2_t[0] = 0;
1050     w2_t[1] = 0;
1051     w2_t[2] = 0;
1052     w2_t[3] = 0;
1053     w3_t[0] = 0;
1054     w3_t[1] = 0;
1055     w3_t[2] = 0;
1056     w3_t[3] = 0;
1057
1058     // 0..2
1059     w0_t[0]  = digest_t1[1];
1060
1061     // 2..18
1062     w0_t[0] |= salt_buf_t2[0];
1063     w0_t[1]  = salt_buf_t2[1];
1064     w0_t[2]  = salt_buf_t2[2];
1065     w0_t[3]  = salt_buf_t2[3];
1066     w1_t[0]  = salt_buf_t2[4];
1067
1068     // 18..23
1069     w1_t[0] |= digest_t2[0];
1070     w1_t[1]  = digest_t2[1];
1071
1072     // 23..39
1073     w1_t[1] |= salt_buf_t3[0];
1074     w1_t[2]  = salt_buf_t3[1];
1075     w1_t[3]  = salt_buf_t3[2];
1076     w2_t[0]  = salt_buf_t3[3];
1077     w2_t[1]  = salt_buf_t3[4];
1078
1079     // 39..44
1080     w2_t[1] |= digest_t3[0];
1081     w2_t[2]  = digest_t3[1];
1082
1083     // 44..60
1084     w2_t[3]  = salt_buf_t0[0];
1085     w3_t[0]  = salt_buf_t0[1];
1086     w3_t[1]  = salt_buf_t0[2];
1087     w3_t[2]  = salt_buf_t0[3];
1088
1089     // 60..
1090     w3_t[3]  = digest_t0[0];
1091
1092     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1093
1094     w0_t[0] = 0;
1095     w0_t[1] = 0;
1096     w0_t[2] = 0;
1097     w0_t[3] = 0;
1098     w1_t[0] = 0;
1099     w1_t[1] = 0;
1100     w1_t[2] = 0;
1101     w1_t[3] = 0;
1102     w2_t[0] = 0;
1103     w2_t[1] = 0;
1104     w2_t[2] = 0;
1105     w2_t[3] = 0;
1106     w3_t[0] = 0;
1107     w3_t[1] = 0;
1108     w3_t[2] = 0;
1109     w3_t[3] = 0;
1110
1111     // 0..1
1112     w0_t[0]  = digest_t0[1];
1113
1114     // 1..17
1115     w0_t[0] |= salt_buf_t1[0];
1116     w0_t[1]  = salt_buf_t1[1];
1117     w0_t[2]  = salt_buf_t1[2];
1118     w0_t[3]  = salt_buf_t1[3];
1119     w1_t[0]  = salt_buf_t1[4];
1120
1121     // 17..22
1122     w1_t[0] |= digest_t1[0];
1123     w1_t[1]  = digest_t1[1];
1124
1125     // 22..38
1126     w1_t[1] |= salt_buf_t2[0];
1127     w1_t[2]  = salt_buf_t2[1];
1128     w1_t[3]  = salt_buf_t2[2];
1129     w2_t[0]  = salt_buf_t2[3];
1130     w2_t[1]  = salt_buf_t2[4];
1131
1132     // 38..43
1133     w2_t[1] |= digest_t2[0];
1134     w2_t[2]  = digest_t2[1];
1135
1136     // 43..59
1137     w2_t[2] |= salt_buf_t3[0];
1138     w2_t[3]  = salt_buf_t3[1];
1139     w3_t[0]  = salt_buf_t3[2];
1140     w3_t[1]  = salt_buf_t3[3];
1141     w3_t[2]  = salt_buf_t3[4];
1142
1143     // 59..
1144     w3_t[2] |= digest_t3[0];
1145     w3_t[3]  = digest_t3[1];
1146
1147     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1148
1149     w0_t[0]  = salt_buf_t0[0];
1150     w0_t[1]  = salt_buf_t0[1];
1151     w0_t[2]  = salt_buf_t0[2];
1152     w0_t[3]  = salt_buf_t0[3];
1153     w1_t[0]  = 0x80;
1154     w1_t[1]  = 0;
1155     w1_t[2]  = 0;
1156     w1_t[3]  = 0;
1157     w2_t[0]  = 0;
1158     w2_t[1]  = 0;
1159     w2_t[2]  = 0;
1160     w2_t[3]  = 0;
1161     w3_t[0]  = 0;
1162     w3_t[1]  = 0;
1163     w3_t[2]  = 21 * 16 * 8;
1164     w3_t[3]  = 0;
1165
1166     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1167
1168     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
1169
1170     w0_t[0]  = digest[0];
1171     w0_t[1]  = digest[1] & 0xff;
1172     w0_t[2]  = 0x8000;
1173     w0_t[3]  = 0;
1174     w1_t[0]  = 0;
1175     w1_t[1]  = 0;
1176     w1_t[2]  = 0;
1177     w1_t[3]  = 0;
1178     w2_t[0]  = 0;
1179     w2_t[1]  = 0;
1180     w2_t[2]  = 0;
1181     w2_t[3]  = 0;
1182     w3_t[0]  = 0;
1183     w3_t[1]  = 0;
1184     w3_t[2]  = 9 * 8;
1185     w3_t[3]  = 0;
1186
1187     digest[0] = MD5M_A;
1188     digest[1] = MD5M_B;
1189     digest[2] = MD5M_C;
1190     digest[3] = MD5M_D;
1191
1192     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1193
1194     // now the RC4 part
1195
1196     u32 key[4];
1197
1198     key[0] = digest[0];
1199     key[1] = digest[1];
1200     key[2] = digest[2];
1201     key[3] = digest[3];
1202
1203     rc4_init_16 (rc4_key, key);
1204
1205     u32 out[4];
1206
1207     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
1208
1209     w0_t[0] = out[0];
1210     w0_t[1] = out[1];
1211     w0_t[2] = out[2];
1212     w0_t[3] = out[3];
1213     w1_t[0] = 0x80;
1214     w1_t[1] = 0;
1215     w1_t[2] = 0;
1216     w1_t[3] = 0;
1217     w2_t[0] = 0;
1218     w2_t[1] = 0;
1219     w2_t[2] = 0;
1220     w2_t[3] = 0;
1221     w3_t[0] = 0;
1222     w3_t[1] = 0;
1223     w3_t[2] = 16 * 8;
1224     w3_t[3] = 0;
1225
1226     digest[0] = MD5M_A;
1227     digest[1] = MD5M_B;
1228     digest[2] = MD5M_C;
1229     digest[3] = MD5M_D;
1230
1231     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1232
1233     rc4_next_16 (rc4_key, 16, j, digest, out);
1234
1235     const u32 r0 = out[0];
1236     const u32 r1 = out[1];
1237     const u32 r2 = out[2];
1238     const u32 r3 = out[3];
1239
1240     #include COMPARE_S
1241   }
1242 }
1243
1244 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1245 {
1246   /**
1247    * base
1248    */
1249
1250   const u32 gid = get_global_id (0);
1251
1252   if (gid >= gid_max) return;
1253
1254   u32 w0[4];
1255
1256   w0[0] = pws[gid].i[ 0];
1257   w0[1] = pws[gid].i[ 1];
1258   w0[2] = pws[gid].i[ 2];
1259   w0[3] = pws[gid].i[ 3];
1260
1261   u32 w1[4];
1262
1263   w1[0] = 0;
1264   w1[1] = 0;
1265   w1[2] = 0;
1266   w1[3] = 0;
1267
1268   u32 w2[4];
1269
1270   w2[0] = 0;
1271   w2[1] = 0;
1272   w2[2] = 0;
1273   w2[3] = 0;
1274
1275   u32 w3[4];
1276
1277   w3[0] = 0;
1278   w3[1] = 0;
1279   w3[2] = 0;
1280   w3[3] = 0;
1281
1282   const u32 pw_len = pws[gid].pw_len;
1283
1284   /**
1285    * main
1286    */
1287
1288   __local RC4_KEY rc4_keys[64];
1289
1290   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, bfs_cnt, digests_cnt, digests_offset);
1291 }
1292
1293 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1294 {
1295   /**
1296    * base
1297    */
1298
1299   const u32 gid = get_global_id (0);
1300
1301   if (gid >= gid_max) return;
1302
1303   u32 w0[4];
1304
1305   w0[0] = pws[gid].i[ 0];
1306   w0[1] = pws[gid].i[ 1];
1307   w0[2] = pws[gid].i[ 2];
1308   w0[3] = pws[gid].i[ 3];
1309
1310   u32 w1[4];
1311
1312   w1[0] = pws[gid].i[ 4];
1313   w1[1] = pws[gid].i[ 5];
1314   w1[2] = pws[gid].i[ 6];
1315   w1[3] = pws[gid].i[ 7];
1316
1317   u32 w2[4];
1318
1319   w2[0] = 0;
1320   w2[1] = 0;
1321   w2[2] = 0;
1322   w2[3] = 0;
1323
1324   u32 w3[4];
1325
1326   w3[0] = 0;
1327   w3[1] = 0;
1328   w3[2] = 0;
1329   w3[3] = 0;
1330
1331   const u32 pw_len = pws[gid].pw_len;
1332
1333   /**
1334    * main
1335    */
1336
1337   __local RC4_KEY rc4_keys[64];
1338
1339   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, bfs_cnt, digests_cnt, digests_offset);
1340 }
1341
1342 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1343 {
1344   /**
1345    * base
1346    */
1347
1348   const u32 gid = get_global_id (0);
1349
1350   if (gid >= gid_max) return;
1351
1352   u32 w0[4];
1353
1354   w0[0] = pws[gid].i[ 0];
1355   w0[1] = pws[gid].i[ 1];
1356   w0[2] = pws[gid].i[ 2];
1357   w0[3] = pws[gid].i[ 3];
1358
1359   u32 w1[4];
1360
1361   w1[0] = pws[gid].i[ 4];
1362   w1[1] = pws[gid].i[ 5];
1363   w1[2] = pws[gid].i[ 6];
1364   w1[3] = pws[gid].i[ 7];
1365
1366   u32 w2[4];
1367
1368   w2[0] = pws[gid].i[ 8];
1369   w2[1] = pws[gid].i[ 9];
1370   w2[2] = pws[gid].i[10];
1371   w2[3] = pws[gid].i[11];
1372
1373   u32 w3[4];
1374
1375   w3[0] = pws[gid].i[12];
1376   w3[1] = pws[gid].i[13];
1377   w3[2] = 0;
1378   w3[3] = 0;
1379
1380   const u32 pw_len = pws[gid].pw_len;
1381
1382   /**
1383    * main
1384    */
1385
1386   __local RC4_KEY rc4_keys[64];
1387
1388   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, bfs_cnt, digests_cnt, digests_offset);
1389 }
1390
1391 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1392 {
1393   /**
1394    * base
1395    */
1396
1397   const u32 gid = get_global_id (0);
1398
1399   if (gid >= gid_max) return;
1400
1401   u32 w0[4];
1402
1403   w0[0] = pws[gid].i[ 0];
1404   w0[1] = pws[gid].i[ 1];
1405   w0[2] = pws[gid].i[ 2];
1406   w0[3] = pws[gid].i[ 3];
1407
1408   u32 w1[4];
1409
1410   w1[0] = 0;
1411   w1[1] = 0;
1412   w1[2] = 0;
1413   w1[3] = 0;
1414
1415   u32 w2[4];
1416
1417   w2[0] = 0;
1418   w2[1] = 0;
1419   w2[2] = 0;
1420   w2[3] = 0;
1421
1422   u32 w3[4];
1423
1424   w3[0] = 0;
1425   w3[1] = 0;
1426   w3[2] = 0;
1427   w3[3] = 0;
1428
1429   const u32 pw_len = pws[gid].pw_len;
1430
1431   /**
1432    * main
1433    */
1434
1435   __local RC4_KEY rc4_keys[64];
1436
1437   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, bfs_cnt, digests_cnt, digests_offset);
1438 }
1439
1440 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1441 {
1442   /**
1443    * base
1444    */
1445
1446   const u32 gid = get_global_id (0);
1447
1448   if (gid >= gid_max) return;
1449
1450   u32 w0[4];
1451
1452   w0[0] = pws[gid].i[ 0];
1453   w0[1] = pws[gid].i[ 1];
1454   w0[2] = pws[gid].i[ 2];
1455   w0[3] = pws[gid].i[ 3];
1456
1457   u32 w1[4];
1458
1459   w1[0] = pws[gid].i[ 4];
1460   w1[1] = pws[gid].i[ 5];
1461   w1[2] = pws[gid].i[ 6];
1462   w1[3] = pws[gid].i[ 7];
1463
1464   u32 w2[4];
1465
1466   w2[0] = 0;
1467   w2[1] = 0;
1468   w2[2] = 0;
1469   w2[3] = 0;
1470
1471   u32 w3[4];
1472
1473   w3[0] = 0;
1474   w3[1] = 0;
1475   w3[2] = 0;
1476   w3[3] = 0;
1477
1478   const u32 pw_len = pws[gid].pw_len;
1479
1480   /**
1481    * main
1482    */
1483
1484   __local RC4_KEY rc4_keys[64];
1485
1486   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, bfs_cnt, digests_cnt, digests_offset);
1487 }
1488
1489 __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1490 {
1491   /**
1492    * base
1493    */
1494
1495   const u32 gid = get_global_id (0);
1496
1497   if (gid >= gid_max) return;
1498
1499   u32 w0[4];
1500
1501   w0[0] = pws[gid].i[ 0];
1502   w0[1] = pws[gid].i[ 1];
1503   w0[2] = pws[gid].i[ 2];
1504   w0[3] = pws[gid].i[ 3];
1505
1506   u32 w1[4];
1507
1508   w1[0] = pws[gid].i[ 4];
1509   w1[1] = pws[gid].i[ 5];
1510   w1[2] = pws[gid].i[ 6];
1511   w1[3] = pws[gid].i[ 7];
1512
1513   u32 w2[4];
1514
1515   w2[0] = pws[gid].i[ 8];
1516   w2[1] = pws[gid].i[ 9];
1517   w2[2] = pws[gid].i[10];
1518   w2[3] = pws[gid].i[11];
1519
1520   u32 w3[4];
1521
1522   w3[0] = pws[gid].i[12];
1523   w3[1] = pws[gid].i[13];
1524   w3[2] = 0;
1525   w3[3] = 0;
1526
1527   const u32 pw_len = pws[gid].pw_len;
1528
1529   /**
1530    * main
1531    */
1532
1533   __local RC4_KEY rc4_keys[64];
1534
1535   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, bfs_cnt, digests_cnt, digests_offset);
1536 }