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