- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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 #ifdef VECT_SIZE1
332 #define BOX(i,n,S) u32 ((S)[(n)][(i)])
333 #endif
334
335 #ifdef VECT_SIZE2
336 #define BOX(i,n,S) u32 ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
337 #endif
338
339 #ifdef VECT_SIZE4
340 #define BOX(i,n,S) u32 ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
341 #endif
342
343 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
344 {
345   u32 r = data[0];
346   u32 l = data[1];
347
348   #pragma unroll 16
349   for (u32 i = 0; i < 16; i += 2)
350   {
351     u32 u;
352     u32 t;
353
354     u = Kc[i + 0] ^ rotl32 (r, 30u);
355     t = Kd[i + 0] ^ rotl32 (r, 26u);
356
357     l = l
358       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
359       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
360       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
361       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
362       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
363       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
364       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
365       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
366
367     u = Kc[i + 1] ^ rotl32 (l, 30u);
368     t = Kd[i + 1] ^ rotl32 (l, 26u);
369
370     r = r
371       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
372       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
373       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
374       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
375       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
376       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
377       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
378       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
379   }
380
381   iv[0] = rotl32 (l, 29);
382   iv[1] = rotl32 (r, 29);
383 }
384
385 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
386 {
387   u32 tt;
388
389   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
390   HPERM_OP (c,    tt, 2, 0xcccc0000);
391   HPERM_OP (d,    tt, 2, 0xcccc0000);
392   PERM_OP  (d, c, tt, 1, 0x55555555);
393   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
394   PERM_OP  (d, c, tt, 1, 0x55555555);
395
396   d = ((d & 0x000000ff) << 16)
397     | ((d & 0x0000ff00) <<  0)
398     | ((d & 0x00ff0000) >> 16)
399     | ((c & 0xf0000000) >>  4);
400
401   c = c & 0x0fffffff;
402
403   #pragma unroll 16
404   for (u32 i = 0; i < 16; i++)
405   {
406     c = c >> shifts3s0[i] | c << shifts3s1[i];
407     d = d >> shifts3s0[i] | d << shifts3s1[i];
408
409     c = c & 0x0fffffff;
410     d = d & 0x0fffffff;
411
412     const u32 c00 = (c >>  0) & 0x0000003f;
413     const u32 c06 = (c >>  6) & 0x00383003;
414     const u32 c07 = (c >>  7) & 0x0000003c;
415     const u32 c13 = (c >> 13) & 0x0000060f;
416     const u32 c20 = (c >> 20) & 0x00000001;
417
418     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
419             | BOX (((c06 >>  0) & 0xff)
420                   |((c07 >>  0) & 0xff), 1, s_skb)
421             | BOX (((c13 >>  0) & 0xff)
422                   |((c06 >>  8) & 0xff), 2, s_skb)
423             | BOX (((c20 >>  0) & 0xff)
424                   |((c13 >>  8) & 0xff)
425                   |((c06 >> 16) & 0xff), 3, s_skb);
426
427     const u32 d00 = (d >>  0) & 0x00003c3f;
428     const u32 d07 = (d >>  7) & 0x00003f03;
429     const u32 d21 = (d >> 21) & 0x0000000f;
430     const u32 d22 = (d >> 22) & 0x00000030;
431
432     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
433             | BOX (((d07 >>  0) & 0xff)
434                   |((d00 >>  8) & 0xff), 5, s_skb)
435             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
436             | BOX (((d21 >>  0) & 0xff)
437                   |((d22 >>  0) & 0xff), 7, s_skb);
438
439     Kc[i] = ((t << 16) | (s & 0x0000ffff));
440     Kd[i] = ((s >> 16) | (t & 0xffff0000));
441   }
442 }
443
444 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
445 {
446   #ifdef VECT_SIZE1
447   const uchar4 t0 = as_uchar4 (w0);
448   const uchar4 t1 = as_uchar4 (w1);
449
450   uchar4 k0;
451   uchar4 k1;
452
453   k0.s0 =                (t0.s0 >> 0);
454   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
455   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
456   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
457   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
458   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
459   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
460   k1.s3 = (t1.s2 << 1);
461
462   out[0] = as_uint (k0);
463   out[1] = as_uint (k1);
464   #endif
465
466   #ifdef VECT_SIZE2
467   const uchar8 t0 = as_uchar8 (w0);
468   const uchar8 t1 = as_uchar8 (w1);
469
470   uchar8 k0;
471   uchar8 k1;
472
473   k0.s0 =                (t0.s0 >> 0);
474   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
475   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
476   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
477   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
478   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
479   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
480   k1.s3 = (t1.s2 << 1);
481
482   k0.s4 =                (t0.s4 >> 0);
483   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
484   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
485   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
486   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
487   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
488   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
489   k1.s7 = (t1.s6 << 1);
490
491   out[0] = as_uint2 (k0);
492   out[1] = as_uint2 (k1);
493   #endif
494
495   #ifdef VECT_SIZE4
496   const uchar16 t0 = as_uchar16 (w0);
497   const uchar16 t1 = as_uchar16 (w1);
498
499   uchar16 k0;
500   uchar16 k1;
501
502   k0.s0 =                (t0.s0 >> 0);
503   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
504   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
505   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
506   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
507   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
508   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
509   k1.s3 = (t1.s2 << 1);
510
511   k0.s4 =                (t0.s4 >> 0);
512   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
513   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
514   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
515   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
516   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
517   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
518   k1.s7 = (t1.s6 << 1);
519
520   k0.s8 =                (t0.s8 >> 0);
521   k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1);
522   k0.sa = (t0.s9 << 6) | (t0.sa >> 2);
523   k0.sb = (t0.sa << 5) | (t0.sb >> 3);
524   k1.s8 = (t0.sb << 4) | (t1.s8 >> 4);
525   k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5);
526   k1.sa = (t1.s9 << 2) | (t1.sa >> 6);
527   k1.sb = (t1.sa << 1);
528
529   k0.sc =                (t0.sc >> 0);
530   k0.sd = (t0.sc << 7) | (t0.sd >> 1);
531   k0.se = (t0.sd << 6) | (t0.se >> 2);
532   k0.sf = (t0.se << 5) | (t0.sf >> 3);
533   k1.sc = (t0.sf << 4) | (t1.sc >> 4);
534   k1.sd = (t1.sc << 3) | (t1.sd >> 5);
535   k1.se = (t1.sd << 2) | (t1.se >> 6);
536   k1.sf = (t1.se << 1);
537
538   out[0] = as_uint4 (k0);
539   out[1] = as_uint4 (k1);
540   #endif
541 }
542
543 __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)
544 {
545   /**
546    * modifier
547    */
548
549   const u32 lid = get_local_id (0);
550
551   /**
552    * base
553    */
554
555   const u32 gid = get_global_id (0);
556
557   u32 pw_buf[4];
558
559   pw_buf[0] = pws[gid].i[ 0];
560   pw_buf[1] = pws[gid].i[ 1];
561   pw_buf[2] = 0;
562   pw_buf[3] = 0;
563
564   const u32 pw_len = pws[gid].pw_len;
565
566   /**
567    * sbox, kbox
568    */
569
570   __local u32 s_SPtrans[8][64];
571   __local u32 s_skb[8][64];
572
573   s_SPtrans[0][lid] = c_SPtrans[0][lid];
574   s_SPtrans[1][lid] = c_SPtrans[1][lid];
575   s_SPtrans[2][lid] = c_SPtrans[2][lid];
576   s_SPtrans[3][lid] = c_SPtrans[3][lid];
577   s_SPtrans[4][lid] = c_SPtrans[4][lid];
578   s_SPtrans[5][lid] = c_SPtrans[5][lid];
579   s_SPtrans[6][lid] = c_SPtrans[6][lid];
580   s_SPtrans[7][lid] = c_SPtrans[7][lid];
581
582   s_skb[0][lid] = c_skb[0][lid];
583   s_skb[1][lid] = c_skb[1][lid];
584   s_skb[2][lid] = c_skb[2][lid];
585   s_skb[3][lid] = c_skb[3][lid];
586   s_skb[4][lid] = c_skb[4][lid];
587   s_skb[5][lid] = c_skb[5][lid];
588   s_skb[6][lid] = c_skb[6][lid];
589   s_skb[7][lid] = c_skb[7][lid];
590
591   barrier (CLK_LOCAL_MEM_FENCE);
592
593   if (gid >= gid_max) return;
594
595   /**
596    * main
597    */
598
599   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
600   {
601     u32 w0[4];
602
603     w0[0] = pw_buf[0];
604     w0[1] = pw_buf[1];
605     w0[2] = pw_buf[2];
606     w0[3] = pw_buf[3];
607
608     u32 w1[4];
609
610     w1[0] = 0;
611     w1[1] = 0;
612     w1[2] = 0;
613     w1[3] = 0;
614
615     u32 w2[4];
616
617     w2[0] = 0;
618     w2[1] = 0;
619     w2[2] = 0;
620     w2[3] = 0;
621
622     u32 w3[4];
623
624     w3[0] = 0;
625     w3[1] = 0;
626     w3[2] = 0;
627     w3[3] = 0;
628
629     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
630
631     out_len = (out_len >= 7) ? 7 : out_len;
632
633     u32 key[2];
634
635     transform_netntlmv1_key (w0[0], w0[1], key);
636
637     const u32 c = key[0];
638     const u32 d = key[1];
639
640     u32 Kc[16];
641     u32 Kd[16];
642
643     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
644
645     u32 data[2];
646
647     data[0] = LM_IV_0_IP_RR3;
648     data[1] = LM_IV_1_IP_RR3;
649
650     u32 iv[2];
651
652     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
653
654     const u32 r0 = iv[0];
655     const u32 r1 = iv[1];
656     const u32 r2 = 0;
657     const u32 r3 = 0;
658
659     #include COMPARE_M
660   }
661 }
662
663 __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)
664 {
665 }
666
667 __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)
668 {
669 }
670
671 __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)
672 {
673   /**
674    * modifier
675    */
676
677   const u32 lid = get_local_id (0);
678
679   /**
680    * base
681    */
682
683   const u32 gid = get_global_id (0);
684
685   u32 pw_buf[4];
686
687   pw_buf[0] = pws[gid].i[ 0];
688   pw_buf[1] = pws[gid].i[ 1];
689   pw_buf[2] = 0;
690   pw_buf[3] = 0;
691
692   const u32 pw_len = pws[gid].pw_len;
693
694   /**
695    * sbox, kbox
696    */
697
698   __local u32 s_SPtrans[8][64];
699   __local u32 s_skb[8][64];
700
701   s_SPtrans[0][lid] = c_SPtrans[0][lid];
702   s_SPtrans[1][lid] = c_SPtrans[1][lid];
703   s_SPtrans[2][lid] = c_SPtrans[2][lid];
704   s_SPtrans[3][lid] = c_SPtrans[3][lid];
705   s_SPtrans[4][lid] = c_SPtrans[4][lid];
706   s_SPtrans[5][lid] = c_SPtrans[5][lid];
707   s_SPtrans[6][lid] = c_SPtrans[6][lid];
708   s_SPtrans[7][lid] = c_SPtrans[7][lid];
709
710   s_skb[0][lid] = c_skb[0][lid];
711   s_skb[1][lid] = c_skb[1][lid];
712   s_skb[2][lid] = c_skb[2][lid];
713   s_skb[3][lid] = c_skb[3][lid];
714   s_skb[4][lid] = c_skb[4][lid];
715   s_skb[5][lid] = c_skb[5][lid];
716   s_skb[6][lid] = c_skb[6][lid];
717   s_skb[7][lid] = c_skb[7][lid];
718
719   barrier (CLK_LOCAL_MEM_FENCE);
720
721   if (gid >= gid_max) return;
722
723   /**
724    * digest
725    */
726
727   const u32 search[4] =
728   {
729     digests_buf[digests_offset].digest_buf[DGST_R0],
730     digests_buf[digests_offset].digest_buf[DGST_R1],
731     digests_buf[digests_offset].digest_buf[DGST_R2],
732     digests_buf[digests_offset].digest_buf[DGST_R3]
733   };
734
735   /**
736    * main
737    */
738
739   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
740   {
741     u32 w0[4];
742
743     w0[0] = pw_buf[0];
744     w0[1] = pw_buf[1];
745     w0[2] = pw_buf[2];
746     w0[3] = pw_buf[3];
747
748     u32 w1[4];
749
750     w1[0] = 0;
751     w1[1] = 0;
752     w1[2] = 0;
753     w1[3] = 0;
754
755     u32 w2[4];
756
757     w2[0] = 0;
758     w2[1] = 0;
759     w2[2] = 0;
760     w2[3] = 0;
761
762     u32 w3[4];
763
764     w3[0] = 0;
765     w3[1] = 0;
766     w3[2] = 0;
767     w3[3] = 0;
768
769     u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
770
771     out_len = (out_len >= 7) ? 7 : out_len;
772
773     u32 key[2];
774
775     transform_netntlmv1_key (w0[0], w0[1], key);
776
777     const u32 c = key[0];
778     const u32 d = key[1];
779
780     u32 Kc[16];
781     u32 Kd[16];
782
783     _des_crypt_keysetup (c, d, Kc, Kd, s_skb);
784
785     u32 data[2];
786
787     data[0] = LM_IV_0_IP_RR3;
788     data[1] = LM_IV_1_IP_RR3;
789
790     u32 iv[2];
791
792     _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans);
793
794     const u32 r0 = iv[0];
795     const u32 r1 = iv[1];
796     const u32 r2 = 0;
797     const u32 r3 = 0;
798
799     #include COMPARE_S
800   }
801 }
802
803 __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)
804 {
805 }
806
807 __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)
808 {
809 }