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