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