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