Initial commit
[hashcat.git] / nv / m09720_a0.cu
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  VLIW2
16 #define VECT_SIZE1
17 #endif
18
19 #define DGST_R0 0
20 #define DGST_R1 1
21 #define DGST_R2 2
22 #define DGST_R3 3
23
24 #include "include/kernel_functions.c"
25 #include "types_nv.c"
26 #include "common_nv.c"
27 #include "include/rp_gpu.h"
28 #include "rp_nv.c"
29
30 #ifdef  VECT_SIZE1
31 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
32 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
33 #endif
34
35 #ifdef  VECT_SIZE4
36 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
37 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
38 #endif
39
40 __device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4])
41 {
42   u32x a = digest[0];
43   u32x b = digest[1];
44   u32x c = digest[2];
45   u32x d = digest[3];
46
47   u32x w0_t = w0[0];
48   u32x w1_t = w0[1];
49   u32x w2_t = w0[2];
50   u32x w3_t = w0[3];
51   u32x w4_t = w1[0];
52   u32x w5_t = w1[1];
53   u32x w6_t = w1[2];
54   u32x w7_t = w1[3];
55   u32x w8_t = w2[0];
56   u32x w9_t = w2[1];
57   u32x wa_t = w2[2];
58   u32x wb_t = w2[3];
59   u32x wc_t = w3[0];
60   u32x wd_t = w3[1];
61   u32x we_t = w3[2];
62   u32x wf_t = w3[3];
63
64   MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
65   MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
66   MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
67   MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
68   MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
69   MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
70   MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
71   MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
72   MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
73   MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
74   MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
75   MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
76   MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
77   MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
78   MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
79   MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
80
81   MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
82   MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
83   MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
84   MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
85   MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
86   MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
87   MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
88   MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
89   MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
90   MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
91   MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
92   MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
93   MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
94   MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
95   MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
96   MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
97
98   MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
99   MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
100   MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
101   MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
102   MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
103   MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
104   MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
105   MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
106   MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
107   MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
108   MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
109   MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
110   MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
111   MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
112   MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
113   MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
114
115   MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
116   MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
117   MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
118   MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
119   MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
120   MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
121   MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
122   MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
123   MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
124   MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
125   MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
126   MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
127   MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
128   MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
129   MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
130   MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
131
132   digest[0] += a;
133   digest[1] += b;
134   digest[2] += c;
135   digest[3] += d;
136 }
137
138 __device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4])
139 {
140   u32x digest_t0[2];
141   u32x digest_t1[2];
142   u32x digest_t2[2];
143   u32x digest_t3[2];
144
145   digest_t0[0] = digest_pre[0];
146   digest_t0[1] = digest_pre[1] & 0xff;
147
148   digest_t1[0] =                       digest_pre[0] <<  8;
149   digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] <<  8;
150
151   digest_t2[0] =                       digest_pre[0] << 16;
152   digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16;
153
154   digest_t3[0] =                       digest_pre[0] << 24;
155   digest_t3[1] = digest_pre[0] >>  8 | digest_pre[1] << 24;
156
157   u32 salt_buf_t0[4];
158   u32 salt_buf_t1[5];
159   u32 salt_buf_t2[5];
160   u32 salt_buf_t3[5];
161
162   salt_buf_t0[0] = salt_buf[0];
163   salt_buf_t0[1] = salt_buf[1];
164   salt_buf_t0[2] = salt_buf[2];
165   salt_buf_t0[3] = salt_buf[3];
166
167   salt_buf_t1[0] =                     salt_buf[0] <<  8;
168   salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] <<  8;
169   salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] <<  8;
170   salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] <<  8;
171   salt_buf_t1[4] = salt_buf[3] >> 24;
172
173   salt_buf_t2[0] =                     salt_buf[0] << 16;
174   salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16;
175   salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16;
176   salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16;
177   salt_buf_t2[4] = salt_buf[3] >> 16;
178
179   salt_buf_t3[0] =                     salt_buf[0] << 24;
180   salt_buf_t3[1] = salt_buf[0] >>  8 | salt_buf[1] << 24;
181   salt_buf_t3[2] = salt_buf[1] >>  8 | salt_buf[2] << 24;
182   salt_buf_t3[3] = salt_buf[2] >>  8 | salt_buf[3] << 24;
183   salt_buf_t3[4] = salt_buf[3] >>  8;
184
185   u32x w0_t[4];
186   u32x w1_t[4];
187   u32x w2_t[4];
188   u32x w3_t[4];
189
190   // generate the 16 * 21 buffer
191
192   w0_t[0] = 0;
193   w0_t[1] = 0;
194   w0_t[2] = 0;
195   w0_t[3] = 0;
196   w1_t[0] = 0;
197   w1_t[1] = 0;
198   w1_t[2] = 0;
199   w1_t[3] = 0;
200   w2_t[0] = 0;
201   w2_t[1] = 0;
202   w2_t[2] = 0;
203   w2_t[3] = 0;
204   w3_t[0] = 0;
205   w3_t[1] = 0;
206   w3_t[2] = 0;
207   w3_t[3] = 0;
208
209   // 0..5
210   w0_t[0]  = digest_t0[0];
211   w0_t[1]  = digest_t0[1];
212
213   // 5..21
214   w0_t[1] |= salt_buf_t1[0];
215   w0_t[2]  = salt_buf_t1[1];
216   w0_t[3]  = salt_buf_t1[2];
217   w1_t[0]  = salt_buf_t1[3];
218   w1_t[1]  = salt_buf_t1[4];
219
220   // 21..26
221   w1_t[1] |= digest_t1[0];
222   w1_t[2]  = digest_t1[1];
223
224   // 26..42
225   w1_t[2] |= salt_buf_t2[0];
226   w1_t[3]  = salt_buf_t2[1];
227   w2_t[0]  = salt_buf_t2[2];
228   w2_t[1]  = salt_buf_t2[3];
229   w2_t[2]  = salt_buf_t2[4];
230
231   // 42..47
232   w2_t[2] |= digest_t2[0];
233   w2_t[3]  = digest_t2[1];
234
235   // 47..63
236   w2_t[3] |= salt_buf_t3[0];
237   w3_t[0]  = salt_buf_t3[1];
238   w3_t[1]  = salt_buf_t3[2];
239   w3_t[2]  = salt_buf_t3[3];
240   w3_t[3]  = salt_buf_t3[4];
241
242   // 63..
243
244   w3_t[3] |= digest_t3[0];
245
246   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
247
248   w0_t[0] = 0;
249   w0_t[1] = 0;
250   w0_t[2] = 0;
251   w0_t[3] = 0;
252   w1_t[0] = 0;
253   w1_t[1] = 0;
254   w1_t[2] = 0;
255   w1_t[3] = 0;
256   w2_t[0] = 0;
257   w2_t[1] = 0;
258   w2_t[2] = 0;
259   w2_t[3] = 0;
260   w3_t[0] = 0;
261   w3_t[1] = 0;
262   w3_t[2] = 0;
263   w3_t[3] = 0;
264
265   // 0..4
266   w0_t[0]  = digest_t3[1];
267
268   // 4..20
269   w0_t[1]  = salt_buf_t0[0];
270   w0_t[2]  = salt_buf_t0[1];
271   w0_t[3]  = salt_buf_t0[2];
272   w1_t[0]  = salt_buf_t0[3];
273
274   // 20..25
275   w1_t[1]  = digest_t0[0];
276   w1_t[2]  = digest_t0[1];
277
278   // 25..41
279   w1_t[2] |= salt_buf_t1[0];
280   w1_t[3]  = salt_buf_t1[1];
281   w2_t[0]  = salt_buf_t1[2];
282   w2_t[1]  = salt_buf_t1[3];
283   w2_t[2]  = salt_buf_t1[4];
284
285   // 41..46
286   w2_t[2] |= digest_t1[0];
287   w2_t[3]  = digest_t1[1];
288
289   // 46..62
290   w2_t[3] |= salt_buf_t2[0];
291   w3_t[0]  = salt_buf_t2[1];
292   w3_t[1]  = salt_buf_t2[2];
293   w3_t[2]  = salt_buf_t2[3];
294   w3_t[3]  = salt_buf_t2[4];
295
296   // 62..
297   w3_t[3] |= digest_t2[0];
298
299   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
300
301   w0_t[0] = 0;
302   w0_t[1] = 0;
303   w0_t[2] = 0;
304   w0_t[3] = 0;
305   w1_t[0] = 0;
306   w1_t[1] = 0;
307   w1_t[2] = 0;
308   w1_t[3] = 0;
309   w2_t[0] = 0;
310   w2_t[1] = 0;
311   w2_t[2] = 0;
312   w2_t[3] = 0;
313   w3_t[0] = 0;
314   w3_t[1] = 0;
315   w3_t[2] = 0;
316   w3_t[3] = 0;
317
318   // 0..3
319   w0_t[0]  = digest_t2[1];
320
321   // 3..19
322   w0_t[0] |= salt_buf_t3[0];
323   w0_t[1]  = salt_buf_t3[1];
324   w0_t[2]  = salt_buf_t3[2];
325   w0_t[3]  = salt_buf_t3[3];
326   w1_t[0]  = salt_buf_t3[4];
327
328   // 19..24
329   w1_t[0] |= digest_t3[0];
330   w1_t[1]  = digest_t3[1];
331
332   // 24..40
333   w1_t[2]  = salt_buf_t0[0];
334   w1_t[3]  = salt_buf_t0[1];
335   w2_t[0]  = salt_buf_t0[2];
336   w2_t[1]  = salt_buf_t0[3];
337
338   // 40..45
339   w2_t[2]  = digest_t0[0];
340   w2_t[3]  = digest_t0[1];
341
342   // 45..61
343   w2_t[3] |= salt_buf_t1[0];
344   w3_t[0]  = salt_buf_t1[1];
345   w3_t[1]  = salt_buf_t1[2];
346   w3_t[2]  = salt_buf_t1[3];
347   w3_t[3]  = salt_buf_t1[4];
348
349   // 61..
350   w3_t[3] |= digest_t1[0];
351
352   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
353
354   w0_t[0] = 0;
355   w0_t[1] = 0;
356   w0_t[2] = 0;
357   w0_t[3] = 0;
358   w1_t[0] = 0;
359   w1_t[1] = 0;
360   w1_t[2] = 0;
361   w1_t[3] = 0;
362   w2_t[0] = 0;
363   w2_t[1] = 0;
364   w2_t[2] = 0;
365   w2_t[3] = 0;
366   w3_t[0] = 0;
367   w3_t[1] = 0;
368   w3_t[2] = 0;
369   w3_t[3] = 0;
370
371   // 0..2
372   w0_t[0]  = digest_t1[1];
373
374   // 2..18
375   w0_t[0] |= salt_buf_t2[0];
376   w0_t[1]  = salt_buf_t2[1];
377   w0_t[2]  = salt_buf_t2[2];
378   w0_t[3]  = salt_buf_t2[3];
379   w1_t[0]  = salt_buf_t2[4];
380
381   // 18..23
382   w1_t[0] |= digest_t2[0];
383   w1_t[1]  = digest_t2[1];
384
385   // 23..39
386   w1_t[1] |= salt_buf_t3[0];
387   w1_t[2]  = salt_buf_t3[1];
388   w1_t[3]  = salt_buf_t3[2];
389   w2_t[0]  = salt_buf_t3[3];
390   w2_t[1]  = salt_buf_t3[4];
391
392   // 39..44
393   w2_t[1] |= digest_t3[0];
394   w2_t[2]  = digest_t3[1];
395
396   // 44..60
397   w2_t[3]  = salt_buf_t0[0];
398   w3_t[0]  = salt_buf_t0[1];
399   w3_t[1]  = salt_buf_t0[2];
400   w3_t[2]  = salt_buf_t0[3];
401
402   // 60..
403   w3_t[3]  = digest_t0[0];
404
405   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
406
407   w0_t[0] = 0;
408   w0_t[1] = 0;
409   w0_t[2] = 0;
410   w0_t[3] = 0;
411   w1_t[0] = 0;
412   w1_t[1] = 0;
413   w1_t[2] = 0;
414   w1_t[3] = 0;
415   w2_t[0] = 0;
416   w2_t[1] = 0;
417   w2_t[2] = 0;
418   w2_t[3] = 0;
419   w3_t[0] = 0;
420   w3_t[1] = 0;
421   w3_t[2] = 0;
422   w3_t[3] = 0;
423
424   // 0..1
425   w0_t[0]  = digest_t0[1];
426
427   // 1..17
428   w0_t[0] |= salt_buf_t1[0];
429   w0_t[1]  = salt_buf_t1[1];
430   w0_t[2]  = salt_buf_t1[2];
431   w0_t[3]  = salt_buf_t1[3];
432   w1_t[0]  = salt_buf_t1[4];
433
434   // 17..22
435   w1_t[0] |= digest_t1[0];
436   w1_t[1]  = digest_t1[1];
437
438   // 22..38
439   w1_t[1] |= salt_buf_t2[0];
440   w1_t[2]  = salt_buf_t2[1];
441   w1_t[3]  = salt_buf_t2[2];
442   w2_t[0]  = salt_buf_t2[3];
443   w2_t[1]  = salt_buf_t2[4];
444
445   // 38..43
446   w2_t[1] |= digest_t2[0];
447   w2_t[2]  = digest_t2[1];
448
449   // 43..59
450   w2_t[2] |= salt_buf_t3[0];
451   w2_t[3]  = salt_buf_t3[1];
452   w3_t[0]  = salt_buf_t3[2];
453   w3_t[1]  = salt_buf_t3[3];
454   w3_t[2]  = salt_buf_t3[4];
455
456   // 59..
457   w3_t[2] |= digest_t3[0];
458   w3_t[3]  = digest_t3[1];
459
460   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
461
462   w0_t[0]  = salt_buf_t0[0];
463   w0_t[1]  = salt_buf_t0[1];
464   w0_t[2]  = salt_buf_t0[2];
465   w0_t[3]  = salt_buf_t0[3];
466   w1_t[0]  = 0x80;
467   w1_t[1]  = 0;
468   w1_t[2]  = 0;
469   w1_t[3]  = 0;
470   w2_t[0]  = 0;
471   w2_t[1]  = 0;
472   w2_t[2]  = 0;
473   w2_t[3]  = 0;
474   w3_t[0]  = 0;
475   w3_t[1]  = 0;
476   w3_t[2]  = 21 * 16 * 8;
477   w3_t[3]  = 0;
478
479   md5_transform (w0_t, w1_t, w2_t, w3_t, digest);
480 }
481
482 __device__ __constant__ gpu_rule_t c_rules[1024];
483
484 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
485 {
486   /**
487    * modifier
488    */
489
490   const u32 lid = threadIdx.x;
491
492   /**
493    * base
494    */
495
496   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
497
498   if (gid >= gid_max) return;
499
500   u32x pw_buf0[4];
501
502   pw_buf0[0] = pws[gid].i[ 0];
503   pw_buf0[1] = pws[gid].i[ 1];
504   pw_buf0[2] = pws[gid].i[ 2];
505   pw_buf0[3] = pws[gid].i[ 3];
506
507   u32x pw_buf1[4];
508
509   pw_buf1[0] = pws[gid].i[ 4];
510   pw_buf1[1] = pws[gid].i[ 5];
511   pw_buf1[2] = pws[gid].i[ 6];
512   pw_buf1[3] = pws[gid].i[ 7];
513
514   const u32 pw_len = pws[gid].pw_len;
515
516   /**
517    * salt
518    */
519
520   u32 salt_buf[4];
521
522   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
523   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
524   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
525   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
526
527   /**
528    * loop
529    */
530
531   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
532   {
533     u32x w0[4];
534
535     w0[0] = pw_buf0[0];
536     w0[1] = pw_buf0[1];
537     w0[2] = pw_buf0[2];
538     w0[3] = pw_buf0[3];
539
540     u32x w1[4];
541
542     w1[0] = pw_buf1[0];
543     w1[1] = pw_buf1[1];
544     w1[2] = pw_buf1[2];
545     w1[3] = pw_buf1[3];
546
547     u32x w2[4];
548
549     w2[0] = 0;
550     w2[1] = 0;
551     w2[2] = 0;
552     w2[3] = 0;
553
554     u32x w3[4];
555
556     w3[0] = 0;
557     w3[1] = 0;
558     w3[2] = 0;
559     w3[3] = 0;
560
561     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
562
563     append_0x80_2 (w0, w1, out_len);
564
565     u32x w0_t[4];
566     u32x w1_t[4];
567     u32x w2_t[4];
568     u32x w3_t[4];
569
570     make_unicode (w0, w0_t, w1_t);
571     make_unicode (w1, w2_t, w3_t);
572
573     w3_t[2] = out_len * 8 * 2;
574
575     u32x digest_pre[4];
576
577     digest_pre[0] = MD5M_A;
578     digest_pre[1] = MD5M_B;
579     digest_pre[2] = MD5M_C;
580     digest_pre[3] = MD5M_D;
581
582     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre);
583
584     digest_pre[0] &= 0xffffffff;
585     digest_pre[1] &= 0x000000ff;
586     digest_pre[2] &= 0x00000000;
587     digest_pre[3] &= 0x00000000;
588
589     u32x digest[4];
590
591     digest[0] = MD5M_A;
592     digest[1] = MD5M_B;
593     digest[2] = MD5M_C;
594     digest[3] = MD5M_D;
595
596     gen336 (digest_pre, salt_buf, digest);
597
598     u32x a = digest[0];
599     u32x b = digest[1] & 0xff;
600
601     const u32x r0 = a;
602     const u32x r1 = b;
603     const u32x r2 = 0;
604     const u32x r3 = 0;
605
606     #include VECT_COMPARE_M
607   }
608 }
609
610 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
611 {
612 }
613
614 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
615 {
616 }
617
618 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
619 {
620   /**
621    * modifier
622    */
623
624   const u32 lid = threadIdx.x;
625
626   /**
627    * base
628    */
629
630   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
631
632   if (gid >= gid_max) return;
633
634   u32x pw_buf0[4];
635
636   pw_buf0[0] = pws[gid].i[ 0];
637   pw_buf0[1] = pws[gid].i[ 1];
638   pw_buf0[2] = pws[gid].i[ 2];
639   pw_buf0[3] = pws[gid].i[ 3];
640
641   u32x pw_buf1[4];
642
643   pw_buf1[0] = pws[gid].i[ 4];
644   pw_buf1[1] = pws[gid].i[ 5];
645   pw_buf1[2] = pws[gid].i[ 6];
646   pw_buf1[3] = pws[gid].i[ 7];
647
648   const u32 pw_len = pws[gid].pw_len;
649
650   /**
651    * digest
652    */
653
654   const u32 search[4] =
655   {
656     digests_buf[digests_offset].digest_buf[DGST_R0],
657     digests_buf[digests_offset].digest_buf[DGST_R1],
658     digests_buf[digests_offset].digest_buf[DGST_R2],
659     digests_buf[digests_offset].digest_buf[DGST_R3]
660   };
661
662   /**
663    * salt
664    */
665
666   u32 salt_buf[4];
667
668   salt_buf[0] = salt_bufs[salt_pos].salt_buf[0];
669   salt_buf[1] = salt_bufs[salt_pos].salt_buf[1];
670   salt_buf[2] = salt_bufs[salt_pos].salt_buf[2];
671   salt_buf[3] = salt_bufs[salt_pos].salt_buf[3];
672
673   /**
674    * loop
675    */
676
677   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
678   {
679     u32x w0[4];
680
681     w0[0] = pw_buf0[0];
682     w0[1] = pw_buf0[1];
683     w0[2] = pw_buf0[2];
684     w0[3] = pw_buf0[3];
685
686     u32x w1[4];
687
688     w1[0] = pw_buf1[0];
689     w1[1] = pw_buf1[1];
690     w1[2] = pw_buf1[2];
691     w1[3] = pw_buf1[3];
692
693     u32x w2[4];
694
695     w2[0] = 0;
696     w2[1] = 0;
697     w2[2] = 0;
698     w2[3] = 0;
699
700     u32x w3[4];
701
702     w3[0] = 0;
703     w3[1] = 0;
704     w3[2] = 0;
705     w3[3] = 0;
706
707     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
708
709     append_0x80_2 (w0, w1, out_len);
710
711     u32x w0_t[4];
712     u32x w1_t[4];
713     u32x w2_t[4];
714     u32x w3_t[4];
715
716     make_unicode (w0, w0_t, w1_t);
717     make_unicode (w1, w2_t, w3_t);
718
719     w3_t[2] = out_len * 8 * 2;
720
721     u32x digest_pre[4];
722
723     digest_pre[0] = MD5M_A;
724     digest_pre[1] = MD5M_B;
725     digest_pre[2] = MD5M_C;
726     digest_pre[3] = MD5M_D;
727
728     md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre);
729
730     digest_pre[0] &= 0xffffffff;
731     digest_pre[1] &= 0x000000ff;
732     digest_pre[2] &= 0x00000000;
733     digest_pre[3] &= 0x00000000;
734
735     u32x digest[4];
736
737     digest[0] = MD5M_A;
738     digest[1] = MD5M_B;
739     digest[2] = MD5M_C;
740     digest[3] = MD5M_D;
741
742     gen336 (digest_pre, salt_buf, digest);
743
744     u32x a = digest[0];
745     u32x b = digest[1] & 0xff;
746
747     const u32x r0 = a;
748     const u32x r1 = b;
749     const u32x r2 = 0;
750     const u32x r3 = 0;
751
752     #include VECT_COMPARE_S
753   }
754 }
755
756 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
757 {
758 }
759
760 extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, 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)
761 {
762 }