Initial commit
[hashcat.git] / nv / m05400_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) m05400_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 ikepsk_t *ikepsk_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   u32x pw_buf0[4];
279
280   pw_buf0[0] = pws[gid].i[ 0];
281   pw_buf0[1] = pws[gid].i[ 1];
282   pw_buf0[2] = pws[gid].i[ 2];
283   pw_buf0[3] = pws[gid].i[ 3];
284
285   u32x pw_buf1[4];
286
287   pw_buf1[0] = pws[gid].i[ 4];
288   pw_buf1[1] = pws[gid].i[ 5];
289   pw_buf1[2] = pws[gid].i[ 6];
290   pw_buf1[3] = pws[gid].i[ 7];
291
292   const u32 pw_len = pws[gid].pw_len;
293
294   /**
295    * salt
296    */
297
298   const u32 nr_len  = ikepsk_bufs[salt_pos].nr_len;
299   const u32 msg_len = ikepsk_bufs[salt_pos].msg_len;
300
301   u32 salt_buf0[4];
302
303   salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]);
304   salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]);
305   salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]);
306   salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]);
307
308   u32 salt_buf1[4];
309
310   salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]);
311   salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]);
312   salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]);
313   salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]);
314
315   u32 salt_buf2[4];
316
317   salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]);
318   salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]);
319   salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]);
320   salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]);
321
322   u32 salt_buf3[4];
323
324   salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]);
325   salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]);
326   salt_buf3[2] = 0;
327   salt_buf3[3] = 0;
328
329   /**
330    * s_msg
331    */
332
333   __shared__ u32 s_msg_buf[128];
334
335   if (lid < 128)
336   {
337     s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]);
338   }
339
340   __syncthreads ();
341
342   if (gid >= gid_max) return;
343
344   /**
345    * loop
346    */
347
348   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
349   {
350     u32x w0[4];
351
352     w0[0] = pw_buf0[0];
353     w0[1] = pw_buf0[1];
354     w0[2] = pw_buf0[2];
355     w0[3] = pw_buf0[3];
356
357     u32x w1[4];
358
359     w1[0] = pw_buf1[0];
360     w1[1] = pw_buf1[1];
361     w1[2] = pw_buf1[2];
362     w1[3] = pw_buf1[3];
363
364     u32x w2[4];
365
366     w2[0] = 0;
367     w2[1] = 0;
368     w2[2] = 0;
369     w2[3] = 0;
370
371     u32x w3[4];
372
373     w3[0] = 0;
374     w3[1] = 0;
375     w3[2] = 0;
376     w3[3] = 0;
377
378     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
379
380     /**
381      * pads
382      */
383
384     u32x w0_t[4];
385
386     w0_t[0] = swap_workaround (w0[0]);
387     w0_t[1] = swap_workaround (w0[1]);
388     w0_t[2] = swap_workaround (w0[2]);
389     w0_t[3] = swap_workaround (w0[3]);
390
391     u32x w1_t[4];
392
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
398     u32x w2_t[4];
399
400     w2_t[0] = 0;
401     w2_t[1] = 0;
402     w2_t[2] = 0;
403     w2_t[3] = 0;
404
405     u32x w3_t[4];
406
407     w3_t[0] = 0;
408     w3_t[1] = 0;
409     w3_t[2] = 0;
410     w3_t[3] = 0;
411
412     u32x ipad[5];
413     u32x opad[5];
414
415     hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
416
417     w0_t[0] = salt_buf0[0];
418     w0_t[1] = salt_buf0[1];
419     w0_t[2] = salt_buf0[2];
420     w0_t[3] = salt_buf0[3];
421     w1_t[0] = salt_buf1[0];
422     w1_t[1] = salt_buf1[1];
423     w1_t[2] = salt_buf1[2];
424     w1_t[3] = salt_buf1[3];
425     w2_t[0] = salt_buf2[0];
426     w2_t[1] = salt_buf2[1];
427     w2_t[2] = salt_buf2[2];
428     w2_t[3] = salt_buf2[3];
429     w3_t[0] = salt_buf3[0];
430     w3_t[1] = salt_buf3[1];
431     w3_t[2] = 0;
432     w3_t[3] = (64 + nr_len) * 8;
433
434     u32x digest[5];
435
436     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
437
438     w0_t[0] = digest[0];
439     w0_t[1] = digest[1];
440     w0_t[2] = digest[2];
441     w0_t[3] = digest[3];
442     w1_t[0] = digest[4];
443     w1_t[1] = 0;
444     w1_t[2] = 0;
445     w1_t[3] = 0;
446     w2_t[0] = 0;
447     w2_t[1] = 0;
448     w2_t[2] = 0;
449     w2_t[3] = 0;
450     w3_t[0] = 0;
451     w3_t[1] = 0;
452     w3_t[2] = 0;
453     w3_t[3] = 0;
454
455     hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
456
457     int left;
458     int off;
459
460     for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16)
461     {
462       w0_t[0] = s_msg_buf[off +  0];
463       w0_t[1] = s_msg_buf[off +  1];
464       w0_t[2] = s_msg_buf[off +  2];
465       w0_t[3] = s_msg_buf[off +  3];
466       w1_t[0] = s_msg_buf[off +  4];
467       w1_t[1] = s_msg_buf[off +  5];
468       w1_t[2] = s_msg_buf[off +  6];
469       w1_t[3] = s_msg_buf[off +  7];
470       w2_t[0] = s_msg_buf[off +  8];
471       w2_t[1] = s_msg_buf[off +  9];
472       w2_t[2] = s_msg_buf[off + 10];
473       w2_t[3] = s_msg_buf[off + 11];
474       w3_t[0] = s_msg_buf[off + 12];
475       w3_t[1] = s_msg_buf[off + 13];
476       w3_t[2] = s_msg_buf[off + 14];
477       w3_t[3] = s_msg_buf[off + 15];
478
479       sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad);
480     }
481
482     w0_t[0] = s_msg_buf[off +  0];
483     w0_t[1] = s_msg_buf[off +  1];
484     w0_t[2] = s_msg_buf[off +  2];
485     w0_t[3] = s_msg_buf[off +  3];
486     w1_t[0] = s_msg_buf[off +  4];
487     w1_t[1] = s_msg_buf[off +  5];
488     w1_t[2] = s_msg_buf[off +  6];
489     w1_t[3] = s_msg_buf[off +  7];
490     w2_t[0] = s_msg_buf[off +  8];
491     w2_t[1] = s_msg_buf[off +  9];
492     w2_t[2] = s_msg_buf[off + 10];
493     w2_t[3] = s_msg_buf[off + 11];
494     w3_t[0] = s_msg_buf[off + 12];
495     w3_t[1] = s_msg_buf[off + 13];
496     w3_t[2] = 0;
497     w3_t[3] = (64 + msg_len) * 8;
498
499     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
500
501     const u32x r0 = digest[3];
502     const u32x r1 = digest[4];
503     const u32x r2 = digest[2];
504     const u32x r3 = digest[1];
505
506     #include VECT_COMPARE_M
507   }
508 }
509
510 extern "C" __global__ void __launch_bounds__ (256, 1) m05400_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 ikepsk_t *ikepsk_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)
511 {
512 }
513
514 extern "C" __global__ void __launch_bounds__ (256, 1) m05400_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 ikepsk_t *ikepsk_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)
515 {
516 }
517
518 extern "C" __global__ void __launch_bounds__ (256, 1) m05400_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 ikepsk_t *ikepsk_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)
519 {
520   /**
521    * modifier
522    */
523
524   const u32 lid = threadIdx.x;
525
526   /**
527    * base
528    */
529
530   const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
531
532   u32x pw_buf0[4];
533
534   pw_buf0[0] = pws[gid].i[ 0];
535   pw_buf0[1] = pws[gid].i[ 1];
536   pw_buf0[2] = pws[gid].i[ 2];
537   pw_buf0[3] = pws[gid].i[ 3];
538
539   u32x pw_buf1[4];
540
541   pw_buf1[0] = pws[gid].i[ 4];
542   pw_buf1[1] = pws[gid].i[ 5];
543   pw_buf1[2] = pws[gid].i[ 6];
544   pw_buf1[3] = pws[gid].i[ 7];
545
546   const u32 pw_len = pws[gid].pw_len;
547
548   /**
549    * salt
550    */
551
552   const u32 nr_len  = ikepsk_bufs[salt_pos].nr_len;
553   const u32 msg_len = ikepsk_bufs[salt_pos].msg_len;
554
555   u32 salt_buf0[4];
556
557   salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]);
558   salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]);
559   salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]);
560   salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]);
561
562   u32 salt_buf1[4];
563
564   salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]);
565   salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]);
566   salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]);
567   salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]);
568
569   u32 salt_buf2[4];
570
571   salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]);
572   salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]);
573   salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]);
574   salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]);
575
576   u32 salt_buf3[4];
577
578   salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]);
579   salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]);
580   salt_buf3[2] = 0;
581   salt_buf3[3] = 0;
582
583   /**
584    * s_msg
585    */
586
587   __shared__ u32 s_msg_buf[128];
588
589   if (lid < 128)
590   {
591     s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]);
592   }
593
594   __syncthreads ();
595
596   if (gid >= gid_max) return;
597
598   /**
599    * digest
600    */
601
602   const u32 search[4] =
603   {
604     digests_buf[digests_offset].digest_buf[DGST_R0],
605     digests_buf[digests_offset].digest_buf[DGST_R1],
606     digests_buf[digests_offset].digest_buf[DGST_R2],
607     digests_buf[digests_offset].digest_buf[DGST_R3]
608   };
609
610   /**
611    * loop
612    */
613
614   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
615   {
616     u32x w0[4];
617
618     w0[0] = pw_buf0[0];
619     w0[1] = pw_buf0[1];
620     w0[2] = pw_buf0[2];
621     w0[3] = pw_buf0[3];
622
623     u32x w1[4];
624
625     w1[0] = pw_buf1[0];
626     w1[1] = pw_buf1[1];
627     w1[2] = pw_buf1[2];
628     w1[3] = pw_buf1[3];
629
630     u32x w2[4];
631
632     w2[0] = 0;
633     w2[1] = 0;
634     w2[2] = 0;
635     w2[3] = 0;
636
637     u32x w3[4];
638
639     w3[0] = 0;
640     w3[1] = 0;
641     w3[2] = 0;
642     w3[3] = 0;
643
644     const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len);
645
646     /**
647      * pads
648      */
649
650     u32x w0_t[4];
651
652     w0_t[0] = swap_workaround (w0[0]);
653     w0_t[1] = swap_workaround (w0[1]);
654     w0_t[2] = swap_workaround (w0[2]);
655     w0_t[3] = swap_workaround (w0[3]);
656
657     u32x w1_t[4];
658
659     w1_t[0] = swap_workaround (w1[0]);
660     w1_t[1] = swap_workaround (w1[1]);
661     w1_t[2] = swap_workaround (w1[2]);
662     w1_t[3] = swap_workaround (w1[3]);
663
664     u32x w2_t[4];
665
666     w2_t[0] = 0;
667     w2_t[1] = 0;
668     w2_t[2] = 0;
669     w2_t[3] = 0;
670
671     u32x w3_t[4];
672
673     w3_t[0] = 0;
674     w3_t[1] = 0;
675     w3_t[2] = 0;
676     w3_t[3] = 0;
677
678     u32x ipad[5];
679     u32x opad[5];
680
681     hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
682
683     w0_t[0] = salt_buf0[0];
684     w0_t[1] = salt_buf0[1];
685     w0_t[2] = salt_buf0[2];
686     w0_t[3] = salt_buf0[3];
687     w1_t[0] = salt_buf1[0];
688     w1_t[1] = salt_buf1[1];
689     w1_t[2] = salt_buf1[2];
690     w1_t[3] = salt_buf1[3];
691     w2_t[0] = salt_buf2[0];
692     w2_t[1] = salt_buf2[1];
693     w2_t[2] = salt_buf2[2];
694     w2_t[3] = salt_buf2[3];
695     w3_t[0] = salt_buf3[0];
696     w3_t[1] = salt_buf3[1];
697     w3_t[2] = 0;
698     w3_t[3] = (64 + nr_len) * 8;
699
700     u32x digest[5];
701
702     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
703
704     w0_t[0] = digest[0];
705     w0_t[1] = digest[1];
706     w0_t[2] = digest[2];
707     w0_t[3] = digest[3];
708     w1_t[0] = digest[4];
709     w1_t[1] = 0;
710     w1_t[2] = 0;
711     w1_t[3] = 0;
712     w2_t[0] = 0;
713     w2_t[1] = 0;
714     w2_t[2] = 0;
715     w2_t[3] = 0;
716     w3_t[0] = 0;
717     w3_t[1] = 0;
718     w3_t[2] = 0;
719     w3_t[3] = 0;
720
721     hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad);
722
723     int left;
724     int off;
725
726     for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16)
727     {
728       w0_t[0] = s_msg_buf[off +  0];
729       w0_t[1] = s_msg_buf[off +  1];
730       w0_t[2] = s_msg_buf[off +  2];
731       w0_t[3] = s_msg_buf[off +  3];
732       w1_t[0] = s_msg_buf[off +  4];
733       w1_t[1] = s_msg_buf[off +  5];
734       w1_t[2] = s_msg_buf[off +  6];
735       w1_t[3] = s_msg_buf[off +  7];
736       w2_t[0] = s_msg_buf[off +  8];
737       w2_t[1] = s_msg_buf[off +  9];
738       w2_t[2] = s_msg_buf[off + 10];
739       w2_t[3] = s_msg_buf[off + 11];
740       w3_t[0] = s_msg_buf[off + 12];
741       w3_t[1] = s_msg_buf[off + 13];
742       w3_t[2] = s_msg_buf[off + 14];
743       w3_t[3] = s_msg_buf[off + 15];
744
745       sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad);
746     }
747
748     w0_t[0] = s_msg_buf[off +  0];
749     w0_t[1] = s_msg_buf[off +  1];
750     w0_t[2] = s_msg_buf[off +  2];
751     w0_t[3] = s_msg_buf[off +  3];
752     w1_t[0] = s_msg_buf[off +  4];
753     w1_t[1] = s_msg_buf[off +  5];
754     w1_t[2] = s_msg_buf[off +  6];
755     w1_t[3] = s_msg_buf[off +  7];
756     w2_t[0] = s_msg_buf[off +  8];
757     w2_t[1] = s_msg_buf[off +  9];
758     w2_t[2] = s_msg_buf[off + 10];
759     w2_t[3] = s_msg_buf[off + 11];
760     w3_t[0] = s_msg_buf[off + 12];
761     w3_t[1] = s_msg_buf[off + 13];
762     w3_t[2] = 0;
763     w3_t[3] = (64 + msg_len) * 8;
764
765     hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest);
766
767     const u32x r0 = digest[3];
768     const u32x r1 = digest[4];
769     const u32x r2 = digest[2];
770     const u32x r3 = digest[1];
771
772     #include VECT_COMPARE_S
773   }
774 }
775
776 extern "C" __global__ void __launch_bounds__ (256, 1) m05400_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 ikepsk_t *ikepsk_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)
777 {
778 }
779
780 extern "C" __global__ void __launch_bounds__ (256, 1) m05400_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 ikepsk_t *ikepsk_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)
781 {
782 }