Initial commit
[hashcat.git] / amd / m09700_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 static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4])
268 {
269   u32x digest_t0[2];
270   u32x digest_t1[2];
271   u32x digest_t2[2];
272   u32x digest_t3[2];
273
274   digest_t0[0] = digest_pre[0];
275   digest_t0[1] = digest_pre[1] & 0xff;
276
277   digest_t1[0] =                       digest_pre[0] <<  8;
278   digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] <<  8;
279
280   digest_t2[0] =                       digest_pre[0] << 16;
281   digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16;
282
283   digest_t3[0] =                       digest_pre[0] << 24;
284   digest_t3[1] = digest_pre[0] >>  8 | digest_pre[1] << 24;
285
286   u32 salt_buf_t0[4];
287   u32 salt_buf_t1[5];
288   u32 salt_buf_t2[5];
289   u32 salt_buf_t3[5];
290
291   salt_buf_t0[0] = salt_buf[0];
292   salt_buf_t0[1] = salt_buf[1];
293   salt_buf_t0[2] = salt_buf[2];
294   salt_buf_t0[3] = salt_buf[3];
295
296   salt_buf_t1[0] =                     salt_buf[0] <<  8;
297   salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] <<  8;
298   salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] <<  8;
299   salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] <<  8;
300   salt_buf_t1[4] = salt_buf[3] >> 24;
301
302   salt_buf_t2[0] =                     salt_buf[0] << 16;
303   salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16;
304   salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16;
305   salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16;
306   salt_buf_t2[4] = salt_buf[3] >> 16;
307
308   salt_buf_t3[0] =                     salt_buf[0] << 24;
309   salt_buf_t3[1] = salt_buf[0] >>  8 | salt_buf[1] << 24;
310   salt_buf_t3[2] = salt_buf[1] >>  8 | salt_buf[2] << 24;
311   salt_buf_t3[3] = salt_buf[2] >>  8 | salt_buf[3] << 24;
312   salt_buf_t3[4] = salt_buf[3] >>  8;
313
314   u32x w0_t[4];
315   u32x w1_t[4];
316   u32x w2_t[4];
317   u32x w3_t[4];
318
319   // generate the 16 * 21 buffer
320
321   w0_t[0] = 0;
322   w0_t[1] = 0;
323   w0_t[2] = 0;
324   w0_t[3] = 0;
325   w1_t[0] = 0;
326   w1_t[1] = 0;
327   w1_t[2] = 0;
328   w1_t[3] = 0;
329   w2_t[0] = 0;
330   w2_t[1] = 0;
331   w2_t[2] = 0;
332   w2_t[3] = 0;
333   w3_t[0] = 0;
334   w3_t[1] = 0;
335   w3_t[2] = 0;
336   w3_t[3] = 0;
337
338   // 0..5
339   w0_t[0]  = digest_t0[0];
340   w0_t[1]  = digest_t0[1];
341
342   // 5..21
343   w0_t[1] |= salt_buf_t1[0];
344   w0_t[2]  = salt_buf_t1[1];
345   w0_t[3]  = salt_buf_t1[2];
346   w1_t[0]  = salt_buf_t1[3];
347   w1_t[1]  = salt_buf_t1[4];
348
349   // 21..26
350   w1_t[1] |= digest_t1[0];
351   w1_t[2]  = digest_t1[1];
352
353   // 26..42
354   w1_t[2] |= salt_buf_t2[0];
355   w1_t[3]  = salt_buf_t2[1];
356   w2_t[0]  = salt_buf_t2[2];
357   w2_t[1]  = salt_buf_t2[3];
358   w2_t[2]  = salt_buf_t2[4];
359
360   // 42..47
361   w2_t[2] |= digest_t2[0];
362   w2_t[3]  = digest_t2[1];
363
364   // 47..63
365   w2_t[3] |= salt_buf_t3[0];
366   w3_t[0]  = salt_buf_t3[1];
367   w3_t[1]  = salt_buf_t3[2];
368   w3_t[2]  = salt_buf_t3[3];
369   w3_t[3]  = salt_buf_t3[4];
370
371   // 63..
372
373   w3_t[3] |= digest_t3[0];
374
375   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
376
377   w0_t[0] = 0;
378   w0_t[1] = 0;
379   w0_t[2] = 0;
380   w0_t[3] = 0;
381   w1_t[0] = 0;
382   w1_t[1] = 0;
383   w1_t[2] = 0;
384   w1_t[3] = 0;
385   w2_t[0] = 0;
386   w2_t[1] = 0;
387   w2_t[2] = 0;
388   w2_t[3] = 0;
389   w3_t[0] = 0;
390   w3_t[1] = 0;
391   w3_t[2] = 0;
392   w3_t[3] = 0;
393
394   // 0..4
395   w0_t[0]  = digest_t3[1];
396
397   // 4..20
398   w0_t[1]  = salt_buf_t0[0];
399   w0_t[2]  = salt_buf_t0[1];
400   w0_t[3]  = salt_buf_t0[2];
401   w1_t[0]  = salt_buf_t0[3];
402
403   // 20..25
404   w1_t[1]  = digest_t0[0];
405   w1_t[2]  = digest_t0[1];
406
407   // 25..41
408   w1_t[2] |= salt_buf_t1[0];
409   w1_t[3]  = salt_buf_t1[1];
410   w2_t[0]  = salt_buf_t1[2];
411   w2_t[1]  = salt_buf_t1[3];
412   w2_t[2]  = salt_buf_t1[4];
413
414   // 41..46
415   w2_t[2] |= digest_t1[0];
416   w2_t[3]  = digest_t1[1];
417
418   // 46..62
419   w2_t[3] |= salt_buf_t2[0];
420   w3_t[0]  = salt_buf_t2[1];
421   w3_t[1]  = salt_buf_t2[2];
422   w3_t[2]  = salt_buf_t2[3];
423   w3_t[3]  = salt_buf_t2[4];
424
425   // 62..
426   w3_t[3] |= digest_t2[0];
427
428   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
429
430   w0_t[0] = 0;
431   w0_t[1] = 0;
432   w0_t[2] = 0;
433   w0_t[3] = 0;
434   w1_t[0] = 0;
435   w1_t[1] = 0;
436   w1_t[2] = 0;
437   w1_t[3] = 0;
438   w2_t[0] = 0;
439   w2_t[1] = 0;
440   w2_t[2] = 0;
441   w2_t[3] = 0;
442   w3_t[0] = 0;
443   w3_t[1] = 0;
444   w3_t[2] = 0;
445   w3_t[3] = 0;
446
447   // 0..3
448   w0_t[0]  = digest_t2[1];
449
450   // 3..19
451   w0_t[0] |= salt_buf_t3[0];
452   w0_t[1]  = salt_buf_t3[1];
453   w0_t[2]  = salt_buf_t3[2];
454   w0_t[3]  = salt_buf_t3[3];
455   w1_t[0]  = salt_buf_t3[4];
456
457   // 19..24
458   w1_t[0] |= digest_t3[0];
459   w1_t[1]  = digest_t3[1];
460
461   // 24..40
462   w1_t[2]  = salt_buf_t0[0];
463   w1_t[3]  = salt_buf_t0[1];
464   w2_t[0]  = salt_buf_t0[2];
465   w2_t[1]  = salt_buf_t0[3];
466
467   // 40..45
468   w2_t[2]  = digest_t0[0];
469   w2_t[3]  = digest_t0[1];
470
471   // 45..61
472   w2_t[3] |= salt_buf_t1[0];
473   w3_t[0]  = salt_buf_t1[1];
474   w3_t[1]  = salt_buf_t1[2];
475   w3_t[2]  = salt_buf_t1[3];
476   w3_t[3]  = salt_buf_t1[4];
477
478   // 61..
479   w3_t[3] |= digest_t1[0];
480
481   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
482
483   w0_t[0] = 0;
484   w0_t[1] = 0;
485   w0_t[2] = 0;
486   w0_t[3] = 0;
487   w1_t[0] = 0;
488   w1_t[1] = 0;
489   w1_t[2] = 0;
490   w1_t[3] = 0;
491   w2_t[0] = 0;
492   w2_t[1] = 0;
493   w2_t[2] = 0;
494   w2_t[3] = 0;
495   w3_t[0] = 0;
496   w3_t[1] = 0;
497   w3_t[2] = 0;
498   w3_t[3] = 0;
499
500   // 0..2
501   w0_t[0]  = digest_t1[1];
502
503   // 2..18
504   w0_t[0] |= salt_buf_t2[0];
505   w0_t[1]  = salt_buf_t2[1];
506   w0_t[2]  = salt_buf_t2[2];
507   w0_t[3]  = salt_buf_t2[3];
508   w1_t[0]  = salt_buf_t2[4];
509
510   // 18..23
511   w1_t[0] |= digest_t2[0];
512   w1_t[1]  = digest_t2[1];
513
514   // 23..39
515   w1_t[1] |= salt_buf_t3[0];
516   w1_t[2]  = salt_buf_t3[1];
517   w1_t[3]  = salt_buf_t3[2];
518   w2_t[0]  = salt_buf_t3[3];
519   w2_t[1]  = salt_buf_t3[4];
520
521   // 39..44
522   w2_t[1] |= digest_t3[0];
523   w2_t[2]  = digest_t3[1];
524
525   // 44..60
526   w2_t[3]  = salt_buf_t0[0];
527   w3_t[0]  = salt_buf_t0[1];
528   w3_t[1]  = salt_buf_t0[2];
529   w3_t[2]  = salt_buf_t0[3];
530
531   // 60..
532   w3_t[3]  = digest_t0[0];
533
534   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
535
536   w0_t[0] = 0;
537   w0_t[1] = 0;
538   w0_t[2] = 0;
539   w0_t[3] = 0;
540   w1_t[0] = 0;
541   w1_t[1] = 0;
542   w1_t[2] = 0;
543   w1_t[3] = 0;
544   w2_t[0] = 0;
545   w2_t[1] = 0;
546   w2_t[2] = 0;
547   w2_t[3] = 0;
548   w3_t[0] = 0;
549   w3_t[1] = 0;
550   w3_t[2] = 0;
551   w3_t[3] = 0;
552
553   // 0..1
554   w0_t[0]  = digest_t0[1];
555
556   // 1..17
557   w0_t[0] |= salt_buf_t1[0];
558   w0_t[1]  = salt_buf_t1[1];
559   w0_t[2]  = salt_buf_t1[2];
560   w0_t[3]  = salt_buf_t1[3];
561   w1_t[0]  = salt_buf_t1[4];
562
563   // 17..22
564   w1_t[0] |= digest_t1[0];
565   w1_t[1]  = digest_t1[1];
566
567   // 22..38
568   w1_t[1] |= salt_buf_t2[0];
569   w1_t[2]  = salt_buf_t2[1];
570   w1_t[3]  = salt_buf_t2[2];
571   w2_t[0]  = salt_buf_t2[3];
572   w2_t[1]  = salt_buf_t2[4];
573
574   // 38..43
575   w2_t[1] |= digest_t2[0];
576   w2_t[2]  = digest_t2[1];
577
578   // 43..59
579   w2_t[2] |= salt_buf_t3[0];
580   w2_t[3]  = salt_buf_t3[1];
581   w3_t[0]  = salt_buf_t3[2];
582   w3_t[1]  = salt_buf_t3[3];
583   w3_t[2]  = salt_buf_t3[4];
584
585   // 59..
586   w3_t[2] |= digest_t3[0];
587   w3_t[3]  = digest_t3[1];
588
589   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
590
591   w0_t[0]  = salt_buf_t0[0];
592   w0_t[1]  = salt_buf_t0[1];
593   w0_t[2]  = salt_buf_t0[2];
594   w0_t[3]  = salt_buf_t0[3];
595   w1_t[0]  = 0x80;
596   w1_t[1]  = 0;
597   w1_t[2]  = 0;
598   w1_t[3]  = 0;
599   w2_t[0]  = 0;
600   w2_t[1]  = 0;
601   w2_t[2]  = 0;
602   w2_t[3]  = 0;
603   w3_t[0]  = 0;
604   w3_t[1]  = 0;
605   w3_t[2]  = 21 * 16 * 8;
606   w3_t[3]  = 0;
607
608   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
609 }
610
611 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
612 {
613   /**
614    * modifier
615    */
616
617   const u32 lid = get_local_id (0);
618
619   __local RC4_KEY rc4_keys[64];
620
621   __local RC4_KEY *rc4_key = &rc4_keys[lid];
622
623   /**
624    * base
625    */
626
627   const u32 gid = get_global_id (0);
628
629   if (gid >= gid_max) return;
630
631   u32x pw_buf0[4];
632
633   pw_buf0[0] = pws[gid].i[ 0];
634   pw_buf0[1] = pws[gid].i[ 1];
635   pw_buf0[2] = pws[gid].i[ 2];
636   pw_buf0[3] = pws[gid].i[ 3];
637
638   u32x pw_buf1[4];
639
640   pw_buf1[0] = pws[gid].i[ 4];
641   pw_buf1[1] = pws[gid].i[ 5];
642   pw_buf1[2] = pws[gid].i[ 6];
643   pw_buf1[3] = pws[gid].i[ 7];
644
645   const u32 pw_len = pws[gid].pw_len;
646
647   /**
648    * salt
649    */
650
651   u32 salt_buf[4];
652
653   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
654   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
655   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
656   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
657
658   /**
659    * esalt
660    */
661
662   const u32 version = oldoffice01_bufs[salt_pos].version;
663
664   u32 encryptedVerifier[4];
665
666   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
667   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
668   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
669   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
670
671   /**
672    * loop
673    */
674
675   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
676   {
677     u32x w0[4];
678
679     w0[0] = pw_buf0[0];
680     w0[1] = pw_buf0[1];
681     w0[2] = pw_buf0[2];
682     w0[3] = pw_buf0[3];
683
684     u32x w1[4];
685
686     w1[0] = pw_buf1[0];
687     w1[1] = pw_buf1[1];
688     w1[2] = pw_buf1[2];
689     w1[3] = pw_buf1[3];
690
691     u32x w2[4];
692
693     w2[0] = 0;
694     w2[1] = 0;
695     w2[2] = 0;
696     w2[3] = 0;
697
698     u32x w3[4];
699
700     w3[0] = 0;
701     w3[1] = 0;
702     w3[2] = 0;
703     w3[3] = 0;
704
705     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
706
707     append_0x80_2 (w0, w1, out_len);
708
709     u32x w0_t[4];
710     u32x w1_t[4];
711     u32x w2_t[4];
712     u32x w3_t[4];
713
714     make_unicode (w0, w0_t, w1_t);
715     make_unicode (w1, w2_t, w3_t);
716
717     w3_t[2] = out_len * 8 * 2;
718
719     u32x digest_pre[4];
720
721     digest_pre[0] = MD5M_A;
722     digest_pre[1] = MD5M_B;
723     digest_pre[2] = MD5M_C;
724     digest_pre[3] = MD5M_D;
725
726     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre);
727
728     digest_pre[0] &= 0xffffffff;
729     digest_pre[1] &= 0x000000ff;
730     digest_pre[2] &= 0x00000000;
731     digest_pre[3] &= 0x00000000;
732
733     u32x digest[4];
734
735     digest[0] = MD5M_A;
736     digest[1] = MD5M_B;
737     digest[2] = MD5M_C;
738     digest[3] = MD5M_D;
739
740     gen336 (digest_pre, salt_buf, digest);
741
742     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
743
744     w0_t[0]  = digest[0];
745     w0_t[1]  = digest[1] & 0xff;
746     w0_t[2]  = 0x8000;
747     w0_t[3]  = 0;
748     w1_t[0]  = 0;
749     w1_t[1]  = 0;
750     w1_t[2]  = 0;
751     w1_t[3]  = 0;
752     w2_t[0]  = 0;
753     w2_t[1]  = 0;
754     w2_t[2]  = 0;
755     w2_t[3]  = 0;
756     w3_t[0]  = 0;
757     w3_t[1]  = 0;
758     w3_t[2]  = 9 * 8;
759     w3_t[3]  = 0;
760
761     digest[0] = MD5M_A;
762     digest[1] = MD5M_B;
763     digest[2] = MD5M_C;
764     digest[3] = MD5M_D;
765
766     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
767
768     // now the RC4 part
769
770     u32x key[4];
771
772     key[0] = digest[0];
773     key[1] = digest[1];
774     key[2] = digest[2];
775     key[3] = digest[3];
776
777     rc4_init_16 (rc4_key, key);
778
779     u32x out[4];
780
781     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
782
783     w0_t[0] = out[0];
784     w0_t[1] = out[1];
785     w0_t[2] = out[2];
786     w0_t[3] = out[3];
787     w1_t[0] = 0x80;
788     w1_t[1] = 0;
789     w1_t[2] = 0;
790     w1_t[3] = 0;
791     w2_t[0] = 0;
792     w2_t[1] = 0;
793     w2_t[2] = 0;
794     w2_t[3] = 0;
795     w3_t[0] = 0;
796     w3_t[1] = 0;
797     w3_t[2] = 16 * 8;
798     w3_t[3] = 0;
799
800     digest[0] = MD5M_A;
801     digest[1] = MD5M_B;
802     digest[2] = MD5M_C;
803     digest[3] = MD5M_D;
804
805     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
806
807     rc4_next_16 (rc4_key, 16, j, digest, out);
808
809     const u32x r0 = out[0];
810     const u32x r1 = out[1];
811     const u32x r2 = out[2];
812     const u32x r3 = out[3];
813
814     #include VECT_COMPARE_M
815   }
816 }
817
818 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
819 {
820 }
821
822 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
823 {
824 }
825
826 __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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
827 {
828   /**
829    * modifier
830    */
831
832   const u32 lid = get_local_id (0);
833
834   __local RC4_KEY rc4_keys[64];
835
836   __local RC4_KEY *rc4_key = &rc4_keys[lid];
837
838   /**
839    * base
840    */
841
842   const u32 gid = get_global_id (0);
843
844   if (gid >= gid_max) return;
845
846   u32x pw_buf0[4];
847
848   pw_buf0[0] = pws[gid].i[ 0];
849   pw_buf0[1] = pws[gid].i[ 1];
850   pw_buf0[2] = pws[gid].i[ 2];
851   pw_buf0[3] = pws[gid].i[ 3];
852
853   u32x pw_buf1[4];
854
855   pw_buf1[0] = pws[gid].i[ 4];
856   pw_buf1[1] = pws[gid].i[ 5];
857   pw_buf1[2] = pws[gid].i[ 6];
858   pw_buf1[3] = pws[gid].i[ 7];
859
860   const u32 pw_len = pws[gid].pw_len;
861
862   /**
863    * digest
864    */
865
866   const u32 search[4] =
867   {
868     digests_buf[digests_offset].digest_buf[DGST_R0],
869     digests_buf[digests_offset].digest_buf[DGST_R1],
870     digests_buf[digests_offset].digest_buf[DGST_R2],
871     digests_buf[digests_offset].digest_buf[DGST_R3]
872   };
873
874   /**
875    * salt
876    */
877
878   u32 salt_buf[4];
879
880   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
881   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
882   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
883   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
884
885   /**
886    * esalt
887    */
888
889   const u32 version = oldoffice01_bufs[salt_pos].version;
890
891   u32 encryptedVerifier[4];
892
893   encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0];
894   encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1];
895   encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2];
896   encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3];
897
898   /**
899    * loop
900    */
901
902   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
903   {
904     u32x w0[4];
905
906     w0[0] = pw_buf0[0];
907     w0[1] = pw_buf0[1];
908     w0[2] = pw_buf0[2];
909     w0[3] = pw_buf0[3];
910
911     u32x w1[4];
912
913     w1[0] = pw_buf1[0];
914     w1[1] = pw_buf1[1];
915     w1[2] = pw_buf1[2];
916     w1[3] = pw_buf1[3];
917
918     u32x w2[4];
919
920     w2[0] = 0;
921     w2[1] = 0;
922     w2[2] = 0;
923     w2[3] = 0;
924
925     u32x w3[4];
926
927     w3[0] = 0;
928     w3[1] = 0;
929     w3[2] = 0;
930     w3[3] = 0;
931
932     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
933
934     append_0x80_2 (w0, w1, out_len);
935
936     u32x w0_t[4];
937     u32x w1_t[4];
938     u32x w2_t[4];
939     u32x w3_t[4];
940
941     make_unicode (w0, w0_t, w1_t);
942     make_unicode (w1, w2_t, w3_t);
943
944     w3_t[2] = out_len * 8 * 2;
945
946     u32x digest_pre[4];
947
948     digest_pre[0] = MD5M_A;
949     digest_pre[1] = MD5M_B;
950     digest_pre[2] = MD5M_C;
951     digest_pre[3] = MD5M_D;
952
953     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre);
954
955     digest_pre[0] &= 0xffffffff;
956     digest_pre[1] &= 0x000000ff;
957     digest_pre[2] &= 0x00000000;
958     digest_pre[3] &= 0x00000000;
959
960     u32x digest[4];
961
962     digest[0] = MD5M_A;
963     digest[1] = MD5M_B;
964     digest[2] = MD5M_C;
965     digest[3] = MD5M_D;
966
967     gen336 (digest_pre, salt_buf, digest);
968
969     // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable!
970
971     w0_t[0]  = digest[0];
972     w0_t[1]  = digest[1] & 0xff;
973     w0_t[2]  = 0x8000;
974     w0_t[3]  = 0;
975     w1_t[0]  = 0;
976     w1_t[1]  = 0;
977     w1_t[2]  = 0;
978     w1_t[3]  = 0;
979     w2_t[0]  = 0;
980     w2_t[1]  = 0;
981     w2_t[2]  = 0;
982     w2_t[3]  = 0;
983     w3_t[0]  = 0;
984     w3_t[1]  = 0;
985     w3_t[2]  = 9 * 8;
986     w3_t[3]  = 0;
987
988     digest[0] = MD5M_A;
989     digest[1] = MD5M_B;
990     digest[2] = MD5M_C;
991     digest[3] = MD5M_D;
992
993     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
994
995     // now the RC4 part
996
997     u32x key[4];
998
999     key[0] = digest[0];
1000     key[1] = digest[1];
1001     key[2] = digest[2];
1002     key[3] = digest[3];
1003
1004     rc4_init_16 (rc4_key, key);
1005
1006     u32x out[4];
1007
1008     u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out);
1009
1010     w0_t[0] = out[0];
1011     w0_t[1] = out[1];
1012     w0_t[2] = out[2];
1013     w0_t[3] = out[3];
1014     w1_t[0] = 0x80;
1015     w1_t[1] = 0;
1016     w1_t[2] = 0;
1017     w1_t[3] = 0;
1018     w2_t[0] = 0;
1019     w2_t[1] = 0;
1020     w2_t[2] = 0;
1021     w2_t[3] = 0;
1022     w3_t[0] = 0;
1023     w3_t[1] = 0;
1024     w3_t[2] = 16 * 8;
1025     w3_t[3] = 0;
1026
1027     digest[0] = MD5M_A;
1028     digest[1] = MD5M_B;
1029     digest[2] = MD5M_C;
1030     digest[3] = MD5M_D;
1031
1032     md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
1033
1034     rc4_next_16 (rc4_key, 16, j, digest, out);
1035
1036     const u32x r0 = out[0];
1037     const u32x r1 = out[1];
1038     const u32x r2 = out[2];
1039     const u32x r3 = out[3];
1040
1041     #include VECT_COMPARE_S
1042   }
1043 }
1044
1045 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1046 {
1047 }
1048
1049 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1050 {
1051 }