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