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