Fix m 60 a 0 by making modified variable non-const
[hashcat.git] / OpenCL / m13800_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _SHA256_
7
8 //not compatible
9 //#define NEW_SIMD_CODE
10
11 #include "inc_vendor.cl"
12 #include "inc_hash_constants.h"
13 #include "inc_hash_functions.cl"
14 #include "inc_types.cl"
15 #include "inc_common.cl"
16 #include "inc_rp.h"
17 #include "inc_rp.cl"
18 #include "inc_simd.cl"
19
20 __constant u32 k_sha256[64] =
21 {
22   SHA256C00, SHA256C01, SHA256C02, SHA256C03,
23   SHA256C04, SHA256C05, SHA256C06, SHA256C07,
24   SHA256C08, SHA256C09, SHA256C0a, SHA256C0b,
25   SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f,
26   SHA256C10, SHA256C11, SHA256C12, SHA256C13,
27   SHA256C14, SHA256C15, SHA256C16, SHA256C17,
28   SHA256C18, SHA256C19, SHA256C1a, SHA256C1b,
29   SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f,
30   SHA256C20, SHA256C21, SHA256C22, SHA256C23,
31   SHA256C24, SHA256C25, SHA256C26, SHA256C27,
32   SHA256C28, SHA256C29, SHA256C2a, SHA256C2b,
33   SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f,
34   SHA256C30, SHA256C31, SHA256C32, SHA256C33,
35   SHA256C34, SHA256C35, SHA256C36, SHA256C37,
36   SHA256C38, SHA256C39, SHA256C3a, SHA256C3b,
37   SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f,
38 };
39
40 void sha256_transform (const u32x w[16], u32x digest[8])
41 {
42   u32x a = digest[0];
43   u32x b = digest[1];
44   u32x c = digest[2];
45   u32x d = digest[3];
46   u32x e = digest[4];
47   u32x f = digest[5];
48   u32x g = digest[6];
49   u32x h = digest[7];
50
51   u32x w0_t = w[ 0];
52   u32x w1_t = w[ 1];
53   u32x w2_t = w[ 2];
54   u32x w3_t = w[ 3];
55   u32x w4_t = w[ 4];
56   u32x w5_t = w[ 5];
57   u32x w6_t = w[ 6];
58   u32x w7_t = w[ 7];
59   u32x w8_t = w[ 8];
60   u32x w9_t = w[ 9];
61   u32x wa_t = w[10];
62   u32x wb_t = w[11];
63   u32x wc_t = w[12];
64   u32x wd_t = w[13];
65   u32x we_t = w[14];
66   u32x wf_t = w[15];
67
68   #define ROUND_EXPAND()                            \
69   {                                                 \
70     w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t);  \
71     w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t);  \
72     w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t);  \
73     w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t);  \
74     w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t);  \
75     w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t);  \
76     w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t);  \
77     w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t);  \
78     w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t);  \
79     w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t);  \
80     wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t);  \
81     wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t);  \
82     wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t);  \
83     wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t);  \
84     we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t);  \
85     wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t);  \
86   }
87
88   #define ROUND_STEP(i)                                                                   \
89   {                                                                                       \
90     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i +  0]); \
91     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i +  1]); \
92     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i +  2]); \
93     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i +  3]); \
94     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i +  4]); \
95     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i +  5]); \
96     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i +  6]); \
97     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i +  7]); \
98     SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i +  8]); \
99     SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i +  9]); \
100     SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \
101     SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \
102     SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \
103     SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \
104     SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \
105     SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \
106   }
107
108   ROUND_STEP (0);
109
110   #ifdef _unroll
111   #pragma unroll
112   #endif
113   for (int i = 16; i < 64; i += 16)
114   {
115     ROUND_EXPAND (); ROUND_STEP (i);
116   }
117
118   digest[0] += a;
119   digest[1] += b;
120   digest[2] += c;
121   digest[3] += d;
122   digest[4] += e;
123   digest[5] += f;
124   digest[6] += g;
125   digest[7] += h;
126 }
127
128 void memcat64c_be (u32x block[16], const u32 offset, u32x carry[16])
129 {
130   const u32 mod = offset & 3;
131   const u32 div = offset / 4;
132
133   u32x tmp00;
134   u32x tmp01;
135   u32x tmp02;
136   u32x tmp03;
137   u32x tmp04;
138   u32x tmp05;
139   u32x tmp06;
140   u32x tmp07;
141   u32x tmp08;
142   u32x tmp09;
143   u32x tmp10;
144   u32x tmp11;
145   u32x tmp12;
146   u32x tmp13;
147   u32x tmp14;
148   u32x tmp15;
149   u32x tmp16;
150
151   #ifdef IS_NV
152   const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff;
153
154   tmp00 = __byte_perm (carry[ 0],         0, selector);
155   tmp01 = __byte_perm (carry[ 1], carry[ 0], selector);
156   tmp02 = __byte_perm (carry[ 2], carry[ 1], selector);
157   tmp03 = __byte_perm (carry[ 3], carry[ 2], selector);
158   tmp04 = __byte_perm (carry[ 4], carry[ 3], selector);
159   tmp05 = __byte_perm (carry[ 5], carry[ 4], selector);
160   tmp06 = __byte_perm (carry[ 6], carry[ 5], selector);
161   tmp07 = __byte_perm (carry[ 7], carry[ 6], selector);
162   tmp08 = __byte_perm (carry[ 8], carry[ 7], selector);
163   tmp09 = __byte_perm (carry[ 9], carry[ 8], selector);
164   tmp10 = __byte_perm (carry[10], carry[ 9], selector);
165   tmp11 = __byte_perm (carry[11], carry[10], selector);
166   tmp12 = __byte_perm (carry[12], carry[11], selector);
167   tmp13 = __byte_perm (carry[13], carry[12], selector);
168   tmp14 = __byte_perm (carry[14], carry[13], selector);
169   tmp15 = __byte_perm (carry[15], carry[14], selector);
170   tmp16 = __byte_perm (        0, carry[15], selector);
171   #endif
172
173   #if defined IS_AMD || defined IS_GENERIC
174   tmp00 = amd_bytealign (        0, carry[ 0], offset);
175   tmp01 = amd_bytealign (carry[ 0], carry[ 1], offset);
176   tmp02 = amd_bytealign (carry[ 1], carry[ 2], offset);
177   tmp03 = amd_bytealign (carry[ 2], carry[ 3], offset);
178   tmp04 = amd_bytealign (carry[ 3], carry[ 4], offset);
179   tmp05 = amd_bytealign (carry[ 4], carry[ 5], offset);
180   tmp06 = amd_bytealign (carry[ 5], carry[ 6], offset);
181   tmp07 = amd_bytealign (carry[ 6], carry[ 7], offset);
182   tmp08 = amd_bytealign (carry[ 7], carry[ 8], offset);
183   tmp09 = amd_bytealign (carry[ 8], carry[ 9], offset);
184   tmp10 = amd_bytealign (carry[ 9], carry[10], offset);
185   tmp11 = amd_bytealign (carry[10], carry[11], offset);
186   tmp12 = amd_bytealign (carry[11], carry[12], offset);
187   tmp13 = amd_bytealign (carry[12], carry[13], offset);
188   tmp14 = amd_bytealign (carry[13], carry[14], offset);
189   tmp15 = amd_bytealign (carry[14], carry[15], offset);
190   tmp16 = amd_bytealign (carry[15],         0, offset);
191   #endif
192
193   carry[ 0] = 0;
194   carry[ 1] = 0;
195   carry[ 2] = 0;
196   carry[ 3] = 0;
197   carry[ 4] = 0;
198   carry[ 5] = 0;
199   carry[ 6] = 0;
200   carry[ 7] = 0;
201   carry[ 8] = 0;
202   carry[ 9] = 0;
203   carry[10] = 0;
204   carry[11] = 0;
205   carry[12] = 0;
206   carry[13] = 0;
207   carry[14] = 0;
208   carry[15] = 0;
209
210   switch (div)
211   {
212     case  0:  block[ 0] |= tmp00;
213               block[ 1]  = tmp01;
214               block[ 2]  = tmp02;
215               block[ 3]  = tmp03;
216               block[ 4]  = tmp04;
217               block[ 5]  = tmp05;
218               block[ 6]  = tmp06;
219               block[ 7]  = tmp07;
220               block[ 8]  = tmp08;
221               block[ 9]  = tmp09;
222               block[10]  = tmp10;
223               block[11]  = tmp11;
224               block[12]  = tmp12;
225               block[13]  = tmp13;
226               block[14]  = tmp14;
227               block[15]  = tmp15;
228               carry[ 0]  = tmp16;
229               break;
230     case  1:  block[ 1] |= tmp00;
231               block[ 2]  = tmp01;
232               block[ 3]  = tmp02;
233               block[ 4]  = tmp03;
234               block[ 5]  = tmp04;
235               block[ 6]  = tmp05;
236               block[ 7]  = tmp06;
237               block[ 8]  = tmp07;
238               block[ 9]  = tmp08;
239               block[10]  = tmp09;
240               block[11]  = tmp10;
241               block[12]  = tmp11;
242               block[13]  = tmp12;
243               block[14]  = tmp13;
244               block[15]  = tmp14;
245               carry[ 0]  = tmp15;
246               carry[ 1]  = tmp16;
247               break;
248     case  2:  block[ 2] |= tmp00;
249               block[ 3]  = tmp01;
250               block[ 4]  = tmp02;
251               block[ 5]  = tmp03;
252               block[ 6]  = tmp04;
253               block[ 7]  = tmp05;
254               block[ 8]  = tmp06;
255               block[ 9]  = tmp07;
256               block[10]  = tmp08;
257               block[11]  = tmp09;
258               block[12]  = tmp10;
259               block[13]  = tmp11;
260               block[14]  = tmp12;
261               block[15]  = tmp13;
262               carry[ 0]  = tmp14;
263               carry[ 1]  = tmp15;
264               carry[ 2]  = tmp16;
265               break;
266     case  3:  block[ 3] |= tmp00;
267               block[ 4]  = tmp01;
268               block[ 5]  = tmp02;
269               block[ 6]  = tmp03;
270               block[ 7]  = tmp04;
271               block[ 8]  = tmp05;
272               block[ 9]  = tmp06;
273               block[10]  = tmp07;
274               block[11]  = tmp08;
275               block[12]  = tmp09;
276               block[13]  = tmp10;
277               block[14]  = tmp11;
278               block[15]  = tmp12;
279               carry[ 0]  = tmp13;
280               carry[ 1]  = tmp14;
281               carry[ 2]  = tmp15;
282               carry[ 3]  = tmp16;
283               break;
284     case  4:  block[ 4] |= tmp00;
285               block[ 5]  = tmp01;
286               block[ 6]  = tmp02;
287               block[ 7]  = tmp03;
288               block[ 8]  = tmp04;
289               block[ 9]  = tmp05;
290               block[10]  = tmp06;
291               block[11]  = tmp07;
292               block[12]  = tmp08;
293               block[13]  = tmp09;
294               block[14]  = tmp10;
295               block[15]  = tmp11;
296               carry[ 0]  = tmp12;
297               carry[ 1]  = tmp13;
298               carry[ 2]  = tmp14;
299               carry[ 3]  = tmp15;
300               carry[ 4]  = tmp16;
301               break;
302     case  5:  block[ 5] |= tmp00;
303               block[ 6]  = tmp01;
304               block[ 7]  = tmp02;
305               block[ 8]  = tmp03;
306               block[ 9]  = tmp04;
307               block[10]  = tmp05;
308               block[11]  = tmp06;
309               block[12]  = tmp07;
310               block[13]  = tmp08;
311               block[14]  = tmp09;
312               block[15]  = tmp10;
313               carry[ 0]  = tmp11;
314               carry[ 1]  = tmp12;
315               carry[ 2]  = tmp13;
316               carry[ 3]  = tmp14;
317               carry[ 4]  = tmp15;
318               carry[ 5]  = tmp16;
319               break;
320     case  6:  block[ 6] |= tmp00;
321               block[ 7]  = tmp01;
322               block[ 8]  = tmp02;
323               block[ 9]  = tmp03;
324               block[10]  = tmp04;
325               block[11]  = tmp05;
326               block[12]  = tmp06;
327               block[13]  = tmp07;
328               block[14]  = tmp08;
329               block[15]  = tmp09;
330               carry[ 0]  = tmp10;
331               carry[ 1]  = tmp11;
332               carry[ 2]  = tmp12;
333               carry[ 3]  = tmp13;
334               carry[ 4]  = tmp14;
335               carry[ 5]  = tmp15;
336               carry[ 6]  = tmp16;
337               break;
338     case  7:  block[ 7] |= tmp00;
339               block[ 8]  = tmp01;
340               block[ 9]  = tmp02;
341               block[10]  = tmp03;
342               block[11]  = tmp04;
343               block[12]  = tmp05;
344               block[13]  = tmp06;
345               block[14]  = tmp07;
346               block[15]  = tmp08;
347               carry[ 0]  = tmp09;
348               carry[ 1]  = tmp10;
349               carry[ 2]  = tmp11;
350               carry[ 3]  = tmp12;
351               carry[ 4]  = tmp13;
352               carry[ 5]  = tmp14;
353               carry[ 6]  = tmp15;
354               carry[ 7]  = tmp16;
355               break;
356     case  8:  block[ 8] |= tmp00;
357               block[ 9]  = tmp01;
358               block[10]  = tmp02;
359               block[11]  = tmp03;
360               block[12]  = tmp04;
361               block[13]  = tmp05;
362               block[14]  = tmp06;
363               block[15]  = tmp07;
364               carry[ 0]  = tmp08;
365               carry[ 1]  = tmp09;
366               carry[ 2]  = tmp10;
367               carry[ 3]  = tmp11;
368               carry[ 4]  = tmp12;
369               carry[ 5]  = tmp13;
370               carry[ 6]  = tmp14;
371               carry[ 7]  = tmp15;
372               carry[ 8]  = tmp16;
373               break;
374     case  9:  block[ 9] |= tmp00;
375               block[10]  = tmp01;
376               block[11]  = tmp02;
377               block[12]  = tmp03;
378               block[13]  = tmp04;
379               block[14]  = tmp05;
380               block[15]  = tmp06;
381               carry[ 0]  = tmp07;
382               carry[ 1]  = tmp08;
383               carry[ 2]  = tmp09;
384               carry[ 3]  = tmp10;
385               carry[ 4]  = tmp11;
386               carry[ 5]  = tmp12;
387               carry[ 6]  = tmp13;
388               carry[ 7]  = tmp14;
389               carry[ 8]  = tmp15;
390               carry[ 9]  = tmp16;
391               break;
392     case 10:  block[10] |= tmp00;
393               block[11]  = tmp01;
394               block[12]  = tmp02;
395               block[13]  = tmp03;
396               block[14]  = tmp04;
397               block[15]  = tmp05;
398               carry[ 0]  = tmp06;
399               carry[ 1]  = tmp07;
400               carry[ 2]  = tmp08;
401               carry[ 3]  = tmp09;
402               carry[ 4]  = tmp10;
403               carry[ 5]  = tmp11;
404               carry[ 6]  = tmp12;
405               carry[ 7]  = tmp13;
406               carry[ 8]  = tmp14;
407               carry[ 9]  = tmp15;
408               carry[10]  = tmp16;
409               break;
410     case 11:  block[11] |= tmp00;
411               block[12]  = tmp01;
412               block[13]  = tmp02;
413               block[14]  = tmp03;
414               block[15]  = tmp04;
415               carry[ 0]  = tmp05;
416               carry[ 1]  = tmp06;
417               carry[ 2]  = tmp07;
418               carry[ 3]  = tmp08;
419               carry[ 4]  = tmp09;
420               carry[ 5]  = tmp10;
421               carry[ 6]  = tmp11;
422               carry[ 7]  = tmp12;
423               carry[ 8]  = tmp13;
424               carry[ 9]  = tmp14;
425               carry[10]  = tmp15;
426               carry[11]  = tmp16;
427               break;
428     case 12:  block[12] |= tmp00;
429               block[13]  = tmp01;
430               block[14]  = tmp02;
431               block[15]  = tmp03;
432               carry[ 0]  = tmp04;
433               carry[ 1]  = tmp05;
434               carry[ 2]  = tmp06;
435               carry[ 3]  = tmp07;
436               carry[ 4]  = tmp08;
437               carry[ 5]  = tmp09;
438               carry[ 6]  = tmp10;
439               carry[ 7]  = tmp11;
440               carry[ 8]  = tmp12;
441               carry[ 9]  = tmp13;
442               carry[10]  = tmp14;
443               carry[11]  = tmp15;
444               carry[12]  = tmp16;
445               break;
446     case 13:  block[13] |= tmp00;
447               block[14]  = tmp01;
448               block[15]  = tmp02;
449               carry[ 0]  = tmp03;
450               carry[ 1]  = tmp04;
451               carry[ 2]  = tmp05;
452               carry[ 3]  = tmp06;
453               carry[ 4]  = tmp07;
454               carry[ 5]  = tmp08;
455               carry[ 6]  = tmp09;
456               carry[ 7]  = tmp10;
457               carry[ 8]  = tmp11;
458               carry[ 9]  = tmp12;
459               carry[10]  = tmp13;
460               carry[11]  = tmp14;
461               carry[12]  = tmp15;
462               carry[13]  = tmp16;
463               break;
464     case 14:  block[14] |= tmp00;
465               block[15]  = tmp01;
466               carry[ 0]  = tmp02;
467               carry[ 1]  = tmp03;
468               carry[ 2]  = tmp04;
469               carry[ 3]  = tmp05;
470               carry[ 4]  = tmp06;
471               carry[ 5]  = tmp07;
472               carry[ 6]  = tmp08;
473               carry[ 7]  = tmp09;
474               carry[ 8]  = tmp10;
475               carry[ 9]  = tmp11;
476               carry[10]  = tmp12;
477               carry[11]  = tmp13;
478               carry[12]  = tmp14;
479               carry[13]  = tmp15;
480               carry[14]  = tmp16;
481               break;
482     case 15:  block[15] |= tmp00;
483               carry[ 0]  = tmp01;
484               carry[ 1]  = tmp02;
485               carry[ 2]  = tmp03;
486               carry[ 3]  = tmp04;
487               carry[ 4]  = tmp05;
488               carry[ 5]  = tmp06;
489               carry[ 6]  = tmp07;
490               carry[ 7]  = tmp08;
491               carry[ 8]  = tmp09;
492               carry[ 9]  = tmp10;
493               carry[10]  = tmp11;
494               carry[11]  = tmp12;
495               carry[12]  = tmp13;
496               carry[13]  = tmp14;
497               carry[14]  = tmp15;
498               carry[15]  = tmp16;
499               break;
500   }
501 }
502
503 __kernel void m13800_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 win8phone_t *esalt_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)
504 {
505   /**
506    * modifier
507    */
508
509   const u32 gid = get_global_id (0);
510   const u32 lid = get_local_id (0);
511   const u32 lsz = get_local_size (0);
512
513   /**
514    * base
515    */
516
517   u32 pw_buf0[4];
518   u32 pw_buf1[4];
519
520   pw_buf0[0] = pws[gid].i[0];
521   pw_buf0[1] = pws[gid].i[1];
522   pw_buf0[2] = pws[gid].i[2];
523   pw_buf0[3] = pws[gid].i[3];
524   pw_buf1[0] = pws[gid].i[4];
525   pw_buf1[1] = pws[gid].i[5];
526   pw_buf1[2] = pws[gid].i[6];
527   pw_buf1[3] = pws[gid].i[7];
528
529   const u32 pw_len = pws[gid].pw_len;
530
531   /**
532    * shared
533    */
534
535   __local u32 s_esalt[32];
536
537   for (u32 i = lid; i < 32; i += lsz)
538   {
539     s_esalt[i] = esalt_bufs[salt_pos].salt_buf[i];
540   }
541
542   barrier (CLK_LOCAL_MEM_FENCE);
543
544   if (gid >= gid_max) return;
545
546   /**
547    * loop
548    */
549
550   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
551   {
552     u32x w0[4] = { 0 };
553     u32x w1[4] = { 0 };
554     u32x w2[4] = { 0 };
555     u32x w3[4] = { 0 };
556
557     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
558
559     const u32x out_len2 = out_len * 2;
560
561     make_unicode (w1, w2, w3);
562     make_unicode (w0, w0, w1);
563
564     u32x w[16];
565
566     w[ 0] = swap32 (w0[0]);
567     w[ 1] = swap32 (w0[1]);
568     w[ 2] = swap32 (w0[2]);
569     w[ 3] = swap32 (w0[3]);
570     w[ 4] = swap32 (w1[0]);
571     w[ 5] = swap32 (w1[1]);
572     w[ 6] = swap32 (w1[2]);
573     w[ 7] = swap32 (w1[3]);
574     w[ 8] = swap32 (w2[0]);
575     w[ 9] = swap32 (w2[1]);
576     w[10] = swap32 (w2[2]);
577     w[11] = swap32 (w2[3]);
578     w[12] = swap32 (w3[0]);
579     w[13] = swap32 (w3[1]);
580     w[14] = swap32 (w3[2]);
581     w[15] = swap32 (w3[3]);
582
583     u32x carry[16];
584
585     carry[ 0] = s_esalt[ 0];
586     carry[ 1] = s_esalt[ 1];
587     carry[ 2] = s_esalt[ 2];
588     carry[ 3] = s_esalt[ 3];
589     carry[ 4] = s_esalt[ 4];
590     carry[ 5] = s_esalt[ 5];
591     carry[ 6] = s_esalt[ 6];
592     carry[ 7] = s_esalt[ 7];
593     carry[ 8] = s_esalt[ 8];
594     carry[ 9] = s_esalt[ 9];
595     carry[10] = s_esalt[10];
596     carry[11] = s_esalt[11];
597     carry[12] = s_esalt[12];
598     carry[13] = s_esalt[13];
599     carry[14] = s_esalt[14];
600     carry[15] = s_esalt[15];
601
602     // we can always use pw_len here, since we add exactly the hash buffer size
603     memcat64c_be (w, out_len2, carry);
604
605     u32x digest[8];
606
607     digest[0] = SHA256M_A;
608     digest[1] = SHA256M_B;
609     digest[2] = SHA256M_C;
610     digest[3] = SHA256M_D;
611     digest[4] = SHA256M_E;
612     digest[5] = SHA256M_F;
613     digest[6] = SHA256M_G;
614     digest[7] = SHA256M_H;
615
616     sha256_transform (w, digest);
617
618     w[ 0] = carry[ 0];
619     w[ 1] = carry[ 1];
620     w[ 2] = carry[ 2];
621     w[ 3] = carry[ 3];
622     w[ 4] = carry[ 4];
623     w[ 5] = carry[ 5];
624     w[ 6] = carry[ 6];
625     w[ 7] = carry[ 7];
626     w[ 8] = carry[ 8];
627     w[ 9] = carry[ 9];
628     w[10] = carry[10];
629     w[11] = carry[11];
630     w[12] = carry[12];
631     w[13] = carry[13];
632     w[14] = carry[14];
633     w[15] = carry[15];
634
635     carry[ 0] = s_esalt[16];
636     carry[ 1] = s_esalt[17];
637     carry[ 2] = s_esalt[18];
638     carry[ 3] = s_esalt[19];
639     carry[ 4] = s_esalt[20];
640     carry[ 5] = s_esalt[21];
641     carry[ 6] = s_esalt[22];
642     carry[ 7] = s_esalt[23];
643     carry[ 8] = s_esalt[24];
644     carry[ 9] = s_esalt[25];
645     carry[10] = s_esalt[26];
646     carry[11] = s_esalt[27];
647     carry[12] = s_esalt[28];
648     carry[13] = s_esalt[29];
649     carry[14] = s_esalt[30];
650     carry[15] = s_esalt[31];
651
652     // we can always use pw_len here, since we add exactly the hash buffer size
653     memcat64c_be (w, out_len2, carry);
654
655     sha256_transform (w, digest);
656
657     w[ 0] = carry[ 0];
658     w[ 1] = carry[ 1];
659     w[ 2] = carry[ 2];
660     w[ 3] = carry[ 3];
661     w[ 4] = carry[ 4];
662     w[ 5] = carry[ 5];
663     w[ 6] = carry[ 6];
664     w[ 7] = carry[ 7];
665     w[ 8] = carry[ 8];
666     w[ 9] = carry[ 9];
667     w[10] = carry[10];
668     w[11] = carry[11];
669     w[12] = carry[12];
670     w[13] = carry[13];
671     w[14] = carry[14];
672     w[15] = carry[15];
673
674     // we can always use pw_len here, since we add exactly the hash buffer size
675     append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, out_len2 ^ 3);
676
677     w[14] = 0;
678     w[15] = (out_len2 + 128) * 8;
679
680     sha256_transform (w, digest);
681
682     const u32x d = digest[DGST_R0];
683     const u32x h = digest[DGST_R1];
684     const u32x c = digest[DGST_R2];
685     const u32x g = digest[DGST_R3];
686
687     COMPARE_M_SIMD (d, h, c, g);
688   }
689 }
690
691 __kernel void m13800_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 win8phone_t *esalt_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)
692 {
693 }
694
695 __kernel void m13800_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 win8phone_t *esalt_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)
696 {
697 }
698
699 __kernel void m13800_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 win8phone_t *esalt_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)
700 {
701   /**
702    * modifier
703    */
704
705   const u32 gid = get_global_id (0);
706   const u32 lid = get_local_id (0);
707   const u32 lsz = get_local_size (0);
708
709   /**
710    * base
711    */
712
713   u32 pw_buf0[4];
714   u32 pw_buf1[4];
715
716   pw_buf0[0] = pws[gid].i[0];
717   pw_buf0[1] = pws[gid].i[1];
718   pw_buf0[2] = pws[gid].i[2];
719   pw_buf0[3] = pws[gid].i[3];
720   pw_buf1[0] = pws[gid].i[4];
721   pw_buf1[1] = pws[gid].i[5];
722   pw_buf1[2] = pws[gid].i[6];
723   pw_buf1[3] = pws[gid].i[7];
724
725   const u32 pw_len = pws[gid].pw_len;
726
727   /**
728    * shared
729    */
730
731   __local u32 s_esalt[32];
732
733   for (u32 i = lid; i < 32; i += lsz)
734   {
735     s_esalt[i] = esalt_bufs[salt_pos].salt_buf[i];
736   }
737
738   barrier (CLK_LOCAL_MEM_FENCE);
739
740   if (gid >= gid_max) return;
741
742   /**
743    * digest
744    */
745
746   const u32 search[4] =
747   {
748     digests_buf[digests_offset].digest_buf[DGST_R0],
749     digests_buf[digests_offset].digest_buf[DGST_R1],
750     digests_buf[digests_offset].digest_buf[DGST_R2],
751     digests_buf[digests_offset].digest_buf[DGST_R3]
752   };
753
754   /**
755    * loop
756    */
757
758   for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE)
759   {
760     u32x w0[4] = { 0 };
761     u32x w1[4] = { 0 };
762     u32x w2[4] = { 0 };
763     u32x w3[4] = { 0 };
764
765     const u32x out_len = apply_rules_vect (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1);
766
767     const u32x out_len2 = out_len * 2;
768
769     make_unicode (w1, w2, w3);
770     make_unicode (w0, w0, w1);
771
772     u32x w[16];
773
774     w[ 0] = swap32 (w0[0]);
775     w[ 1] = swap32 (w0[1]);
776     w[ 2] = swap32 (w0[2]);
777     w[ 3] = swap32 (w0[3]);
778     w[ 4] = swap32 (w1[0]);
779     w[ 5] = swap32 (w1[1]);
780     w[ 6] = swap32 (w1[2]);
781     w[ 7] = swap32 (w1[3]);
782     w[ 8] = swap32 (w2[0]);
783     w[ 9] = swap32 (w2[1]);
784     w[10] = swap32 (w2[2]);
785     w[11] = swap32 (w2[3]);
786     w[12] = swap32 (w3[0]);
787     w[13] = swap32 (w3[1]);
788     w[14] = swap32 (w3[2]);
789     w[15] = swap32 (w3[3]);
790
791     u32x carry[16];
792
793     carry[ 0] = s_esalt[ 0];
794     carry[ 1] = s_esalt[ 1];
795     carry[ 2] = s_esalt[ 2];
796     carry[ 3] = s_esalt[ 3];
797     carry[ 4] = s_esalt[ 4];
798     carry[ 5] = s_esalt[ 5];
799     carry[ 6] = s_esalt[ 6];
800     carry[ 7] = s_esalt[ 7];
801     carry[ 8] = s_esalt[ 8];
802     carry[ 9] = s_esalt[ 9];
803     carry[10] = s_esalt[10];
804     carry[11] = s_esalt[11];
805     carry[12] = s_esalt[12];
806     carry[13] = s_esalt[13];
807     carry[14] = s_esalt[14];
808     carry[15] = s_esalt[15];
809
810     // we can always use pw_len here, since we add exactly the hash buffer size
811     memcat64c_be (w, out_len2, carry);
812
813     u32x digest[8];
814
815     digest[0] = SHA256M_A;
816     digest[1] = SHA256M_B;
817     digest[2] = SHA256M_C;
818     digest[3] = SHA256M_D;
819     digest[4] = SHA256M_E;
820     digest[5] = SHA256M_F;
821     digest[6] = SHA256M_G;
822     digest[7] = SHA256M_H;
823
824     sha256_transform (w, digest);
825
826     w[ 0] = carry[ 0];
827     w[ 1] = carry[ 1];
828     w[ 2] = carry[ 2];
829     w[ 3] = carry[ 3];
830     w[ 4] = carry[ 4];
831     w[ 5] = carry[ 5];
832     w[ 6] = carry[ 6];
833     w[ 7] = carry[ 7];
834     w[ 8] = carry[ 8];
835     w[ 9] = carry[ 9];
836     w[10] = carry[10];
837     w[11] = carry[11];
838     w[12] = carry[12];
839     w[13] = carry[13];
840     w[14] = carry[14];
841     w[15] = carry[15];
842
843     carry[ 0] = s_esalt[16];
844     carry[ 1] = s_esalt[17];
845     carry[ 2] = s_esalt[18];
846     carry[ 3] = s_esalt[19];
847     carry[ 4] = s_esalt[20];
848     carry[ 5] = s_esalt[21];
849     carry[ 6] = s_esalt[22];
850     carry[ 7] = s_esalt[23];
851     carry[ 8] = s_esalt[24];
852     carry[ 9] = s_esalt[25];
853     carry[10] = s_esalt[26];
854     carry[11] = s_esalt[27];
855     carry[12] = s_esalt[28];
856     carry[13] = s_esalt[29];
857     carry[14] = s_esalt[30];
858     carry[15] = s_esalt[31];
859
860     // we can always use pw_len here, since we add exactly the hash buffer size
861     memcat64c_be (w, out_len2, carry);
862
863     sha256_transform (w, digest);
864
865     w[ 0] = carry[ 0];
866     w[ 1] = carry[ 1];
867     w[ 2] = carry[ 2];
868     w[ 3] = carry[ 3];
869     w[ 4] = carry[ 4];
870     w[ 5] = carry[ 5];
871     w[ 6] = carry[ 6];
872     w[ 7] = carry[ 7];
873     w[ 8] = carry[ 8];
874     w[ 9] = carry[ 9];
875     w[10] = carry[10];
876     w[11] = carry[11];
877     w[12] = carry[12];
878     w[13] = carry[13];
879     w[14] = carry[14];
880     w[15] = carry[15];
881
882     // we can always use pw_len here, since we add exactly the hash buffer size
883     append_0x80_4x4 (w + 0, w + 4, w + 8, w + 12, out_len2 ^ 3);
884
885     w[14] = 0;
886     w[15] = (out_len2 + 128) * 8;
887
888     sha256_transform (w, digest);
889
890     const u32x d = digest[DGST_R0];
891     const u32x h = digest[DGST_R1];
892     const u32x c = digest[DGST_R2];
893     const u32x g = digest[DGST_R3];
894
895     COMPARE_S_SIMD (d, h, c, g);
896   }
897 }
898
899 __kernel void m13800_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 win8phone_t *esalt_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)
900 {
901 }
902
903 __kernel void m13800_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 win8phone_t *esalt_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)
904 {
905 }