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