Initial commit
[hashcat.git] / nv / m00160_a0.cu
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA1_
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 3
20 #define DGST_R1 4
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 #include "include/rp_gpu.h"
28 #include "rp_nv.c"
29
30 #ifdef  VECT_SIZE1
31 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
32 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
33 #endif
34
35 #ifdef  VECT_SIZE2
36 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
37 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
38 #endif
39
40 #ifdef  VECT_SIZE4
41 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
42 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
43 #endif
44
45 __device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5])
46 {
47   u32x A = digest[0];
48   u32x B = digest[1];
49   u32x C = digest[2];
50   u32x D = digest[3];
51   u32x E = digest[4];
52
53   u32x w0_t = w0[0];
54   u32x w1_t = w0[1];
55   u32x w2_t = w0[2];
56   u32x w3_t = w0[3];
57   u32x w4_t = w1[0];
58   u32x w5_t = w1[1];
59   u32x w6_t = w1[2];
60   u32x w7_t = w1[3];
61   u32x w8_t = w2[0];
62   u32x w9_t = w2[1];
63   u32x wa_t = w2[2];
64   u32x wb_t = w2[3];
65   u32x wc_t = w3[0];
66   u32x wd_t = w3[1];
67   u32x we_t = w3[2];
68   u32x wf_t = w3[3];
69
70   #undef K
71   #define K SHA1C00
72
73   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t);
74   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t);
75   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t);
76   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t);
77   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t);
78   SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t);
79   SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t);
80   SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t);
81   SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t);
82   SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t);
83   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t);
84   SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t);
85   SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t);
86   SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t);
87   SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t);
88   SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t);
89   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t);
90   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t);
91   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t);
92   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t);
93
94   #undef K
95   #define K SHA1C01
96
97   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t);
98   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t);
99   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t);
100   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t);
101   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t);
102   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t);
103   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t);
104   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t);
105   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t);
106   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t);
107   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t);
108   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t);
109   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t);
110   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t);
111   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t);
112   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t);
113   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t);
114   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t);
115   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t);
116   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t);
117
118   #undef K
119   #define K SHA1C02
120
121   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t);
122   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t);
123   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t);
124   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t);
125   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t);
126   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t);
127   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t);
128   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t);
129   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t);
130   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t);
131   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t);
132   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t);
133   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t);
134   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t);
135   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t);
136   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t);
137   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t);
138   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t);
139   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t);
140   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t);
141
142   #undef K
143   #define K SHA1C03
144
145   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t);
146   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t);
147   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t);
148   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t);
149   w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t);
150   w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t);
151   w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t);
152   w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t);
153   w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t);
154   w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t);
155   w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t);
156   w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t);
157   w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t);
158   w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t);
159   wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t);
160   wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t);
161   wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t);
162   wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t);
163   we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t);
164   wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t);
165
166   digest[0] += A;
167   digest[1] += B;
168   digest[2] += C;
169   digest[3] += D;
170   digest[4] += E;
171 }
172
173 __device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5])
174 {
175   w0[0] = w0[0] ^ 0x36363636;
176   w0[1] = w0[1] ^ 0x36363636;
177   w0[2] = w0[2] ^ 0x36363636;
178   w0[3] = w0[3] ^ 0x36363636;
179   w1[0] = w1[0] ^ 0x36363636;
180   w1[1] = w1[1] ^ 0x36363636;
181   w1[2] = w1[2] ^ 0x36363636;
182   w1[3] = w1[3] ^ 0x36363636;
183   w2[0] = w2[0] ^ 0x36363636;
184   w2[1] = w2[1] ^ 0x36363636;
185   w2[2] = w2[2] ^ 0x36363636;
186   w2[3] = w2[3] ^ 0x36363636;
187   w3[0] = w3[0] ^ 0x36363636;
188   w3[1] = w3[1] ^ 0x36363636;
189   w3[2] = w3[2] ^ 0x36363636;
190   w3[3] = w3[3] ^ 0x36363636;
191
192   ipad[0] = SHA1M_A;
193   ipad[1] = SHA1M_B;
194   ipad[2] = SHA1M_C;
195   ipad[3] = SHA1M_D;
196   ipad[4] = SHA1M_E;
197
198   sha1_transform (w0, w1, w2, w3, ipad);
199
200   w0[0] = w0[0] ^ 0x6a6a6a6a;
201   w0[1] = w0[1] ^ 0x6a6a6a6a;
202   w0[2] = w0[2] ^ 0x6a6a6a6a;
203   w0[3] = w0[3] ^ 0x6a6a6a6a;
204   w1[0] = w1[0] ^ 0x6a6a6a6a;
205   w1[1] = w1[1] ^ 0x6a6a6a6a;
206   w1[2] = w1[2] ^ 0x6a6a6a6a;
207   w1[3] = w1[3] ^ 0x6a6a6a6a;
208   w2[0] = w2[0] ^ 0x6a6a6a6a;
209   w2[1] = w2[1] ^ 0x6a6a6a6a;
210   w2[2] = w2[2] ^ 0x6a6a6a6a;
211   w2[3] = w2[3] ^ 0x6a6a6a6a;
212   w3[0] = w3[0] ^ 0x6a6a6a6a;
213   w3[1] = w3[1] ^ 0x6a6a6a6a;
214   w3[2] = w3[2] ^ 0x6a6a6a6a;
215   w3[3] = w3[3] ^ 0x6a6a6a6a;
216
217   opad[0] = SHA1M_A;
218   opad[1] = SHA1M_B;
219   opad[2] = SHA1M_C;
220   opad[3] = SHA1M_D;
221   opad[4] = SHA1M_E;
222
223   sha1_transform (w0, w1, w2, w3, opad);
224 }
225
226 __device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5])
227 {
228   digest[0] = ipad[0];
229   digest[1] = ipad[1];
230   digest[2] = ipad[2];
231   digest[3] = ipad[3];
232   digest[4] = ipad[4];
233
234   sha1_transform (w0, w1, w2, w3, digest);
235
236   w0[0] = digest[0];
237   w0[1] = digest[1];
238   w0[2] = digest[2];
239   w0[3] = digest[3];
240   w1[0] = digest[4];
241   w1[1] = 0x80000000;
242   w1[2] = 0;
243   w1[3] = 0;
244   w2[0] = 0;
245   w2[1] = 0;
246   w2[2] = 0;
247   w2[3] = 0;
248   w3[0] = 0;
249   w3[1] = 0;
250   w3[2] = 0;
251   w3[3] = (64 + 20) * 8;
252
253   digest[0] = opad[0];
254   digest[1] = opad[1];
255   digest[2] = opad[2];
256   digest[3] = opad[3];
257   digest[4] = opad[4];
258
259   sha1_transform (w0, w1, w2, w3, digest);
260 }
261
262 __device__ __constant__ gpu_rule_t c_rules[1024];
263
264 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
265 {
266   /**
267    * modifier
268    */
269
270   const u32 lid = threadIdx.x;
271
272   /**
273    * base
274    */
275
276   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
277
278   if (gid >= gid_max) return;
279
280   u32x pw_buf0[4];
281
282   pw_buf0[0] = pws[gid].i[ 0];
283   pw_buf0[1] = pws[gid].i[ 1];
284   pw_buf0[2] = pws[gid].i[ 2];
285   pw_buf0[3] = pws[gid].i[ 3];
286
287   u32x pw_buf1[4];
288
289   pw_buf1[0] = pws[gid].i[ 4];
290   pw_buf1[1] = pws[gid].i[ 5];
291   pw_buf1[2] = pws[gid].i[ 6];
292   pw_buf1[3] = pws[gid].i[ 7];
293
294   const u32 pw_len = pws[gid].pw_len;
295
296   /**
297    * salt
298    */
299
300   u32 salt_buf0[4];
301
302   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
303   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
304   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
305   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
306
307   u32 salt_buf1[4];
308
309   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
310   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
311   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
312   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
313
314   /**
315    * pads
316    */
317
318   u32x w0_t[4];
319
320   w0_t[0] = swap_workaround (salt_buf0[0]);
321   w0_t[1] = swap_workaround (salt_buf0[1]);
322   w0_t[2] = swap_workaround (salt_buf0[2]);
323   w0_t[3] = swap_workaround (salt_buf0[3]);
324
325   u32x w1_t[4];
326
327   w1_t[0] = swap_workaround (salt_buf1[0]);
328   w1_t[1] = swap_workaround (salt_buf1[1]);
329   w1_t[2] = swap_workaround (salt_buf1[2]);
330   w1_t[3] = swap_workaround (salt_buf1[3]);
331
332   u32x w2_t[4];
333
334   w2_t[0] = 0;
335   w2_t[1] = 0;
336   w2_t[2] = 0;
337   w2_t[3] = 0;
338
339   u32x w3_t[4];
340
341   w3_t[0] = 0;
342   w3_t[1] = 0;
343   w3_t[2] = 0;
344   w3_t[3] = 0;
345
346   u32x ipad[5];
347   u32x opad[5];
348
349   hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
350
351   /**
352    * loop
353    */
354
355   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
356   {
357     u32x w0[4];
358
359     w0[0] = pw_buf0[0];
360     w0[1] = pw_buf0[1];
361     w0[2] = pw_buf0[2];
362     w0[3] = pw_buf0[3];
363
364     u32x w1[4];
365
366     w1[0] = pw_buf1[0];
367     w1[1] = pw_buf1[1];
368     w1[2] = pw_buf1[2];
369     w1[3] = pw_buf1[3];
370
371     u32x w2[4];
372
373     w2[0] = 0;
374     w2[1] = 0;
375     w2[2] = 0;
376     w2[3] = 0;
377
378     u32x w3[4];
379
380     w3[0] = 0;
381     w3[1] = 0;
382     w3[2] = 0;
383     w3[3] = 0;
384
385     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
386
387     append_0x80_2 (w0, w1, out_len);
388
389     w0_t[0] = swap_workaround (w0[0]);
390     w0_t[1] = swap_workaround (w0[1]);
391     w0_t[2] = swap_workaround (w0[2]);
392     w0_t[3] = swap_workaround (w0[3]);
393     w1_t[0] = swap_workaround (w1[0]);
394     w1_t[1] = swap_workaround (w1[1]);
395     w1_t[2] = swap_workaround (w1[2]);
396     w1_t[3] = swap_workaround (w1[3]);
397     w2_t[0] = 0;
398     w2_t[1] = 0;
399     w2_t[2] = 0;
400     w2_t[3] = 0;
401     w3_t[0] = 0;
402     w3_t[1] = 0;
403     w3_t[2] = 0;
404     w3_t[3] = (64 + out_len) * 8;
405
406     u32x digest[5];
407
408     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
409
410     const u32x r0 = digest[3];
411     const u32x r1 = digest[4];
412     const u32x r2 = digest[2];
413     const u32x r3 = digest[1];
414
415     #include VECT_COMPARE_M
416   }
417 }
418
419 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
420 {
421 }
422
423 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
424 {
425 }
426
427 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
428 {
429   /**
430    * modifier
431    */
432
433   const u32 lid = threadIdx.x;
434
435   /**
436    * base
437    */
438
439   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
440
441   if (gid >= gid_max) return;
442
443   u32x pw_buf0[4];
444
445   pw_buf0[0] = pws[gid].i[ 0];
446   pw_buf0[1] = pws[gid].i[ 1];
447   pw_buf0[2] = pws[gid].i[ 2];
448   pw_buf0[3] = pws[gid].i[ 3];
449
450   u32x pw_buf1[4];
451
452   pw_buf1[0] = pws[gid].i[ 4];
453   pw_buf1[1] = pws[gid].i[ 5];
454   pw_buf1[2] = pws[gid].i[ 6];
455   pw_buf1[3] = pws[gid].i[ 7];
456
457   const u32 pw_len = pws[gid].pw_len;
458
459   /**
460    * salt
461    */
462
463   u32 salt_buf0[4];
464
465   salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0];
466   salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1];
467   salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2];
468   salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3];
469
470   u32 salt_buf1[4];
471
472   salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4];
473   salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5];
474   salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6];
475   salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7];
476
477   /**
478    * pads
479    */
480
481   u32x w0_t[4];
482
483   w0_t[0] = swap_workaround (salt_buf0[0]);
484   w0_t[1] = swap_workaround (salt_buf0[1]);
485   w0_t[2] = swap_workaround (salt_buf0[2]);
486   w0_t[3] = swap_workaround (salt_buf0[3]);
487
488   u32x w1_t[4];
489
490   w1_t[0] = swap_workaround (salt_buf1[0]);
491   w1_t[1] = swap_workaround (salt_buf1[1]);
492   w1_t[2] = swap_workaround (salt_buf1[2]);
493   w1_t[3] = swap_workaround (salt_buf1[3]);
494
495   u32x w2_t[4];
496
497   w2_t[0] = 0;
498   w2_t[1] = 0;
499   w2_t[2] = 0;
500   w2_t[3] = 0;
501
502   u32x w3_t[4];
503
504   w3_t[0] = 0;
505   w3_t[1] = 0;
506   w3_t[2] = 0;
507   w3_t[3] = 0;
508
509   u32x ipad[5];
510   u32x opad[5];
511
512   hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
513
514   /**
515    * digest
516    */
517
518   const u32 search[4] =
519   {
520     digests_buf[digests_offset].digest_buf[DGST_R0],
521     digests_buf[digests_offset].digest_buf[DGST_R1],
522     digests_buf[digests_offset].digest_buf[DGST_R2],
523     digests_buf[digests_offset].digest_buf[DGST_R3]
524   };
525
526   /**
527    * loop
528    */
529
530   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
531   {
532     u32x w0[4];
533
534     w0[0] = pw_buf0[0];
535     w0[1] = pw_buf0[1];
536     w0[2] = pw_buf0[2];
537     w0[3] = pw_buf0[3];
538
539     u32x w1[4];
540
541     w1[0] = pw_buf1[0];
542     w1[1] = pw_buf1[1];
543     w1[2] = pw_buf1[2];
544     w1[3] = pw_buf1[3];
545
546     u32x w2[4];
547
548     w2[0] = 0;
549     w2[1] = 0;
550     w2[2] = 0;
551     w2[3] = 0;
552
553     u32x w3[4];
554
555     w3[0] = 0;
556     w3[1] = 0;
557     w3[2] = 0;
558     w3[3] = 0;
559
560     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
561
562     append_0x80_2 (w0, w1, out_len);
563
564     w0_t[0] = swap_workaround (w0[0]);
565     w0_t[1] = swap_workaround (w0[1]);
566     w0_t[2] = swap_workaround (w0[2]);
567     w0_t[3] = swap_workaround (w0[3]);
568     w1_t[0] = swap_workaround (w1[0]);
569     w1_t[1] = swap_workaround (w1[1]);
570     w1_t[2] = swap_workaround (w1[2]);
571     w1_t[3] = swap_workaround (w1[3]);
572     w2_t[0] = 0;
573     w2_t[1] = 0;
574     w2_t[2] = 0;
575     w2_t[3] = 0;
576     w3_t[0] = 0;
577     w3_t[1] = 0;
578     w3_t[2] = 0;
579     w3_t[3] = (64 + out_len) * 8;
580
581     u32x digest[5];
582
583     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
584
585     const u32x r0 = digest[3];
586     const u32x r1 = digest[4];
587     const u32x r2 = digest[2];
588     const u32x r3 = digest[1];
589
590     #include VECT_COMPARE_S
591   }
592 }
593
594 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
595 {
596 }
597
598 extern "C" __global__ void __launch_bounds__ (256, 1) m00160_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 void *esalt_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)
599 {
600 }