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