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