- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[hashcat.git] / OpenCL / m05500_a3.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 static void m05500m (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
539 {
540   /**
541    * modifier
542    */
543
544   const u32 gid = get_global_id (0);
545   const u32 lid = get_local_id (0);
546
547   /**
548    * salt
549    */
550
551   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
552   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
553   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
554
555   u32 data[2];
556
557   data[0] = s0;
558   data[1] = s1;
559
560   /**
561    * loop
562    */
563
564   u32 w0l = w[0];
565
566   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
567   {
568     const u32 w0r = words_buf_r[il_pos];
569
570     const u32 w0 = w0l | w0r;
571
572     u32 a = MD4M_A;
573     u32 b = MD4M_B;
574     u32 c = MD4M_C;
575     u32 d = MD4M_D;
576
577     #define w0_t w0
578     #define w1_t w[ 1]
579     #define w2_t w[ 2]
580     #define w3_t w[ 3]
581     #define w4_t w[ 4]
582     #define w5_t w[ 5]
583     #define w6_t w[ 6]
584     #define w7_t w[ 7]
585     #define w8_t w[ 8]
586     #define w9_t w[ 9]
587     #define wa_t w[10]
588     #define wb_t w[11]
589     #define wc_t w[12]
590     #define wd_t w[13]
591     #define we_t w[14]
592     #define wf_t w[15]
593
594     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
595     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
596     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
597     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
598     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
599     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
600     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
601     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
602     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
603     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
604     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
605     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
606     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
607     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
608     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
609     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
610
611     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
612     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
613     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
614     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
615     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
616     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
617     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
618     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
619     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
620     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
621     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
622     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
623     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
624     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
625     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
626     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
627
628     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
629     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
630     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
631     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
632     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
633     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
634     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
635     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
636     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
637     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
638     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
639     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
640     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
641     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
642
643     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
644
645     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
646     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
647
648     a += MD4M_A;
649     b += MD4M_B;
650     c += MD4M_C;
651     d += MD4M_D;
652
653     /**
654      * DES1
655      */
656
657     u32 key[2];
658
659     transform_netntlmv1_key (a, b, key);
660
661     u32 Kc[16];
662     u32 Kd[16];
663
664     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
665
666     u32 iv1[2];
667
668     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
669
670     /**
671      * DES2
672      */
673
674     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
675
676     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
677
678     u32 iv2[2];
679
680     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
681
682     /**
683      * compare
684      */
685
686     const u32 r0 = iv1[0];
687     const u32 r1 = iv1[1];
688     const u32 r2 = iv2[0];
689     const u32 r3 = iv2[1];
690
691     #include COMPARE_M
692   }
693 }
694
695 static void m05500s (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset)
696 {
697   /**
698    * modifier
699    */
700
701   const u32 gid = get_global_id (0);
702   const u32 lid = get_local_id (0);
703
704   /**
705    * salt
706    */
707
708   const u32 s0 = salt_bufs[salt_pos].salt_buf[0];
709   const u32 s1 = salt_bufs[salt_pos].salt_buf[1];
710   const u32 s2 = salt_bufs[salt_pos].salt_buf[2];
711
712   u32 data[2];
713
714   data[0] = s0;
715   data[1] = s1;
716
717   /**
718    * digest
719    */
720
721   const u32 search[4] =
722   {
723     digests_buf[digests_offset].digest_buf[DGST_R0],
724     digests_buf[digests_offset].digest_buf[DGST_R1],
725     digests_buf[digests_offset].digest_buf[DGST_R2],
726     digests_buf[digests_offset].digest_buf[DGST_R3]
727   };
728
729   /**
730    * loop
731    */
732
733   u32 w0l = w[0];
734
735   for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++)
736   {
737     const u32 w0r = words_buf_r[il_pos];
738
739     const u32 w0 = w0l | w0r;
740
741     u32 a = MD4M_A;
742     u32 b = MD4M_B;
743     u32 c = MD4M_C;
744     u32 d = MD4M_D;
745
746     #define w0_t w0
747     #define w1_t w[ 1]
748     #define w2_t w[ 2]
749     #define w3_t w[ 3]
750     #define w4_t w[ 4]
751     #define w5_t w[ 5]
752     #define w6_t w[ 6]
753     #define w7_t w[ 7]
754     #define w8_t w[ 8]
755     #define w9_t w[ 9]
756     #define wa_t w[10]
757     #define wb_t w[11]
758     #define wc_t w[12]
759     #define wd_t w[13]
760     #define we_t w[14]
761     #define wf_t w[15]
762
763     MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00);
764     MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01);
765     MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02);
766     MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03);
767     MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00);
768     MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01);
769     MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02);
770     MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03);
771     MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00);
772     MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01);
773     MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02);
774     MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03);
775     MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00);
776     MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01);
777     MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02);
778     MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03);
779
780     MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10);
781     MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11);
782     MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12);
783     MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13);
784     MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10);
785     MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11);
786     MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12);
787     MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13);
788     MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10);
789     MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11);
790     MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12);
791     MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13);
792     MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10);
793     MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11);
794     MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12);
795     MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13);
796
797     MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20);
798     MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21);
799     MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22);
800     MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23);
801     MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20);
802     MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21);
803     MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22);
804     MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23);
805     MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20);
806     MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21);
807     MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22);
808     MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23);
809     MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20);
810     MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21);
811
812     if (allx (s2 != ((d + MD4M_D) >> 16))) continue;
813
814     MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22);
815     MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23);
816
817     a += MD4M_A;
818     b += MD4M_B;
819     c += MD4M_C;
820     d += MD4M_D;
821
822     /**
823      * DES1
824      */
825
826     u32 key[2];
827
828     transform_netntlmv1_key (a, b, key);
829
830     u32 Kc[16];
831     u32 Kd[16];
832
833     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
834
835     u32 iv1[2];
836
837     _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans);
838
839     /**
840      * DES2
841      */
842
843     /*
844     transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key);
845
846     _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb);
847
848     u32 iv2[2];
849
850     _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans);
851     */
852
853     u32 iv2[2];
854
855     iv2[0] = search[2];
856     iv2[1] = search[3];
857
858     /**
859      * compare
860      */
861
862     const u32 r0 = iv1[0];
863     const u32 r1 = iv1[1];
864     const u32 r2 = iv2[0];
865     const u32 r3 = iv2[1];
866
867     #include COMPARE_S
868   }
869 }
870
871 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
872 {
873   /**
874    * base
875    */
876
877   const u32 gid = get_global_id (0);
878   const u32 lid = get_local_id (0);
879
880   u32 w[16];
881
882   w[ 0] = pws[gid].i[ 0];
883   w[ 1] = pws[gid].i[ 1];
884   w[ 2] = pws[gid].i[ 2];
885   w[ 3] = pws[gid].i[ 3];
886   w[ 4] = 0;
887   w[ 5] = 0;
888   w[ 6] = 0;
889   w[ 7] = 0;
890   w[ 8] = 0;
891   w[ 9] = 0;
892   w[10] = 0;
893   w[11] = 0;
894   w[12] = 0;
895   w[13] = 0;
896   w[14] = pws[gid].i[14];
897   w[15] = 0;
898
899   const u32 pw_len = pws[gid].pw_len;
900
901   /**
902    * sbox, kbox
903    */
904
905   __local u32 s_SPtrans[8][64];
906   __local u32 s_skb[8][64];
907
908   s_SPtrans[0][lid] = c_SPtrans[0][lid];
909   s_SPtrans[1][lid] = c_SPtrans[1][lid];
910   s_SPtrans[2][lid] = c_SPtrans[2][lid];
911   s_SPtrans[3][lid] = c_SPtrans[3][lid];
912   s_SPtrans[4][lid] = c_SPtrans[4][lid];
913   s_SPtrans[5][lid] = c_SPtrans[5][lid];
914   s_SPtrans[6][lid] = c_SPtrans[6][lid];
915   s_SPtrans[7][lid] = c_SPtrans[7][lid];
916
917   s_skb[0][lid] = c_skb[0][lid];
918   s_skb[1][lid] = c_skb[1][lid];
919   s_skb[2][lid] = c_skb[2][lid];
920   s_skb[3][lid] = c_skb[3][lid];
921   s_skb[4][lid] = c_skb[4][lid];
922   s_skb[5][lid] = c_skb[5][lid];
923   s_skb[6][lid] = c_skb[6][lid];
924   s_skb[7][lid] = c_skb[7][lid];
925
926   barrier (CLK_LOCAL_MEM_FENCE);
927
928   if (gid >= gid_max) return;
929
930   /**
931    * main
932    */
933
934   m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
935 }
936
937 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
938 {
939   /**
940    * base
941    */
942
943   const u32 gid = get_global_id (0);
944   const u32 lid = get_local_id (0);
945
946   u32 w[16];
947
948   w[ 0] = pws[gid].i[ 0];
949   w[ 1] = pws[gid].i[ 1];
950   w[ 2] = pws[gid].i[ 2];
951   w[ 3] = pws[gid].i[ 3];
952   w[ 4] = pws[gid].i[ 4];
953   w[ 5] = pws[gid].i[ 5];
954   w[ 6] = pws[gid].i[ 6];
955   w[ 7] = pws[gid].i[ 7];
956   w[ 8] = 0;
957   w[ 9] = 0;
958   w[10] = 0;
959   w[11] = 0;
960   w[12] = 0;
961   w[13] = 0;
962   w[14] = pws[gid].i[14];
963   w[15] = 0;
964
965   const u32 pw_len = pws[gid].pw_len;
966
967   /**
968    * sbox, kbox
969    */
970
971   __local u32 s_SPtrans[8][64];
972   __local u32 s_skb[8][64];
973
974   s_SPtrans[0][lid] = c_SPtrans[0][lid];
975   s_SPtrans[1][lid] = c_SPtrans[1][lid];
976   s_SPtrans[2][lid] = c_SPtrans[2][lid];
977   s_SPtrans[3][lid] = c_SPtrans[3][lid];
978   s_SPtrans[4][lid] = c_SPtrans[4][lid];
979   s_SPtrans[5][lid] = c_SPtrans[5][lid];
980   s_SPtrans[6][lid] = c_SPtrans[6][lid];
981   s_SPtrans[7][lid] = c_SPtrans[7][lid];
982
983   s_skb[0][lid] = c_skb[0][lid];
984   s_skb[1][lid] = c_skb[1][lid];
985   s_skb[2][lid] = c_skb[2][lid];
986   s_skb[3][lid] = c_skb[3][lid];
987   s_skb[4][lid] = c_skb[4][lid];
988   s_skb[5][lid] = c_skb[5][lid];
989   s_skb[6][lid] = c_skb[6][lid];
990   s_skb[7][lid] = c_skb[7][lid];
991
992   barrier (CLK_LOCAL_MEM_FENCE);
993
994   if (gid >= gid_max) return;
995
996   /**
997    * main
998    */
999
1000   m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
1001 }
1002
1003 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1004 {
1005 }
1006
1007 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1008 {
1009   /**
1010    * base
1011    */
1012
1013   const u32 gid = get_global_id (0);
1014   const u32 lid = get_local_id (0);
1015
1016   u32 w[16];
1017
1018   w[ 0] = pws[gid].i[ 0];
1019   w[ 1] = pws[gid].i[ 1];
1020   w[ 2] = pws[gid].i[ 2];
1021   w[ 3] = pws[gid].i[ 3];
1022   w[ 4] = 0;
1023   w[ 5] = 0;
1024   w[ 6] = 0;
1025   w[ 7] = 0;
1026   w[ 8] = 0;
1027   w[ 9] = 0;
1028   w[10] = 0;
1029   w[11] = 0;
1030   w[12] = 0;
1031   w[13] = 0;
1032   w[14] = pws[gid].i[14];
1033   w[15] = 0;
1034
1035   const u32 pw_len = pws[gid].pw_len;
1036
1037   /**
1038    * sbox, kbox
1039    */
1040
1041   __local u32 s_SPtrans[8][64];
1042   __local u32 s_skb[8][64];
1043
1044   s_SPtrans[0][lid] = c_SPtrans[0][lid];
1045   s_SPtrans[1][lid] = c_SPtrans[1][lid];
1046   s_SPtrans[2][lid] = c_SPtrans[2][lid];
1047   s_SPtrans[3][lid] = c_SPtrans[3][lid];
1048   s_SPtrans[4][lid] = c_SPtrans[4][lid];
1049   s_SPtrans[5][lid] = c_SPtrans[5][lid];
1050   s_SPtrans[6][lid] = c_SPtrans[6][lid];
1051   s_SPtrans[7][lid] = c_SPtrans[7][lid];
1052
1053   s_skb[0][lid] = c_skb[0][lid];
1054   s_skb[1][lid] = c_skb[1][lid];
1055   s_skb[2][lid] = c_skb[2][lid];
1056   s_skb[3][lid] = c_skb[3][lid];
1057   s_skb[4][lid] = c_skb[4][lid];
1058   s_skb[5][lid] = c_skb[5][lid];
1059   s_skb[6][lid] = c_skb[6][lid];
1060   s_skb[7][lid] = c_skb[7][lid];
1061
1062   barrier (CLK_LOCAL_MEM_FENCE);
1063
1064   if (gid >= gid_max) return;
1065
1066   /**
1067    * main
1068    */
1069
1070   m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
1071 }
1072
1073 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1074 {
1075   /**
1076    * base
1077    */
1078
1079   const u32 gid = get_global_id (0);
1080   const u32 lid = get_local_id (0);
1081
1082   u32 w[16];
1083
1084   w[ 0] = pws[gid].i[ 0];
1085   w[ 1] = pws[gid].i[ 1];
1086   w[ 2] = pws[gid].i[ 2];
1087   w[ 3] = pws[gid].i[ 3];
1088   w[ 4] = pws[gid].i[ 4];
1089   w[ 5] = pws[gid].i[ 5];
1090   w[ 6] = pws[gid].i[ 6];
1091   w[ 7] = pws[gid].i[ 7];
1092   w[ 8] = 0;
1093   w[ 9] = 0;
1094   w[10] = 0;
1095   w[11] = 0;
1096   w[12] = 0;
1097   w[13] = 0;
1098   w[14] = pws[gid].i[14];
1099   w[15] = 0;
1100
1101   const u32 pw_len = pws[gid].pw_len;
1102
1103   /**
1104    * sbox, kbox
1105    */
1106
1107   __local u32 s_SPtrans[8][64];
1108   __local u32 s_skb[8][64];
1109
1110   s_SPtrans[0][lid] = c_SPtrans[0][lid];
1111   s_SPtrans[1][lid] = c_SPtrans[1][lid];
1112   s_SPtrans[2][lid] = c_SPtrans[2][lid];
1113   s_SPtrans[3][lid] = c_SPtrans[3][lid];
1114   s_SPtrans[4][lid] = c_SPtrans[4][lid];
1115   s_SPtrans[5][lid] = c_SPtrans[5][lid];
1116   s_SPtrans[6][lid] = c_SPtrans[6][lid];
1117   s_SPtrans[7][lid] = c_SPtrans[7][lid];
1118
1119   s_skb[0][lid] = c_skb[0][lid];
1120   s_skb[1][lid] = c_skb[1][lid];
1121   s_skb[2][lid] = c_skb[2][lid];
1122   s_skb[3][lid] = c_skb[3][lid];
1123   s_skb[4][lid] = c_skb[4][lid];
1124   s_skb[5][lid] = c_skb[5][lid];
1125   s_skb[6][lid] = c_skb[6][lid];
1126   s_skb[7][lid] = c_skb[7][lid];
1127
1128   barrier (CLK_LOCAL_MEM_FENCE);
1129
1130   if (gid >= gid_max) return;
1131
1132   /**
1133    * main
1134    */
1135
1136   m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset);
1137 }
1138
1139 __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 u32 * words_buf_r, __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 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1140 {
1141 }