More kernel fixes for function calls and vector datatypes
[hashcat.git] / OpenCL / 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 #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 BOX(i,n,S) (S)[(n)][(i)]
329
330 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
331 {
332   u32 r = data[0];
333   u32 l = data[1];
334
335   #pragma unroll 16
336   for (u32 i = 0; i < 16; i += 2)
337   {
338     u32 u;
339     u32 t;
340
341     u = Kc[i + 0] ^ rotl32 (r, 30u);
342     t = Kd[i + 0] ^ rotl32 (r, 26u);
343
344     l = l
345       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
346       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
347       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
348       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
349       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
350       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
351       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
352       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
353
354     u = Kc[i + 1] ^ rotl32 (l, 30u);
355     t = Kd[i + 1] ^ rotl32 (l, 26u);
356
357     r = r
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
368   iv[0] = l;
369   iv[1] = r;
370 }
371
372 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
373 {
374   u32 tt;
375
376   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
377   HPERM_OP (c,    tt, 2, 0xcccc0000);
378   HPERM_OP (d,    tt, 2, 0xcccc0000);
379   PERM_OP  (d, c, tt, 1, 0x55555555);
380   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
381   PERM_OP  (d, c, tt, 1, 0x55555555);
382
383   d = ((d & 0x000000ff) << 16)
384     | ((d & 0x0000ff00) <<  0)
385     | ((d & 0x00ff0000) >> 16)
386     | ((c & 0xf0000000) >>  4);
387
388   c = c & 0x0fffffff;
389
390   #pragma unroll 16
391   for (u32 i = 0; i < 16; i++)
392   {
393     c = c >> shifts3s0[i] | c << shifts3s1[i];
394     d = d >> shifts3s0[i] | d << shifts3s1[i];
395
396     c = c & 0x0fffffff;
397     d = d & 0x0fffffff;
398
399     const u32 c00 = (c >>  0) & 0x0000003f;
400     const u32 c06 = (c >>  6) & 0x00383003;
401     const u32 c07 = (c >>  7) & 0x0000003c;
402     const u32 c13 = (c >> 13) & 0x0000060f;
403     const u32 c20 = (c >> 20) & 0x00000001;
404
405     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
406             | BOX (((c06 >>  0) & 0xff)
407                   |((c07 >>  0) & 0xff), 1, s_skb)
408             | BOX (((c13 >>  0) & 0xff)
409                   |((c06 >>  8) & 0xff), 2, s_skb)
410             | BOX (((c20 >>  0) & 0xff)
411                   |((c13 >>  8) & 0xff)
412                   |((c06 >> 16) & 0xff), 3, s_skb);
413
414     const u32 d00 = (d >>  0) & 0x00003c3f;
415     const u32 d07 = (d >>  7) & 0x00003f03;
416     const u32 d21 = (d >> 21) & 0x0000000f;
417     const u32 d22 = (d >> 22) & 0x00000030;
418
419     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
420             | BOX (((d07 >>  0) & 0xff)
421                   |((d00 >>  8) & 0xff), 5, s_skb)
422             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
423             | BOX (((d21 >>  0) & 0xff)
424                   |((d22 >>  0) & 0xff), 7, s_skb);
425
426     Kc[i] = ((t << 16) | (s & 0x0000ffff));
427     Kd[i] = ((s >> 16) | (t & 0xffff0000));
428   }
429 }
430
431 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
432 {
433   const uchar4 t0 = as_uchar4 (w0);
434   const uchar4 t1 = as_uchar4 (w1);
435
436   uchar4 k0;
437   uchar4 k1;
438
439   k0.s0 =                (t0.s0 >> 0);
440   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
441   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
442   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
443   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
444   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
445   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
446   k1.s3 = (t1.s2 << 1);
447
448   out[0] = as_uint (k0);
449   out[1] = as_uint (k1);
450 }
451
452 __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)
453 {
454   /**
455    * modifier
456    */
457
458   const u32 lid = get_local_id (0);
459
460   /**
461    * base
462    */
463
464   const u32 gid = get_global_id (0);
465
466   u32 pw_buf0[4];
467
468   pw_buf0[0] = pws[gid].i[ 0];
469   pw_buf0[1] = pws[gid].i[ 1];
470   pw_buf0[2] = pws[gid].i[ 2];
471   pw_buf0[3] = pws[gid].i[ 3];
472
473   u32 pw_buf1[4];
474
475   pw_buf1[0] = pws[gid].i[ 4];
476   pw_buf1[1] = pws[gid].i[ 5];
477   pw_buf1[2] = pws[gid].i[ 6];
478   pw_buf1[3] = pws[gid].i[ 7];
479
480   const u32 pw_len = pws[gid].pw_len;
481
482   /**
483    * sbox, kbox
484    */
485
486   __local u32 s_SPtrans[8][64];
487   __local u32 s_skb[8][64];
488
489   s_SPtrans[0][lid] = c_SPtrans[0][lid];
490   s_SPtrans[1][lid] = c_SPtrans[1][lid];
491   s_SPtrans[2][lid] = c_SPtrans[2][lid];
492   s_SPtrans[3][lid] = c_SPtrans[3][lid];
493   s_SPtrans[4][lid] = c_SPtrans[4][lid];
494   s_SPtrans[5][lid] = c_SPtrans[5][lid];
495   s_SPtrans[6][lid] = c_SPtrans[6][lid];
496   s_SPtrans[7][lid] = c_SPtrans[7][lid];
497
498   s_skb[0][lid] = c_skb[0][lid];
499   s_skb[1][lid] = c_skb[1][lid];
500   s_skb[2][lid] = c_skb[2][lid];
501   s_skb[3][lid] = c_skb[3][lid];
502   s_skb[4][lid] = c_skb[4][lid];
503   s_skb[5][lid] = c_skb[5][lid];
504   s_skb[6][lid] = c_skb[6][lid];
505   s_skb[7][lid] = c_skb[7][lid];
506
507   barrier (CLK_LOCAL_MEM_FENCE);
508
509   if (gid >= gid_max) return;
510
511   /**
512    * salt
513    */
514
515   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
516   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
517   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
518
519   u32 data[2];
520
521   data[0] = s0;
522   data[1] = s1;
523
524   /**
525    * loop
526    */
527
528   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
529   {
530     u32 w0[4];
531
532     w0[0] = pw_buf0[0];
533     w0[1] = pw_buf0[1];
534     w0[2] = pw_buf0[2];
535     w0[3] = pw_buf0[3];
536
537     u32 w1[4];
538
539     w1[0] = pw_buf1[0];
540     w1[1] = pw_buf1[1];
541     w1[2] = pw_buf1[2];
542     w1[3] = pw_buf1[3];
543
544     u32 w2[4];
545
546     w2[0] = 0;
547     w2[1] = 0;
548     w2[2] = 0;
549     w2[3] = 0;
550
551     u32 w3[4];
552
553     w3[0] = 0;
554     w3[1] = 0;
555     w3[2] = 0;
556     w3[3] = 0;
557
558     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
559
560     append_0x80_2x4 (w0, w1, out_len);
561
562     u32 w0_t[4];
563     u32 w1_t[4];
564     u32 w2_t[4];
565     u32 w3_t[4];
566
567     make_unicode (w0, w0_t, w1_t);
568     make_unicode (w1, w2_t, w3_t);
569
570     w3_t[2] = out_len * 8 * 2;
571
572     u32 a = MD4M_A;
573     u32 b = MD4M_B;
574     u32 c = MD4M_C;
575     u32 d = MD4M_D;
576
577     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
578     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
579     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
580     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
581     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
582     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
583     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
584     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
585     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
586     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
587     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
588     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
589     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
590     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
591     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
592     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
593
594     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
595     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
596     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
597     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
598     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
599     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
600     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
601     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
602     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
603     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
604     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
605     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
606     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
607     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
608     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
609     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
610
611     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
612     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
613     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
614     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
615     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
616     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
617     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
618     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
619     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
620     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
621     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
622     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
623     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
624     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
625
626     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
627
628     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
629     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
630
631     a += MD4M_A;
632     b += MD4M_B;
633     c += MD4M_C;
634     d += MD4M_D;
635
636     /**
637      * DES1
638      */
639
640     u32 key[2];
641
642     transform_netntlmv1_key (a, b, key);
643
644     u32 Kc[16];
645     u32 Kd[16];
646
647     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
648
649     u32 iv1[2];
650
651     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
652
653     /**
654      * DES2
655      */
656
657     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
658
659     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
660
661     u32 iv2[2];
662
663     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
664
665     /**
666      * compare
667      */
668
669     const u32 r0 = iv1[0];
670     const u32 r1 = iv1[1];
671     const u32 r2 = iv2[0];
672     const u32 r3 = iv2[1];
673
674     #include COMPARE_M
675   }
676 }
677
678 __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)
679 {
680 }
681
682 __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)
683 {
684 }
685
686 __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)
687 {
688   /**
689    * modifier
690    */
691
692   const u32 lid = get_local_id (0);
693
694   /**
695    * base
696    */
697
698   const u32 gid = get_global_id (0);
699
700   u32 pw_buf0[4];
701
702   pw_buf0[0] = pws[gid].i[ 0];
703   pw_buf0[1] = pws[gid].i[ 1];
704   pw_buf0[2] = pws[gid].i[ 2];
705   pw_buf0[3] = pws[gid].i[ 3];
706
707   u32 pw_buf1[4];
708
709   pw_buf1[0] = pws[gid].i[ 4];
710   pw_buf1[1] = pws[gid].i[ 5];
711   pw_buf1[2] = pws[gid].i[ 6];
712   pw_buf1[3] = pws[gid].i[ 7];
713
714   const u32 pw_len = pws[gid].pw_len;
715
716   /**
717    * sbox, kbox
718    */
719
720   __local u32 s_SPtrans[8][64];
721   __local u32 s_skb[8][64];
722
723   s_SPtrans[0][lid] = c_SPtrans[0][lid];
724   s_SPtrans[1][lid] = c_SPtrans[1][lid];
725   s_SPtrans[2][lid] = c_SPtrans[2][lid];
726   s_SPtrans[3][lid] = c_SPtrans[3][lid];
727   s_SPtrans[4][lid] = c_SPtrans[4][lid];
728   s_SPtrans[5][lid] = c_SPtrans[5][lid];
729   s_SPtrans[6][lid] = c_SPtrans[6][lid];
730   s_SPtrans[7][lid] = c_SPtrans[7][lid];
731
732   s_skb[0][lid] = c_skb[0][lid];
733   s_skb[1][lid] = c_skb[1][lid];
734   s_skb[2][lid] = c_skb[2][lid];
735   s_skb[3][lid] = c_skb[3][lid];
736   s_skb[4][lid] = c_skb[4][lid];
737   s_skb[5][lid] = c_skb[5][lid];
738   s_skb[6][lid] = c_skb[6][lid];
739   s_skb[7][lid] = c_skb[7][lid];
740
741   barrier (CLK_LOCAL_MEM_FENCE);
742
743   if (gid >= gid_max) return;
744
745   /**
746    * salt
747    */
748
749   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
750   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
751   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
752
753   u32 data[2];
754
755   data[0] = s0;
756   data[1] = s1;
757
758   /**
759    * digest
760    */
761
762   const u32 search[4] =
763   {
764     digests_buf[digests_offset].digest_buf[DGST_R0],
765     digests_buf[digests_offset].digest_buf[DGST_R1],
766     digests_buf[digests_offset].digest_buf[DGST_R2],
767     digests_buf[digests_offset].digest_buf[DGST_R3]
768   };
769
770   /**
771    * loop
772    */
773
774   for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++)
775   {
776     u32 w0[4];
777
778     w0[0] = pw_buf0[0];
779     w0[1] = pw_buf0[1];
780     w0[2] = pw_buf0[2];
781     w0[3] = pw_buf0[3];
782
783     u32 w1[4];
784
785     w1[0] = pw_buf1[0];
786     w1[1] = pw_buf1[1];
787     w1[2] = pw_buf1[2];
788     w1[3] = pw_buf1[3];
789
790     u32 w2[4];
791
792     w2[0] = 0;
793     w2[1] = 0;
794     w2[2] = 0;
795     w2[3] = 0;
796
797     u32 w3[4];
798
799     w3[0] = 0;
800     w3[1] = 0;
801     w3[2] = 0;
802     w3[3] = 0;
803
804     const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len);
805
806     append_0x80_2x4 (w0, w1, out_len);
807
808     u32 w0_t[4];
809     u32 w1_t[4];
810     u32 w2_t[4];
811     u32 w3_t[4];
812
813     make_unicode (w0, w0_t, w1_t);
814     make_unicode (w1, w2_t, w3_t);
815
816     w3_t[2] = out_len * 8 * 2;
817
818     u32 a = MD4M_A;
819     u32 b = MD4M_B;
820     u32 c = MD4M_C;
821     u32 d = MD4M_D;
822
823     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
824     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
825     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
826     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
827     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
828     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
829     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
830     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
831     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
832     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
833     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
834     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
835     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
836     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
837     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
838     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
839
840     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
841     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
842     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
843     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
844     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
845     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
846     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
847     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
848     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
849     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
850     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
851     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
852     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
853     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
854     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
855     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
856
857     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
858     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
859     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
860     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
861     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
862     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
863     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
864     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
865     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
866     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
867     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
868     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
869     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
870     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
871
872     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
873
874     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
875     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
876
877     a += MD4M_A;
878     b += MD4M_B;
879     c += MD4M_C;
880     d += MD4M_D;
881
882     /**
883      * DES1
884      */
885
886     u32 key[2];
887
888     transform_netntlmv1_key (a, b, key);
889
890     u32 Kc[16];
891     u32 Kd[16];
892
893     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
894
895     u32 iv1[2];
896
897     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
898
899     /**
900      * DES2
901      */
902
903     /*
904     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
905
906     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
907
908     u32 iv2[2];
909
910     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
911     */
912
913     u32 iv2[2];
914
915     iv2[0] = search[2];
916     iv2[1] = search[3];
917
918     /**
919      * compare
920      */
921
922     const u32 r0 = iv1[0];
923     const u32 r1 = iv1[1];
924     const u32 r2 = iv2[0];
925     const u32 r3 = iv2[1];
926
927     #include COMPARE_S
928   }
929 }
930
931 __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)
932 {
933 }
934
935 __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)
936 {
937 }