More kernel fixes for function calls and vector datatypes
[hashcat.git] / OpenCL / m03000_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _DES_
7
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
10
11 #define DGST_R0 0
12 #define DGST_R1 1
13 #define DGST_R2 2
14 #define DGST_R3 3
15
16 #include "include/kernel_functions.c"
17 #include "types_ocl.c"
18 #include "common.c"
19 #include "include/rp_gpu.h"
20 #include "rp.c"
21
22 #define COMPARE_S "check_single_comp4.c"
23 #define COMPARE_M "check_multi_comp4.c"
24
25 #define PERM_OP(a,b,tt,n,m) \
26 {                           \
27   tt = a >> n;              \
28   tt = tt ^ b;              \
29   tt = tt & m;              \
30   b = b ^ tt;               \
31   tt = tt << n;             \
32   a = a ^ tt;               \
33 }
34
35 #define HPERM_OP(a,tt,n,m)  \
36 {                           \
37   tt = a << (16 + n);       \
38   tt = tt ^ a;              \
39   tt = tt & m;              \
40   a  = a ^ tt;              \
41   tt = tt >> (16 + n);      \
42   a  = a ^ tt;              \
43 }
44
45 __constant u32 c_SPtrans[8][64] =
46 {
47   /* nibble 0 */
48   0x02080800, 0x00080000, 0x02000002, 0x02080802,
49   0x02000000, 0x00080802, 0x00080002, 0x02000002,
50   0x00080802, 0x02080800, 0x02080000, 0x00000802,
51   0x02000802, 0x02000000, 0x00000000, 0x00080002,
52   0x00080000, 0x00000002, 0x02000800, 0x00080800,
53   0x02080802, 0x02080000, 0x00000802, 0x02000800,
54   0x00000002, 0x00000800, 0x00080800, 0x02080002,
55   0x00000800, 0x02000802, 0x02080002, 0x00000000,
56   0x00000000, 0x02080802, 0x02000800, 0x00080002,
57   0x02080800, 0x00080000, 0x00000802, 0x02000800,
58   0x02080002, 0x00000800, 0x00080800, 0x02000002,
59   0x00080802, 0x00000002, 0x02000002, 0x02080000,
60   0x02080802, 0x00080800, 0x02080000, 0x02000802,
61   0x02000000, 0x00000802, 0x00080002, 0x00000000,
62   0x00080000, 0x02000000, 0x02000802, 0x02080800,
63   0x00000002, 0x02080002, 0x00000800, 0x00080802,
64   /* nibble 1 */
65   0x40108010, 0x00000000, 0x00108000, 0x40100000,
66   0x40000010, 0x00008010, 0x40008000, 0x00108000,
67   0x00008000, 0x40100010, 0x00000010, 0x40008000,
68   0x00100010, 0x40108000, 0x40100000, 0x00000010,
69   0x00100000, 0x40008010, 0x40100010, 0x00008000,
70   0x00108010, 0x40000000, 0x00000000, 0x00100010,
71   0x40008010, 0x00108010, 0x40108000, 0x40000010,
72   0x40000000, 0x00100000, 0x00008010, 0x40108010,
73   0x00100010, 0x40108000, 0x40008000, 0x00108010,
74   0x40108010, 0x00100010, 0x40000010, 0x00000000,
75   0x40000000, 0x00008010, 0x00100000, 0x40100010,
76   0x00008000, 0x40000000, 0x00108010, 0x40008010,
77   0x40108000, 0x00008000, 0x00000000, 0x40000010,
78   0x00000010, 0x40108010, 0x00108000, 0x40100000,
79   0x40100010, 0x00100000, 0x00008010, 0x40008000,
80   0x40008010, 0x00000010, 0x40100000, 0x00108000,
81   /* nibble 2 */
82   0x04000001, 0x04040100, 0x00000100, 0x04000101,
83   0x00040001, 0x04000000, 0x04000101, 0x00040100,
84   0x04000100, 0x00040000, 0x04040000, 0x00000001,
85   0x04040101, 0x00000101, 0x00000001, 0x04040001,
86   0x00000000, 0x00040001, 0x04040100, 0x00000100,
87   0x00000101, 0x04040101, 0x00040000, 0x04000001,
88   0x04040001, 0x04000100, 0x00040101, 0x04040000,
89   0x00040100, 0x00000000, 0x04000000, 0x00040101,
90   0x04040100, 0x00000100, 0x00000001, 0x00040000,
91   0x00000101, 0x00040001, 0x04040000, 0x04000101,
92   0x00000000, 0x04040100, 0x00040100, 0x04040001,
93   0x00040001, 0x04000000, 0x04040101, 0x00000001,
94   0x00040101, 0x04000001, 0x04000000, 0x04040101,
95   0x00040000, 0x04000100, 0x04000101, 0x00040100,
96   0x04000100, 0x00000000, 0x04040001, 0x00000101,
97   0x04000001, 0x00040101, 0x00000100, 0x04040000,
98   /* nibble 3 */
99   0x00401008, 0x10001000, 0x00000008, 0x10401008,
100   0x00000000, 0x10400000, 0x10001008, 0x00400008,
101   0x10401000, 0x10000008, 0x10000000, 0x00001008,
102   0x10000008, 0x00401008, 0x00400000, 0x10000000,
103   0x10400008, 0x00401000, 0x00001000, 0x00000008,
104   0x00401000, 0x10001008, 0x10400000, 0x00001000,
105   0x00001008, 0x00000000, 0x00400008, 0x10401000,
106   0x10001000, 0x10400008, 0x10401008, 0x00400000,
107   0x10400008, 0x00001008, 0x00400000, 0x10000008,
108   0x00401000, 0x10001000, 0x00000008, 0x10400000,
109   0x10001008, 0x00000000, 0x00001000, 0x00400008,
110   0x00000000, 0x10400008, 0x10401000, 0x00001000,
111   0x10000000, 0x10401008, 0x00401008, 0x00400000,
112   0x10401008, 0x00000008, 0x10001000, 0x00401008,
113   0x00400008, 0x00401000, 0x10400000, 0x10001008,
114   0x00001008, 0x10000000, 0x10000008, 0x10401000,
115   /* nibble 4 */
116   0x08000000, 0x00010000, 0x00000400, 0x08010420,
117   0x08010020, 0x08000400, 0x00010420, 0x08010000,
118   0x00010000, 0x00000020, 0x08000020, 0x00010400,
119   0x08000420, 0x08010020, 0x08010400, 0x00000000,
120   0x00010400, 0x08000000, 0x00010020, 0x00000420,
121   0x08000400, 0x00010420, 0x00000000, 0x08000020,
122   0x00000020, 0x08000420, 0x08010420, 0x00010020,
123   0x08010000, 0x00000400, 0x00000420, 0x08010400,
124   0x08010400, 0x08000420, 0x00010020, 0x08010000,
125   0x00010000, 0x00000020, 0x08000020, 0x08000400,
126   0x08000000, 0x00010400, 0x08010420, 0x00000000,
127   0x00010420, 0x08000000, 0x00000400, 0x00010020,
128   0x08000420, 0x00000400, 0x00000000, 0x08010420,
129   0x08010020, 0x08010400, 0x00000420, 0x00010000,
130   0x00010400, 0x08010020, 0x08000400, 0x00000420,
131   0x00000020, 0x00010420, 0x08010000, 0x08000020,
132   /* nibble 5 */
133   0x80000040, 0x00200040, 0x00000000, 0x80202000,
134   0x00200040, 0x00002000, 0x80002040, 0x00200000,
135   0x00002040, 0x80202040, 0x00202000, 0x80000000,
136   0x80002000, 0x80000040, 0x80200000, 0x00202040,
137   0x00200000, 0x80002040, 0x80200040, 0x00000000,
138   0x00002000, 0x00000040, 0x80202000, 0x80200040,
139   0x80202040, 0x80200000, 0x80000000, 0x00002040,
140   0x00000040, 0x00202000, 0x00202040, 0x80002000,
141   0x00002040, 0x80000000, 0x80002000, 0x00202040,
142   0x80202000, 0x00200040, 0x00000000, 0x80002000,
143   0x80000000, 0x00002000, 0x80200040, 0x00200000,
144   0x00200040, 0x80202040, 0x00202000, 0x00000040,
145   0x80202040, 0x00202000, 0x00200000, 0x80002040,
146   0x80000040, 0x80200000, 0x00202040, 0x00000000,
147   0x00002000, 0x80000040, 0x80002040, 0x80202000,
148   0x80200000, 0x00002040, 0x00000040, 0x80200040,
149   /* nibble 6 */
150   0x00004000, 0x00000200, 0x01000200, 0x01000004,
151   0x01004204, 0x00004004, 0x00004200, 0x00000000,
152   0x01000000, 0x01000204, 0x00000204, 0x01004000,
153   0x00000004, 0x01004200, 0x01004000, 0x00000204,
154   0x01000204, 0x00004000, 0x00004004, 0x01004204,
155   0x00000000, 0x01000200, 0x01000004, 0x00004200,
156   0x01004004, 0x00004204, 0x01004200, 0x00000004,
157   0x00004204, 0x01004004, 0x00000200, 0x01000000,
158   0x00004204, 0x01004000, 0x01004004, 0x00000204,
159   0x00004000, 0x00000200, 0x01000000, 0x01004004,
160   0x01000204, 0x00004204, 0x00004200, 0x00000000,
161   0x00000200, 0x01000004, 0x00000004, 0x01000200,
162   0x00000000, 0x01000204, 0x01000200, 0x00004200,
163   0x00000204, 0x00004000, 0x01004204, 0x01000000,
164   0x01004200, 0x00000004, 0x00004004, 0x01004204,
165   0x01000004, 0x01004200, 0x01004000, 0x00004004,
166   /* nibble 7 */
167   0x20800080, 0x20820000, 0x00020080, 0x00000000,
168   0x20020000, 0x00800080, 0x20800000, 0x20820080,
169   0x00000080, 0x20000000, 0x00820000, 0x00020080,
170   0x00820080, 0x20020080, 0x20000080, 0x20800000,
171   0x00020000, 0x00820080, 0x00800080, 0x20020000,
172   0x20820080, 0x20000080, 0x00000000, 0x00820000,
173   0x20000000, 0x00800000, 0x20020080, 0x20800080,
174   0x00800000, 0x00020000, 0x20820000, 0x00000080,
175   0x00800000, 0x00020000, 0x20000080, 0x20820080,
176   0x00020080, 0x20000000, 0x00000000, 0x00820000,
177   0x20800080, 0x20020080, 0x20020000, 0x00800080,
178   0x20820000, 0x00000080, 0x00800080, 0x20020000,
179   0x20820080, 0x00800000, 0x20800000, 0x20000080,
180   0x00820000, 0x00020080, 0x20020080, 0x20800000,
181   0x00000080, 0x20820000, 0x00820080, 0x00000000,
182   0x20000000, 0x20800080, 0x00020000, 0x00820080,
183 };
184
185 __constant u32 c_skb[8][64] =
186 {
187   /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
188   0x00000000, 0x00000010, 0x20000000, 0x20000010,
189   0x00010000, 0x00010010, 0x20010000, 0x20010010,
190   0x00000800, 0x00000810, 0x20000800, 0x20000810,
191   0x00010800, 0x00010810, 0x20010800, 0x20010810,
192   0x00000020, 0x00000030, 0x20000020, 0x20000030,
193   0x00010020, 0x00010030, 0x20010020, 0x20010030,
194   0x00000820, 0x00000830, 0x20000820, 0x20000830,
195   0x00010820, 0x00010830, 0x20010820, 0x20010830,
196   0x00080000, 0x00080010, 0x20080000, 0x20080010,
197   0x00090000, 0x00090010, 0x20090000, 0x20090010,
198   0x00080800, 0x00080810, 0x20080800, 0x20080810,
199   0x00090800, 0x00090810, 0x20090800, 0x20090810,
200   0x00080020, 0x00080030, 0x20080020, 0x20080030,
201   0x00090020, 0x00090030, 0x20090020, 0x20090030,
202   0x00080820, 0x00080830, 0x20080820, 0x20080830,
203   0x00090820, 0x00090830, 0x20090820, 0x20090830,
204   /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
205   0x00000000, 0x02000000, 0x00002000, 0x02002000,
206   0x00200000, 0x02200000, 0x00202000, 0x02202000,
207   0x00000004, 0x02000004, 0x00002004, 0x02002004,
208   0x00200004, 0x02200004, 0x00202004, 0x02202004,
209   0x00000400, 0x02000400, 0x00002400, 0x02002400,
210   0x00200400, 0x02200400, 0x00202400, 0x02202400,
211   0x00000404, 0x02000404, 0x00002404, 0x02002404,
212   0x00200404, 0x02200404, 0x00202404, 0x02202404,
213   0x10000000, 0x12000000, 0x10002000, 0x12002000,
214   0x10200000, 0x12200000, 0x10202000, 0x12202000,
215   0x10000004, 0x12000004, 0x10002004, 0x12002004,
216   0x10200004, 0x12200004, 0x10202004, 0x12202004,
217   0x10000400, 0x12000400, 0x10002400, 0x12002400,
218   0x10200400, 0x12200400, 0x10202400, 0x12202400,
219   0x10000404, 0x12000404, 0x10002404, 0x12002404,
220   0x10200404, 0x12200404, 0x10202404, 0x12202404,
221   /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
222   0x00000000, 0x00000001, 0x00040000, 0x00040001,
223   0x01000000, 0x01000001, 0x01040000, 0x01040001,
224   0x00000002, 0x00000003, 0x00040002, 0x00040003,
225   0x01000002, 0x01000003, 0x01040002, 0x01040003,
226   0x00000200, 0x00000201, 0x00040200, 0x00040201,
227   0x01000200, 0x01000201, 0x01040200, 0x01040201,
228   0x00000202, 0x00000203, 0x00040202, 0x00040203,
229   0x01000202, 0x01000203, 0x01040202, 0x01040203,
230   0x08000000, 0x08000001, 0x08040000, 0x08040001,
231   0x09000000, 0x09000001, 0x09040000, 0x09040001,
232   0x08000002, 0x08000003, 0x08040002, 0x08040003,
233   0x09000002, 0x09000003, 0x09040002, 0x09040003,
234   0x08000200, 0x08000201, 0x08040200, 0x08040201,
235   0x09000200, 0x09000201, 0x09040200, 0x09040201,
236   0x08000202, 0x08000203, 0x08040202, 0x08040203,
237   0x09000202, 0x09000203, 0x09040202, 0x09040203,
238   /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
239   0x00000000, 0x00100000, 0x00000100, 0x00100100,
240   0x00000008, 0x00100008, 0x00000108, 0x00100108,
241   0x00001000, 0x00101000, 0x00001100, 0x00101100,
242   0x00001008, 0x00101008, 0x00001108, 0x00101108,
243   0x04000000, 0x04100000, 0x04000100, 0x04100100,
244   0x04000008, 0x04100008, 0x04000108, 0x04100108,
245   0x04001000, 0x04101000, 0x04001100, 0x04101100,
246   0x04001008, 0x04101008, 0x04001108, 0x04101108,
247   0x00020000, 0x00120000, 0x00020100, 0x00120100,
248   0x00020008, 0x00120008, 0x00020108, 0x00120108,
249   0x00021000, 0x00121000, 0x00021100, 0x00121100,
250   0x00021008, 0x00121008, 0x00021108, 0x00121108,
251   0x04020000, 0x04120000, 0x04020100, 0x04120100,
252   0x04020008, 0x04120008, 0x04020108, 0x04120108,
253   0x04021000, 0x04121000, 0x04021100, 0x04121100,
254   0x04021008, 0x04121008, 0x04021108, 0x04121108,
255   /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
256   0x00000000, 0x10000000, 0x00010000, 0x10010000,
257   0x00000004, 0x10000004, 0x00010004, 0x10010004,
258   0x20000000, 0x30000000, 0x20010000, 0x30010000,
259   0x20000004, 0x30000004, 0x20010004, 0x30010004,
260   0x00100000, 0x10100000, 0x00110000, 0x10110000,
261   0x00100004, 0x10100004, 0x00110004, 0x10110004,
262   0x20100000, 0x30100000, 0x20110000, 0x30110000,
263   0x20100004, 0x30100004, 0x20110004, 0x30110004,
264   0x00001000, 0x10001000, 0x00011000, 0x10011000,
265   0x00001004, 0x10001004, 0x00011004, 0x10011004,
266   0x20001000, 0x30001000, 0x20011000, 0x30011000,
267   0x20001004, 0x30001004, 0x20011004, 0x30011004,
268   0x00101000, 0x10101000, 0x00111000, 0x10111000,
269   0x00101004, 0x10101004, 0x00111004, 0x10111004,
270   0x20101000, 0x30101000, 0x20111000, 0x30111000,
271   0x20101004, 0x30101004, 0x20111004, 0x30111004,
272   /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
273   0x00000000, 0x08000000, 0x00000008, 0x08000008,
274   0x00000400, 0x08000400, 0x00000408, 0x08000408,
275   0x00020000, 0x08020000, 0x00020008, 0x08020008,
276   0x00020400, 0x08020400, 0x00020408, 0x08020408,
277   0x00000001, 0x08000001, 0x00000009, 0x08000009,
278   0x00000401, 0x08000401, 0x00000409, 0x08000409,
279   0x00020001, 0x08020001, 0x00020009, 0x08020009,
280   0x00020401, 0x08020401, 0x00020409, 0x08020409,
281   0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
282   0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
283   0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
284   0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
285   0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
286   0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
287   0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
288   0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
289   /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
290   0x00000000, 0x00000100, 0x00080000, 0x00080100,
291   0x01000000, 0x01000100, 0x01080000, 0x01080100,
292   0x00000010, 0x00000110, 0x00080010, 0x00080110,
293   0x01000010, 0x01000110, 0x01080010, 0x01080110,
294   0x00200000, 0x00200100, 0x00280000, 0x00280100,
295   0x01200000, 0x01200100, 0x01280000, 0x01280100,
296   0x00200010, 0x00200110, 0x00280010, 0x00280110,
297   0x01200010, 0x01200110, 0x01280010, 0x01280110,
298   0x00000200, 0x00000300, 0x00080200, 0x00080300,
299   0x01000200, 0x01000300, 0x01080200, 0x01080300,
300   0x00000210, 0x00000310, 0x00080210, 0x00080310,
301   0x01000210, 0x01000310, 0x01080210, 0x01080310,
302   0x00200200, 0x00200300, 0x00280200, 0x00280300,
303   0x01200200, 0x01200300, 0x01280200, 0x01280300,
304   0x00200210, 0x00200310, 0x00280210, 0x00280310,
305   0x01200210, 0x01200310, 0x01280210, 0x01280310,
306   /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
307   0x00000000, 0x04000000, 0x00040000, 0x04040000,
308   0x00000002, 0x04000002, 0x00040002, 0x04040002,
309   0x00002000, 0x04002000, 0x00042000, 0x04042000,
310   0x00002002, 0x04002002, 0x00042002, 0x04042002,
311   0x00000020, 0x04000020, 0x00040020, 0x04040020,
312   0x00000022, 0x04000022, 0x00040022, 0x04040022,
313   0x00002020, 0x04002020, 0x00042020, 0x04042020,
314   0x00002022, 0x04002022, 0x00042022, 0x04042022,
315   0x00000800, 0x04000800, 0x00040800, 0x04040800,
316   0x00000802, 0x04000802, 0x00040802, 0x04040802,
317   0x00002800, 0x04002800, 0x00042800, 0x04042800,
318   0x00002802, 0x04002802, 0x00042802, 0x04042802,
319   0x00000820, 0x04000820, 0x00040820, 0x04040820,
320   0x00000822, 0x04000822, 0x00040822, 0x04040822,
321   0x00002820, 0x04002820, 0x00042820, 0x04042820,
322   0x00002822, 0x04002822, 0x00042822, 0x04042822
323 };
324
325 __constant u32 shifts3s0[16] = {  1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1 };
326 __constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
327
328 #define LM_IV_0_IP_RR3 0x2400b807
329 #define LM_IV_1_IP_RR3 0xaa190747
330
331 #define BOX(i,n,S) (S)[(n)][(i)]
332
333 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
334 {
335   u32 r = data[0];
336   u32 l = data[1];
337
338   #pragma unroll 16
339   for (u32 i = 0; i < 16; i += 2)
340   {
341     u32 u;
342     u32 t;
343
344     u = Kc[i + 0] ^ rotl32 (r, 30u);
345     t = Kd[i + 0] ^ rotl32 (r, 26u);
346
347     l = l
348       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
349       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
350       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
351       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
352       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
353       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
354       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
355       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
356
357     u = Kc[i + 1] ^ rotl32 (l, 30u);
358     t = Kd[i + 1] ^ rotl32 (l, 26u);
359
360     r = r
361       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
362       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
363       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
364       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
365       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
366       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
367       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
368       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
369   }
370
371   iv[0] = rotl32 (l, 29);
372   iv[1] = rotl32 (r, 29);
373 }
374
375 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
376 {
377   u32 tt;
378
379   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
380   HPERM_OP (c,    tt, 2, 0xcccc0000);
381   HPERM_OP (d,    tt, 2, 0xcccc0000);
382   PERM_OP  (d, c, tt, 1, 0x55555555);
383   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
384   PERM_OP  (d, c, tt, 1, 0x55555555);
385
386   d = ((d & 0x000000ff) << 16)
387     | ((d & 0x0000ff00) <<  0)
388     | ((d & 0x00ff0000) >> 16)
389     | ((c & 0xf0000000) >>  4);
390
391   c = c & 0x0fffffff;
392
393   #pragma unroll 16
394   for (u32 i = 0; i < 16; i++)
395   {
396     c = c >> shifts3s0[i] | c << shifts3s1[i];
397     d = d >> shifts3s0[i] | d << shifts3s1[i];
398
399     c = c & 0x0fffffff;
400     d = d & 0x0fffffff;
401
402     const u32 c00 = (c >>  0) & 0x0000003f;
403     const u32 c06 = (c >>  6) & 0x00383003;
404     const u32 c07 = (c >>  7) & 0x0000003c;
405     const u32 c13 = (c >> 13) & 0x0000060f;
406     const u32 c20 = (c >> 20) & 0x00000001;
407
408     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
409             | BOX (((c06 >>  0) & 0xff)
410                   |((c07 >>  0) & 0xff), 1, s_skb)
411             | BOX (((c13 >>  0) & 0xff)
412                   |((c06 >>  8) & 0xff), 2, s_skb)
413             | BOX (((c20 >>  0) & 0xff)
414                   |((c13 >>  8) & 0xff)
415                   |((c06 >> 16) & 0xff), 3, s_skb);
416
417     const u32 d00 = (d >>  0) & 0x00003c3f;
418     const u32 d07 = (d >>  7) & 0x00003f03;
419     const u32 d21 = (d >> 21) & 0x0000000f;
420     const u32 d22 = (d >> 22) & 0x00000030;
421
422     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
423             | BOX (((d07 >>  0) & 0xff)
424                   |((d00 >>  8) & 0xff), 5, s_skb)
425             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
426             | BOX (((d21 >>  0) & 0xff)
427                   |((d22 >>  0) & 0xff), 7, s_skb);
428
429     Kc[i] = ((t << 16) | (s & 0x0000ffff));
430     Kd[i] = ((s >> 16) | (t & 0xffff0000));
431   }
432 }
433
434 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
435 {
436   const uchar4 t0 = as_uchar4 (w0);
437   const uchar4 t1 = as_uchar4 (w1);
438
439   uchar4 k0;
440   uchar4 k1;
441
442   k0.s0 =                (t0.s0 >> 0);
443   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
444   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
445   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
446   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
447   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
448   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
449   k1.s3 = (t1.s2 << 1);
450
451   out[0] = as_uint (k0);
452   out[1] = as_uint (k1);
453 }
454
455 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
456 {
457   /**
458    * modifier
459    */
460
461   const u32 lid = get_local_id (0);
462
463   /**
464    * base
465    */
466
467   const u32 gid = get_global_id (0);
468
469   u32 pw_buf[4];
470
471   pw_buf[0] = pws[gid].i[ 0];
472   pw_buf[1] = pws[gid].i[ 1];
473   pw_buf[2] = 0;
474   pw_buf[3] = 0;
475
476   const u32 pw_len = pws[gid].pw_len;
477
478   /**
479    * sbox, kbox
480    */
481
482   __local u32 s_SPtrans[8][64];
483   __local u32 s_skb[8][64];
484
485   s_SPtrans[0][lid] = c_SPtrans[0][lid];
486   s_SPtrans[1][lid] = c_SPtrans[1][lid];
487   s_SPtrans[2][lid] = c_SPtrans[2][lid];
488   s_SPtrans[3][lid] = c_SPtrans[3][lid];
489   s_SPtrans[4][lid] = c_SPtrans[4][lid];
490   s_SPtrans[5][lid] = c_SPtrans[5][lid];
491   s_SPtrans[6][lid] = c_SPtrans[6][lid];
492   s_SPtrans[7][lid] = c_SPtrans[7][lid];
493
494   s_skb[0][lid] = c_skb[0][lid];
495   s_skb[1][lid] = c_skb[1][lid];
496   s_skb[2][lid] = c_skb[2][lid];
497   s_skb[3][lid] = c_skb[3][lid];
498   s_skb[4][lid] = c_skb[4][lid];
499   s_skb[5][lid] = c_skb[5][lid];
500   s_skb[6][lid] = c_skb[6][lid];
501   s_skb[7][lid] = c_skb[7][lid];
502
503   barrier (CLK_LOCAL_MEM_FENCE);
504
505   if (gid >= gid_max) return;
506
507   /**
508    * main
509    */
510
511   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
512   {
513     u32 w0[4];
514
515     w0[0] = pw_buf[0];
516     w0[1] = pw_buf[1];
517     w0[2] = pw_buf[2];
518     w0[3] = pw_buf[3];
519
520     u32 w1[4];
521
522     w1[0] = 0;
523     w1[1] = 0;
524     w1[2] = 0;
525     w1[3] = 0;
526
527     u32 w2[4];
528
529     w2[0] = 0;
530     w2[1] = 0;
531     w2[2] = 0;
532     w2[3] = 0;
533
534     u32 w3[4];
535
536     w3[0] = 0;
537     w3[1] = 0;
538     w3[2] = 0;
539     w3[3] = 0;
540
541     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
542
543     out_len = (out_len >= 7) ? 7 : out_len;
544
545     u32 key[2];
546
547     transform_netntlmv1_key (w0[0], w0[1], key);
548
549     const u32 c = key[0];
550     const u32 d = key[1];
551
552     u32 Kc[16];
553     u32 Kd[16];
554
555     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
556
557     u32 data[2];
558
559     data[0] = LM_IV_0_IP_RR3;
560     data[1] = LM_IV_1_IP_RR3;
561
562     u32 iv[2];
563
564     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
565
566     const u32 r0 = iv[0];
567     const u32 r1 = iv[1];
568     const u32 r2 = 0;
569     const u32 r3 = 0;
570
571     #include COMPARE_M
572   }
573 }
574
575 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
576 {
577 }
578
579 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
580 {
581 }
582
583 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
584 {
585   /**
586    * modifier
587    */
588
589   const u32 lid = get_local_id (0);
590
591   /**
592    * base
593    */
594
595   const u32 gid = get_global_id (0);
596
597   u32 pw_buf[4];
598
599   pw_buf[0] = pws[gid].i[ 0];
600   pw_buf[1] = pws[gid].i[ 1];
601   pw_buf[2] = 0;
602   pw_buf[3] = 0;
603
604   const u32 pw_len = pws[gid].pw_len;
605
606   /**
607    * sbox, kbox
608    */
609
610   __local u32 s_SPtrans[8][64];
611   __local u32 s_skb[8][64];
612
613   s_SPtrans[0][lid] = c_SPtrans[0][lid];
614   s_SPtrans[1][lid] = c_SPtrans[1][lid];
615   s_SPtrans[2][lid] = c_SPtrans[2][lid];
616   s_SPtrans[3][lid] = c_SPtrans[3][lid];
617   s_SPtrans[4][lid] = c_SPtrans[4][lid];
618   s_SPtrans[5][lid] = c_SPtrans[5][lid];
619   s_SPtrans[6][lid] = c_SPtrans[6][lid];
620   s_SPtrans[7][lid] = c_SPtrans[7][lid];
621
622   s_skb[0][lid] = c_skb[0][lid];
623   s_skb[1][lid] = c_skb[1][lid];
624   s_skb[2][lid] = c_skb[2][lid];
625   s_skb[3][lid] = c_skb[3][lid];
626   s_skb[4][lid] = c_skb[4][lid];
627   s_skb[5][lid] = c_skb[5][lid];
628   s_skb[6][lid] = c_skb[6][lid];
629   s_skb[7][lid] = c_skb[7][lid];
630
631   barrier (CLK_LOCAL_MEM_FENCE);
632
633   if (gid >= gid_max) return;
634
635   /**
636    * digest
637    */
638
639   const u32 search[4] =
640   {
641     digests_buf[digests_offset].digest_buf[DGST_R0],
642     digests_buf[digests_offset].digest_buf[DGST_R1],
643     digests_buf[digests_offset].digest_buf[DGST_R2],
644     digests_buf[digests_offset].digest_buf[DGST_R3]
645   };
646
647   /**
648    * main
649    */
650
651   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
652   {
653     u32 w0[4];
654
655     w0[0] = pw_buf[0];
656     w0[1] = pw_buf[1];
657     w0[2] = pw_buf[2];
658     w0[3] = pw_buf[3];
659
660     u32 w1[4];
661
662     w1[0] = 0;
663     w1[1] = 0;
664     w1[2] = 0;
665     w1[3] = 0;
666
667     u32 w2[4];
668
669     w2[0] = 0;
670     w2[1] = 0;
671     w2[2] = 0;
672     w2[3] = 0;
673
674     u32 w3[4];
675
676     w3[0] = 0;
677     w3[1] = 0;
678     w3[2] = 0;
679     w3[3] = 0;
680
681     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
682
683     out_len = (out_len >= 7) ? 7 : out_len;
684
685     u32 key[2];
686
687     transform_netntlmv1_key (w0[0], w0[1], key);
688
689     const u32 c = key[0];
690     const u32 d = key[1];
691
692     u32 Kc[16];
693     u32 Kd[16];
694
695     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
696
697     u32 data[2];
698
699     data[0] = LM_IV_0_IP_RR3;
700     data[1] = LM_IV_1_IP_RR3;
701
702     u32 iv[2];
703
704     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
705
706     const u32 r0 = iv[0];
707     const u32 r1 = iv[1];
708     const u32 r2 = 0;
709     const u32 r3 = 0;
710
711     #include COMPARE_S
712   }
713 }
714
715 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
716 {
717 }
718
719 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_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)
720 {
721 }