- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[hashcat.git] / OpenCL / m05500_a1.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
20 #define COMPARE_S "check_single_comp4.c"
21 #define COMPARE_M "check_multi_comp4.c"
22
23 #define PERM_OP(a,b,tt,n,m) \
24 {                           \
25   tt = a >> n;              \
26   tt = tt ^ b;              \
27   tt = tt & m;              \
28   b = b ^ tt;               \
29   tt = tt << n;             \
30   a = a ^ tt;               \
31 }
32
33 #define HPERM_OP(a,tt,n,m)  \
34 {                           \
35   tt = a << (16 + n);       \
36   tt = tt ^ a;              \
37   tt = tt & m;              \
38   a  = a ^ tt;              \
39   tt = tt >> (16 + n);      \
40   a  = a ^ tt;              \
41 }
42
43 __constant u32 c_SPtrans[8][64] =
44 {
45   /* nibble 0 */
46   0x02080800, 0x00080000, 0x02000002, 0x02080802,
47   0x02000000, 0x00080802, 0x00080002, 0x02000002,
48   0x00080802, 0x02080800, 0x02080000, 0x00000802,
49   0x02000802, 0x02000000, 0x00000000, 0x00080002,
50   0x00080000, 0x00000002, 0x02000800, 0x00080800,
51   0x02080802, 0x02080000, 0x00000802, 0x02000800,
52   0x00000002, 0x00000800, 0x00080800, 0x02080002,
53   0x00000800, 0x02000802, 0x02080002, 0x00000000,
54   0x00000000, 0x02080802, 0x02000800, 0x00080002,
55   0x02080800, 0x00080000, 0x00000802, 0x02000800,
56   0x02080002, 0x00000800, 0x00080800, 0x02000002,
57   0x00080802, 0x00000002, 0x02000002, 0x02080000,
58   0x02080802, 0x00080800, 0x02080000, 0x02000802,
59   0x02000000, 0x00000802, 0x00080002, 0x00000000,
60   0x00080000, 0x02000000, 0x02000802, 0x02080800,
61   0x00000002, 0x02080002, 0x00000800, 0x00080802,
62   /* nibble 1 */
63   0x40108010, 0x00000000, 0x00108000, 0x40100000,
64   0x40000010, 0x00008010, 0x40008000, 0x00108000,
65   0x00008000, 0x40100010, 0x00000010, 0x40008000,
66   0x00100010, 0x40108000, 0x40100000, 0x00000010,
67   0x00100000, 0x40008010, 0x40100010, 0x00008000,
68   0x00108010, 0x40000000, 0x00000000, 0x00100010,
69   0x40008010, 0x00108010, 0x40108000, 0x40000010,
70   0x40000000, 0x00100000, 0x00008010, 0x40108010,
71   0x00100010, 0x40108000, 0x40008000, 0x00108010,
72   0x40108010, 0x00100010, 0x40000010, 0x00000000,
73   0x40000000, 0x00008010, 0x00100000, 0x40100010,
74   0x00008000, 0x40000000, 0x00108010, 0x40008010,
75   0x40108000, 0x00008000, 0x00000000, 0x40000010,
76   0x00000010, 0x40108010, 0x00108000, 0x40100000,
77   0x40100010, 0x00100000, 0x00008010, 0x40008000,
78   0x40008010, 0x00000010, 0x40100000, 0x00108000,
79   /* nibble 2 */
80   0x04000001, 0x04040100, 0x00000100, 0x04000101,
81   0x00040001, 0x04000000, 0x04000101, 0x00040100,
82   0x04000100, 0x00040000, 0x04040000, 0x00000001,
83   0x04040101, 0x00000101, 0x00000001, 0x04040001,
84   0x00000000, 0x00040001, 0x04040100, 0x00000100,
85   0x00000101, 0x04040101, 0x00040000, 0x04000001,
86   0x04040001, 0x04000100, 0x00040101, 0x04040000,
87   0x00040100, 0x00000000, 0x04000000, 0x00040101,
88   0x04040100, 0x00000100, 0x00000001, 0x00040000,
89   0x00000101, 0x00040001, 0x04040000, 0x04000101,
90   0x00000000, 0x04040100, 0x00040100, 0x04040001,
91   0x00040001, 0x04000000, 0x04040101, 0x00000001,
92   0x00040101, 0x04000001, 0x04000000, 0x04040101,
93   0x00040000, 0x04000100, 0x04000101, 0x00040100,
94   0x04000100, 0x00000000, 0x04040001, 0x00000101,
95   0x04000001, 0x00040101, 0x00000100, 0x04040000,
96   /* nibble 3 */
97   0x00401008, 0x10001000, 0x00000008, 0x10401008,
98   0x00000000, 0x10400000, 0x10001008, 0x00400008,
99   0x10401000, 0x10000008, 0x10000000, 0x00001008,
100   0x10000008, 0x00401008, 0x00400000, 0x10000000,
101   0x10400008, 0x00401000, 0x00001000, 0x00000008,
102   0x00401000, 0x10001008, 0x10400000, 0x00001000,
103   0x00001008, 0x00000000, 0x00400008, 0x10401000,
104   0x10001000, 0x10400008, 0x10401008, 0x00400000,
105   0x10400008, 0x00001008, 0x00400000, 0x10000008,
106   0x00401000, 0x10001000, 0x00000008, 0x10400000,
107   0x10001008, 0x00000000, 0x00001000, 0x00400008,
108   0x00000000, 0x10400008, 0x10401000, 0x00001000,
109   0x10000000, 0x10401008, 0x00401008, 0x00400000,
110   0x10401008, 0x00000008, 0x10001000, 0x00401008,
111   0x00400008, 0x00401000, 0x10400000, 0x10001008,
112   0x00001008, 0x10000000, 0x10000008, 0x10401000,
113   /* nibble 4 */
114   0x08000000, 0x00010000, 0x00000400, 0x08010420,
115   0x08010020, 0x08000400, 0x00010420, 0x08010000,
116   0x00010000, 0x00000020, 0x08000020, 0x00010400,
117   0x08000420, 0x08010020, 0x08010400, 0x00000000,
118   0x00010400, 0x08000000, 0x00010020, 0x00000420,
119   0x08000400, 0x00010420, 0x00000000, 0x08000020,
120   0x00000020, 0x08000420, 0x08010420, 0x00010020,
121   0x08010000, 0x00000400, 0x00000420, 0x08010400,
122   0x08010400, 0x08000420, 0x00010020, 0x08010000,
123   0x00010000, 0x00000020, 0x08000020, 0x08000400,
124   0x08000000, 0x00010400, 0x08010420, 0x00000000,
125   0x00010420, 0x08000000, 0x00000400, 0x00010020,
126   0x08000420, 0x00000400, 0x00000000, 0x08010420,
127   0x08010020, 0x08010400, 0x00000420, 0x00010000,
128   0x00010400, 0x08010020, 0x08000400, 0x00000420,
129   0x00000020, 0x00010420, 0x08010000, 0x08000020,
130   /* nibble 5 */
131   0x80000040, 0x00200040, 0x00000000, 0x80202000,
132   0x00200040, 0x00002000, 0x80002040, 0x00200000,
133   0x00002040, 0x80202040, 0x00202000, 0x80000000,
134   0x80002000, 0x80000040, 0x80200000, 0x00202040,
135   0x00200000, 0x80002040, 0x80200040, 0x00000000,
136   0x00002000, 0x00000040, 0x80202000, 0x80200040,
137   0x80202040, 0x80200000, 0x80000000, 0x00002040,
138   0x00000040, 0x00202000, 0x00202040, 0x80002000,
139   0x00002040, 0x80000000, 0x80002000, 0x00202040,
140   0x80202000, 0x00200040, 0x00000000, 0x80002000,
141   0x80000000, 0x00002000, 0x80200040, 0x00200000,
142   0x00200040, 0x80202040, 0x00202000, 0x00000040,
143   0x80202040, 0x00202000, 0x00200000, 0x80002040,
144   0x80000040, 0x80200000, 0x00202040, 0x00000000,
145   0x00002000, 0x80000040, 0x80002040, 0x80202000,
146   0x80200000, 0x00002040, 0x00000040, 0x80200040,
147   /* nibble 6 */
148   0x00004000, 0x00000200, 0x01000200, 0x01000004,
149   0x01004204, 0x00004004, 0x00004200, 0x00000000,
150   0x01000000, 0x01000204, 0x00000204, 0x01004000,
151   0x00000004, 0x01004200, 0x01004000, 0x00000204,
152   0x01000204, 0x00004000, 0x00004004, 0x01004204,
153   0x00000000, 0x01000200, 0x01000004, 0x00004200,
154   0x01004004, 0x00004204, 0x01004200, 0x00000004,
155   0x00004204, 0x01004004, 0x00000200, 0x01000000,
156   0x00004204, 0x01004000, 0x01004004, 0x00000204,
157   0x00004000, 0x00000200, 0x01000000, 0x01004004,
158   0x01000204, 0x00004204, 0x00004200, 0x00000000,
159   0x00000200, 0x01000004, 0x00000004, 0x01000200,
160   0x00000000, 0x01000204, 0x01000200, 0x00004200,
161   0x00000204, 0x00004000, 0x01004204, 0x01000000,
162   0x01004200, 0x00000004, 0x00004004, 0x01004204,
163   0x01000004, 0x01004200, 0x01004000, 0x00004004,
164   /* nibble 7 */
165   0x20800080, 0x20820000, 0x00020080, 0x00000000,
166   0x20020000, 0x00800080, 0x20800000, 0x20820080,
167   0x00000080, 0x20000000, 0x00820000, 0x00020080,
168   0x00820080, 0x20020080, 0x20000080, 0x20800000,
169   0x00020000, 0x00820080, 0x00800080, 0x20020000,
170   0x20820080, 0x20000080, 0x00000000, 0x00820000,
171   0x20000000, 0x00800000, 0x20020080, 0x20800080,
172   0x00800000, 0x00020000, 0x20820000, 0x00000080,
173   0x00800000, 0x00020000, 0x20000080, 0x20820080,
174   0x00020080, 0x20000000, 0x00000000, 0x00820000,
175   0x20800080, 0x20020080, 0x20020000, 0x00800080,
176   0x20820000, 0x00000080, 0x00800080, 0x20020000,
177   0x20820080, 0x00800000, 0x20800000, 0x20000080,
178   0x00820000, 0x00020080, 0x20020080, 0x20800000,
179   0x00000080, 0x20820000, 0x00820080, 0x00000000,
180   0x20000000, 0x20800080, 0x00020000, 0x00820080,
181 };
182
183 __constant u32 c_skb[8][64] =
184 {
185   /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
186   0x00000000, 0x00000010, 0x20000000, 0x20000010,
187   0x00010000, 0x00010010, 0x20010000, 0x20010010,
188   0x00000800, 0x00000810, 0x20000800, 0x20000810,
189   0x00010800, 0x00010810, 0x20010800, 0x20010810,
190   0x00000020, 0x00000030, 0x20000020, 0x20000030,
191   0x00010020, 0x00010030, 0x20010020, 0x20010030,
192   0x00000820, 0x00000830, 0x20000820, 0x20000830,
193   0x00010820, 0x00010830, 0x20010820, 0x20010830,
194   0x00080000, 0x00080010, 0x20080000, 0x20080010,
195   0x00090000, 0x00090010, 0x20090000, 0x20090010,
196   0x00080800, 0x00080810, 0x20080800, 0x20080810,
197   0x00090800, 0x00090810, 0x20090800, 0x20090810,
198   0x00080020, 0x00080030, 0x20080020, 0x20080030,
199   0x00090020, 0x00090030, 0x20090020, 0x20090030,
200   0x00080820, 0x00080830, 0x20080820, 0x20080830,
201   0x00090820, 0x00090830, 0x20090820, 0x20090830,
202   /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
203   0x00000000, 0x02000000, 0x00002000, 0x02002000,
204   0x00200000, 0x02200000, 0x00202000, 0x02202000,
205   0x00000004, 0x02000004, 0x00002004, 0x02002004,
206   0x00200004, 0x02200004, 0x00202004, 0x02202004,
207   0x00000400, 0x02000400, 0x00002400, 0x02002400,
208   0x00200400, 0x02200400, 0x00202400, 0x02202400,
209   0x00000404, 0x02000404, 0x00002404, 0x02002404,
210   0x00200404, 0x02200404, 0x00202404, 0x02202404,
211   0x10000000, 0x12000000, 0x10002000, 0x12002000,
212   0x10200000, 0x12200000, 0x10202000, 0x12202000,
213   0x10000004, 0x12000004, 0x10002004, 0x12002004,
214   0x10200004, 0x12200004, 0x10202004, 0x12202004,
215   0x10000400, 0x12000400, 0x10002400, 0x12002400,
216   0x10200400, 0x12200400, 0x10202400, 0x12202400,
217   0x10000404, 0x12000404, 0x10002404, 0x12002404,
218   0x10200404, 0x12200404, 0x10202404, 0x12202404,
219   /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
220   0x00000000, 0x00000001, 0x00040000, 0x00040001,
221   0x01000000, 0x01000001, 0x01040000, 0x01040001,
222   0x00000002, 0x00000003, 0x00040002, 0x00040003,
223   0x01000002, 0x01000003, 0x01040002, 0x01040003,
224   0x00000200, 0x00000201, 0x00040200, 0x00040201,
225   0x01000200, 0x01000201, 0x01040200, 0x01040201,
226   0x00000202, 0x00000203, 0x00040202, 0x00040203,
227   0x01000202, 0x01000203, 0x01040202, 0x01040203,
228   0x08000000, 0x08000001, 0x08040000, 0x08040001,
229   0x09000000, 0x09000001, 0x09040000, 0x09040001,
230   0x08000002, 0x08000003, 0x08040002, 0x08040003,
231   0x09000002, 0x09000003, 0x09040002, 0x09040003,
232   0x08000200, 0x08000201, 0x08040200, 0x08040201,
233   0x09000200, 0x09000201, 0x09040200, 0x09040201,
234   0x08000202, 0x08000203, 0x08040202, 0x08040203,
235   0x09000202, 0x09000203, 0x09040202, 0x09040203,
236   /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
237   0x00000000, 0x00100000, 0x00000100, 0x00100100,
238   0x00000008, 0x00100008, 0x00000108, 0x00100108,
239   0x00001000, 0x00101000, 0x00001100, 0x00101100,
240   0x00001008, 0x00101008, 0x00001108, 0x00101108,
241   0x04000000, 0x04100000, 0x04000100, 0x04100100,
242   0x04000008, 0x04100008, 0x04000108, 0x04100108,
243   0x04001000, 0x04101000, 0x04001100, 0x04101100,
244   0x04001008, 0x04101008, 0x04001108, 0x04101108,
245   0x00020000, 0x00120000, 0x00020100, 0x00120100,
246   0x00020008, 0x00120008, 0x00020108, 0x00120108,
247   0x00021000, 0x00121000, 0x00021100, 0x00121100,
248   0x00021008, 0x00121008, 0x00021108, 0x00121108,
249   0x04020000, 0x04120000, 0x04020100, 0x04120100,
250   0x04020008, 0x04120008, 0x04020108, 0x04120108,
251   0x04021000, 0x04121000, 0x04021100, 0x04121100,
252   0x04021008, 0x04121008, 0x04021108, 0x04121108,
253   /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
254   0x00000000, 0x10000000, 0x00010000, 0x10010000,
255   0x00000004, 0x10000004, 0x00010004, 0x10010004,
256   0x20000000, 0x30000000, 0x20010000, 0x30010000,
257   0x20000004, 0x30000004, 0x20010004, 0x30010004,
258   0x00100000, 0x10100000, 0x00110000, 0x10110000,
259   0x00100004, 0x10100004, 0x00110004, 0x10110004,
260   0x20100000, 0x30100000, 0x20110000, 0x30110000,
261   0x20100004, 0x30100004, 0x20110004, 0x30110004,
262   0x00001000, 0x10001000, 0x00011000, 0x10011000,
263   0x00001004, 0x10001004, 0x00011004, 0x10011004,
264   0x20001000, 0x30001000, 0x20011000, 0x30011000,
265   0x20001004, 0x30001004, 0x20011004, 0x30011004,
266   0x00101000, 0x10101000, 0x00111000, 0x10111000,
267   0x00101004, 0x10101004, 0x00111004, 0x10111004,
268   0x20101000, 0x30101000, 0x20111000, 0x30111000,
269   0x20101004, 0x30101004, 0x20111004, 0x30111004,
270   /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
271   0x00000000, 0x08000000, 0x00000008, 0x08000008,
272   0x00000400, 0x08000400, 0x00000408, 0x08000408,
273   0x00020000, 0x08020000, 0x00020008, 0x08020008,
274   0x00020400, 0x08020400, 0x00020408, 0x08020408,
275   0x00000001, 0x08000001, 0x00000009, 0x08000009,
276   0x00000401, 0x08000401, 0x00000409, 0x08000409,
277   0x00020001, 0x08020001, 0x00020009, 0x08020009,
278   0x00020401, 0x08020401, 0x00020409, 0x08020409,
279   0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
280   0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
281   0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
282   0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
283   0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
284   0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
285   0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
286   0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
287   /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
288   0x00000000, 0x00000100, 0x00080000, 0x00080100,
289   0x01000000, 0x01000100, 0x01080000, 0x01080100,
290   0x00000010, 0x00000110, 0x00080010, 0x00080110,
291   0x01000010, 0x01000110, 0x01080010, 0x01080110,
292   0x00200000, 0x00200100, 0x00280000, 0x00280100,
293   0x01200000, 0x01200100, 0x01280000, 0x01280100,
294   0x00200010, 0x00200110, 0x00280010, 0x00280110,
295   0x01200010, 0x01200110, 0x01280010, 0x01280110,
296   0x00000200, 0x00000300, 0x00080200, 0x00080300,
297   0x01000200, 0x01000300, 0x01080200, 0x01080300,
298   0x00000210, 0x00000310, 0x00080210, 0x00080310,
299   0x01000210, 0x01000310, 0x01080210, 0x01080310,
300   0x00200200, 0x00200300, 0x00280200, 0x00280300,
301   0x01200200, 0x01200300, 0x01280200, 0x01280300,
302   0x00200210, 0x00200310, 0x00280210, 0x00280310,
303   0x01200210, 0x01200310, 0x01280210, 0x01280310,
304   /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
305   0x00000000, 0x04000000, 0x00040000, 0x04040000,
306   0x00000002, 0x04000002, 0x00040002, 0x04040002,
307   0x00002000, 0x04002000, 0x00042000, 0x04042000,
308   0x00002002, 0x04002002, 0x00042002, 0x04042002,
309   0x00000020, 0x04000020, 0x00040020, 0x04040020,
310   0x00000022, 0x04000022, 0x00040022, 0x04040022,
311   0x00002020, 0x04002020, 0x00042020, 0x04042020,
312   0x00002022, 0x04002022, 0x00042022, 0x04042022,
313   0x00000800, 0x04000800, 0x00040800, 0x04040800,
314   0x00000802, 0x04000802, 0x00040802, 0x04040802,
315   0x00002800, 0x04002800, 0x00042800, 0x04042800,
316   0x00002802, 0x04002802, 0x00042802, 0x04042802,
317   0x00000820, 0x04000820, 0x00040820, 0x04040820,
318   0x00000822, 0x04000822, 0x00040822, 0x04040822,
319   0x00002820, 0x04002820, 0x00042820, 0x04042820,
320   0x00002822, 0x04002822, 0x00042822, 0x04042822
321 };
322
323 __constant u32 shifts3s0[16] = {  1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1 };
324 __constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
325
326 #ifdef VECT_SIZE1
327 #define BOX(i,n,S) (u32x) ((S)[(n)][(i)])
328 #endif
329
330 #ifdef VECT_SIZE2
331 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1])
332 #endif
333
334 #ifdef VECT_SIZE4
335 #define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3])
336 #endif
337
338 static void _des_crypt_encrypt (u32 iv[2], u32 data[2], u32 Kc[16], u32 Kd[16], __local u32 s_SPtrans[8][64])
339 {
340   u32 r = data[0];
341   u32 l = data[1];
342
343   #pragma unroll 16
344   for (u32 i = 0; i < 16; i += 2)
345   {
346     u32 u;
347     u32 t;
348
349     u = Kc[i + 0] ^ rotl32 (r, 30u);
350     t = Kd[i + 0] ^ rotl32 (r, 26u);
351
352     l = l
353       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
354       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
355       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
356       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
357       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
358       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
359       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
360       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
361
362     u = Kc[i + 1] ^ rotl32 (l, 30u);
363     t = Kd[i + 1] ^ rotl32 (l, 26u);
364
365     r = r
366       ^ BOX (amd_bfe (u,  0, 6), 0, s_SPtrans)
367       ^ BOX (amd_bfe (u,  8, 6), 2, s_SPtrans)
368       ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans)
369       ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans)
370       ^ BOX (amd_bfe (t,  0, 6), 1, s_SPtrans)
371       ^ BOX (amd_bfe (t,  8, 6), 3, s_SPtrans)
372       ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans)
373       ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans);
374   }
375
376   iv[0] = l;
377   iv[1] = r;
378 }
379
380 static void _des_crypt_keysetup (u32 c, u32 d, u32 Kc[16], u32 Kd[16], __local u32 s_skb[8][64])
381 {
382   u32 tt;
383
384   PERM_OP  (d, c, tt, 4, 0x0f0f0f0f);
385   HPERM_OP (c,    tt, 2, 0xcccc0000);
386   HPERM_OP (d,    tt, 2, 0xcccc0000);
387   PERM_OP  (d, c, tt, 1, 0x55555555);
388   PERM_OP  (c, d, tt, 8, 0x00ff00ff);
389   PERM_OP  (d, c, tt, 1, 0x55555555);
390
391   d = ((d & 0x000000ff) << 16)
392     | ((d & 0x0000ff00) <<  0)
393     | ((d & 0x00ff0000) >> 16)
394     | ((c & 0xf0000000) >>  4);
395
396   c = c & 0x0fffffff;
397
398   #pragma unroll 16
399   for (u32 i = 0; i < 16; i++)
400   {
401     c = c >> shifts3s0[i] | c << shifts3s1[i];
402     d = d >> shifts3s0[i] | d << shifts3s1[i];
403
404     c = c & 0x0fffffff;
405     d = d & 0x0fffffff;
406
407     const u32 c00 = (c >>  0) & 0x0000003f;
408     const u32 c06 = (c >>  6) & 0x00383003;
409     const u32 c07 = (c >>  7) & 0x0000003c;
410     const u32 c13 = (c >> 13) & 0x0000060f;
411     const u32 c20 = (c >> 20) & 0x00000001;
412
413     u32 s = BOX (((c00 >>  0) & 0xff), 0, s_skb)
414             | BOX (((c06 >>  0) & 0xff)
415                   |((c07 >>  0) & 0xff), 1, s_skb)
416             | BOX (((c13 >>  0) & 0xff)
417                   |((c06 >>  8) & 0xff), 2, s_skb)
418             | BOX (((c20 >>  0) & 0xff)
419                   |((c13 >>  8) & 0xff)
420                   |((c06 >> 16) & 0xff), 3, s_skb);
421
422     const u32 d00 = (d >>  0) & 0x00003c3f;
423     const u32 d07 = (d >>  7) & 0x00003f03;
424     const u32 d21 = (d >> 21) & 0x0000000f;
425     const u32 d22 = (d >> 22) & 0x00000030;
426
427     u32 t = BOX (((d00 >>  0) & 0xff), 4, s_skb)
428             | BOX (((d07 >>  0) & 0xff)
429                   |((d00 >>  8) & 0xff), 5, s_skb)
430             | BOX (((d07 >>  8) & 0xff), 6, s_skb)
431             | BOX (((d21 >>  0) & 0xff)
432                   |((d22 >>  0) & 0xff), 7, s_skb);
433
434     Kc[i] = ((t << 16) | (s & 0x0000ffff));
435     Kd[i] = ((s >> 16) | (t & 0xffff0000));
436   }
437 }
438
439 static void transform_netntlmv1_key (const u32 w0, const u32 w1, u32 out[2])
440 {
441   #ifdef VECT_SIZE1
442   const uchar4 t0 = as_uchar4 (w0);
443   const uchar4 t1 = as_uchar4 (w1);
444
445   uchar4 k0;
446   uchar4 k1;
447
448   k0.s0 =                (t0.s0 >> 0);
449   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
450   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
451   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
452   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
453   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
454   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
455   k1.s3 = (t1.s2 << 1);
456
457   out[0] = as_uint (k0);
458   out[1] = as_uint (k1);
459   #endif
460
461   #ifdef VECT_SIZE2
462   const uchar8 t0 = as_uchar8 (w0);
463   const uchar8 t1 = as_uchar8 (w1);
464
465   uchar8 k0;
466   uchar8 k1;
467
468   k0.s0 =                (t0.s0 >> 0);
469   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
470   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
471   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
472   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
473   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
474   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
475   k1.s3 = (t1.s2 << 1);
476
477   k0.s4 =                (t0.s4 >> 0);
478   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
479   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
480   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
481   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
482   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
483   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
484   k1.s7 = (t1.s6 << 1);
485
486   out[0] = as_uint2 (k0);
487   out[1] = as_uint2 (k1);
488   #endif
489
490   #ifdef VECT_SIZE4
491   const uchar16 t0 = as_uchar16 (w0);
492   const uchar16 t1 = as_uchar16 (w1);
493
494   uchar16 k0;
495   uchar16 k1;
496
497   k0.s0 =                (t0.s0 >> 0);
498   k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1);
499   k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2);
500   k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3);
501   k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4);
502   k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5);
503   k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6);
504   k1.s3 = (t1.s2 << 1);
505
506   k0.s4 =                (t0.s4 >> 0);
507   k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1);
508   k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2);
509   k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3);
510   k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4);
511   k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5);
512   k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6);
513   k1.s7 = (t1.s6 << 1);
514
515   k0.s8 =                (t0.s8 >> 0);
516   k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1);
517   k0.sa = (t0.s9 << 6) | (t0.sa >> 2);
518   k0.sb = (t0.sa << 5) | (t0.sb >> 3);
519   k1.s8 = (t0.sb << 4) | (t1.s8 >> 4);
520   k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5);
521   k1.sa = (t1.s9 << 2) | (t1.sa >> 6);
522   k1.sb = (t1.sa << 1);
523
524   k0.sc =                (t0.sc >> 0);
525   k0.sd = (t0.sc << 7) | (t0.sd >> 1);
526   k0.se = (t0.sd << 6) | (t0.se >> 2);
527   k0.sf = (t0.se << 5) | (t0.sf >> 3);
528   k1.sc = (t0.sf << 4) | (t1.sc >> 4);
529   k1.sd = (t1.sc << 3) | (t1.sd >> 5);
530   k1.se = (t1.sd << 2) | (t1.se >> 6);
531   k1.sf = (t1.se << 1);
532
533   out[0] = as_uint4 (k0);
534   out[1] = as_uint4 (k1);
535   #endif
536 }
537
538 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
539 {
540   /**
541    * modifier
542    */
543
544   const u32 lid = get_local_id (0);
545
546   /**
547    * base
548    */
549
550   const u32 gid = get_global_id (0);
551
552   u32 wordl0[4];
553
554   wordl0[0] = pws[gid].i[ 0];
555   wordl0[1] = pws[gid].i[ 1];
556   wordl0[2] = pws[gid].i[ 2];
557   wordl0[3] = pws[gid].i[ 3];
558
559   u32 wordl1[4];
560
561   wordl1[0] = pws[gid].i[ 4];
562   wordl1[1] = pws[gid].i[ 5];
563   wordl1[2] = pws[gid].i[ 6];
564   wordl1[3] = pws[gid].i[ 7];
565
566   u32 wordl2[4];
567
568   wordl2[0] = 0;
569   wordl2[1] = 0;
570   wordl2[2] = 0;
571   wordl2[3] = 0;
572
573   u32 wordl3[4];
574
575   wordl3[0] = 0;
576   wordl3[1] = 0;
577   wordl3[2] = 0;
578   wordl3[3] = 0;
579
580   const u32 pw_l_len = pws[gid].pw_len;
581
582   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
583   {
584     append_0x80_2 (wordl0, wordl1, pw_l_len);
585
586     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
587   }
588
589   /**
590    * sbox, kbox
591    */
592
593   __local u32 s_SPtrans[8][64];
594   __local u32 s_skb[8][64];
595
596   s_SPtrans[0][lid] = c_SPtrans[0][lid];
597   s_SPtrans[1][lid] = c_SPtrans[1][lid];
598   s_SPtrans[2][lid] = c_SPtrans[2][lid];
599   s_SPtrans[3][lid] = c_SPtrans[3][lid];
600   s_SPtrans[4][lid] = c_SPtrans[4][lid];
601   s_SPtrans[5][lid] = c_SPtrans[5][lid];
602   s_SPtrans[6][lid] = c_SPtrans[6][lid];
603   s_SPtrans[7][lid] = c_SPtrans[7][lid];
604
605   s_skb[0][lid] = c_skb[0][lid];
606   s_skb[1][lid] = c_skb[1][lid];
607   s_skb[2][lid] = c_skb[2][lid];
608   s_skb[3][lid] = c_skb[3][lid];
609   s_skb[4][lid] = c_skb[4][lid];
610   s_skb[5][lid] = c_skb[5][lid];
611   s_skb[6][lid] = c_skb[6][lid];
612   s_skb[7][lid] = c_skb[7][lid];
613
614   barrier (CLK_LOCAL_MEM_FENCE);
615
616   if (gid >= gid_max) return;
617
618   /**
619    * salt
620    */
621
622   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
623   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
624   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
625
626   u32 data[2];
627
628   data[0] = s0;
629   data[1] = s1;
630
631   /**
632    * loop
633    */
634
635   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
636   {
637     const u32 pw_r_len = combs_buf[il_pos].pw_len;
638
639     const u32 pw_len = pw_l_len + pw_r_len;
640
641     u32 wordr0[4];
642
643     wordr0[0] = combs_buf[il_pos].i[0];
644     wordr0[1] = combs_buf[il_pos].i[1];
645     wordr0[2] = combs_buf[il_pos].i[2];
646     wordr0[3] = combs_buf[il_pos].i[3];
647
648     u32 wordr1[4];
649
650     wordr1[0] = combs_buf[il_pos].i[4];
651     wordr1[1] = combs_buf[il_pos].i[5];
652     wordr1[2] = combs_buf[il_pos].i[6];
653     wordr1[3] = combs_buf[il_pos].i[7];
654
655     u32 wordr2[4];
656
657     wordr2[0] = 0;
658     wordr2[1] = 0;
659     wordr2[2] = 0;
660     wordr2[3] = 0;
661
662     u32 wordr3[4];
663
664     wordr3[0] = 0;
665     wordr3[1] = 0;
666     wordr3[2] = 0;
667     wordr3[3] = 0;
668
669     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
670     {
671       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
672     }
673
674     u32 w0[4];
675
676     w0[0] = wordl0[0] | wordr0[0];
677     w0[1] = wordl0[1] | wordr0[1];
678     w0[2] = wordl0[2] | wordr0[2];
679     w0[3] = wordl0[3] | wordr0[3];
680
681     u32 w1[4];
682
683     w1[0] = wordl1[0] | wordr1[0];
684     w1[1] = wordl1[1] | wordr1[1];
685     w1[2] = wordl1[2] | wordr1[2];
686     w1[3] = wordl1[3] | wordr1[3];
687
688     u32 w2[4];
689
690     w2[0] = 0;
691     w2[1] = 0;
692     w2[2] = 0;
693     w2[3] = 0;
694
695     u32 w3[4];
696
697     w3[0] = 0;
698     w3[1] = 0;
699     w3[2] = 0;
700     w3[3] = 0;
701
702     u32 w0_t[4];
703     u32 w1_t[4];
704     u32 w2_t[4];
705     u32 w3_t[4];
706
707     make_unicode (w0, w0_t, w1_t);
708     make_unicode (w1, w2_t, w3_t);
709
710     w3_t[2] = pw_len * 8 * 2;
711
712     u32 a = MD4M_A;
713     u32 b = MD4M_B;
714     u32 c = MD4M_C;
715     u32 d = MD4M_D;
716
717     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
718     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
719     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
720     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
721     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
722     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
723     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
724     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
725     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
726     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
727     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
728     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
729     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
730     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
731     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
732     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
733
734     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
735     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
736     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
737     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
738     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
739     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
740     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
741     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
742     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
743     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
744     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
745     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
746     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
747     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
748     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
749     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
750
751     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
752     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
753     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
754     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
755     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
756     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
757     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
758     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
759     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
760     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
761     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
762     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
763     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
764     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
765
766     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
767
768     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
769     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
770
771     a += MD4M_A;
772     b += MD4M_B;
773     c += MD4M_C;
774     d += MD4M_D;
775
776     /**
777      * DES1
778      */
779
780     u32 key[2];
781
782     transform_netntlmv1_key (a, b, key);
783
784     u32 Kc[16];
785     u32 Kd[16];
786
787     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
788
789     u32 iv1[2];
790
791     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
792
793     /**
794      * DES2
795      */
796
797     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
798
799     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
800
801     u32 iv2[2];
802
803     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
804
805     /**
806      * compare
807      */
808
809     const u32 r0 = iv1[0];
810     const u32 r1 = iv1[1];
811     const u32 r2 = iv2[0];
812     const u32 r3 = iv2[1];
813
814     #include COMPARE_M
815   }
816 }
817
818 __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)
819 {
820 }
821
822 __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)
823 {
824 }
825
826 __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 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
827 {
828   /**
829    * modifier
830    */
831
832   const u32 lid = get_local_id (0);
833
834   /**
835    * base
836    */
837
838   const u32 gid = get_global_id (0);
839
840   u32 wordl0[4];
841
842   wordl0[0] = pws[gid].i[ 0];
843   wordl0[1] = pws[gid].i[ 1];
844   wordl0[2] = pws[gid].i[ 2];
845   wordl0[3] = pws[gid].i[ 3];
846
847   u32 wordl1[4];
848
849   wordl1[0] = pws[gid].i[ 4];
850   wordl1[1] = pws[gid].i[ 5];
851   wordl1[2] = pws[gid].i[ 6];
852   wordl1[3] = pws[gid].i[ 7];
853
854   u32 wordl2[4];
855
856   wordl2[0] = 0;
857   wordl2[1] = 0;
858   wordl2[2] = 0;
859   wordl2[3] = 0;
860
861   u32 wordl3[4];
862
863   wordl3[0] = 0;
864   wordl3[1] = 0;
865   wordl3[2] = 0;
866   wordl3[3] = 0;
867
868   const u32 pw_l_len = pws[gid].pw_len;
869
870   if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
871   {
872     append_0x80_2 (wordl0, wordl1, pw_l_len);
873
874     switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len);
875   }
876
877   /**
878    * sbox, kbox
879    */
880
881   __local u32 s_SPtrans[8][64];
882   __local u32 s_skb[8][64];
883
884   s_SPtrans[0][lid] = c_SPtrans[0][lid];
885   s_SPtrans[1][lid] = c_SPtrans[1][lid];
886   s_SPtrans[2][lid] = c_SPtrans[2][lid];
887   s_SPtrans[3][lid] = c_SPtrans[3][lid];
888   s_SPtrans[4][lid] = c_SPtrans[4][lid];
889   s_SPtrans[5][lid] = c_SPtrans[5][lid];
890   s_SPtrans[6][lid] = c_SPtrans[6][lid];
891   s_SPtrans[7][lid] = c_SPtrans[7][lid];
892
893   s_skb[0][lid] = c_skb[0][lid];
894   s_skb[1][lid] = c_skb[1][lid];
895   s_skb[2][lid] = c_skb[2][lid];
896   s_skb[3][lid] = c_skb[3][lid];
897   s_skb[4][lid] = c_skb[4][lid];
898   s_skb[5][lid] = c_skb[5][lid];
899   s_skb[6][lid] = c_skb[6][lid];
900   s_skb[7][lid] = c_skb[7][lid];
901
902   barrier (CLK_LOCAL_MEM_FENCE);
903
904   if (gid >= gid_max) return;
905
906   /**
907    * salt
908    */
909
910   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
911   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
912   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
913
914   u32 data[2];
915
916   data[0] = s0;
917   data[1] = s1;
918
919   /**
920    * digest
921    */
922
923   const u32 search[4] =
924   {
925     digests_buf[digests_offset].digest_buf[DGST_R0],
926     digests_buf[digests_offset].digest_buf[DGST_R1],
927     digests_buf[digests_offset].digest_buf[DGST_R2],
928     digests_buf[digests_offset].digest_buf[DGST_R3]
929   };
930
931   /**
932    * loop
933    */
934
935   for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
936   {
937     const u32 pw_r_len = combs_buf[il_pos].pw_len;
938
939     const u32 pw_len = pw_l_len + pw_r_len;
940
941     u32 wordr0[4];
942
943     wordr0[0] = combs_buf[il_pos].i[0];
944     wordr0[1] = combs_buf[il_pos].i[1];
945     wordr0[2] = combs_buf[il_pos].i[2];
946     wordr0[3] = combs_buf[il_pos].i[3];
947
948     u32 wordr1[4];
949
950     wordr1[0] = combs_buf[il_pos].i[4];
951     wordr1[1] = combs_buf[il_pos].i[5];
952     wordr1[2] = combs_buf[il_pos].i[6];
953     wordr1[3] = combs_buf[il_pos].i[7];
954
955     u32 wordr2[4];
956
957     wordr2[0] = 0;
958     wordr2[1] = 0;
959     wordr2[2] = 0;
960     wordr2[3] = 0;
961
962     u32 wordr3[4];
963
964     wordr3[0] = 0;
965     wordr3[1] = 0;
966     wordr3[2] = 0;
967     wordr3[3] = 0;
968
969     if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
970     {
971       switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
972     }
973
974     u32 w0[4];
975
976     w0[0] = wordl0[0] | wordr0[0];
977     w0[1] = wordl0[1] | wordr0[1];
978     w0[2] = wordl0[2] | wordr0[2];
979     w0[3] = wordl0[3] | wordr0[3];
980
981     u32 w1[4];
982
983     w1[0] = wordl1[0] | wordr1[0];
984     w1[1] = wordl1[1] | wordr1[1];
985     w1[2] = wordl1[2] | wordr1[2];
986     w1[3] = wordl1[3] | wordr1[3];
987
988     u32 w2[4];
989
990     w2[0] = 0;
991     w2[1] = 0;
992     w2[2] = 0;
993     w2[3] = 0;
994
995     u32 w3[4];
996
997     w3[0] = 0;
998     w3[1] = 0;
999     w3[2] = 0;
1000     w3[3] = 0;
1001
1002     u32 w0_t[4];
1003     u32 w1_t[4];
1004     u32 w2_t[4];
1005     u32 w3_t[4];
1006
1007     make_unicode (w0, w0_t, w1_t);
1008     make_unicode (w1, w2_t, w3_t);
1009
1010     w3_t[2] = pw_len * 8 * 2;
1011
1012     u32 a = MD4M_A;
1013     u32 b = MD4M_B;
1014     u32 c = MD4M_C;
1015     u32 d = MD4M_D;
1016
1017     MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00);
1018     MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01);
1019     MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02);
1020     MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03);
1021     MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00);
1022     MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01);
1023     MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02);
1024     MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03);
1025     MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00);
1026     MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01);
1027     MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02);
1028     MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03);
1029     MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00);
1030     MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01);
1031     MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02);
1032     MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03);
1033
1034     MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10);
1035     MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11);
1036     MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12);
1037     MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13);
1038     MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10);
1039     MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11);
1040     MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12);
1041     MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13);
1042     MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10);
1043     MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11);
1044     MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12);
1045     MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13);
1046     MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10);
1047     MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11);
1048     MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12);
1049     MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13);
1050
1051     MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20);
1052     MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21);
1053     MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22);
1054     MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23);
1055     MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20);
1056     MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21);
1057     MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22);
1058     MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23);
1059     MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20);
1060     MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21);
1061     MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22);
1062     MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23);
1063     MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20);
1064     MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21);
1065
1066     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
1067
1068     MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22);
1069     MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23);
1070
1071     a += MD4M_A;
1072     b += MD4M_B;
1073     c += MD4M_C;
1074     d += MD4M_D;
1075
1076     /**
1077      * DES1
1078      */
1079
1080     u32 key[2];
1081
1082     transform_netntlmv1_key (a, b, key);
1083
1084     u32 Kc[16];
1085     u32 Kd[16];
1086
1087     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1088
1089     u32 iv1[2];
1090
1091     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
1092
1093     /**
1094      * DES2
1095      */
1096
1097     /*
1098     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
1099
1100     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
1101
1102     u32 iv2[2];
1103
1104     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
1105     */
1106
1107     u32 iv2[2];
1108
1109     iv2[0] = search[2];
1110     iv2[1] = search[3];
1111
1112     /**
1113      * compare
1114      */
1115
1116     const u32 r0 = iv1[0];
1117     const u32 r1 = iv1[1];
1118     const u32 r2 = iv2[0];
1119     const u32 r3 = iv2[1];
1120
1121     #include COMPARE_S
1122   }
1123 }
1124
1125 __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)
1126 {
1127 }
1128
1129 __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)
1130 {
1131 }