Initial commit
[hashcat.git] / amd / m05500_a0.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  */
5
6 #define _MD4_
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_SIZE4
17 #endif
18
19 #ifdef  VLIW5
20 #define VECT_SIZE4
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 #ifdef VECT_SIZE1
353 #define BOX(i,n,S) (u32x) ((S)[(n)][(i)])
354 #endif
355
356 #ifdef VECT_SIZE2
357 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
358 #endif
359
360 #ifdef VECT_SIZE4
361 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
362 #endif
363
364 static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64])
365 {
366   u32x r = data[0];
367   u32x l = data[1];
368
369   #pragma unroll 16
370   for (u32 i = 0; i < 16; i += 2)
371   {
372     u32x u;
373     u32x t;
374
375     u = Kc[i + 0] ^ rotl32 (r, 30u);
376     t = Kd[i + 0] ^ rotl32 (r, 26u);
377
378     l = l
379       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
380       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
381       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
382       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
383       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
384       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
385       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
386       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
387
388     u = Kc[i + 1] ^ rotl32 (l, 30u);
389     t = Kd[i + 1] ^ rotl32 (l, 26u);
390
391     r = r
392       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
393       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
394       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
395       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
396       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
397       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
398       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
399       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
400   }
401
402   iv[0] = l;
403   iv[1] = r;
404 }
405
406 static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64])
407 {
408   u32x tt;
409
410   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
411   HPERM_OP (c,    tt, 2, 0xcccc0000);
412   HPERM_OP (d,    tt, 2, 0xcccc0000);
413   PERM_OP  (d, c, tt, 1, 0x55555555);
414   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
415   PERM_OP  (d, c, tt, 1, 0x55555555);
416
417   d = ((d & 0x000000ff) << 16)
418     | ((d & 0x0000ff00) <<  0)
419     | ((d & 0x00ff0000) >> 16)
420     | ((c & 0xf0000000) >>  4);
421
422   c = c & 0x0fffffff;
423
424   #pragma unroll 16
425   for (u32 i = 0; i < 16; i++)
426   {
427     c = c >> shifts3s0[i] | c << shifts3s1[i];
428     d = d >> shifts3s0[i] | d << shifts3s1[i];
429
430     c = c & 0x0fffffff;
431     d = d & 0x0fffffff;
432
433     const u32x c00 = (c >>  0) & 0x0000003f;
434     const u32x c06 = (c >>  6) & 0x00383003;
435     const u32x c07 = (c >>  7) & 0x0000003c;
436     const u32x c13 = (c >> 13) & 0x0000060f;
437     const u32x c20 = (c >> 20) & 0x00000001;
438
439     u32x s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
440             | BOX (((c06 >>  0) & 0xff)
441                   |((c07 >>  0) & 0xff), 1, s_skb)
442             | BOX (((c13 >>  0) & 0xff)
443                   |((c06 >>  8) & 0xff), 2, s_skb)
444             | BOX (((c20 >>  0) & 0xff)
445                   |((c13 >>  8) & 0xff)
446                   |((c06 >> 16) & 0xff), 3, s_skb);
447
448     const u32x d00 = (d >>  0) & 0x00003c3f;
449     const u32x d07 = (d >>  7) & 0x00003f03;
450     const u32x d21 = (d >> 21) & 0x0000000f;
451     const u32x d22 = (d >> 22) & 0x00000030;
452
453     u32x t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
454             | BOX (((d07 >>  0) & 0xff)
455                   |((d00 >>  8) & 0xff), 5, s_skb)
456             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
457             | BOX (((d21 >>  0) & 0xff)
458                   |((d22 >>  0) & 0xff), 7, s_skb);
459
460     Kc[i] = ((t << 16) | (s & 0x0000ffff));
461     Kd[i] = ((s >> 16) | (t & 0xffff0000));
462   }
463 }
464
465 static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2])
466 {
467   #ifdef VECT_SIZE1
468   const uchar4 t0 = as_uchar4 (w0);
469   const uchar4 t1 = as_uchar4 (w1);
470
471   uchar4 k0;
472   uchar4 k1;
473
474   k0.s0 =                (t0.s0 >> 0);
475   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
476   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
477   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
478   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
479   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
480   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
481   k1.s3 = (t1.s2 << 1);
482
483   out[0] = as_uint (k0);
484   out[1] = as_uint (k1);
485   #endif
486
487   #ifdef VECT_SIZE2
488   const uchar8 t0 = as_uchar8 (w0);
489   const uchar8 t1 = as_uchar8 (w1);
490
491   uchar8 k0;
492   uchar8 k1;
493
494   k0.s0 =                (t0.s0 >> 0);
495   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
496   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
497   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
498   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
499   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
500   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
501   k1.s3 = (t1.s2 << 1);
502
503   k0.s4 =                (t0.s4 >> 0);
504   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
505   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
506   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
507   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
508   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
509   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
510   k1.s7 = (t1.s6 << 1);
511
512   out[0] = as_uint2 (k0);
513   out[1] = as_uint2 (k1);
514   #endif
515
516   #ifdef VECT_SIZE4
517   const uchar16 t0 = as_uchar16 (w0);
518   const uchar16 t1 = as_uchar16 (w1);
519
520   uchar16 k0;
521   uchar16 k1;
522
523   k0.s0 =                (t0.s0 >> 0);
524   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
525   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
526   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
527   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
528   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
529   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
530   k1.s3 = (t1.s2 << 1);
531
532   k0.s4 =                (t0.s4 >> 0);
533   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
534   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
535   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
536   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
537   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
538   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
539   k1.s7 = (t1.s6 << 1);
540
541   k0.s8 =                (t0.s8 >> 0);
542   k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1);
543   k0.sa = (t0.s9 << 6) | (t0.sa >> 2);
544   k0.sb = (t0.sa << 5) | (t0.sb >> 3);
545   k1.s8 = (t0.sb << 4) | (t1.s8 >> 4);
546   k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5);
547   k1.sa = (t1.s9 << 2) | (t1.sa >> 6);
548   k1.sb = (t1.sa << 1);
549
550   k0.sc =                (t0.sc >> 0);
551   k0.sd = (t0.sc << 7) | (t0.sd >> 1);
552   k0.se = (t0.sd << 6) | (t0.se >> 2);
553   k0.sf = (t0.se << 5) | (t0.sf >> 3);
554   k1.sc = (t0.sf << 4) | (t1.sc >> 4);
555   k1.sd = (t1.sc << 3) | (t1.sd >> 5);
556   k1.se = (t1.sd << 2) | (t1.se >> 6);
557   k1.sf = (t1.se << 1);
558
559   out[0] = as_uint4 (k0);
560   out[1] = as_uint4 (k1);
561   #endif
562 }
563
564 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
565 {
566   /**
567    * modifier
568    */
569
570   const u32 lid = get_local_id (0);
571
572   /**
573    * base
574    */
575
576   const u32 gid = get_global_id (0);
577
578   u32x pw_buf0[4];
579
580   pw_buf0[0] = pws[gid].i[ 0];
581   pw_buf0[1] = pws[gid].i[ 1];
582   pw_buf0[2] = pws[gid].i[ 2];
583   pw_buf0[3] = pws[gid].i[ 3];
584
585   u32x pw_buf1[4];
586
587   pw_buf1[0] = pws[gid].i[ 4];
588   pw_buf1[1] = pws[gid].i[ 5];
589   pw_buf1[2] = pws[gid].i[ 6];
590   pw_buf1[3] = pws[gid].i[ 7];
591
592   const u32 pw_len = pws[gid].pw_len;
593
594   /**
595    * sbox, kbox
596    */
597
598   __local u32 s_SPtrans[8][64];
599   __local u32 s_skb[8][64];
600
601   s_SPtrans[0][lid] = c_SPtrans[0][lid];
602   s_SPtrans[1][lid] = c_SPtrans[1][lid];
603   s_SPtrans[2][lid] = c_SPtrans[2][lid];
604   s_SPtrans[3][lid] = c_SPtrans[3][lid];
605   s_SPtrans[4][lid] = c_SPtrans[4][lid];
606   s_SPtrans[5][lid] = c_SPtrans[5][lid];
607   s_SPtrans[6][lid] = c_SPtrans[6][lid];
608   s_SPtrans[7][lid] = c_SPtrans[7][lid];
609
610   s_skb[0][lid] = c_skb[0][lid];
611   s_skb[1][lid] = c_skb[1][lid];
612   s_skb[2][lid] = c_skb[2][lid];
613   s_skb[3][lid] = c_skb[3][lid];
614   s_skb[4][lid] = c_skb[4][lid];
615   s_skb[5][lid] = c_skb[5][lid];
616   s_skb[6][lid] = c_skb[6][lid];
617   s_skb[7][lid] = c_skb[7][lid];
618
619   barrier (CLK_LOCAL_MEM_FENCE);
620
621   if (gid >= gid_max) return;
622
623   /**
624    * salt
625    */
626
627   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
628   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
629   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
630
631   u32x data[2];
632
633   data[0] = s0;
634   data[1] = s1;
635
636   /**
637    * loop
638    */
639
640   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
641   {
642     u32x w0[4];
643
644     w0[0] = pw_buf0[0];
645     w0[1] = pw_buf0[1];
646     w0[2] = pw_buf0[2];
647     w0[3] = pw_buf0[3];
648
649     u32x w1[4];
650
651     w1[0] = pw_buf1[0];
652     w1[1] = pw_buf1[1];
653     w1[2] = pw_buf1[2];
654     w1[3] = pw_buf1[3];
655
656     u32x w2[4];
657
658     w2[0] = 0;
659     w2[1] = 0;
660     w2[2] = 0;
661     w2[3] = 0;
662
663     u32x w3[4];
664
665     w3[0] = 0;
666     w3[1] = 0;
667     w3[2] = 0;
668     w3[3] = 0;
669
670     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
671
672     append_0x80_2 (w0, w1, out_len);
673
674     u32x w0_t[4];
675     u32x w1_t[4];
676     u32x w2_t[4];
677     u32x w3_t[4];
678
679     make_unicode (w0, w0_t, w1_t);
680     make_unicode (w1, w2_t, w3_t);
681
682     w3_t[2] = out_len * 8 * 2;
683
684     u32x a = MD4M_A;
685     u32x b = MD4M_B;
686     u32x c = MD4M_C;
687     u32x d = MD4M_D;
688
689     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
690     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
691     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
692     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
693     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
694     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
695     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
696     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
697     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
698     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
699     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
700     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
701     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
702     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
703     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
704     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
705
706     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
707     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
708     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
709     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
710     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
711     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
712     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
713     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
714     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
715     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
716     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
717     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
718     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
719     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
720     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
721     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
722
723     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
724     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
725     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
726     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
727     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
728     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
729     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
730     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
731     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
732     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
733     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
734     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
735     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
736     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
737
738     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
739
740     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
741     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
742
743     a += MD4M_A;
744     b += MD4M_B;
745     c += MD4M_C;
746     d += MD4M_D;
747
748     /**
749      * DES1
750      */
751
752     u32x key[2];
753
754     transform_netntlmv1_key (a, b, key);
755
756     u32x Kc[16];
757     u32x Kd[16];
758
759     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
760
761     u32x iv1[2];
762
763     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
764
765     /**
766      * DES2
767      */
768
769     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
770
771     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
772
773     u32x iv2[2];
774
775     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
776
777     /**
778      * compare
779      */
780
781     const u32x r0 = iv1[0];
782     const u32x r1 = iv1[1];
783     const u32x r2 = iv2[0];
784     const u32x r3 = iv2[1];
785
786     #include VECT_COMPARE_M
787   }
788 }
789
790 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
791 {
792 }
793
794 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
795 {
796 }
797
798 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
799 {
800   /**
801    * modifier
802    */
803
804   const u32 lid = get_local_id (0);
805
806   /**
807    * base
808    */
809
810   const u32 gid = get_global_id (0);
811
812   u32x pw_buf0[4];
813
814   pw_buf0[0] = pws[gid].i[ 0];
815   pw_buf0[1] = pws[gid].i[ 1];
816   pw_buf0[2] = pws[gid].i[ 2];
817   pw_buf0[3] = pws[gid].i[ 3];
818
819   u32x pw_buf1[4];
820
821   pw_buf1[0] = pws[gid].i[ 4];
822   pw_buf1[1] = pws[gid].i[ 5];
823   pw_buf1[2] = pws[gid].i[ 6];
824   pw_buf1[3] = pws[gid].i[ 7];
825
826   const u32 pw_len = pws[gid].pw_len;
827
828   /**
829    * sbox, kbox
830    */
831
832   __local u32 s_SPtrans[8][64];
833   __local u32 s_skb[8][64];
834
835   s_SPtrans[0][lid] = c_SPtrans[0][lid];
836   s_SPtrans[1][lid] = c_SPtrans[1][lid];
837   s_SPtrans[2][lid] = c_SPtrans[2][lid];
838   s_SPtrans[3][lid] = c_SPtrans[3][lid];
839   s_SPtrans[4][lid] = c_SPtrans[4][lid];
840   s_SPtrans[5][lid] = c_SPtrans[5][lid];
841   s_SPtrans[6][lid] = c_SPtrans[6][lid];
842   s_SPtrans[7][lid] = c_SPtrans[7][lid];
843
844   s_skb[0][lid] = c_skb[0][lid];
845   s_skb[1][lid] = c_skb[1][lid];
846   s_skb[2][lid] = c_skb[2][lid];
847   s_skb[3][lid] = c_skb[3][lid];
848   s_skb[4][lid] = c_skb[4][lid];
849   s_skb[5][lid] = c_skb[5][lid];
850   s_skb[6][lid] = c_skb[6][lid];
851   s_skb[7][lid] = c_skb[7][lid];
852
853   barrier (CLK_LOCAL_MEM_FENCE);
854
855   if (gid >= gid_max) return;
856
857   /**
858    * salt
859    */
860
861   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
862   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
863   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
864
865   u32x data[2];
866
867   data[0] = s0;
868   data[1] = s1;
869
870   /**
871    * digest
872    */
873
874   const u32 search[4] =
875   {
876     digests_buf[digests_offset].digest_buf[DGST_R0],
877     digests_buf[digests_offset].digest_buf[DGST_R1],
878     digests_buf[digests_offset].digest_buf[DGST_R2],
879     digests_buf[digests_offset].digest_buf[DGST_R3]
880   };
881
882   /**
883    * loop
884    */
885
886   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
887   {
888     u32x w0[4];
889
890     w0[0] = pw_buf0[0];
891     w0[1] = pw_buf0[1];
892     w0[2] = pw_buf0[2];
893     w0[3] = pw_buf0[3];
894
895     u32x w1[4];
896
897     w1[0] = pw_buf1[0];
898     w1[1] = pw_buf1[1];
899     w1[2] = pw_buf1[2];
900     w1[3] = pw_buf1[3];
901
902     u32x w2[4];
903
904     w2[0] = 0;
905     w2[1] = 0;
906     w2[2] = 0;
907     w2[3] = 0;
908
909     u32x w3[4];
910
911     w3[0] = 0;
912     w3[1] = 0;
913     w3[2] = 0;
914     w3[3] = 0;
915
916     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
917
918     append_0x80_2 (w0, w1, out_len);
919
920     u32x w0_t[4];
921     u32x w1_t[4];
922     u32x w2_t[4];
923     u32x w3_t[4];
924
925     make_unicode (w0, w0_t, w1_t);
926     make_unicode (w1, w2_t, w3_t);
927
928     w3_t[2] = out_len * 8 * 2;
929
930     u32x a = MD4M_A;
931     u32x b = MD4M_B;
932     u32x c = MD4M_C;
933     u32x d = MD4M_D;
934
935     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
936     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
937     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
938     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
939     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
940     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
941     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
942     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
943     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
944     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
945     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
946     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
947     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
948     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
949     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
950     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
951
952     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
953     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
954     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
955     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
956     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
957     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
958     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
959     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
960     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
961     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
962     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
963     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
964     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
965     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
966     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
967     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
968
969     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
970     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
971     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
972     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
973     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
974     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
975     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
976     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
977     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
978     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
979     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
980     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
981     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
982     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
983
984     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
985
986     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
987     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
988
989     a += MD4M_A;
990     b += MD4M_B;
991     c += MD4M_C;
992     d += MD4M_D;
993
994     /**
995      * DES1
996      */
997
998     u32x key[2];
999
1000     transform_netntlmv1_key (a, b, key);
1001
1002     u32x Kc[16];
1003     u32x Kd[16];
1004
1005     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1006
1007     u32x iv1[2];
1008
1009     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
1010
1011     /**
1012      * DES2
1013      */
1014
1015     /*
1016     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
1017
1018     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1019
1020     u32x iv2[2];
1021
1022     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
1023     */
1024
1025     u32x iv2[2];
1026
1027     iv2[0] = search[2];
1028     iv2[1] = search[3];
1029
1030     /**
1031      * compare
1032      */
1033
1034     const u32x r0 = iv1[0];
1035     const u32x r1 = iv1[1];
1036     const u32x r2 = iv2[0];
1037     const u32x r3 = iv2[1];
1038
1039     #include VECT_COMPARE_S
1040   }
1041 }
1042
1043 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
1044 {
1045 }
1046
1047 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_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)
1048 {
1049 }