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