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