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