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