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