Initial commit
[hashcat.git] / amd / m05000_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _KECCAK_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #ifdef  VLIW1
12 #define VECT_SIZE1
13 #endif
14
15 #ifdef  VLIW4
16 #define VECT_SIZE1
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE1
21 #endif
22
23 #define DGST_R0 2
24 #define DGST_R1 3
25 #define DGST_R2 4
26 #define DGST_R3 5
27
28 #include "include/kernel_functions.c"
29 #include "types_amd.c"
30 #include "common_amd.c"
31 #include "include/rp_gpu.h"
32 #include "rp_amd.c"
33
34 #ifdef  VECT_SIZE1
35 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
36 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
37 #endif
38
39 #ifdef  VECT_SIZE2
40 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
41 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
42 #endif
43
44 __constant u64 keccakf_rndc[24] =
45 {
46   0x0000000000000001, 0x0000000000008082, 0x800000000000808a,
47   0x8000000080008000, 0x000000000000808b, 0x0000000080000001,
48   0x8000000080008081, 0x8000000000008009, 0x000000000000008a,
49   0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
50   0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
51   0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
52   0x000000000000800a, 0x800000008000000a, 0x8000000080008081,
53   0x8000000000008080, 0x0000000080000001, 0x8000000080008008
54 };
55
56 __constant u32 keccakf_rotc[24] =
57 {
58    1,  3,  6, 10, 15, 21, 28, 36, 45, 55,  2, 14,
59   27, 41, 56,  8, 25, 43, 62, 18, 39, 61, 20, 44
60 };
61
62 __constant u32 keccakf_piln[24] =
63 {
64   10,  7, 11, 17, 18,  3,  5, 16,  8, 21, 24,  4,
65   15, 23, 19, 13, 12,  2, 20, 14, 22,  9,  6,  1
66 };
67
68 #ifndef KECCAK_ROUNDS
69 #define KECCAK_ROUNDS 24
70 #endif
71
72 #define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s])
73
74 #define Theta2(s)               \
75 {                               \
76   st[ 0 + s] ^= t;              \
77   st[ 5 + s] ^= t;              \
78   st[10 + s] ^= t;              \
79   st[15 + s] ^= t;              \
80   st[20 + s] ^= t;              \
81 }
82
83 #define Rho_Pi(s)               \
84 {                               \
85   u32 j = keccakf_piln[s];     \
86   u32 k = keccakf_rotc[s];     \
87   bc0 = st[j];                  \
88   st[j] = rotl64 (t, k);        \
89   t = bc0;                      \
90 }
91
92 #define Chi(s)                  \
93 {                               \
94   bc0 = st[0 + s];              \
95   bc1 = st[1 + s];              \
96   bc2 = st[2 + s];              \
97   bc3 = st[3 + s];              \
98   bc4 = st[4 + s];              \
99   st[0 + s] ^= ~bc1 & bc2;      \
100   st[1 + s] ^= ~bc2 & bc3;      \
101   st[2 + s] ^= ~bc3 & bc4;      \
102   st[3 + s] ^= ~bc4 & bc0;      \
103   st[4 + s] ^= ~bc0 & bc1;      \
104 }
105
106 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m04 (__global pw_t *pws, __global gpu_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 void *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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
107 {
108   /**
109    * modifier
110    */
111
112   const u32 lid = get_local_id (0);
113
114   /**
115    * base
116    */
117
118   const u32 gid = get_global_id (0);
119
120   if (gid >= gid_max) return;
121
122   u32x pw_buf0[4];
123
124   pw_buf0[0] = pws[gid].i[ 0];
125   pw_buf0[1] = pws[gid].i[ 1];
126   pw_buf0[2] = pws[gid].i[ 2];
127   pw_buf0[3] = pws[gid].i[ 3];
128
129   u32x pw_buf1[4];
130
131   pw_buf1[0] = pws[gid].i[ 4];
132   pw_buf1[1] = pws[gid].i[ 5];
133   pw_buf1[2] = pws[gid].i[ 6];
134   pw_buf1[3] = pws[gid].i[ 7];
135
136   const u32 pw_len = pws[gid].pw_len;
137
138   /**
139    * 0x80 keccak, very special
140    */
141
142   const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen;
143
144   const u32 rsiz = 200 - (2 * mdlen);
145
146   const u32 add80w = (rsiz - 1) / 8;
147
148   /**
149    * loop
150    */
151
152   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
153   {
154     u32x w0[4];
155
156     w0[0] = pw_buf0[0];
157     w0[1] = pw_buf0[1];
158     w0[2] = pw_buf0[2];
159     w0[3] = pw_buf0[3];
160
161     u32x w1[4];
162
163     w1[0] = pw_buf1[0];
164     w1[1] = pw_buf1[1];
165     w1[2] = pw_buf1[2];
166     w1[3] = pw_buf1[3];
167
168     u32x w2[4];
169
170     w2[0] = 0;
171     w2[1] = 0;
172     w2[2] = 0;
173     w2[3] = 0;
174
175     u32x w3[4];
176
177     w3[0] = 0;
178     w3[1] = 0;
179     w3[2] = 0;
180     w3[3] = 0;
181
182     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
183
184     append_0x01_2 (w0, w1, out_len);
185
186     u64x st[25];
187
188     #ifdef VECT_SIZE1
189     st[ 0] = (u64x) (w0[0])               | (u64x) (w0[1]) << 32;
190     st[ 1] = (u64x) (w0[2])               | (u64x) (w0[3]) << 32;
191     st[ 2] = (u64x) (w1[0])               | (u64x) (w1[1]) << 32;
192     st[ 3] = (u64x) (w1[2])               | (u64x) (w1[3]) << 32;
193     #endif
194
195     #ifdef VECT_SIZE2
196     st[ 0] = (u64x) (w0[0].s0, w0[0].s1)  | (u64x) (w0[1].s0, w0[1].s1) << 32;
197     st[ 1] = (u64x) (w0[2].s0, w0[2].s1)  | (u64x) (w0[3].s0, w0[3].s1) << 32;
198     st[ 2] = (u64x) (w1[0].s0, w1[0].s1)  | (u64x) (w1[1].s0, w1[1].s1) << 32;
199     st[ 3] = (u64x) (w1[2].s0, w1[2].s1)  | (u64x) (w1[3].s0, w1[3].s1) << 32;
200     #endif
201
202     st[ 4] = 0;
203     st[ 5] = 0;
204     st[ 6] = 0;
205     st[ 7] = 0;
206     st[ 8] = 0;
207     st[ 9] = 0;
208     st[10] = 0;
209     st[11] = 0;
210     st[12] = 0;
211     st[13] = 0;
212     st[14] = 0;
213     st[15] = 0;
214     st[16] = 0;
215     st[17] = 0;
216     st[18] = 0;
217     st[19] = 0;
218     st[20] = 0;
219     st[21] = 0;
220     st[22] = 0;
221     st[23] = 0;
222     st[24] = 0;
223
224     st[add80w] |= 0x8000000000000000;
225
226     int round;
227
228     for (round = 0; round < KECCAK_ROUNDS; round++)
229     {
230       // Theta
231
232       u64x bc0 = Theta1 (0);
233       u64x bc1 = Theta1 (1);
234       u64x bc2 = Theta1 (2);
235       u64x bc3 = Theta1 (3);
236       u64x bc4 = Theta1 (4);
237
238       u64x t;
239
240       t = bc4 ^ rotl64 (bc1, 1); Theta2 (0);
241       t = bc0 ^ rotl64 (bc2, 1); Theta2 (1);
242       t = bc1 ^ rotl64 (bc3, 1); Theta2 (2);
243       t = bc2 ^ rotl64 (bc4, 1); Theta2 (3);
244       t = bc3 ^ rotl64 (bc0, 1); Theta2 (4);
245
246       // Rho Pi
247
248       t = st[1];
249
250       Rho_Pi (0);
251       Rho_Pi (1);
252       Rho_Pi (2);
253       Rho_Pi (3);
254       Rho_Pi (4);
255       Rho_Pi (5);
256       Rho_Pi (6);
257       Rho_Pi (7);
258       Rho_Pi (8);
259       Rho_Pi (9);
260       Rho_Pi (10);
261       Rho_Pi (11);
262       Rho_Pi (12);
263       Rho_Pi (13);
264       Rho_Pi (14);
265       Rho_Pi (15);
266       Rho_Pi (16);
267       Rho_Pi (17);
268       Rho_Pi (18);
269       Rho_Pi (19);
270       Rho_Pi (20);
271       Rho_Pi (21);
272       Rho_Pi (22);
273       Rho_Pi (23);
274
275       //  Chi
276
277       Chi (0);
278       Chi (5);
279       Chi (10);
280       Chi (15);
281       Chi (20);
282
283       //  Iota
284
285       st[0] ^= keccakf_rndc[round];
286     }
287
288     const u32x r0 = l32_from_64 (st[1]);
289     const u32x r1 = h32_from_64 (st[1]);
290     const u32x r2 = l32_from_64 (st[2]);
291     const u32x r3 = h32_from_64 (st[2]);
292
293     #include VECT_COMPARE_M
294   }
295 }
296
297 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m08 (__global pw_t *pws, __global gpu_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 void *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
298 {
299 }
300
301 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m16 (__global pw_t *pws, __global gpu_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 void *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
302 {
303 }
304
305 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s04 (__global pw_t *pws, __global gpu_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 void *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 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
306 {
307   /**
308    * modifier
309    */
310
311   const u32 lid = get_local_id (0);
312
313   /**
314    * base
315    */
316
317   const u32 gid = get_global_id (0);
318
319   if (gid >= gid_max) return;
320
321   u32x pw_buf0[4];
322
323   pw_buf0[0] = pws[gid].i[ 0];
324   pw_buf0[1] = pws[gid].i[ 1];
325   pw_buf0[2] = pws[gid].i[ 2];
326   pw_buf0[3] = pws[gid].i[ 3];
327
328   u32x pw_buf1[4];
329
330   pw_buf1[0] = pws[gid].i[ 4];
331   pw_buf1[1] = pws[gid].i[ 5];
332   pw_buf1[2] = pws[gid].i[ 6];
333   pw_buf1[3] = pws[gid].i[ 7];
334
335   const u32 pw_len = pws[gid].pw_len;
336
337   /**
338    * digest
339    */
340
341   const u32 search[4] =
342   {
343     digests_buf[digests_offset].digest_buf[DGST_R0],
344     digests_buf[digests_offset].digest_buf[DGST_R1],
345     digests_buf[digests_offset].digest_buf[DGST_R2],
346     digests_buf[digests_offset].digest_buf[DGST_R3]
347   };
348
349   /**
350    * 0x80 keccak, very special
351    */
352
353   const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen;
354
355   const u32 rsiz = 200 - (2 * mdlen);
356
357   const u32 add80w = (rsiz - 1) / 8;
358
359   /**
360    * loop
361    */
362
363   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
364   {
365     u32x w0[4];
366
367     w0[0] = pw_buf0[0];
368     w0[1] = pw_buf0[1];
369     w0[2] = pw_buf0[2];
370     w0[3] = pw_buf0[3];
371
372     u32x w1[4];
373
374     w1[0] = pw_buf1[0];
375     w1[1] = pw_buf1[1];
376     w1[2] = pw_buf1[2];
377     w1[3] = pw_buf1[3];
378
379     u32x w2[4];
380
381     w2[0] = 0;
382     w2[1] = 0;
383     w2[2] = 0;
384     w2[3] = 0;
385
386     u32x w3[4];
387
388     w3[0] = 0;
389     w3[1] = 0;
390     w3[2] = 0;
391     w3[3] = 0;
392
393     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
394
395     append_0x01_2 (w0, w1, out_len);
396
397     u64x st[25];
398
399     #ifdef VECT_SIZE1
400     st[ 0] = (u64x) (w0[0])               | (u64x) (w0[1]) << 32;
401     st[ 1] = (u64x) (w0[2])               | (u64x) (w0[3]) << 32;
402     st[ 2] = (u64x) (w1[0])               | (u64x) (w1[1]) << 32;
403     st[ 3] = (u64x) (w1[2])               | (u64x) (w1[3]) << 32;
404     #endif
405
406     #ifdef VECT_SIZE2
407     st[ 0] = (u64x) (w0[0].s0, w0[0].s1)  | (u64x) (w0[1].s0, w0[1].s1) << 32;
408     st[ 1] = (u64x) (w0[2].s0, w0[2].s1)  | (u64x) (w0[3].s0, w0[3].s1) << 32;
409     st[ 2] = (u64x) (w1[0].s0, w1[0].s1)  | (u64x) (w1[1].s0, w1[1].s1) << 32;
410     st[ 3] = (u64x) (w1[2].s0, w1[2].s1)  | (u64x) (w1[3].s0, w1[3].s1) << 32;
411     #endif
412
413     st[ 4] = 0;
414     st[ 5] = 0;
415     st[ 6] = 0;
416     st[ 7] = 0;
417     st[ 8] = 0;
418     st[ 9] = 0;
419     st[10] = 0;
420     st[11] = 0;
421     st[12] = 0;
422     st[13] = 0;
423     st[14] = 0;
424     st[15] = 0;
425     st[16] = 0;
426     st[17] = 0;
427     st[18] = 0;
428     st[19] = 0;
429     st[20] = 0;
430     st[21] = 0;
431     st[22] = 0;
432     st[23] = 0;
433     st[24] = 0;
434
435     st[add80w] |= 0x8000000000000000;
436
437     int round;
438
439     for (round = 0; round < KECCAK_ROUNDS; round++)
440     {
441       // Theta
442
443       u64x bc0 = Theta1 (0);
444       u64x bc1 = Theta1 (1);
445       u64x bc2 = Theta1 (2);
446       u64x bc3 = Theta1 (3);
447       u64x bc4 = Theta1 (4);
448
449       u64x t;
450
451       t = bc4 ^ rotl64 (bc1, 1); Theta2 (0);
452       t = bc0 ^ rotl64 (bc2, 1); Theta2 (1);
453       t = bc1 ^ rotl64 (bc3, 1); Theta2 (2);
454       t = bc2 ^ rotl64 (bc4, 1); Theta2 (3);
455       t = bc3 ^ rotl64 (bc0, 1); Theta2 (4);
456
457       // Rho Pi
458
459       t = st[1];
460
461       Rho_Pi (0);
462       Rho_Pi (1);
463       Rho_Pi (2);
464       Rho_Pi (3);
465       Rho_Pi (4);
466       Rho_Pi (5);
467       Rho_Pi (6);
468       Rho_Pi (7);
469       Rho_Pi (8);
470       Rho_Pi (9);
471       Rho_Pi (10);
472       Rho_Pi (11);
473       Rho_Pi (12);
474       Rho_Pi (13);
475       Rho_Pi (14);
476       Rho_Pi (15);
477       Rho_Pi (16);
478       Rho_Pi (17);
479       Rho_Pi (18);
480       Rho_Pi (19);
481       Rho_Pi (20);
482       Rho_Pi (21);
483       Rho_Pi (22);
484       Rho_Pi (23);
485
486       //  Chi
487
488       Chi (0);
489       Chi (5);
490       Chi (10);
491       Chi (15);
492       Chi (20);
493
494       //  Iota
495
496       st[0] ^= keccakf_rndc[round];
497     }
498
499     const u32x r0 = l32_from_64 (st[1]);
500     const u32x r1 = h32_from_64 (st[1]);
501     const u32x r2 = l32_from_64 (st[2]);
502     const u32x r3 = h32_from_64 (st[2]);
503
504     #include VECT_COMPARE_S
505   }
506 }
507
508 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s08 (__global pw_t *pws, __global gpu_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 void *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
509 {
510 }
511
512 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s16 (__global pw_t *pws, __global gpu_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 void *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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
513 {
514 }