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