Replace the substring GPU to a more appropriate "device" or "kernel" substring depend...
[hashcat.git] / OpenCL / m09710_a0.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 "include/rp_kernel.h"
20 #include "OpenCL/rp.c"
21
22 #define COMPARE_S "OpenCL/check_single_comp4.c"
23 #define COMPARE_M "OpenCL/check_multi_comp4.c"
24
25 typedef struct
26 {
27   u8 S[256];
28
29   u32 wtf_its_faster;
30
31 } RC4_KEY;
32
33 static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j)
34 {
35   u8 tmp;
36
37   tmp           = rc4_key->S[i];
38   rc4_key->S[i] = rc4_key->S[j];
39   rc4_key->S[j] = tmp;
40 }
41
42 static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4])
43 {
44   u32 v = 0x03020100;
45   u32 a = 0x04040404;
46
47   __local u32 *ptr = (__local u32 *) rc4_key->S;
48
49   #pragma unroll
50   for (u32 i = 0; i < 64; i++)
51   {
52     *ptr++ = v; v += a;
53   }
54
55   u32 j = 0;
56
57   for (u32 i = 0; i < 16; i++)
58   {
59     u32 idx = i * 16;
60
61     u32 v;
62
63     v = data[0];
64
65     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
66     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
67     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
68     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
69
70     v = data[1];
71
72     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
73     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
74     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
75     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
76
77     v = data[2];
78
79     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
80     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
81     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
82     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
83
84     v = data[3];
85
86     j += rc4_key->S[idx] + (v >>  0); swap (rc4_key, idx, j); idx++;
87     j += rc4_key->S[idx] + (v >>  8); swap (rc4_key, idx, j); idx++;
88     j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++;
89     j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++;
90   }
91 }
92
93 static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4])
94 {
95   #pragma unroll
96   for (u32 k = 0; k < 4; k++)
97   {
98     u32 xor4 = 0;
99
100     u8 idx;
101
102     i += 1;
103     j += rc4_key->S[i];
104
105     swap (rc4_key, i, j);
106
107     idx = rc4_key->S[i] + rc4_key->S[j];
108
109     xor4 |= rc4_key->S[idx] <<  0;
110
111     i += 1;
112     j += rc4_key->S[i];
113
114     swap (rc4_key, i, j);
115
116     idx = rc4_key->S[i] + rc4_key->S[j];
117
118     xor4 |= rc4_key->S[idx] <<  8;
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] << 16;
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] << 24;
137
138     out[k] = in[k] ^ xor4;
139   }
140
141   return j;
142 }
143
144 static void md5_transform (const u32 w0[4], const u32 w1[4], const u32 w2[4], const u32 w3[4], u32 digest[4])
145 {
146   u32 a = digest[0];
147   u32 b = digest[1];
148   u32 c = digest[2];
149   u32 d = digest[3];
150
151   u32 w0_t = w0[0];
152   u32 w1_t = w0[1];
153   u32 w2_t = w0[2];
154   u32 w3_t = w0[3];
155   u32 w4_t = w1[0];
156   u32 w5_t = w1[1];
157   u32 w6_t = w1[2];
158   u32 w7_t = w1[3];
159   u32 w8_t = w2[0];
160   u32 w9_t = w2[1];
161   u32 wa_t = w2[2];
162   u32 wb_t = w2[3];
163   u32 wc_t = w3[0];
164   u32 wd_t = w3[1];
165   u32 we_t = w3[2];
166   u32 wf_t = w3[3];
167
168   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
169   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
170   MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
171   MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
172   MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
173   MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
174   MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
175   MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
176   MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
177   MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
178   MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
179   MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
180   MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
181   MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
182   MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
183   MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
184
185   MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
186   MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
187   MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
188   MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
189   MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
190   MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
191   MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
192   MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
193   MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
194   MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
195   MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
196   MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
197   MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
198   MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
199   MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
200   MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
201
202   MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
203   MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
204   MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
205   MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
206   MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
207   MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
208   MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
209   MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
210   MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
211   MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
212   MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
213   MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
214   MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
215   MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
216   MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
217   MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
218
219   MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
220   MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
221   MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
222   MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
223   MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
224   MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
225   MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
226   MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
227   MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
228   MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
229   MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
230   MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
231   MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
232   MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
233   MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
234   MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
235
236   digest[0] += a;
237   digest[1] += b;
238   digest[2] += c;
239   digest[3] += d;
240 }
241
242 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
243 {
244   /**
245    * modifier
246    */
247
248   const u32 lid = get_local_id (0);
249
250   __local RC4_KEY rc4_keys[64];
251
252   __local RC4_KEY *rc4_key = &rc4_keys[lid];
253
254   /**
255    * base
256    */
257
258   const u32 gid = get_global_id (0);
259
260   if (gid >= gid_max) return;
261
262   u32 pw_buf0[4];
263
264   pw_buf0[0] = pws[gid].i[ 0];
265   pw_buf0[1] = pws[gid].i[ 1];
266   pw_buf0[2] = pws[gid].i[ 2];
267   pw_buf0[3] = pws[gid].i[ 3];
268
269   u32 pw_buf1[4];
270
271   pw_buf1[0] = pws[gid].i[ 4];
272   pw_buf1[1] = pws[gid].i[ 5];
273   pw_buf1[2] = pws[gid].i[ 6];
274   pw_buf1[3] = pws[gid].i[ 7];
275
276   const u32 pw_len = pws[gid].pw_len;
277
278   /**
279    * esalt
280    */
281
282   const u32 version = oldoffice01_bufs[salt_pos].version;
283
284   u32 encryptedVerifier[4];
285
286   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
287   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
288   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
289   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
290
291   /**
292    * loop
293    */
294
295   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
296   {
297     u32 w0[4];
298
299     w0[0] = pw_buf0[0];
300     w0[1] = pw_buf0[1];
301     w0[2] = pw_buf0[2];
302     w0[3] = pw_buf0[3];
303
304     u32 w1[4];
305
306     w1[0] = pw_buf1[0];
307     w1[1] = pw_buf1[1];
308     w1[2] = pw_buf1[2];
309     w1[3] = pw_buf1[3];
310
311     u32 w2[4];
312
313     w2[0] = 0;
314     w2[1] = 0;
315     w2[2] = 0;
316     w2[3] = 0;
317
318     u32 w3[4];
319
320     w3[0] = 0;
321     w3[1] = 0;
322     w3[2] = 0;
323     w3[3] = 0;
324
325     apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
326
327     // first md5 to generate RC4 128 bit key
328
329     u32 w0_t[4];
330     u32 w1_t[4];
331     u32 w2_t[4];
332     u32 w3_t[4];
333
334     w0_t[0]  = w0[0];
335     w0_t[1]  = w0[1] & 0xff;
336     w0_t[2]  = 0x8000;
337     w0_t[3]  = 0;
338     w1_t[0]  = 0;
339     w1_t[1]  = 0;
340     w1_t[2]  = 0;
341     w1_t[3]  = 0;
342     w2_t[0]  = 0;
343     w2_t[1]  = 0;
344     w2_t[2]  = 0;
345     w2_t[3]  = 0;
346     w3_t[0]  = 0;
347     w3_t[1]  = 0;
348     w3_t[2]  = 9 * 8;
349     w3_t[3]  = 0;
350
351     u32 digest[4];
352
353     digest[0] = MD5M_A;
354     digest[1] = MD5M_B;
355     digest[2] = MD5M_C;
356     digest[3] = MD5M_D;
357
358     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
359
360     // now the RC4 part
361
362     u32 key[4];
363
364     key[0] = digest[0];
365     key[1] = digest[1];
366     key[2] = digest[2];
367     key[3] = digest[3];
368
369     rc4_init_16 (rc4_key, key);
370
371     u32 out[4];
372
373     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
374
375     w0_t[0] = out[0];
376     w0_t[1] = out[1];
377     w0_t[2] = out[2];
378     w0_t[3] = out[3];
379     w1_t[0] = 0x80;
380     w1_t[1] = 0;
381     w1_t[2] = 0;
382     w1_t[3] = 0;
383     w2_t[0] = 0;
384     w2_t[1] = 0;
385     w2_t[2] = 0;
386     w2_t[3] = 0;
387     w3_t[0] = 0;
388     w3_t[1] = 0;
389     w3_t[2] = 16 * 8;
390     w3_t[3] = 0;
391
392     digest[0] = MD5M_A;
393     digest[1] = MD5M_B;
394     digest[2] = MD5M_C;
395     digest[3] = MD5M_D;
396
397     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
398
399     rc4_next_16 (rc4_key, 16, j, digest, out);
400
401     const u32 r0 = out[0];
402     const u32 r1 = out[1];
403     const u32 r2 = out[2];
404     const u32 r3 = out[3];
405
406     #include COMPARE_M
407   }
408 }
409
410 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
411 {
412 }
413
414 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
415 {
416 }
417
418 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
419 {
420   /**
421    * modifier
422    */
423
424   const u32 lid = get_local_id (0);
425
426   __local RC4_KEY rc4_keys[64];
427
428   __local RC4_KEY *rc4_key = &rc4_keys[lid];
429
430   /**
431    * base
432    */
433
434   const u32 gid = get_global_id (0);
435
436   if (gid >= gid_max) return;
437
438   u32 pw_buf0[4];
439
440   pw_buf0[0] = pws[gid].i[ 0];
441   pw_buf0[1] = pws[gid].i[ 1];
442   pw_buf0[2] = pws[gid].i[ 2];
443   pw_buf0[3] = pws[gid].i[ 3];
444
445   u32 pw_buf1[4];
446
447   pw_buf1[0] = pws[gid].i[ 4];
448   pw_buf1[1] = pws[gid].i[ 5];
449   pw_buf1[2] = pws[gid].i[ 6];
450   pw_buf1[3] = pws[gid].i[ 7];
451
452   const u32 pw_len = pws[gid].pw_len;
453
454   /**
455    * digest
456    */
457
458   const u32 search[4] =
459   {
460     digests_buf[digests_offset].digest_buf[DGST_R0],
461     digests_buf[digests_offset].digest_buf[DGST_R1],
462     digests_buf[digests_offset].digest_buf[DGST_R2],
463     digests_buf[digests_offset].digest_buf[DGST_R3]
464   };
465
466   /**
467    * esalt
468    */
469
470   const u32 version = oldoffice01_bufs[salt_pos].version;
471
472   u32 encryptedVerifier[4];
473
474   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
475   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
476   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
477   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
478
479   /**
480    * loop
481    */
482
483   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
484   {
485     u32 w0[4];
486
487     w0[0] = pw_buf0[0];
488     w0[1] = pw_buf0[1];
489     w0[2] = pw_buf0[2];
490     w0[3] = pw_buf0[3];
491
492     u32 w1[4];
493
494     w1[0] = pw_buf1[0];
495     w1[1] = pw_buf1[1];
496     w1[2] = pw_buf1[2];
497     w1[3] = pw_buf1[3];
498
499     u32 w2[4];
500
501     w2[0] = 0;
502     w2[1] = 0;
503     w2[2] = 0;
504     w2[3] = 0;
505
506     u32 w3[4];
507
508     w3[0] = 0;
509     w3[1] = 0;
510     w3[2] = 0;
511     w3[3] = 0;
512
513     apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
514
515     // first md5 to generate RC4 128 bit key
516
517     u32 w0_t[4];
518     u32 w1_t[4];
519     u32 w2_t[4];
520     u32 w3_t[4];
521
522     w0_t[0]  = w0[0];
523     w0_t[1]  = w0[1] & 0xff;
524     w0_t[2]  = 0x8000;
525     w0_t[3]  = 0;
526     w1_t[0]  = 0;
527     w1_t[1]  = 0;
528     w1_t[2]  = 0;
529     w1_t[3]  = 0;
530     w2_t[0]  = 0;
531     w2_t[1]  = 0;
532     w2_t[2]  = 0;
533     w2_t[3]  = 0;
534     w3_t[0]  = 0;
535     w3_t[1]  = 0;
536     w3_t[2]  = 9 * 8;
537     w3_t[3]  = 0;
538
539     u32 digest[4];
540
541     digest[0] = MD5M_A;
542     digest[1] = MD5M_B;
543     digest[2] = MD5M_C;
544     digest[3] = MD5M_D;
545
546     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
547
548     // now the RC4 part
549
550     u32 key[4];
551
552     key[0] = digest[0];
553     key[1] = digest[1];
554     key[2] = digest[2];
555     key[3] = digest[3];
556
557     rc4_init_16 (rc4_key, key);
558
559     u32 out[4];
560
561     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
562
563     w0_t[0] = out[0];
564     w0_t[1] = out[1];
565     w0_t[2] = out[2];
566     w0_t[3] = out[3];
567     w1_t[0] = 0x80;
568     w1_t[1] = 0;
569     w1_t[2] = 0;
570     w1_t[3] = 0;
571     w2_t[0] = 0;
572     w2_t[1] = 0;
573     w2_t[2] = 0;
574     w2_t[3] = 0;
575     w3_t[0] = 0;
576     w3_t[1] = 0;
577     w3_t[2] = 16 * 8;
578     w3_t[3] = 0;
579
580     digest[0] = MD5M_A;
581     digest[1] = MD5M_B;
582     digest[2] = MD5M_C;
583     digest[3] = MD5M_D;
584
585     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
586
587     rc4_next_16 (rc4_key, 16, j, digest, out);
588
589     const u32 r0 = out[0];
590     const u32 r1 = out[1];
591     const u32 r2 = out[2];
592     const u32 r3 = out[3];
593
594     #include COMPARE_S
595   }
596 }
597
598 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
599 {
600 }
601
602 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
603 {
604 }