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