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