Started optimizing some of the OpenCL kernel for latest AMD Catalyst 15.12:
[hashcat.git] / OpenCL / m01500_a3.cl
1 /**
2  * Author......: Jens Steube <jens.steube@gmail.com>
3  * License.....: MIT
4  * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below
5  *             : sboxes for others were takes fron JtR, license below
6  */
7
8 #define _DES_
9
10 #include "include/constants.h"
11 #include "include/kernel_vendor.h"
12
13 #define DGST_R0 0
14 #define DGST_R1 1
15 #define DGST_R2 2
16 #define DGST_R3 3
17
18 #include "include/kernel_functions.c"
19 #include "OpenCL/types_ocl.c"
20 #include "OpenCL/common.c"
21
22 #define COMPARE_S "OpenCL/check_single_comp4_bs.c"
23 #define COMPARE_M "OpenCL/check_multi_comp4_bs.c"
24
25 #define myselx(a,b,c) ((c) ? (b) : (a))
26
27 #ifdef IS_NV
28
29 #if CUDA_ARCH >= 500
30
31 //
32 // Bitslice DES S-boxes with LOP3.LUT instructions
33 // For NVIDIA Maxwell architecture and CUDA 7.5 RC
34 // by DeepLearningJohnDoe, version 0.1.6, 2015/07/19
35 //
36 // Gate counts: 25 24 25 18 25 24 24 23
37 // Average: 23.5
38 // Depth: 8 7 7 6 8 10 10 8
39 // Average: 8
40 //
41 // Note that same S-box function with a lower gate count isn't necessarily faster.
42 //
43 // These Boolean expressions corresponding to DES S-boxes were
44 // discovered by <deeplearningjohndoe at gmail.com>
45 //
46 // This file itself is Copyright (c) 2015 by <deeplearningjohndoe at gmail.com>
47 // Redistribution and use in source and binary forms, with or without
48 // modification, are permitted.
49 //
50 // The underlying mathematical formulas are NOT copyrighted.
51 //
52
53 #define LUT(a,b,c,d,e) u32 a; asm ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d));
54
55 static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
56 {
57   LUT(xAA55AA5500550055, a1, a4, a6, 0xC1)
58   LUT(xA55AA55AF0F5F0F5, a3, a6, xAA55AA5500550055, 0x9E)
59   LUT(x5F5F5F5FA5A5A5A5, a1, a3, a6, 0xD6)
60   LUT(xF5A0F5A0A55AA55A, a4, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x56)
61   LUT(x947A947AD1E7D1E7, a2, xA55AA55AF0F5F0F5, xF5A0F5A0A55AA55A, 0x6C)
62   LUT(x5FFF5FFFFFFAFFFA, a6, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x7B)
63   LUT(xB96CB96C69936993, a2, xF5A0F5A0A55AA55A, x5FFF5FFFFFFAFFFA, 0xD6)
64   LUT(x3, a5, x947A947AD1E7D1E7, xB96CB96C69936993, 0x6A)
65   LUT(x55EE55EE55EE55EE, a1, a2, a4, 0x7A)
66   LUT(x084C084CB77BB77B, a2, a6, xF5A0F5A0A55AA55A, 0xC9)
67   LUT(x9C329C32E295E295, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x72)
68   LUT(xA51EA51E50E050E0, a3, a6, x55EE55EE55EE55EE, 0x29)
69   LUT(x4AD34AD3BE3CBE3C, a2, x947A947AD1E7D1E7, xA51EA51E50E050E0, 0x95)
70   LUT(x2, a5, x9C329C32E295E295, x4AD34AD3BE3CBE3C, 0xC6)
71   LUT(xD955D95595D195D1, a1, a2, x9C329C32E295E295, 0xD2)
72   LUT(x8058805811621162, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x90)
73   LUT(x7D0F7D0FC4B3C4B3, xA51EA51E50E050E0, xD955D95595D195D1, x8058805811621162, 0x76)
74   LUT(x0805080500010001, a3, xAA55AA5500550055, xD955D95595D195D1, 0x80)
75   LUT(x4A964A96962D962D, xB96CB96C69936993, x4AD34AD3BE3CBE3C, x0805080500010001, 0xA6)
76   LUT(x4, a5, x7D0F7D0FC4B3C4B3, x4A964A96962D962D, 0xA6)
77   LUT(x148014807B087B08, a1, xAA55AA5500550055, x947A947AD1E7D1E7, 0x21)
78   LUT(x94D894D86B686B68, xA55AA55AF0F5F0F5, x8058805811621162, x148014807B087B08, 0x6A)
79   LUT(x5555555540044004, a1, a6, x084C084CB77BB77B, 0x70)
80   LUT(xAFB4AFB4BF5BBF5B, x5F5F5F5FA5A5A5A5, xA51EA51E50E050E0, x5555555540044004, 0x97)
81   LUT(x1, a5, x94D894D86B686B68, xAFB4AFB4BF5BBF5B, 0x6C)
82
83   *out1 ^= x1;
84   *out2 ^= x2;
85   *out3 ^= x3;
86   *out4 ^= x4;
87 }
88
89 static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
90 {
91   LUT(xEEEEEEEE99999999, a1, a2, a6, 0x97)
92   LUT(xFFFFEEEE66666666, a5, a6, xEEEEEEEE99999999, 0x67)
93   LUT(x5555FFFFFFFF0000, a1, a5, a6, 0x76)
94   LUT(x6666DDDD5555AAAA, a2, xFFFFEEEE66666666, x5555FFFFFFFF0000, 0x69)
95   LUT(x6969D3D35353ACAC, a3, xFFFFEEEE66666666, x6666DDDD5555AAAA, 0x6A)
96   LUT(xCFCF3030CFCF3030, a2, a3, a5, 0x65)
97   LUT(xE4E4EEEE9999F0F0, a3, xEEEEEEEE99999999, x5555FFFFFFFF0000, 0x8D)
98   LUT(xE5E5BABACDCDB0B0, a1, xCFCF3030CFCF3030, xE4E4EEEE9999F0F0, 0xCA)
99   LUT(x3, a4, x6969D3D35353ACAC, xE5E5BABACDCDB0B0, 0xC6)
100   LUT(x3333CCCC00000000, a2, a5, a6, 0x14)
101   LUT(xCCCCDDDDFFFF0F0F, a5, xE4E4EEEE9999F0F0, x3333CCCC00000000, 0xB5)
102   LUT(x00000101F0F0F0F0, a3, a6, xFFFFEEEE66666666, 0x1C)
103   LUT(x9A9A64646A6A9595, a1, xCFCF3030CFCF3030, x00000101F0F0F0F0, 0x96)
104   LUT(x2, a4, xCCCCDDDDFFFF0F0F, x9A9A64646A6A9595, 0x6A)
105   LUT(x3333BBBB3333FFFF, a1, a2, x6666DDDD5555AAAA, 0xDE)
106   LUT(x1414141441410000, a1, a3, xE4E4EEEE9999F0F0, 0x90)
107   LUT(x7F7FF3F3F5F53939, x6969D3D35353ACAC, x9A9A64646A6A9595, x3333BBBB3333FFFF, 0x79)
108   LUT(x9494E3E34B4B3939, a5, x1414141441410000, x7F7FF3F3F5F53939, 0x29)
109   LUT(x1, a4, x3333BBBB3333FFFF, x9494E3E34B4B3939, 0xA6)
110   LUT(xB1B1BBBBCCCCA5A5, a1, a1, xE4E4EEEE9999F0F0, 0x4A)
111   LUT(xFFFFECECEEEEDDDD, a2, x3333CCCC00000000, x9A9A64646A6A9595, 0xEF)
112   LUT(xB1B1A9A9DCDC8787, xE5E5BABACDCDB0B0, xB1B1BBBBCCCCA5A5, xFFFFECECEEEEDDDD, 0x8D)
113   LUT(xFFFFCCCCEEEE4444, a2, a5, xFFFFEEEE66666666, 0x2B)
114   LUT(x4, a4, xB1B1A9A9DCDC8787, xFFFFCCCCEEEE4444, 0x6C)
115
116   *out1 ^= x1;
117   *out2 ^= x2;
118   *out3 ^= x3;
119   *out4 ^= x4;
120 }
121
122 static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
123 {
124   LUT(xA50FA50FA50FA50F, a1, a3, a4, 0xC9)
125   LUT(xF0F00F0FF0F0F0F0, a3, a5, a6, 0x4B)
126   LUT(xAF0FA0AAAF0FAF0F, a1, xA50FA50FA50FA50F, xF0F00F0FF0F0F0F0, 0x4D)
127   LUT(x5AA5A55A5AA55AA5, a1, a4, xF0F00F0FF0F0F0F0, 0x69)
128   LUT(xAA005FFFAA005FFF, a3, a5, xA50FA50FA50FA50F, 0xD6)
129   LUT(x5AA5A55A0F5AFAA5, a6, x5AA5A55A5AA55AA5, xAA005FFFAA005FFF, 0x9C)
130   LUT(x1, a2, xAF0FA0AAAF0FAF0F, x5AA5A55A0F5AFAA5, 0xA6)
131   LUT(xAA55AA5500AA00AA, a1, a4, a6, 0x49)
132   LUT(xFAFAA50FFAFAA50F, a1, a5, xA50FA50FA50FA50F, 0x9B)
133   LUT(x50AF0F5AFA50A5A5, a1, xAA55AA5500AA00AA, xFAFAA50FFAFAA50F, 0x66)
134   LUT(xAFAFAFAFFAFAFAFA, a1, a3, a6, 0x6F)
135   LUT(xAFAFFFFFFFFAFAFF, a4, x50AF0F5AFA50A5A5, xAFAFAFAFFAFAFAFA, 0xEB)
136   LUT(x4, a2, x50AF0F5AFA50A5A5, xAFAFFFFFFFFAFAFF, 0x6C)
137   LUT(x500F500F500F500F, a1, a3, a4, 0x98)
138   LUT(xF0505A0505A5050F, x5AA5A55A0F5AFAA5, xAA55AA5500AA00AA, xAFAFAFAFFAFAFAFA, 0x1D)
139   LUT(xF0505A05AA55AAFF, a6, x500F500F500F500F, xF0505A0505A5050F, 0x9A)
140   LUT(xFF005F55FF005F55, a1, a4, xAA005FFFAA005FFF, 0xB2)
141   LUT(xA55F5AF0A55F5AF0, a5, xA50FA50FA50FA50F, x5AA5A55A5AA55AA5, 0x3D)
142   LUT(x5A5F05A5A55F5AF0, a6, xFF005F55FF005F55, xA55F5AF0A55F5AF0, 0xA6)
143   LUT(x3, a2, xF0505A05AA55AAFF, x5A5F05A5A55F5AF0, 0xA6)
144   LUT(x0F0F0F0FA5A5A5A5, a1, a3, a6, 0xC6)
145   LUT(x5FFFFF5FFFA0FFA0, x5AA5A55A5AA55AA5, xAFAFAFAFFAFAFAFA, x0F0F0F0FA5A5A5A5, 0xDB)
146   LUT(xF5555AF500A05FFF, a5, xFAFAA50FFAFAA50F, xF0505A0505A5050F, 0xB9)
147   LUT(x05A5AAF55AFA55A5, xF0505A05AA55AAFF, x0F0F0F0FA5A5A5A5, xF5555AF500A05FFF, 0x9B)
148   LUT(x2, a2, x5FFFFF5FFFA0FFA0, x05A5AAF55AFA55A5, 0xA6)
149
150   *out1 ^= x1;
151   *out2 ^= x2;
152   *out3 ^= x3;
153   *out4 ^= x4;
154 }
155
156 static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
157 {
158   LUT(x55F055F055F055F0, a1, a3, a4, 0x72)
159   LUT(xA500F5F0A500F5F0, a3, a5, x55F055F055F055F0, 0xAD)
160   LUT(xF50AF50AF50AF50A, a1, a3, a4, 0x59)
161   LUT(xF5FA0FFFF5FA0FFF, a3, a5, xF50AF50AF50AF50A, 0xE7)
162   LUT(x61C8F93C61C8F93C, a2, xA500F5F0A500F5F0, xF5FA0FFFF5FA0FFF, 0xC6)
163   LUT(x9999666699996666, a1, a2, a5, 0x69)
164   LUT(x22C022C022C022C0, a2, a4, x55F055F055F055F0, 0x18)
165   LUT(xB35C94A6B35C94A6, xF5FA0FFFF5FA0FFF, x9999666699996666, x22C022C022C022C0, 0x63)
166   LUT(x4, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x6A)
167   LUT(x4848484848484848, a1, a2, a3, 0x12)
168   LUT(x55500AAA55500AAA, a1, a5, xF5FA0FFFF5FA0FFF, 0x28)
169   LUT(x3C90B3D63C90B3D6, x61C8F93C61C8F93C, x4848484848484848, x55500AAA55500AAA, 0x1E)
170   LUT(x8484333384843333, a1, x9999666699996666, x4848484848484848, 0x14)
171   LUT(x4452F1AC4452F1AC, xF50AF50AF50AF50A, xF5FA0FFFF5FA0FFF, xB35C94A6B35C94A6, 0x78)
172   LUT(x9586CA379586CA37, x55500AAA55500AAA, x8484333384843333, x4452F1AC4452F1AC, 0xD6)
173   LUT(x2, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0x6A)
174   LUT(x1, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0xA9)
175   LUT(x3, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x56)
176
177   *out1 ^= x1;
178   *out2 ^= x2;
179   *out3 ^= x3;
180   *out4 ^= x4;
181 }
182
183 static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
184 {
185   LUT(xA0A0A0A0FFFFFFFF, a1, a3, a6, 0xAB)
186   LUT(xFFFF00005555FFFF, a1, a5, a6, 0xB9)
187   LUT(xB3B320207777FFFF, a2, xA0A0A0A0FFFFFFFF, xFFFF00005555FFFF, 0xE8)
188   LUT(x50505A5A5A5A5050, a1, a3, xFFFF00005555FFFF, 0x34)
189   LUT(xA2A2FFFF2222FFFF, a1, a5, xB3B320207777FFFF, 0xCE)
190   LUT(x2E2E6969A4A46363, a2, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, 0x29)
191   LUT(x3, a4, xB3B320207777FFFF, x2E2E6969A4A46363, 0xA6)
192   LUT(xA5A50A0AA5A50A0A, a1, a3, a5, 0x49)
193   LUT(x969639396969C6C6, a2, a6, xA5A50A0AA5A50A0A, 0x96)
194   LUT(x1B1B1B1B1B1B1B1B, a1, a2, a3, 0xCA)
195   LUT(xBFBFBFBFF6F6F9F9, a3, xA0A0A0A0FFFFFFFF, x969639396969C6C6, 0x7E)
196   LUT(x5B5BA4A4B8B81D1D, xFFFF00005555FFFF, x1B1B1B1B1B1B1B1B, xBFBFBFBFF6F6F9F9, 0x96)
197   LUT(x2, a4, x969639396969C6C6, x5B5BA4A4B8B81D1D, 0xCA)
198   LUT(x5555BBBBFFFF5555, a1, a2, xFFFF00005555FFFF, 0xE5)
199   LUT(x6D6D9C9C95956969, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, x969639396969C6C6, 0x97)
200   LUT(x1A1A67676A6AB4B4, xA5A50A0AA5A50A0A, x5555BBBBFFFF5555, x6D6D9C9C95956969, 0x47)
201   LUT(xA0A0FFFFAAAA0000, a3, xFFFF00005555FFFF, xA5A50A0AA5A50A0A, 0x3B)
202   LUT(x36369C9CC1C1D6D6, x969639396969C6C6, x6D6D9C9C95956969, xA0A0FFFFAAAA0000, 0xD9)
203   LUT(x1, a4, x1A1A67676A6AB4B4, x36369C9CC1C1D6D6, 0xCA)
204   LUT(x5555F0F0F5F55555, a1, a3, xFFFF00005555FFFF, 0xB1)
205   LUT(x79790202DCDC0808, xA2A2FFFF2222FFFF, xA5A50A0AA5A50A0A, x969639396969C6C6, 0x47)
206   LUT(x6C6CF2F229295D5D, xBFBFBFBFF6F6F9F9, x5555F0F0F5F55555, x79790202DCDC0808, 0x6E)
207   LUT(xA3A3505010101A1A, a2, xA2A2FFFF2222FFFF, x36369C9CC1C1D6D6, 0x94)
208   LUT(x7676C7C74F4FC7C7, a1, x2E2E6969A4A46363, xA3A3505010101A1A, 0xD9)
209   LUT(x4, a4, x6C6CF2F229295D5D, x7676C7C74F4FC7C7, 0xC6)
210
211   *out1 ^= x1;
212   *out2 ^= x2;
213   *out3 ^= x3;
214   *out4 ^= x4;
215 }
216
217 static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
218 {
219   LUT(x5050F5F55050F5F5, a1, a3, a5, 0xB2)
220   LUT(x6363C6C66363C6C6, a1, a2, x5050F5F55050F5F5, 0x66)
221   LUT(xAAAA5555AAAA5555, a1, a1, a5, 0xA9)
222   LUT(x3A3A65653A3A6565, a3, x6363C6C66363C6C6, xAAAA5555AAAA5555, 0xA9)
223   LUT(x5963A3C65963A3C6, a4, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xC6)
224   LUT(xE7E76565E7E76565, a5, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xAD)
225   LUT(x455D45DF455D45DF, a1, a4, xE7E76565E7E76565, 0xE4)
226   LUT(x4, a6, x5963A3C65963A3C6, x455D45DF455D45DF, 0x6C)
227   LUT(x1101220211012202, a2, xAAAA5555AAAA5555, x5963A3C65963A3C6, 0x20)
228   LUT(xF00F0FF0F00F0FF0, a3, a4, a5, 0x69)
229   LUT(x16E94A9716E94A97, xE7E76565E7E76565, x1101220211012202, xF00F0FF0F00F0FF0, 0x9E)
230   LUT(x2992922929929229, a1, a2, xF00F0FF0F00F0FF0, 0x49)
231   LUT(xAFAF9823AFAF9823, a5, x5050F5F55050F5F5, x2992922929929229, 0x93)
232   LUT(x3, a6, x16E94A9716E94A97, xAFAF9823AFAF9823, 0x6C)
233   LUT(x4801810248018102, a4, x5963A3C65963A3C6, x1101220211012202, 0xA4)
234   LUT(x5EE8FFFD5EE8FFFD, a5, x16E94A9716E94A97, x4801810248018102, 0x76)
235   LUT(xF0FF00FFF0FF00FF, a3, a4, a5, 0xCD)
236   LUT(x942D9A67942D9A67, x3A3A65653A3A6565, x5EE8FFFD5EE8FFFD, xF0FF00FFF0FF00FF, 0x86)
237   LUT(x1, a6, x5EE8FFFD5EE8FFFD, x942D9A67942D9A67, 0xA6)
238   LUT(x6A40D4ED6F4DD4EE, a2, x4, xAFAF9823AFAF9823, 0x2D)
239   LUT(x6CA89C7869A49C79, x1101220211012202, x16E94A9716E94A97, x6A40D4ED6F4DD4EE, 0x26)
240   LUT(xD6DE73F9D6DE73F9, a3, x6363C6C66363C6C6, x455D45DF455D45DF, 0x6B)
241   LUT(x925E63E1965A63E1, x3A3A65653A3A6565, x6CA89C7869A49C79, xD6DE73F9D6DE73F9, 0xA2)
242   LUT(x2, a6, x6CA89C7869A49C79, x925E63E1965A63E1, 0xCA)
243
244   *out1 ^= x1;
245   *out2 ^= x2;
246   *out3 ^= x3;
247   *out4 ^= x4;
248 }
249
250 static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
251 {
252   LUT(x88AA88AA88AA88AA, a1, a2, a4, 0x0B)
253   LUT(xAAAAFF00AAAAFF00, a1, a4, a5, 0x27)
254   LUT(xADAFF8A5ADAFF8A5, a3, x88AA88AA88AA88AA, xAAAAFF00AAAAFF00, 0x9E)
255   LUT(x0A0AF5F50A0AF5F5, a1, a3, a5, 0xA6)
256   LUT(x6B69C5DC6B69C5DC, a2, xADAFF8A5ADAFF8A5, x0A0AF5F50A0AF5F5, 0x6B)
257   LUT(x1C69B2DC1C69B2DC, a4, x88AA88AA88AA88AA, x6B69C5DC6B69C5DC, 0xA9)
258   LUT(x1, a6, xADAFF8A5ADAFF8A5, x1C69B2DC1C69B2DC, 0x6A)
259   LUT(x9C9C9C9C9C9C9C9C, a1, a2, a3, 0x63)
260   LUT(xE6E63BFDE6E63BFD, a2, xAAAAFF00AAAAFF00, x0A0AF5F50A0AF5F5, 0xE7)
261   LUT(x6385639E6385639E, a4, x9C9C9C9C9C9C9C9C, xE6E63BFDE6E63BFD, 0x93)
262   LUT(x5959C4CE5959C4CE, a2, x6B69C5DC6B69C5DC, xE6E63BFDE6E63BFD, 0x5D)
263   LUT(x5B53F53B5B53F53B, a4, x0A0AF5F50A0AF5F5, x5959C4CE5959C4CE, 0x6E)
264   LUT(x3, a6, x6385639E6385639E, x5B53F53B5B53F53B, 0xC6)
265   LUT(xFAF505FAFAF505FA, a3, a4, x0A0AF5F50A0AF5F5, 0x6D)
266   LUT(x6A65956A6A65956A, a3, x9C9C9C9C9C9C9C9C, xFAF505FAFAF505FA, 0xA6)
267   LUT(x8888CCCC8888CCCC, a1, a2, a5, 0x23)
268   LUT(x94E97A9494E97A94, x1C69B2DC1C69B2DC, x6A65956A6A65956A, x8888CCCC8888CCCC, 0x72)
269   LUT(x4, a6, x6A65956A6A65956A, x94E97A9494E97A94, 0xAC)
270   LUT(xA050A050A050A050, a1, a3, a4, 0x21)
271   LUT(xC1B87A2BC1B87A2B, xAAAAFF00AAAAFF00, x5B53F53B5B53F53B, x94E97A9494E97A94, 0xA4)
272   LUT(xE96016B7E96016B7, x8888CCCC8888CCCC, xA050A050A050A050, xC1B87A2BC1B87A2B, 0x96)
273   LUT(xE3CF1FD5E3CF1FD5, x88AA88AA88AA88AA, x6A65956A6A65956A, xE96016B7E96016B7, 0x3E)
274   LUT(x6776675B6776675B, xADAFF8A5ADAFF8A5, x94E97A9494E97A94, xE3CF1FD5E3CF1FD5, 0x6B)
275   LUT(x2, a6, xE96016B7E96016B7, x6776675B6776675B, 0xC6)
276
277   *out1 ^= x1;
278   *out2 ^= x2;
279   *out3 ^= x3;
280   *out4 ^= x4;
281 }
282
283 static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
284 {
285   LUT(xEEEE3333EEEE3333, a1, a2, a5, 0x9D)
286   LUT(xBBBBBBBBBBBBBBBB, a1, a1, a2, 0x83)
287   LUT(xDDDDAAAADDDDAAAA, a1, a2, a5, 0x5B)
288   LUT(x29295A5A29295A5A, a3, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0x85)
289   LUT(xC729695AC729695A, a4, xEEEE3333EEEE3333, x29295A5A29295A5A, 0xA6)
290   LUT(x3BF77B7B3BF77B7B, a2, a5, xC729695AC729695A, 0xF9)
291   LUT(x2900FF002900FF00, a4, a5, x29295A5A29295A5A, 0x0E)
292   LUT(x56B3803F56B3803F, xBBBBBBBBBBBBBBBB, x3BF77B7B3BF77B7B, x2900FF002900FF00, 0x61)
293   LUT(x4, a6, xC729695AC729695A, x56B3803F56B3803F, 0x6C)
294   LUT(xFBFBFBFBFBFBFBFB, a1, a2, a3, 0xDF)
295   LUT(x3012B7B73012B7B7, a2, a5, xC729695AC729695A, 0xD4)
296   LUT(x34E9B34C34E9B34C, a4, xFBFBFBFBFBFBFBFB, x3012B7B73012B7B7, 0x69)
297   LUT(xBFEAEBBEBFEAEBBE, a1, x29295A5A29295A5A, x34E9B34C34E9B34C, 0x6F)
298   LUT(xFFAEAFFEFFAEAFFE, a3, xBBBBBBBBBBBBBBBB, xBFEAEBBEBFEAEBBE, 0xB9)
299   LUT(x2, a6, x34E9B34C34E9B34C, xFFAEAFFEFFAEAFFE, 0xC6)
300   LUT(xCFDE88BBCFDE88BB, a2, xDDDDAAAADDDDAAAA, x34E9B34C34E9B34C, 0x5C)
301   LUT(x3055574530555745, a1, xC729695AC729695A, xCFDE88BBCFDE88BB, 0x71)
302   LUT(x99DDEEEE99DDEEEE, a4, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0xB9)
303   LUT(x693CD926693CD926, x3BF77B7B3BF77B7B, x34E9B34C34E9B34C, x99DDEEEE99DDEEEE, 0x69)
304   LUT(x3, a6, x3055574530555745, x693CD926693CD926, 0x6A)
305   LUT(x9955EE559955EE55, a1, a4, x99DDEEEE99DDEEEE, 0xE2)
306   LUT(x9D48FA949D48FA94, x3BF77B7B3BF77B7B, xBFEAEBBEBFEAEBBE, x9955EE559955EE55, 0x9C)
307   LUT(x1, a6, xC729695AC729695A, x9D48FA949D48FA94, 0x39)
308
309   *out1 ^= x1;
310   *out2 ^= x2;
311   *out3 ^= x3;
312   *out4 ^= x4;
313 }
314
315 #else
316
317 /*
318  * Bitslice DES S-boxes for x86 with MMX/SSE2/AVX and for typical RISC
319  * architectures.  These use AND, OR, XOR, NOT, and AND-NOT gates.
320  *
321  * Gate counts: 49 44 46 33 48 46 46 41
322  * Average: 44.125
323  *
324  * Several same-gate-count expressions for each S-box are included (for use on
325  * different CPUs/GPUs).
326  *
327  * These Boolean expressions corresponding to DES S-boxes have been generated
328  * by Roman Rusakov <roman_rus at openwall.com> for use in Openwall's
329  * John the Ripper password cracker: http://www.openwall.com/john/
330  * Being mathematical formulas, they are not copyrighted and are free for reuse
331  * by anyone.
332  *
333  * This file (a specific representation of the S-box expressions, surrounding
334  * logic) is Copyright (c) 2011 by Solar Designer <solar at openwall.com>.
335  * Redistribution and use in source and binary forms, with or without
336  * modification, are permitted.  (This is a heavily cut-down "BSD license".)
337  *
338  * The effort has been sponsored by Rapid7: http://www.rapid7.com
339  */
340
341 static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
342 {
343     u32 x55005500, x5A0F5A0F, x3333FFFF, x66666666, x22226666, x2D2D6969,
344         x25202160;
345     u32 x00FFFF00, x33CCCC33, x4803120C, x2222FFFF, x6A21EDF3, x4A01CC93;
346     u32 x5555FFFF, x7F75FFFF, x00D20096, x7FA7FF69;
347     u32 x0A0A0000, x0AD80096, x00999900, x0AD99996;
348     u32 x22332233, x257AA5F0, x054885C0, xFAB77A3F, x2221EDF3, xD89697CC;
349     u32 x05B77AC0, x05F77AD6, x36C48529, x6391D07C, xBB0747B0;
350     u32 x4C460000, x4EDF9996, x2D4E49EA, xBBFFFFB0, x96B1B65A;
351     u32 x5AFF5AFF, x52B11215, x4201C010, x10B0D205;
352     u32 x00, x01, x10, x11, x20, x21, x30, x31;
353
354     x55005500 = a1 & ~a5;
355     x5A0F5A0F = a4 ^ x55005500;
356     x3333FFFF = a3 | a6;
357     x66666666 = a1 ^ a3;
358     x22226666 = x3333FFFF & x66666666;
359     x2D2D6969 = a4 ^ x22226666;
360     x25202160 = x2D2D6969 & ~x5A0F5A0F;
361
362     x00FFFF00 = a5 ^ a6;
363     x33CCCC33 = a3 ^ x00FFFF00;
364     x4803120C = x5A0F5A0F & ~x33CCCC33;
365     x2222FFFF = a6 | x22226666;
366     x6A21EDF3 = x4803120C ^ x2222FFFF;
367     x4A01CC93 = x6A21EDF3 & ~x25202160;
368
369     x5555FFFF = a1 | a6;
370     x7F75FFFF = x6A21EDF3 | x5555FFFF;
371     x00D20096 = a5 & ~x2D2D6969;
372     x7FA7FF69 = x7F75FFFF ^ x00D20096;
373
374     x0A0A0000 = a4 & ~x5555FFFF;
375     x0AD80096 = x00D20096 ^ x0A0A0000;
376     x00999900 = x00FFFF00 & ~x66666666;
377     x0AD99996 = x0AD80096 | x00999900;
378
379     x22332233 = a3 & ~x55005500;
380     x257AA5F0 = x5A0F5A0F ^ x7F75FFFF;
381     x054885C0 = x257AA5F0 & ~x22332233;
382     xFAB77A3F = ~x054885C0;
383     x2221EDF3 = x3333FFFF & x6A21EDF3;
384     xD89697CC = xFAB77A3F ^ x2221EDF3;
385     x20 = x7FA7FF69 & ~a2;
386     x21 = x20 ^ xD89697CC;
387     *out3 ^= x21;
388
389     x05B77AC0 = x00FFFF00 ^ x054885C0;
390     x05F77AD6 = x00D20096 | x05B77AC0;
391     x36C48529 = x3333FFFF ^ x05F77AD6;
392     x6391D07C = a1 ^ x36C48529;
393     xBB0747B0 = xD89697CC ^ x6391D07C;
394     x00 = x25202160 | a2;
395     x01 = x00 ^ xBB0747B0;
396     *out1 ^= x01;
397
398     x4C460000 = x3333FFFF ^ x7F75FFFF;
399     x4EDF9996 = x0AD99996 | x4C460000;
400     x2D4E49EA = x6391D07C ^ x4EDF9996;
401     xBBFFFFB0 = x00FFFF00 | xBB0747B0;
402     x96B1B65A = x2D4E49EA ^ xBBFFFFB0;
403     x10 = x4A01CC93 | a2;
404     x11 = x10 ^ x96B1B65A;
405     *out2 ^= x11;
406
407     x5AFF5AFF = a5 | x5A0F5A0F;
408     x52B11215 = x5AFF5AFF & ~x2D4E49EA;
409     x4201C010 = x4A01CC93 & x6391D07C;
410     x10B0D205 = x52B11215 ^ x4201C010;
411     x30 = x10B0D205 | a2;
412     x31 = x30 ^ x0AD99996;
413     *out4 ^= x31;
414 }
415
416 static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
417 {
418     u32 x33CC33CC;
419     u32 x55550000, x00AA00FF, x33BB33FF;
420     u32 x33CC0000, x11441144, x11BB11BB, x003311BB;
421     u32 x00000F0F, x336600FF, x332200FF, x332200F0;
422     u32 x0302000F, xAAAAAAAA, xA9A8AAA5, x33CCCC33, x33CCC030, x9A646A95;
423     u32 x00333303, x118822B8, xA8208805, x3CC3C33C, x94E34B39;
424     u32 x0331330C, x3FF3F33C, xA9DF596A, xA9DF5F6F, x962CAC53;
425     u32 xA9466A6A, x3DA52153, x29850143, x33C0330C, x1A45324F;
426     u32 x0A451047, xBBDFDD7B, xB19ACD3C;
427     u32 x00, x01, x10, x11, x20, x21, x30, x31;
428
429     x33CC33CC = a2 ^ a5;
430
431     x55550000 = a1 & ~a6;
432     x00AA00FF = a5 & ~x55550000;
433     x33BB33FF = a2 | x00AA00FF;
434
435     x33CC0000 = x33CC33CC & ~a6;
436     x11441144 = a1 & x33CC33CC;
437     x11BB11BB = a5 ^ x11441144;
438     x003311BB = x11BB11BB & ~x33CC0000;
439
440     x00000F0F = a3 & a6;
441     x336600FF = x00AA00FF ^ x33CC0000;
442     x332200FF = x33BB33FF & x336600FF;
443     x332200F0 = x332200FF & ~x00000F0F;
444
445     x0302000F = a3 & x332200FF;
446     xAAAAAAAA = ~a1;
447     xA9A8AAA5 = x0302000F ^ xAAAAAAAA;
448     x33CCCC33 = a6 ^ x33CC33CC;
449     x33CCC030 = x33CCCC33 & ~x00000F0F;
450     x9A646A95 = xA9A8AAA5 ^ x33CCC030;
451     x10 = a4 & ~x332200F0;
452     x11 = x10 ^ x9A646A95;
453     *out2 ^= x11;
454
455     x00333303 = a2 & ~x33CCC030;
456     x118822B8 = x11BB11BB ^ x00333303;
457     xA8208805 = xA9A8AAA5 & ~x118822B8;
458     x3CC3C33C = a3 ^ x33CCCC33;
459     x94E34B39 = xA8208805 ^ x3CC3C33C;
460     x00 = x33BB33FF & ~a4;
461     x01 = x00 ^ x94E34B39;
462     *out1 ^= x01;
463
464     x0331330C = x0302000F ^ x00333303;
465     x3FF3F33C = x3CC3C33C | x0331330C;
466     xA9DF596A = x33BB33FF ^ x9A646A95;
467     xA9DF5F6F = x00000F0F | xA9DF596A;
468     x962CAC53 = x3FF3F33C ^ xA9DF5F6F;
469
470     xA9466A6A = x332200FF ^ x9A646A95;
471     x3DA52153 = x94E34B39 ^ xA9466A6A;
472     x29850143 = xA9DF5F6F & x3DA52153;
473     x33C0330C = x33CC33CC & x3FF3F33C;
474     x1A45324F = x29850143 ^ x33C0330C;
475     x20 = x1A45324F | a4;
476     x21 = x20 ^ x962CAC53;
477     *out3 ^= x21;
478
479     x0A451047 = x1A45324F & ~x118822B8;
480     xBBDFDD7B = x33CCCC33 | xA9DF596A;
481     xB19ACD3C = x0A451047 ^ xBBDFDD7B;
482     x30 = x003311BB | a4;
483     x31 = x30 ^ xB19ACD3C;
484     *out4 ^= x31;
485 }
486
487 static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
488 {
489     u32 x44444444, x0F0FF0F0, x4F4FF4F4, x00FFFF00, x00AAAA00, x4FE55EF4;
490     u32 x3C3CC3C3, x3C3C0000, x7373F4F4, x0C840A00;
491     u32 x00005EF4, x00FF5EFF, x00555455, x3C699796;
492     u32 x000FF000, x55AA55AA, x26D9A15E, x2FDFAF5F, x2FD00F5F;
493     u32 x55AAFFAA, x28410014, x000000FF, x000000CC, x284100D8;
494     u32 x204100D0, x3C3CC3FF, x1C3CC32F, x4969967A;
495     u32 x4CC44CC4, x40C040C0, xC3C33C3C, x9669C396, xD6A98356;
496     u32 xD6E9C3D6, x4CEEEEC4, x9A072D12, x001A000B, x9A1F2D1B;
497     u32 x00, x01, x10, x11, x20, x21, x30, x31;
498
499     x44444444 = a1 & ~a2;
500     x0F0FF0F0 = a3 ^ a6;
501     x4F4FF4F4 = x44444444 | x0F0FF0F0;
502     x00FFFF00 = a4 ^ a6;
503     x00AAAA00 = x00FFFF00 & ~a1;
504     x4FE55EF4 = x4F4FF4F4 ^ x00AAAA00;
505
506     x3C3CC3C3 = a2 ^ x0F0FF0F0;
507     x3C3C0000 = x3C3CC3C3 & ~a6;
508     x7373F4F4 = x4F4FF4F4 ^ x3C3C0000;
509     x0C840A00 = x4FE55EF4 & ~x7373F4F4;
510
511     x00005EF4 = a6 & x4FE55EF4;
512     x00FF5EFF = a4 | x00005EF4;
513     x00555455 = a1 & x00FF5EFF;
514     x3C699796 = x3C3CC3C3 ^ x00555455;
515     x30 = x4FE55EF4 & ~a5;
516     x31 = x30 ^ x3C699796;
517     *out4 ^= x31;
518
519     x000FF000 = x0F0FF0F0 & x00FFFF00;
520     x55AA55AA = a1 ^ a4;
521     x26D9A15E = x7373F4F4 ^ x55AA55AA;
522     x2FDFAF5F = a3 | x26D9A15E;
523     x2FD00F5F = x2FDFAF5F & ~x000FF000;
524
525     x55AAFFAA = x00AAAA00 | x55AA55AA;
526     x28410014 = x3C699796 & ~x55AAFFAA;
527     x000000FF = a4 & a6;
528     x000000CC = x000000FF & ~a2;
529     x284100D8 = x28410014 ^ x000000CC;
530
531     x204100D0 = x7373F4F4 & x284100D8;
532     x3C3CC3FF = x3C3CC3C3 | x000000FF;
533     x1C3CC32F = x3C3CC3FF & ~x204100D0;
534     x4969967A = a1 ^ x1C3CC32F;
535     x10 = x2FD00F5F & a5;
536     x11 = x10 ^ x4969967A;
537     *out2 ^= x11;
538
539     x4CC44CC4 = x4FE55EF4 & ~a2;
540     x40C040C0 = x4CC44CC4 & ~a3;
541     xC3C33C3C = ~x3C3CC3C3;
542     x9669C396 = x55AAFFAA ^ xC3C33C3C;
543     xD6A98356 = x40C040C0 ^ x9669C396;
544     x00 = a5 & ~x0C840A00;
545     x01 = x00 ^ xD6A98356;
546     *out1 ^= x01;
547
548     xD6E9C3D6 = x40C040C0 | x9669C396;
549     x4CEEEEC4 = x00AAAA00 | x4CC44CC4;
550     x9A072D12 = xD6E9C3D6 ^ x4CEEEEC4;
551     x001A000B = a4 & ~x4FE55EF4;
552     x9A1F2D1B = x9A072D12 | x001A000B;
553     x20 = a5 & ~x284100D8;
554     x21 = x20 ^ x9A1F2D1B;
555     *out3 ^= x21;
556 }
557
558 static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
559 {
560     u32 x5A5A5A5A, x0F0FF0F0;
561     u32 x33FF33FF, x33FFCC00, x0C0030F0, x0C0CC0C0, x0CF3C03F, x5EFBDA7F,
562         x52FBCA0F, x61C8F93C;
563     u32 x00C0C03C, x0F0F30C0, x3B92A366, x30908326, x3C90B3D6;
564     u32 x33CC33CC, x0C0CFFFF, x379E5C99, x04124C11, x56E9861E, xA91679E1;
565     u32 x9586CA37, x8402C833, x84C2C83F, xB35C94A6;
566     u32 x00, x01, x10, x11, x20, x21, x30, x31;
567
568     x5A5A5A5A = a1 ^ a3;
569     x0F0FF0F0 = a3 ^ a5;
570     x33FF33FF = a2 | a4;
571     x33FFCC00 = a5 ^ x33FF33FF;
572     x0C0030F0 = x0F0FF0F0 & ~x33FFCC00;
573     x0C0CC0C0 = x0F0FF0F0 & ~a2;
574     x0CF3C03F = a4 ^ x0C0CC0C0;
575     x5EFBDA7F = x5A5A5A5A | x0CF3C03F;
576     x52FBCA0F = x5EFBDA7F & ~x0C0030F0;
577     x61C8F93C = a2 ^ x52FBCA0F;
578
579     x00C0C03C = x0CF3C03F & x61C8F93C;
580     x0F0F30C0 = x0F0FF0F0 & ~x00C0C03C;
581     x3B92A366 = x5A5A5A5A ^ x61C8F93C;
582     x30908326 = x3B92A366 & ~x0F0F30C0;
583     x3C90B3D6 = x0C0030F0 ^ x30908326;
584
585     x33CC33CC = a2 ^ a4;
586     x0C0CFFFF = a5 | x0C0CC0C0;
587     x379E5C99 = x3B92A366 ^ x0C0CFFFF;
588     x04124C11 = x379E5C99 & ~x33CC33CC;
589     x56E9861E = x52FBCA0F ^ x04124C11;
590     x00 = a6 & ~x3C90B3D6;
591     x01 = x00 ^ x56E9861E;
592     *out1 ^= x01;
593
594     xA91679E1 = ~x56E9861E;
595     x10 = x3C90B3D6 & ~a6;
596     x11 = x10 ^ xA91679E1;
597     *out2 ^= x11;
598
599     x9586CA37 = x3C90B3D6 ^ xA91679E1;
600     x8402C833 = x9586CA37 & ~x33CC33CC;
601     x84C2C83F = x00C0C03C | x8402C833;
602     xB35C94A6 = x379E5C99 ^ x84C2C83F;
603     x20 = x61C8F93C | a6;
604     x21 = x20 ^ xB35C94A6;
605     *out3 ^= x21;
606
607     x30 = a6 & x61C8F93C;
608     x31 = x30 ^ xB35C94A6;
609     *out4 ^= x31;
610 }
611
612 static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
613 {
614     u32 x77777777, x77770000, x22225555, x11116666, x1F1F6F6F;
615     u32 x70700000, x43433333, x00430033, x55557777, x55167744, x5A19784B;
616     u32 x5A1987B4, x7A3BD7F5, x003B00F5, x221955A0, x05050707, x271C52A7;
617     u32 x2A2A82A0, x6969B193, x1FE06F90, x16804E00, xE97FB1FF;
618     u32 x43403302, x35CAED30, x37DEFFB7, x349ECCB5, x0B01234A;
619     u32 x101884B4, x0FF8EB24, x41413333, x4FF9FB37, x4FC2FBC2;
620     u32 x22222222, x16BCEE97, x0F080B04, x19B4E593;
621     u32 x5C5C5C5C, x4448184C, x2DDABE71, x6992A63D;
622     u32 x00, x01, x10, x11, x20, x21, x30, x31;
623
624     x77777777 = a1 | a3;
625     x77770000 = x77777777 & ~a6;
626     x22225555 = a1 ^ x77770000;
627     x11116666 = a3 ^ x22225555;
628     x1F1F6F6F = a4 | x11116666;
629
630     x70700000 = x77770000 & ~a4;
631     x43433333 = a3 ^ x70700000;
632     x00430033 = a5 & x43433333;
633     x55557777 = a1 | x11116666;
634     x55167744 = x00430033 ^ x55557777;
635     x5A19784B = a4 ^ x55167744;
636
637     x5A1987B4 = a6 ^ x5A19784B;
638     x7A3BD7F5 = x22225555 | x5A1987B4;
639     x003B00F5 = a5 & x7A3BD7F5;
640     x221955A0 = x22225555 ^ x003B00F5;
641     x05050707 = a4 & x55557777;
642     x271C52A7 = x221955A0 ^ x05050707;
643
644     x2A2A82A0 = x7A3BD7F5 & ~a1;
645     x6969B193 = x43433333 ^ x2A2A82A0;
646     x1FE06F90 = a5 ^ x1F1F6F6F;
647     x16804E00 = x1FE06F90 & ~x6969B193;
648     xE97FB1FF = ~x16804E00;
649     x20 = xE97FB1FF & ~a2;
650     x21 = x20 ^ x5A19784B;
651     *out3 ^= x21;
652
653     x43403302 = x43433333 & ~x003B00F5;
654     x35CAED30 = x2A2A82A0 ^ x1FE06F90;
655     x37DEFFB7 = x271C52A7 | x35CAED30;
656     x349ECCB5 = x37DEFFB7 & ~x43403302;
657     x0B01234A = x1F1F6F6F & ~x349ECCB5;
658
659     x101884B4 = x5A1987B4 & x349ECCB5;
660     x0FF8EB24 = x1FE06F90 ^ x101884B4;
661     x41413333 = x43433333 & x55557777;
662     x4FF9FB37 = x0FF8EB24 | x41413333;
663     x4FC2FBC2 = x003B00F5 ^ x4FF9FB37;
664     x30 = x4FC2FBC2 & a2;
665     x31 = x30 ^ x271C52A7;
666     *out4 ^= x31;
667
668     x22222222 = a1 ^ x77777777;
669     x16BCEE97 = x349ECCB5 ^ x22222222;
670     x0F080B04 = a4 & x0FF8EB24;
671     x19B4E593 = x16BCEE97 ^ x0F080B04;
672     x00 = x0B01234A | a2;
673     x01 = x00 ^ x19B4E593;
674     *out1 ^= x01;
675
676     x5C5C5C5C = x1F1F6F6F ^ x43433333;
677     x4448184C = x5C5C5C5C & ~x19B4E593;
678     x2DDABE71 = x22225555 ^ x0FF8EB24;
679     x6992A63D = x4448184C ^ x2DDABE71;
680     x10 = x1F1F6F6F & a2;
681     x11 = x10 ^ x6992A63D;
682     *out2 ^= x11;
683 }
684
685 static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
686 {
687     u32 x33CC33CC;
688     u32 x3333FFFF, x11115555, x22DD6699, x22DD9966, x00220099;
689     u32 x00551144, x33662277, x5A5A5A5A, x7B7E7A7F, x59A31CE6;
690     u32 x09030C06, x09030000, x336622FF, x3A6522FF;
691     u32 x484D494C, x0000B6B3, x0F0FB9BC, x00FC00F9, x0FFFB9FD;
692     u32 x5DF75DF7, x116600F7, x1E69B94B, x1668B94B;
693     u32 x7B7B7B7B, x411E5984, x1FFFFDFD, x5EE1A479;
694     u32 x3CB4DFD2, x004B002D, xB7B2B6B3, xCCC9CDC8, xCC82CDE5;
695     u32 x0055EEBB, x5A5AECE9, x0050ECA9, xC5CAC1CE, xC59A2D67;
696     u32 x00, x01, x10, x11, x20, x21, x30, x31;
697
698     x33CC33CC = a2 ^ a5;
699
700     x3333FFFF = a2 | a6;
701     x11115555 = a1 & x3333FFFF;
702     x22DD6699 = x33CC33CC ^ x11115555;
703     x22DD9966 = a6 ^ x22DD6699;
704     x00220099 = a5 & ~x22DD9966;
705
706     x00551144 = a1 & x22DD9966;
707     x33662277 = a2 ^ x00551144;
708     x5A5A5A5A = a1 ^ a3;
709     x7B7E7A7F = x33662277 | x5A5A5A5A;
710     x59A31CE6 = x22DD6699 ^ x7B7E7A7F;
711
712     x09030C06 = a3 & x59A31CE6;
713     x09030000 = x09030C06 & ~a6;
714     x336622FF = x00220099 | x33662277;
715     x3A6522FF = x09030000 ^ x336622FF;
716     x30 = x3A6522FF & a4;
717     x31 = x30 ^ x59A31CE6;
718     *out4 ^= x31;
719
720     x484D494C = a2 ^ x7B7E7A7F;
721     x0000B6B3 = a6 & ~x484D494C;
722     x0F0FB9BC = a3 ^ x0000B6B3;
723     x00FC00F9 = a5 & ~x09030C06;
724     x0FFFB9FD = x0F0FB9BC | x00FC00F9;
725
726     x5DF75DF7 = a1 | x59A31CE6;
727     x116600F7 = x336622FF & x5DF75DF7;
728     x1E69B94B = x0F0FB9BC ^ x116600F7;
729     x1668B94B = x1E69B94B & ~x09030000;
730     x20 = x00220099 | a4;
731     x21 = x20 ^ x1668B94B;
732     *out3 ^= x21;
733
734     x7B7B7B7B = a2 | x5A5A5A5A;
735     x411E5984 = x3A6522FF ^ x7B7B7B7B;
736     x1FFFFDFD = x11115555 | x0FFFB9FD;
737     x5EE1A479 = x411E5984 ^ x1FFFFDFD;
738
739     x3CB4DFD2 = x22DD6699 ^ x1E69B94B;
740     x004B002D = a5 & ~x3CB4DFD2;
741     xB7B2B6B3 = ~x484D494C;
742     xCCC9CDC8 = x7B7B7B7B ^ xB7B2B6B3;
743     xCC82CDE5 = x004B002D ^ xCCC9CDC8;
744     x10 = xCC82CDE5 & ~a4;
745     x11 = x10 ^ x5EE1A479;
746     *out2 ^= x11;
747
748     x0055EEBB = a6 ^ x00551144;
749     x5A5AECE9 = a1 ^ x0F0FB9BC;
750     x0050ECA9 = x0055EEBB & x5A5AECE9;
751     xC5CAC1CE = x09030C06 ^ xCCC9CDC8;
752     xC59A2D67 = x0050ECA9 ^ xC5CAC1CE;
753     x00 = x0FFFB9FD & ~a4;
754     x01 = x00 ^ xC59A2D67;
755     *out1 ^= x01;
756 }
757
758 static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
759 {
760     u32 x0FF00FF0, x3CC33CC3, x00003CC3, x0F000F00, x5A555A55, x00001841;
761     u32 x00000F00, x33333C33, x7B777E77, x0FF0F00F, x74878E78;
762     u32 x003C003C, x5A7D5A7D, x333300F0, x694E5A8D;
763     u32 x0FF0CCCC, x000F0303, x5A505854, x33CC000F, x699C585B;
764     u32 x7F878F78, x21101013, x7F979F7B, x30030CC0, x4F9493BB;
765     u32 x6F9CDBFB, x0000DBFB, x00005151, x26DAC936, x26DA9867;
766     u32 x27DA9877, x27DA438C, x2625C9C9, x27FFCBCD;
767     u32 x27FF1036, x27FF103E, xB06B6C44, x97947C7A;
768     u32 x00, x01, x10, x11, x20, x21, x30, x31;
769
770     x0FF00FF0 = a4 ^ a5;
771     x3CC33CC3 = a3 ^ x0FF00FF0;
772     x00003CC3 = a6 & x3CC33CC3;
773     x0F000F00 = a4 & x0FF00FF0;
774     x5A555A55 = a2 ^ x0F000F00;
775     x00001841 = x00003CC3 & x5A555A55;
776
777     x00000F00 = a6 & x0F000F00;
778     x33333C33 = a3 ^ x00000F00;
779     x7B777E77 = x5A555A55 | x33333C33;
780     x0FF0F00F = a6 ^ x0FF00FF0;
781     x74878E78 = x7B777E77 ^ x0FF0F00F;
782     x30 = a1 & ~x00001841;
783     x31 = x30 ^ x74878E78;
784     *out4 ^= x31;
785
786     x003C003C = a5 & ~x3CC33CC3;
787     x5A7D5A7D = x5A555A55 | x003C003C;
788     x333300F0 = x00003CC3 ^ x33333C33;
789     x694E5A8D = x5A7D5A7D ^ x333300F0;
790
791     x0FF0CCCC = x00003CC3 ^ x0FF0F00F;
792     x000F0303 = a4 & ~x0FF0CCCC;
793     x5A505854 = x5A555A55 & ~x000F0303;
794     x33CC000F = a5 ^ x333300F0;
795     x699C585B = x5A505854 ^ x33CC000F;
796
797     x7F878F78 = x0F000F00 | x74878E78;
798     x21101013 = a3 & x699C585B;
799     x7F979F7B = x7F878F78 | x21101013;
800     x30030CC0 = x3CC33CC3 & ~x0FF0F00F;
801     x4F9493BB = x7F979F7B ^ x30030CC0;
802     x00 = x4F9493BB & ~a1;
803     x01 = x00 ^ x694E5A8D;
804     *out1 ^= x01;
805
806     x6F9CDBFB = x699C585B | x4F9493BB;
807     x0000DBFB = a6 & x6F9CDBFB;
808     x00005151 = a2 & x0000DBFB;
809     x26DAC936 = x694E5A8D ^ x4F9493BB;
810     x26DA9867 = x00005151 ^ x26DAC936;
811
812     x27DA9877 = x21101013 | x26DA9867;
813     x27DA438C = x0000DBFB ^ x27DA9877;
814     x2625C9C9 = a5 ^ x26DAC936;
815     x27FFCBCD = x27DA438C | x2625C9C9;
816     x20 = x27FFCBCD & a1;
817     x21 = x20 ^ x699C585B;
818     *out3 ^= x21;
819
820     x27FF1036 = x0000DBFB ^ x27FFCBCD;
821     x27FF103E = x003C003C | x27FF1036;
822     xB06B6C44 = ~x4F9493BB;
823     x97947C7A = x27FF103E ^ xB06B6C44;
824     x10 = x97947C7A & ~a1;
825     x11 = x10 ^ x26DA9867;
826     *out2 ^= x11;
827 }
828
829 static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
830 {
831     u32 x0C0C0C0C, x0000F0F0, x00FFF00F, x00555005, x00515001;
832     u32 x33000330, x77555775, x30303030, x3030CFCF, x30104745, x30555745;
833     u32 xFF000FF0, xCF1048B5, x080A080A, xC71A40BF, xCB164CB3;
834     u32 x9E4319E6, x000019E6, xF429738C, xF4296A6A, xC729695A;
835     u32 xC47C3D2F, xF77F3F3F, x9E43E619, x693CD926;
836     u32 xF719A695, xF4FF73FF, x03E6D56A, x56B3803F;
837     u32 xF700A600, x61008000, x03B7856B, x62B7056B;
838     u32 x00, x01, x10, x11, x20, x21, x30, x31;
839
840     x0C0C0C0C = a3 & ~a2;
841     x0000F0F0 = a5 & ~a3;
842     x00FFF00F = a4 ^ x0000F0F0;
843     x00555005 = a1 & x00FFF00F;
844     x00515001 = x00555005 & ~x0C0C0C0C;
845
846     x33000330 = a2 & ~x00FFF00F;
847     x77555775 = a1 | x33000330;
848     x30303030 = a2 & ~a3;
849     x3030CFCF = a5 ^ x30303030;
850     x30104745 = x77555775 & x3030CFCF;
851     x30555745 = x00555005 | x30104745;
852
853     xFF000FF0 = ~x00FFF00F;
854     xCF1048B5 = x30104745 ^ xFF000FF0;
855     x080A080A = a3 & ~x77555775;
856     xC71A40BF = xCF1048B5 ^ x080A080A;
857     xCB164CB3 = x0C0C0C0C ^ xC71A40BF;
858     x10 = x00515001 | a6;
859     x11 = x10 ^ xCB164CB3;
860     *out2 ^= x11;
861
862     x9E4319E6 = a1 ^ xCB164CB3;
863     x000019E6 = a5 & x9E4319E6;
864     xF429738C = a2 ^ xC71A40BF;
865     xF4296A6A = x000019E6 ^ xF429738C;
866     xC729695A = x33000330 ^ xF4296A6A;
867
868     xC47C3D2F = x30555745 ^ xF4296A6A;
869     xF77F3F3F = a2 | xC47C3D2F;
870     x9E43E619 = a5 ^ x9E4319E6;
871     x693CD926 = xF77F3F3F ^ x9E43E619;
872     x20 = x30555745 & a6;
873     x21 = x20 ^ x693CD926;
874     *out3 ^= x21;
875
876     xF719A695 = x3030CFCF ^ xC729695A;
877     xF4FF73FF = a4 | xF429738C;
878     x03E6D56A = xF719A695 ^ xF4FF73FF;
879     x56B3803F = a1 ^ x03E6D56A;
880     x30 = x56B3803F & a6;
881     x31 = x30 ^ xC729695A;
882     *out4 ^= x31;
883
884     xF700A600 = xF719A695 & ~a4;
885     x61008000 = x693CD926 & xF700A600;
886     x03B7856B = x00515001 ^ x03E6D56A;
887     x62B7056B = x61008000 ^ x03B7856B;
888     x00 = x62B7056B | a6;
889     x01 = x00 ^ xC729695A;
890     *out1 ^= x01;
891 }
892
893 #endif
894 #endif
895
896 #if defined IS_AMD || defined IS_GENERIC
897
898 /*
899  * Bitslice DES S-boxes for x86 with MMX/SSE2/AVX and for typical RISC
900  * architectures.  These use AND, OR, XOR, NOT, and AND-NOT gates.
901  *
902  * Gate counts: 49 44 46 33 48 46 46 41
903  * Average: 44.125
904  *
905  * Several same-gate-count expressions for each S-box are included (for use on
906  * different CPUs/GPUs).
907  *
908  * These Boolean expressions corresponding to DES S-boxes have been generated
909  * by Roman Rusakov <roman_rus at openwall.com> for use in Openwall's
910  * John the Ripper password cracker: http://www.openwall.com/john/
911  * Being mathematical formulas, they are not copyrighted and are free for reuse
912  * by anyone.
913  *
914  * This file (a specific representation of the S-box expressions, surrounding
915  * logic) is Copyright (c) 2011 by Solar Designer <solar at openwall.com>.
916  * Redistribution and use in source and binary forms, with or without
917  * modification, are permitted.  (This is a heavily cut-down "BSD license".)
918  *
919  * The effort has been sponsored by Rapid7: http://www.rapid7.com
920  */
921
922 static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
923 {
924     u32 x55005500, x5A0F5A0F, x3333FFFF, x66666666, x22226666, x2D2D6969,
925         x25202160;
926     u32 x00FFFF00, x33CCCC33, x4803120C, x2222FFFF, x6A21EDF3, x4A01CC93;
927     u32 x5555FFFF, x7F75FFFF, x00D20096, x7FA7FF69;
928     u32 x0A0A0000, x0AD80096, x00999900, x0AD99996;
929     u32 x22332233, x257AA5F0, x054885C0, xFAB77A3F, x2221EDF3, xD89697CC;
930     u32 x05B77AC0, x05F77AD6, x36C48529, x6391D07C, xBB0747B0;
931     u32 x4C460000, x4EDF9996, x2D4E49EA, xBBFFFFB0, x96B1B65A;
932     u32 x5AFF5AFF, x52B11215, x4201C010, x10B0D205;
933     u32 x00, x01, x10, x11, x20, x21, x30, x31;
934
935     x55005500 = a1 & ~a5;
936     x5A0F5A0F = a4 ^ x55005500;
937     x3333FFFF = a3 | a6;
938     x66666666 = a1 ^ a3;
939     x22226666 = x3333FFFF & x66666666;
940     x2D2D6969 = a4 ^ x22226666;
941     x25202160 = x2D2D6969 & ~x5A0F5A0F;
942
943     x00FFFF00 = a5 ^ a6;
944     x33CCCC33 = a3 ^ x00FFFF00;
945     x4803120C = x5A0F5A0F & ~x33CCCC33;
946     x2222FFFF = a6 | x22226666;
947     x6A21EDF3 = x4803120C ^ x2222FFFF;
948     x4A01CC93 = x6A21EDF3 & ~x25202160;
949
950     x5555FFFF = a1 | a6;
951     x7F75FFFF = x6A21EDF3 | x5555FFFF;
952     x00D20096 = a5 & ~x2D2D6969;
953     x7FA7FF69 = x7F75FFFF ^ x00D20096;
954
955     x0A0A0000 = a4 & ~x5555FFFF;
956     x0AD80096 = x00D20096 ^ x0A0A0000;
957     x00999900 = x00FFFF00 & ~x66666666;
958     x0AD99996 = x0AD80096 | x00999900;
959
960     x22332233 = a3 & ~x55005500;
961     x257AA5F0 = x5A0F5A0F ^ x7F75FFFF;
962     x054885C0 = x257AA5F0 & ~x22332233;
963     xFAB77A3F = ~x054885C0;
964     x2221EDF3 = x3333FFFF & x6A21EDF3;
965     xD89697CC = xFAB77A3F ^ x2221EDF3;
966     x20 = x7FA7FF69 & ~a2;
967     x21 = x20 ^ xD89697CC;
968     *out3 ^= x21;
969
970     x05B77AC0 = x00FFFF00 ^ x054885C0;
971     x05F77AD6 = x00D20096 | x05B77AC0;
972     x36C48529 = x3333FFFF ^ x05F77AD6;
973     x6391D07C = a1 ^ x36C48529;
974     xBB0747B0 = xD89697CC ^ x6391D07C;
975     x00 = x25202160 | a2;
976     x01 = x00 ^ xBB0747B0;
977     *out1 ^= x01;
978
979     x4C460000 = x3333FFFF ^ x7F75FFFF;
980     x4EDF9996 = x0AD99996 | x4C460000;
981     x2D4E49EA = x6391D07C ^ x4EDF9996;
982     xBBFFFFB0 = x00FFFF00 | xBB0747B0;
983     x96B1B65A = x2D4E49EA ^ xBBFFFFB0;
984     x10 = x4A01CC93 | a2;
985     x11 = x10 ^ x96B1B65A;
986     *out2 ^= x11;
987
988     x5AFF5AFF = a5 | x5A0F5A0F;
989     x52B11215 = x5AFF5AFF & ~x2D4E49EA;
990     x4201C010 = x4A01CC93 & x6391D07C;
991     x10B0D205 = x52B11215 ^ x4201C010;
992     x30 = x10B0D205 | a2;
993     x31 = x30 ^ x0AD99996;
994     *out4 ^= x31;
995 }
996
997 static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
998 {
999     u32 x33CC33CC;
1000     u32 x55550000, x00AA00FF, x33BB33FF;
1001     u32 x33CC0000, x11441144, x11BB11BB, x003311BB;
1002     u32 x00000F0F, x336600FF, x332200FF, x332200F0;
1003     u32 x0302000F, xAAAAAAAA, xA9A8AAA5, x33CCCC33, x33CCC030, x9A646A95;
1004     u32 x00333303, x118822B8, xA8208805, x3CC3C33C, x94E34B39;
1005     u32 x0331330C, x3FF3F33C, xA9DF596A, xA9DF5F6F, x962CAC53;
1006     u32 xA9466A6A, x3DA52153, x29850143, x33C0330C, x1A45324F;
1007     u32 x0A451047, xBBDFDD7B, xB19ACD3C;
1008     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1009
1010     x33CC33CC = a2 ^ a5;
1011
1012     x55550000 = a1 & ~a6;
1013     x00AA00FF = a5 & ~x55550000;
1014     x33BB33FF = a2 | x00AA00FF;
1015
1016     x33CC0000 = x33CC33CC & ~a6;
1017     x11441144 = a1 & x33CC33CC;
1018     x11BB11BB = a5 ^ x11441144;
1019     x003311BB = x11BB11BB & ~x33CC0000;
1020
1021     x00000F0F = a3 & a6;
1022     x336600FF = x00AA00FF ^ x33CC0000;
1023     x332200FF = x33BB33FF & x336600FF;
1024     x332200F0 = x332200FF & ~x00000F0F;
1025
1026     x0302000F = a3 & x332200FF;
1027     xAAAAAAAA = ~a1;
1028     xA9A8AAA5 = x0302000F ^ xAAAAAAAA;
1029     x33CCCC33 = a6 ^ x33CC33CC;
1030     x33CCC030 = x33CCCC33 & ~x00000F0F;
1031     x9A646A95 = xA9A8AAA5 ^ x33CCC030;
1032     x10 = a4 & ~x332200F0;
1033     x11 = x10 ^ x9A646A95;
1034     *out2 ^= x11;
1035
1036     x00333303 = a2 & ~x33CCC030;
1037     x118822B8 = x11BB11BB ^ x00333303;
1038     xA8208805 = xA9A8AAA5 & ~x118822B8;
1039     x3CC3C33C = a3 ^ x33CCCC33;
1040     x94E34B39 = xA8208805 ^ x3CC3C33C;
1041     x00 = x33BB33FF & ~a4;
1042     x01 = x00 ^ x94E34B39;
1043     *out1 ^= x01;
1044
1045     x0331330C = x0302000F ^ x00333303;
1046     x3FF3F33C = x3CC3C33C | x0331330C;
1047     xA9DF596A = x33BB33FF ^ x9A646A95;
1048     xA9DF5F6F = x00000F0F | xA9DF596A;
1049     x962CAC53 = x3FF3F33C ^ xA9DF5F6F;
1050
1051     xA9466A6A = x332200FF ^ x9A646A95;
1052     x3DA52153 = x94E34B39 ^ xA9466A6A;
1053     x29850143 = xA9DF5F6F & x3DA52153;
1054     x33C0330C = x33CC33CC & x3FF3F33C;
1055     x1A45324F = x29850143 ^ x33C0330C;
1056     x20 = x1A45324F | a4;
1057     x21 = x20 ^ x962CAC53;
1058     *out3 ^= x21;
1059
1060     x0A451047 = x1A45324F & ~x118822B8;
1061     xBBDFDD7B = x33CCCC33 | xA9DF596A;
1062     xB19ACD3C = x0A451047 ^ xBBDFDD7B;
1063     x30 = x003311BB | a4;
1064     x31 = x30 ^ xB19ACD3C;
1065     *out4 ^= x31;
1066 }
1067
1068 static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1069 {
1070     u32 x44444444, x0F0FF0F0, x4F4FF4F4, x00FFFF00, x00AAAA00, x4FE55EF4;
1071     u32 x3C3CC3C3, x3C3C0000, x7373F4F4, x0C840A00;
1072     u32 x00005EF4, x00FF5EFF, x00555455, x3C699796;
1073     u32 x000FF000, x55AA55AA, x26D9A15E, x2FDFAF5F, x2FD00F5F;
1074     u32 x55AAFFAA, x28410014, x000000FF, x000000CC, x284100D8;
1075     u32 x204100D0, x3C3CC3FF, x1C3CC32F, x4969967A;
1076     u32 x4CC44CC4, x40C040C0, xC3C33C3C, x9669C396, xD6A98356;
1077     u32 xD6E9C3D6, x4CEEEEC4, x9A072D12, x001A000B, x9A1F2D1B;
1078     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1079
1080     x44444444 = a1 & ~a2;
1081     x0F0FF0F0 = a3 ^ a6;
1082     x4F4FF4F4 = x44444444 | x0F0FF0F0;
1083     x00FFFF00 = a4 ^ a6;
1084     x00AAAA00 = x00FFFF00 & ~a1;
1085     x4FE55EF4 = x4F4FF4F4 ^ x00AAAA00;
1086
1087     x3C3CC3C3 = a2 ^ x0F0FF0F0;
1088     x3C3C0000 = x3C3CC3C3 & ~a6;
1089     x7373F4F4 = x4F4FF4F4 ^ x3C3C0000;
1090     x0C840A00 = x4FE55EF4 & ~x7373F4F4;
1091
1092     x00005EF4 = a6 & x4FE55EF4;
1093     x00FF5EFF = a4 | x00005EF4;
1094     x00555455 = a1 & x00FF5EFF;
1095     x3C699796 = x3C3CC3C3 ^ x00555455;
1096     x30 = x4FE55EF4 & ~a5;
1097     x31 = x30 ^ x3C699796;
1098     *out4 ^= x31;
1099
1100     x000FF000 = x0F0FF0F0 & x00FFFF00;
1101     x55AA55AA = a1 ^ a4;
1102     x26D9A15E = x7373F4F4 ^ x55AA55AA;
1103     x2FDFAF5F = a3 | x26D9A15E;
1104     x2FD00F5F = x2FDFAF5F & ~x000FF000;
1105
1106     x55AAFFAA = x00AAAA00 | x55AA55AA;
1107     x28410014 = x3C699796 & ~x55AAFFAA;
1108     x000000FF = a4 & a6;
1109     x000000CC = x000000FF & ~a2;
1110     x284100D8 = x28410014 ^ x000000CC;
1111
1112     x204100D0 = x7373F4F4 & x284100D8;
1113     x3C3CC3FF = x3C3CC3C3 | x000000FF;
1114     x1C3CC32F = x3C3CC3FF & ~x204100D0;
1115     x4969967A = a1 ^ x1C3CC32F;
1116     x10 = x2FD00F5F & a5;
1117     x11 = x10 ^ x4969967A;
1118     *out2 ^= x11;
1119
1120     x4CC44CC4 = x4FE55EF4 & ~a2;
1121     x40C040C0 = x4CC44CC4 & ~a3;
1122     xC3C33C3C = ~x3C3CC3C3;
1123     x9669C396 = x55AAFFAA ^ xC3C33C3C;
1124     xD6A98356 = x40C040C0 ^ x9669C396;
1125     x00 = a5 & ~x0C840A00;
1126     x01 = x00 ^ xD6A98356;
1127     *out1 ^= x01;
1128
1129     xD6E9C3D6 = x40C040C0 | x9669C396;
1130     x4CEEEEC4 = x00AAAA00 | x4CC44CC4;
1131     x9A072D12 = xD6E9C3D6 ^ x4CEEEEC4;
1132     x001A000B = a4 & ~x4FE55EF4;
1133     x9A1F2D1B = x9A072D12 | x001A000B;
1134     x20 = a5 & ~x284100D8;
1135     x21 = x20 ^ x9A1F2D1B;
1136     *out3 ^= x21;
1137 }
1138
1139 static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1140 {
1141     u32 x5A5A5A5A, x0F0FF0F0;
1142     u32 x33FF33FF, x33FFCC00, x0C0030F0, x0C0CC0C0, x0CF3C03F, x5EFBDA7F,
1143         x52FBCA0F, x61C8F93C;
1144     u32 x00C0C03C, x0F0F30C0, x3B92A366, x30908326, x3C90B3D6;
1145     u32 x33CC33CC, x0C0CFFFF, x379E5C99, x04124C11, x56E9861E, xA91679E1;
1146     u32 x9586CA37, x8402C833, x84C2C83F, xB35C94A6;
1147     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1148
1149     x5A5A5A5A = a1 ^ a3;
1150     x0F0FF0F0 = a3 ^ a5;
1151     x33FF33FF = a2 | a4;
1152     x33FFCC00 = a5 ^ x33FF33FF;
1153     x0C0030F0 = x0F0FF0F0 & ~x33FFCC00;
1154     x0C0CC0C0 = x0F0FF0F0 & ~a2;
1155     x0CF3C03F = a4 ^ x0C0CC0C0;
1156     x5EFBDA7F = x5A5A5A5A | x0CF3C03F;
1157     x52FBCA0F = x5EFBDA7F & ~x0C0030F0;
1158     x61C8F93C = a2 ^ x52FBCA0F;
1159
1160     x00C0C03C = x0CF3C03F & x61C8F93C;
1161     x0F0F30C0 = x0F0FF0F0 & ~x00C0C03C;
1162     x3B92A366 = x5A5A5A5A ^ x61C8F93C;
1163     x30908326 = x3B92A366 & ~x0F0F30C0;
1164     x3C90B3D6 = x0C0030F0 ^ x30908326;
1165
1166     x33CC33CC = a2 ^ a4;
1167     x0C0CFFFF = a5 | x0C0CC0C0;
1168     x379E5C99 = x3B92A366 ^ x0C0CFFFF;
1169     x04124C11 = x379E5C99 & ~x33CC33CC;
1170     x56E9861E = x52FBCA0F ^ x04124C11;
1171     x00 = a6 & ~x3C90B3D6;
1172     x01 = x00 ^ x56E9861E;
1173     *out1 ^= x01;
1174
1175     xA91679E1 = ~x56E9861E;
1176     x10 = x3C90B3D6 & ~a6;
1177     x11 = x10 ^ xA91679E1;
1178     *out2 ^= x11;
1179
1180     x9586CA37 = x3C90B3D6 ^ xA91679E1;
1181     x8402C833 = x9586CA37 & ~x33CC33CC;
1182     x84C2C83F = x00C0C03C | x8402C833;
1183     xB35C94A6 = x379E5C99 ^ x84C2C83F;
1184     x20 = x61C8F93C | a6;
1185     x21 = x20 ^ xB35C94A6;
1186     *out3 ^= x21;
1187
1188     x30 = a6 & x61C8F93C;
1189     x31 = x30 ^ xB35C94A6;
1190     *out4 ^= x31;
1191 }
1192
1193 static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1194 {
1195     u32 x77777777, x77770000, x22225555, x11116666, x1F1F6F6F;
1196     u32 x70700000, x43433333, x00430033, x55557777, x55167744, x5A19784B;
1197     u32 x5A1987B4, x7A3BD7F5, x003B00F5, x221955A0, x05050707, x271C52A7;
1198     u32 x2A2A82A0, x6969B193, x1FE06F90, x16804E00, xE97FB1FF;
1199     u32 x43403302, x35CAED30, x37DEFFB7, x349ECCB5, x0B01234A;
1200     u32 x101884B4, x0FF8EB24, x41413333, x4FF9FB37, x4FC2FBC2;
1201     u32 x22222222, x16BCEE97, x0F080B04, x19B4E593;
1202     u32 x5C5C5C5C, x4448184C, x2DDABE71, x6992A63D;
1203     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1204
1205     x77777777 = a1 | a3;
1206     x77770000 = x77777777 & ~a6;
1207     x22225555 = a1 ^ x77770000;
1208     x11116666 = a3 ^ x22225555;
1209     x1F1F6F6F = a4 | x11116666;
1210
1211     x70700000 = x77770000 & ~a4;
1212     x43433333 = a3 ^ x70700000;
1213     x00430033 = a5 & x43433333;
1214     x55557777 = a1 | x11116666;
1215     x55167744 = x00430033 ^ x55557777;
1216     x5A19784B = a4 ^ x55167744;
1217
1218     x5A1987B4 = a6 ^ x5A19784B;
1219     x7A3BD7F5 = x22225555 | x5A1987B4;
1220     x003B00F5 = a5 & x7A3BD7F5;
1221     x221955A0 = x22225555 ^ x003B00F5;
1222     x05050707 = a4 & x55557777;
1223     x271C52A7 = x221955A0 ^ x05050707;
1224
1225     x2A2A82A0 = x7A3BD7F5 & ~a1;
1226     x6969B193 = x43433333 ^ x2A2A82A0;
1227     x1FE06F90 = a5 ^ x1F1F6F6F;
1228     x16804E00 = x1FE06F90 & ~x6969B193;
1229     xE97FB1FF = ~x16804E00;
1230     x20 = xE97FB1FF & ~a2;
1231     x21 = x20 ^ x5A19784B;
1232     *out3 ^= x21;
1233
1234     x43403302 = x43433333 & ~x003B00F5;
1235     x35CAED30 = x2A2A82A0 ^ x1FE06F90;
1236     x37DEFFB7 = x271C52A7 | x35CAED30;
1237     x349ECCB5 = x37DEFFB7 & ~x43403302;
1238     x0B01234A = x1F1F6F6F & ~x349ECCB5;
1239
1240     x101884B4 = x5A1987B4 & x349ECCB5;
1241     x0FF8EB24 = x1FE06F90 ^ x101884B4;
1242     x41413333 = x43433333 & x55557777;
1243     x4FF9FB37 = x0FF8EB24 | x41413333;
1244     x4FC2FBC2 = x003B00F5 ^ x4FF9FB37;
1245     x30 = x4FC2FBC2 & a2;
1246     x31 = x30 ^ x271C52A7;
1247     *out4 ^= x31;
1248
1249     x22222222 = a1 ^ x77777777;
1250     x16BCEE97 = x349ECCB5 ^ x22222222;
1251     x0F080B04 = a4 & x0FF8EB24;
1252     x19B4E593 = x16BCEE97 ^ x0F080B04;
1253     x00 = x0B01234A | a2;
1254     x01 = x00 ^ x19B4E593;
1255     *out1 ^= x01;
1256
1257     x5C5C5C5C = x1F1F6F6F ^ x43433333;
1258     x4448184C = x5C5C5C5C & ~x19B4E593;
1259     x2DDABE71 = x22225555 ^ x0FF8EB24;
1260     x6992A63D = x4448184C ^ x2DDABE71;
1261     x10 = x1F1F6F6F & a2;
1262     x11 = x10 ^ x6992A63D;
1263     *out2 ^= x11;
1264 }
1265
1266 static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1267 {
1268     u32 x33CC33CC;
1269     u32 x3333FFFF, x11115555, x22DD6699, x22DD9966, x00220099;
1270     u32 x00551144, x33662277, x5A5A5A5A, x7B7E7A7F, x59A31CE6;
1271     u32 x09030C06, x09030000, x336622FF, x3A6522FF;
1272     u32 x484D494C, x0000B6B3, x0F0FB9BC, x00FC00F9, x0FFFB9FD;
1273     u32 x5DF75DF7, x116600F7, x1E69B94B, x1668B94B;
1274     u32 x7B7B7B7B, x411E5984, x1FFFFDFD, x5EE1A479;
1275     u32 x3CB4DFD2, x004B002D, xB7B2B6B3, xCCC9CDC8, xCC82CDE5;
1276     u32 x0055EEBB, x5A5AECE9, x0050ECA9, xC5CAC1CE, xC59A2D67;
1277     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1278
1279     x33CC33CC = a2 ^ a5;
1280
1281     x3333FFFF = a2 | a6;
1282     x11115555 = a1 & x3333FFFF;
1283     x22DD6699 = x33CC33CC ^ x11115555;
1284     x22DD9966 = a6 ^ x22DD6699;
1285     x00220099 = a5 & ~x22DD9966;
1286
1287     x00551144 = a1 & x22DD9966;
1288     x33662277 = a2 ^ x00551144;
1289     x5A5A5A5A = a1 ^ a3;
1290     x7B7E7A7F = x33662277 | x5A5A5A5A;
1291     x59A31CE6 = x22DD6699 ^ x7B7E7A7F;
1292
1293     x09030C06 = a3 & x59A31CE6;
1294     x09030000 = x09030C06 & ~a6;
1295     x336622FF = x00220099 | x33662277;
1296     x3A6522FF = x09030000 ^ x336622FF;
1297     x30 = x3A6522FF & a4;
1298     x31 = x30 ^ x59A31CE6;
1299     *out4 ^= x31;
1300
1301     x484D494C = a2 ^ x7B7E7A7F;
1302     x0000B6B3 = a6 & ~x484D494C;
1303     x0F0FB9BC = a3 ^ x0000B6B3;
1304     x00FC00F9 = a5 & ~x09030C06;
1305     x0FFFB9FD = x0F0FB9BC | x00FC00F9;
1306
1307     x5DF75DF7 = a1 | x59A31CE6;
1308     x116600F7 = x336622FF & x5DF75DF7;
1309     x1E69B94B = x0F0FB9BC ^ x116600F7;
1310     x1668B94B = x1E69B94B & ~x09030000;
1311     x20 = x00220099 | a4;
1312     x21 = x20 ^ x1668B94B;
1313     *out3 ^= x21;
1314
1315     x7B7B7B7B = a2 | x5A5A5A5A;
1316     x411E5984 = x3A6522FF ^ x7B7B7B7B;
1317     x1FFFFDFD = x11115555 | x0FFFB9FD;
1318     x5EE1A479 = x411E5984 ^ x1FFFFDFD;
1319
1320     x3CB4DFD2 = x22DD6699 ^ x1E69B94B;
1321     x004B002D = a5 & ~x3CB4DFD2;
1322     xB7B2B6B3 = ~x484D494C;
1323     xCCC9CDC8 = x7B7B7B7B ^ xB7B2B6B3;
1324     xCC82CDE5 = x004B002D ^ xCCC9CDC8;
1325     x10 = xCC82CDE5 & ~a4;
1326     x11 = x10 ^ x5EE1A479;
1327     *out2 ^= x11;
1328
1329     x0055EEBB = a6 ^ x00551144;
1330     x5A5AECE9 = a1 ^ x0F0FB9BC;
1331     x0050ECA9 = x0055EEBB & x5A5AECE9;
1332     xC5CAC1CE = x09030C06 ^ xCCC9CDC8;
1333     xC59A2D67 = x0050ECA9 ^ xC5CAC1CE;
1334     x00 = x0FFFB9FD & ~a4;
1335     x01 = x00 ^ xC59A2D67;
1336     *out1 ^= x01;
1337 }
1338
1339 static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1340 {
1341     u32 x0FF00FF0, x3CC33CC3, x00003CC3, x0F000F00, x5A555A55, x00001841;
1342     u32 x00000F00, x33333C33, x7B777E77, x0FF0F00F, x74878E78;
1343     u32 x003C003C, x5A7D5A7D, x333300F0, x694E5A8D;
1344     u32 x0FF0CCCC, x000F0303, x5A505854, x33CC000F, x699C585B;
1345     u32 x7F878F78, x21101013, x7F979F7B, x30030CC0, x4F9493BB;
1346     u32 x6F9CDBFB, x0000DBFB, x00005151, x26DAC936, x26DA9867;
1347     u32 x27DA9877, x27DA438C, x2625C9C9, x27FFCBCD;
1348     u32 x27FF1036, x27FF103E, xB06B6C44, x97947C7A;
1349     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1350
1351     x0FF00FF0 = a4 ^ a5;
1352     x3CC33CC3 = a3 ^ x0FF00FF0;
1353     x00003CC3 = a6 & x3CC33CC3;
1354     x0F000F00 = a4 & x0FF00FF0;
1355     x5A555A55 = a2 ^ x0F000F00;
1356     x00001841 = x00003CC3 & x5A555A55;
1357
1358     x00000F00 = a6 & x0F000F00;
1359     x33333C33 = a3 ^ x00000F00;
1360     x7B777E77 = x5A555A55 | x33333C33;
1361     x0FF0F00F = a6 ^ x0FF00FF0;
1362     x74878E78 = x7B777E77 ^ x0FF0F00F;
1363     x30 = a1 & ~x00001841;
1364     x31 = x30 ^ x74878E78;
1365     *out4 ^= x31;
1366
1367     x003C003C = a5 & ~x3CC33CC3;
1368     x5A7D5A7D = x5A555A55 | x003C003C;
1369     x333300F0 = x00003CC3 ^ x33333C33;
1370     x694E5A8D = x5A7D5A7D ^ x333300F0;
1371
1372     x0FF0CCCC = x00003CC3 ^ x0FF0F00F;
1373     x000F0303 = a4 & ~x0FF0CCCC;
1374     x5A505854 = x5A555A55 & ~x000F0303;
1375     x33CC000F = a5 ^ x333300F0;
1376     x699C585B = x5A505854 ^ x33CC000F;
1377
1378     x7F878F78 = x0F000F00 | x74878E78;
1379     x21101013 = a3 & x699C585B;
1380     x7F979F7B = x7F878F78 | x21101013;
1381     x30030CC0 = x3CC33CC3 & ~x0FF0F00F;
1382     x4F9493BB = x7F979F7B ^ x30030CC0;
1383     x00 = x4F9493BB & ~a1;
1384     x01 = x00 ^ x694E5A8D;
1385     *out1 ^= x01;
1386
1387     x6F9CDBFB = x699C585B | x4F9493BB;
1388     x0000DBFB = a6 & x6F9CDBFB;
1389     x00005151 = a2 & x0000DBFB;
1390     x26DAC936 = x694E5A8D ^ x4F9493BB;
1391     x26DA9867 = x00005151 ^ x26DAC936;
1392
1393     x27DA9877 = x21101013 | x26DA9867;
1394     x27DA438C = x0000DBFB ^ x27DA9877;
1395     x2625C9C9 = a5 ^ x26DAC936;
1396     x27FFCBCD = x27DA438C | x2625C9C9;
1397     x20 = x27FFCBCD & a1;
1398     x21 = x20 ^ x699C585B;
1399     *out3 ^= x21;
1400
1401     x27FF1036 = x0000DBFB ^ x27FFCBCD;
1402     x27FF103E = x003C003C | x27FF1036;
1403     xB06B6C44 = ~x4F9493BB;
1404     x97947C7A = x27FF103E ^ xB06B6C44;
1405     x10 = x97947C7A & ~a1;
1406     x11 = x10 ^ x26DA9867;
1407     *out2 ^= x11;
1408 }
1409
1410 static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4)
1411 {
1412     u32 x0C0C0C0C, x0000F0F0, x00FFF00F, x00555005, x00515001;
1413     u32 x33000330, x77555775, x30303030, x3030CFCF, x30104745, x30555745;
1414     u32 xFF000FF0, xCF1048B5, x080A080A, xC71A40BF, xCB164CB3;
1415     u32 x9E4319E6, x000019E6, xF429738C, xF4296A6A, xC729695A;
1416     u32 xC47C3D2F, xF77F3F3F, x9E43E619, x693CD926;
1417     u32 xF719A695, xF4FF73FF, x03E6D56A, x56B3803F;
1418     u32 xF700A600, x61008000, x03B7856B, x62B7056B;
1419     u32 x00, x01, x10, x11, x20, x21, x30, x31;
1420
1421     x0C0C0C0C = a3 & ~a2;
1422     x0000F0F0 = a5 & ~a3;
1423     x00FFF00F = a4 ^ x0000F0F0;
1424     x00555005 = a1 & x00FFF00F;
1425     x00515001 = x00555005 & ~x0C0C0C0C;
1426
1427     x33000330 = a2 & ~x00FFF00F;
1428     x77555775 = a1 | x33000330;
1429     x30303030 = a2 & ~a3;
1430     x3030CFCF = a5 ^ x30303030;
1431     x30104745 = x77555775 & x3030CFCF;
1432     x30555745 = x00555005 | x30104745;
1433
1434     xFF000FF0 = ~x00FFF00F;
1435     xCF1048B5 = x30104745 ^ xFF000FF0;
1436     x080A080A = a3 & ~x77555775;
1437     xC71A40BF = xCF1048B5 ^ x080A080A;
1438     xCB164CB3 = x0C0C0C0C ^ xC71A40BF;
1439     x10 = x00515001 | a6;
1440     x11 = x10 ^ xCB164CB3;
1441     *out2 ^= x11;
1442
1443     x9E4319E6 = a1 ^ xCB164CB3;
1444     x000019E6 = a5 & x9E4319E6;
1445     xF429738C = a2 ^ xC71A40BF;
1446     xF4296A6A = x000019E6 ^ xF429738C;
1447     xC729695A = x33000330 ^ xF4296A6A;
1448
1449     xC47C3D2F = x30555745 ^ xF4296A6A;
1450     xF77F3F3F = a2 | xC47C3D2F;
1451     x9E43E619 = a5 ^ x9E4319E6;
1452     x693CD926 = xF77F3F3F ^ x9E43E619;
1453     x20 = x30555745 & a6;
1454     x21 = x20 ^ x693CD926;
1455     *out3 ^= x21;
1456
1457     xF719A695 = x3030CFCF ^ xC729695A;
1458     xF4FF73FF = a4 | xF429738C;
1459     x03E6D56A = xF719A695 ^ xF4FF73FF;
1460     x56B3803F = a1 ^ x03E6D56A;
1461     x30 = x56B3803F & a6;
1462     x31 = x30 ^ xC729695A;
1463     *out4 ^= x31;
1464
1465     xF700A600 = xF719A695 & ~a4;
1466     x61008000 = x693CD926 & xF700A600;
1467     x03B7856B = x00515001 ^ x03E6D56A;
1468     x62B7056B = x61008000 ^ x03B7856B;
1469     x00 = x62B7056B | a6;
1470     x01 = x00 ^ xC729695A;
1471     *out1 ^= x01;
1472 }
1473
1474 #endif
1475
1476 #define SWAP(a, b) { u32 tmp=*a;*a=*b;*b=tmp; }
1477
1478 #define DATASWAP  \
1479   SWAP(D00, D32); \
1480   SWAP(D01, D33); \
1481   SWAP(D02, D34); \
1482   SWAP(D03, D35); \
1483   SWAP(D04, D36); \
1484   SWAP(D05, D37); \
1485   SWAP(D06, D38); \
1486   SWAP(D07, D39); \
1487   SWAP(D08, D40); \
1488   SWAP(D09, D41); \
1489   SWAP(D10, D42); \
1490   SWAP(D11, D43); \
1491   SWAP(D12, D44); \
1492   SWAP(D13, D45); \
1493   SWAP(D14, D46); \
1494   SWAP(D15, D47); \
1495   SWAP(D16, D48); \
1496   SWAP(D17, D49); \
1497   SWAP(D18, D50); \
1498   SWAP(D19, D51); \
1499   SWAP(D20, D52); \
1500   SWAP(D21, D53); \
1501   SWAP(D22, D54); \
1502   SWAP(D23, D55); \
1503   SWAP(D24, D56); \
1504   SWAP(D25, D57); \
1505   SWAP(D26, D58); \
1506   SWAP(D27, D59); \
1507   SWAP(D28, D60); \
1508   SWAP(D29, D61); \
1509   SWAP(D30, D62); \
1510   SWAP(D31, D63);
1511
1512 #define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; }
1513 #define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; }
1514 #define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; }
1515 #define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; }
1516 #define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; }
1517 #define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; }
1518 #define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; }
1519 #define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; }
1520 #define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; }
1521 #define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; }
1522 #define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; }
1523 #define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; }
1524 #define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; }
1525 #define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; }
1526 #define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; }
1527 #define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; }
1528
1529 #ifdef IS_NV
1530 #define KXX_DECL
1531 #define sXXX_DECL
1532 #endif
1533
1534 #ifdef IS_AMD
1535 #define KXX_DECL
1536 #define sXXX_DECL
1537 #endif
1538
1539 #ifdef IS_GENERIC
1540 #define KXX_DECL
1541 #define sXXX_DECL
1542 #endif
1543
1544 #ifdef DESCRYPT_SALT
1545
1546 static void DESCrypt (const u32 SALT, const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 *D00, u32 *D01, u32 *D02, u32 *D03, u32 *D04, u32 *D05, u32 *D06, u32 *D07, u32 *D08, u32 *D09, u32 *D10, u32 *D11, u32 *D12, u32 *D13, u32 *D14, u32 *D15, u32 *D16, u32 *D17, u32 *D18, u32 *D19, u32 *D20, u32 *D21, u32 *D22, u32 *D23, u32 *D24, u32 *D25, u32 *D26, u32 *D27, u32 *D28, u32 *D29, u32 *D30, u32 *D31, u32 *D32, u32 *D33, u32 *D34, u32 *D35, u32 *D36, u32 *D37, u32 *D38, u32 *D39, u32 *D40, u32 *D41, u32 *D42, u32 *D43, u32 *D44, u32 *D45, u32 *D46, u32 *D47, u32 *D48, u32 *D49, u32 *D50, u32 *D51, u32 *D52, u32 *D53, u32 *D54, u32 *D55, u32 *D56, u32 *D57, u32 *D58, u32 *D59, u32 *D60, u32 *D61, u32 *D62, u32 *D63)
1547 {
1548   sXXX_DECL u32 s001 = (0x001 & DESCRYPT_SALT) ? 0xffffffff : 0;
1549   sXXX_DECL u32 s002 = (0x002 & DESCRYPT_SALT) ? 0xffffffff : 0;
1550   sXXX_DECL u32 s004 = (0x004 & DESCRYPT_SALT) ? 0xffffffff : 0;
1551   sXXX_DECL u32 s008 = (0x008 & DESCRYPT_SALT) ? 0xffffffff : 0;
1552   sXXX_DECL u32 s010 = (0x010 & DESCRYPT_SALT) ? 0xffffffff : 0;
1553   sXXX_DECL u32 s020 = (0x020 & DESCRYPT_SALT) ? 0xffffffff : 0;
1554   sXXX_DECL u32 s040 = (0x040 & DESCRYPT_SALT) ? 0xffffffff : 0;
1555   sXXX_DECL u32 s080 = (0x080 & DESCRYPT_SALT) ? 0xffffffff : 0;
1556   sXXX_DECL u32 s100 = (0x100 & DESCRYPT_SALT) ? 0xffffffff : 0;
1557   sXXX_DECL u32 s200 = (0x200 & DESCRYPT_SALT) ? 0xffffffff : 0;
1558   sXXX_DECL u32 s400 = (0x400 & DESCRYPT_SALT) ? 0xffffffff : 0;
1559   sXXX_DECL u32 s800 = (0x800 & DESCRYPT_SALT) ? 0xffffffff : 0;
1560
1561   KXX_DECL u32 k00, k01, k02, k03, k04, k05;
1562   KXX_DECL u32 k06, k07, k08, k09, k10, k11;
1563   KXX_DECL u32 k12, k13, k14, k15, k16, k17;
1564   KXX_DECL u32 k18, k19, k20, k21, k22, k23;
1565   KXX_DECL u32 k24, k25, k26, k27, k28, k29;
1566   KXX_DECL u32 k30, k31, k32, k33, k34, k35;
1567   KXX_DECL u32 k36, k37, k38, k39, k40, k41;
1568   KXX_DECL u32 k42, k43, k44, k45, k46, k47;
1569
1570   for (u32 ii = 0; ii < 25; ii++)
1571   {
1572     #ifdef IS_NV
1573     #if CUDA_ARCH >= 500
1574     #else
1575     #pragma unroll
1576     #endif
1577     #endif
1578
1579     #ifdef IS_AMD
1580     #pragma unroll
1581     #endif
1582
1583     for (u32 i = 0; i < 2; i++)
1584     {
1585       if (i) KEYSET10 else KEYSET00
1586
1587       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1588       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1589       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1590       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1591       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1592       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1593       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1594       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1595
1596       if (i) KEYSET11 else KEYSET01
1597
1598       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1599       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1600       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1601       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1602       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1603       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1604       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1605       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1606
1607       if (i) KEYSET12 else KEYSET02
1608
1609       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1610       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1611       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1612       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1613       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1614       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1615       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1616       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1617
1618       if (i) KEYSET13 else KEYSET03
1619
1620       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1621       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1622       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1623       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1624       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1625       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1626       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1627       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1628
1629       if (i) KEYSET14 else KEYSET04
1630
1631       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1632       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1633       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1634       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1635       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1636       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1637       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1638       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1639
1640       if (i) KEYSET15 else KEYSET05
1641
1642       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1643       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1644       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1645       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1646       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1647       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1648       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1649       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1650
1651       if (i) KEYSET16 else KEYSET06
1652
1653       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1654       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1655       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1656       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1657       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1658       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1659       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1660       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1661
1662       if (i) KEYSET17 else KEYSET07
1663
1664       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1665       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1666       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1667       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1668       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1669       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1670       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1671       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1672     }
1673
1674     DATASWAP;
1675   }
1676
1677   DATASWAP;
1678 }
1679
1680 #else
1681
1682 static void DESCrypt (const u32 SALT, const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 *D00, u32 *D01, u32 *D02, u32 *D03, u32 *D04, u32 *D05, u32 *D06, u32 *D07, u32 *D08, u32 *D09, u32 *D10, u32 *D11, u32 *D12, u32 *D13, u32 *D14, u32 *D15, u32 *D16, u32 *D17, u32 *D18, u32 *D19, u32 *D20, u32 *D21, u32 *D22, u32 *D23, u32 *D24, u32 *D25, u32 *D26, u32 *D27, u32 *D28, u32 *D29, u32 *D30, u32 *D31, u32 *D32, u32 *D33, u32 *D34, u32 *D35, u32 *D36, u32 *D37, u32 *D38, u32 *D39, u32 *D40, u32 *D41, u32 *D42, u32 *D43, u32 *D44, u32 *D45, u32 *D46, u32 *D47, u32 *D48, u32 *D49, u32 *D50, u32 *D51, u32 *D52, u32 *D53, u32 *D54, u32 *D55, u32 *D56, u32 *D57, u32 *D58, u32 *D59, u32 *D60, u32 *D61, u32 *D62, u32 *D63)
1683 {
1684   sXXX_DECL u32 s001 = (0x001 & SALT) ? 0xffffffff : 0;
1685   sXXX_DECL u32 s002 = (0x002 & SALT) ? 0xffffffff : 0;
1686   sXXX_DECL u32 s004 = (0x004 & SALT) ? 0xffffffff : 0;
1687   sXXX_DECL u32 s008 = (0x008 & SALT) ? 0xffffffff : 0;
1688   sXXX_DECL u32 s010 = (0x010 & SALT) ? 0xffffffff : 0;
1689   sXXX_DECL u32 s020 = (0x020 & SALT) ? 0xffffffff : 0;
1690   sXXX_DECL u32 s040 = (0x040 & SALT) ? 0xffffffff : 0;
1691   sXXX_DECL u32 s080 = (0x080 & SALT) ? 0xffffffff : 0;
1692   sXXX_DECL u32 s100 = (0x100 & SALT) ? 0xffffffff : 0;
1693   sXXX_DECL u32 s200 = (0x200 & SALT) ? 0xffffffff : 0;
1694   sXXX_DECL u32 s400 = (0x400 & SALT) ? 0xffffffff : 0;
1695   sXXX_DECL u32 s800 = (0x800 & SALT) ? 0xffffffff : 0;
1696
1697   KXX_DECL u32 k00, k01, k02, k03, k04, k05;
1698   KXX_DECL u32 k06, k07, k08, k09, k10, k11;
1699   KXX_DECL u32 k12, k13, k14, k15, k16, k17;
1700   KXX_DECL u32 k18, k19, k20, k21, k22, k23;
1701   KXX_DECL u32 k24, k25, k26, k27, k28, k29;
1702   KXX_DECL u32 k30, k31, k32, k33, k34, k35;
1703   KXX_DECL u32 k36, k37, k38, k39, k40, k41;
1704   KXX_DECL u32 k42, k43, k44, k45, k46, k47;
1705
1706   for (u32 ii = 0; ii < 25; ii++)
1707   {
1708     #ifdef IS_NV
1709     #if CUDA_ARCH >= 500
1710     #else
1711     #pragma unroll
1712     #endif
1713     #endif
1714
1715     #ifdef IS_AMD
1716     #pragma unroll
1717     #endif
1718
1719     for (u32 i = 0; i < 2; i++)
1720     {
1721       if (i) KEYSET10 else KEYSET00
1722
1723       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1724       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1725       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1726       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1727       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1728       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1729       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1730       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1731
1732       if (i) KEYSET11 else KEYSET01
1733
1734       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1735       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1736       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1737       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1738       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1739       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1740       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1741       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1742
1743       if (i) KEYSET12 else KEYSET02
1744
1745       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1746       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1747       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1748       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1749       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1750       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1751       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1752       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1753
1754       if (i) KEYSET13 else KEYSET03
1755
1756       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1757       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1758       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1759       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1760       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1761       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1762       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1763       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1764
1765       if (i) KEYSET14 else KEYSET04
1766
1767       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1768       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1769       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1770       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1771       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1772       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1773       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1774       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1775
1776       if (i) KEYSET15 else KEYSET05
1777
1778       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1779       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1780       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1781       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1782       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1783       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1784       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1785       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1786
1787       if (i) KEYSET16 else KEYSET06
1788
1789       s1(myselx (*D63, *D47, s001) ^ k00, myselx (*D32, *D48, s002) ^ k01, myselx (*D33, *D49, s004) ^ k02, myselx (*D34, *D50, s008) ^ k03, myselx (*D35, *D51, s010) ^ k04, myselx (*D36, *D52, s020) ^ k05, D08, D16, D22, D30);
1790       s2(myselx (*D35, *D51, s040) ^ k06, myselx (*D36, *D52, s080) ^ k07, myselx (*D37, *D53, s100) ^ k08, myselx (*D38, *D54, s200) ^ k09, myselx (*D39, *D55, s400) ^ k10, myselx (*D40, *D56, s800) ^ k11, D12, D27, D01, D17);
1791       s3(              *D39        ^ k12,               *D40        ^ k13,               *D41        ^ k14,               *D42        ^ k15,               *D43        ^ k16,               *D44        ^ k17, D23, D15, D29, D05);
1792       s4(              *D43        ^ k18,               *D44        ^ k19,               *D45        ^ k20,               *D46        ^ k21,               *D47        ^ k22,               *D48        ^ k23, D25, D19, D09, D00);
1793       s5(myselx (*D47, *D63, s001) ^ k24, myselx (*D48, *D32, s002) ^ k25, myselx (*D49, *D33, s004) ^ k26, myselx (*D50, *D34, s008) ^ k27, myselx (*D51, *D35, s010) ^ k28, myselx (*D52, *D36, s020) ^ k29, D07, D13, D24, D02);
1794       s6(myselx (*D51, *D35, s040) ^ k30, myselx (*D52, *D36, s080) ^ k31, myselx (*D53, *D37, s100) ^ k32, myselx (*D54, *D38, s200) ^ k33, myselx (*D55, *D39, s400) ^ k34, myselx (*D56, *D40, s800) ^ k35, D03, D28, D10, D18);
1795       s7(              *D55        ^ k36,               *D56        ^ k37,               *D57        ^ k38,               *D58        ^ k39,               *D59        ^ k40,               *D60        ^ k41, D31, D11, D21, D06);
1796       s8(              *D59        ^ k42,               *D60        ^ k43,               *D61        ^ k44,               *D62        ^ k45,               *D63        ^ k46,               *D32        ^ k47, D04, D26, D14, D20);
1797
1798       if (i) KEYSET17 else KEYSET07
1799
1800       s1(myselx (*D31, *D15, s001) ^ k00, myselx (*D00, *D16, s002) ^ k01, myselx (*D01, *D17, s004) ^ k02, myselx (*D02, *D18, s008) ^ k03, myselx (*D03, *D19, s010) ^ k04, myselx (*D04, *D20, s020) ^ k05, D40, D48, D54, D62);
1801       s2(myselx (*D03, *D19, s040) ^ k06, myselx (*D04, *D20, s080) ^ k07, myselx (*D05, *D21, s100) ^ k08, myselx (*D06, *D22, s200) ^ k09, myselx (*D07, *D23, s400) ^ k10, myselx (*D08, *D24, s800) ^ k11, D44, D59, D33, D49);
1802       s3(              *D07        ^ k12,               *D08        ^ k13,               *D09        ^ k14,               *D10        ^ k15,               *D11        ^ k16,               *D12        ^ k17, D55, D47, D61, D37);
1803       s4(              *D11        ^ k18,               *D12        ^ k19,               *D13        ^ k20,               *D14        ^ k21,               *D15        ^ k22,               *D16        ^ k23, D57, D51, D41, D32);
1804       s5(myselx (*D15, *D31, s001) ^ k24, myselx (*D16, *D00, s002) ^ k25, myselx (*D17, *D01, s004) ^ k26, myselx (*D18, *D02, s008) ^ k27, myselx (*D19, *D03, s010) ^ k28, myselx (*D20, *D04, s020) ^ k29, D39, D45, D56, D34);
1805       s6(myselx (*D19, *D03, s040) ^ k30, myselx (*D20, *D04, s080) ^ k31, myselx (*D21, *D05, s100) ^ k32, myselx (*D22, *D06, s200) ^ k33, myselx (*D23, *D07, s400) ^ k34, myselx (*D24, *D08, s800) ^ k35, D35, D60, D42, D50);
1806       s7(              *D23        ^ k36,               *D24        ^ k37,               *D25        ^ k38,               *D26        ^ k39,               *D27        ^ k40,               *D28        ^ k41, D63, D43, D53, D38);
1807       s8(              *D27        ^ k42,               *D28        ^ k43,               *D29        ^ k44,               *D30        ^ k45,               *D31        ^ k46,               *D00        ^ k47, D36, D58, D46, D52);
1808     }
1809
1810     DATASWAP;
1811   }
1812
1813   DATASWAP;
1814 }
1815
1816 #endif
1817
1818 static void transpose32c (u32 data[32])
1819 {
1820   #define swap(x,y,j,m)               \
1821      t  = ((x) ^ ((y) >> (j))) & (m); \
1822     (x) = (x) ^ t;                    \
1823     (y) = (y) ^ (t << (j));
1824
1825   u32 t;
1826
1827   swap (data[ 0], data[16], 16, 0x0000ffff);
1828   swap (data[ 1], data[17], 16, 0x0000ffff);
1829   swap (data[ 2], data[18], 16, 0x0000ffff);
1830   swap (data[ 3], data[19], 16, 0x0000ffff);
1831   swap (data[ 4], data[20], 16, 0x0000ffff);
1832   swap (data[ 5], data[21], 16, 0x0000ffff);
1833   swap (data[ 6], data[22], 16, 0x0000ffff);
1834   swap (data[ 7], data[23], 16, 0x0000ffff);
1835   swap (data[ 8], data[24], 16, 0x0000ffff);
1836   swap (data[ 9], data[25], 16, 0x0000ffff);
1837   swap (data[10], data[26], 16, 0x0000ffff);
1838   swap (data[11], data[27], 16, 0x0000ffff);
1839   swap (data[12], data[28], 16, 0x0000ffff);
1840   swap (data[13], data[29], 16, 0x0000ffff);
1841   swap (data[14], data[30], 16, 0x0000ffff);
1842   swap (data[15], data[31], 16, 0x0000ffff);
1843   swap (data[ 0], data[ 8],  8, 0x00ff00ff);
1844   swap (data[ 1], data[ 9],  8, 0x00ff00ff);
1845   swap (data[ 2], data[10],  8, 0x00ff00ff);
1846   swap (data[ 3], data[11],  8, 0x00ff00ff);
1847   swap (data[ 4], data[12],  8, 0x00ff00ff);
1848   swap (data[ 5], data[13],  8, 0x00ff00ff);
1849   swap (data[ 6], data[14],  8, 0x00ff00ff);
1850   swap (data[ 7], data[15],  8, 0x00ff00ff);
1851   swap (data[ 0], data[ 4],  4, 0x0f0f0f0f);
1852   swap (data[ 1], data[ 5],  4, 0x0f0f0f0f);
1853   swap (data[ 2], data[ 6],  4, 0x0f0f0f0f);
1854   swap (data[ 3], data[ 7],  4, 0x0f0f0f0f);
1855   swap (data[ 0], data[ 2],  2, 0x33333333);
1856   swap (data[ 1], data[ 3],  2, 0x33333333);
1857   swap (data[ 0], data[ 1],  1, 0x55555555);
1858   swap (data[ 2], data[ 3],  1, 0x55555555);
1859   swap (data[ 4], data[ 6],  2, 0x33333333);
1860   swap (data[ 5], data[ 7],  2, 0x33333333);
1861   swap (data[ 4], data[ 5],  1, 0x55555555);
1862   swap (data[ 6], data[ 7],  1, 0x55555555);
1863   swap (data[ 8], data[12],  4, 0x0f0f0f0f);
1864   swap (data[ 9], data[13],  4, 0x0f0f0f0f);
1865   swap (data[10], data[14],  4, 0x0f0f0f0f);
1866   swap (data[11], data[15],  4, 0x0f0f0f0f);
1867   swap (data[ 8], data[10],  2, 0x33333333);
1868   swap (data[ 9], data[11],  2, 0x33333333);
1869   swap (data[ 8], data[ 9],  1, 0x55555555);
1870   swap (data[10], data[11],  1, 0x55555555);
1871   swap (data[12], data[14],  2, 0x33333333);
1872   swap (data[13], data[15],  2, 0x33333333);
1873   swap (data[12], data[13],  1, 0x55555555);
1874   swap (data[14], data[15],  1, 0x55555555);
1875   swap (data[16], data[24],  8, 0x00ff00ff);
1876   swap (data[17], data[25],  8, 0x00ff00ff);
1877   swap (data[18], data[26],  8, 0x00ff00ff);
1878   swap (data[19], data[27],  8, 0x00ff00ff);
1879   swap (data[20], data[28],  8, 0x00ff00ff);
1880   swap (data[21], data[29],  8, 0x00ff00ff);
1881   swap (data[22], data[30],  8, 0x00ff00ff);
1882   swap (data[23], data[31],  8, 0x00ff00ff);
1883   swap (data[16], data[20],  4, 0x0f0f0f0f);
1884   swap (data[17], data[21],  4, 0x0f0f0f0f);
1885   swap (data[18], data[22],  4, 0x0f0f0f0f);
1886   swap (data[19], data[23],  4, 0x0f0f0f0f);
1887   swap (data[16], data[18],  2, 0x33333333);
1888   swap (data[17], data[19],  2, 0x33333333);
1889   swap (data[16], data[17],  1, 0x55555555);
1890   swap (data[18], data[19],  1, 0x55555555);
1891   swap (data[20], data[22],  2, 0x33333333);
1892   swap (data[21], data[23],  2, 0x33333333);
1893   swap (data[20], data[21],  1, 0x55555555);
1894   swap (data[22], data[23],  1, 0x55555555);
1895   swap (data[24], data[28],  4, 0x0f0f0f0f);
1896   swap (data[25], data[29],  4, 0x0f0f0f0f);
1897   swap (data[26], data[30],  4, 0x0f0f0f0f);
1898   swap (data[27], data[31],  4, 0x0f0f0f0f);
1899   swap (data[24], data[26],  2, 0x33333333);
1900   swap (data[25], data[27],  2, 0x33333333);
1901   swap (data[24], data[25],  1, 0x55555555);
1902   swap (data[26], data[27],  1, 0x55555555);
1903   swap (data[28], data[30],  2, 0x33333333);
1904   swap (data[29], data[31],  2, 0x33333333);
1905   swap (data[28], data[29],  1, 0x55555555);
1906   swap (data[30], data[31],  1, 0x55555555);
1907 }
1908
1909 static void m01500m (__local u32 *s_S, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
1910 {
1911   /**
1912    * base
1913    */
1914
1915   const u32 gid = get_global_id (0);
1916   const u32 lid = get_local_id (0);
1917
1918   /**
1919    * salt
1920    */
1921
1922   const u32 salt = salt_bufs[salt_pos].salt_buf[0];
1923
1924   /**
1925    * keys
1926    */
1927
1928   const u32 K00 = pws[gid].i[ 0];
1929   const u32 K01 = pws[gid].i[ 1];
1930   const u32 K02 = pws[gid].i[ 2];
1931   const u32 K03 = pws[gid].i[ 3];
1932   const u32 K04 = pws[gid].i[ 4];
1933   const u32 K05 = pws[gid].i[ 5];
1934   const u32 K06 = pws[gid].i[ 6];
1935   const u32 K07 = pws[gid].i[ 7];
1936   const u32 K08 = pws[gid].i[ 8];
1937   const u32 K09 = pws[gid].i[ 9];
1938   const u32 K10 = pws[gid].i[10];
1939   const u32 K11 = pws[gid].i[11];
1940   const u32 K12 = pws[gid].i[12];
1941   const u32 K13 = pws[gid].i[13];
1942   const u32 K14 = pws[gid].i[14];
1943   const u32 K15 = pws[gid].i[15];
1944   const u32 K16 = pws[gid].i[16];
1945   const u32 K17 = pws[gid].i[17];
1946   const u32 K18 = pws[gid].i[18];
1947   const u32 K19 = pws[gid].i[19];
1948   const u32 K20 = pws[gid].i[20];
1949   const u32 K21 = pws[gid].i[21];
1950   const u32 K22 = pws[gid].i[22];
1951   const u32 K23 = pws[gid].i[23];
1952   const u32 K24 = pws[gid].i[24];
1953   const u32 K25 = pws[gid].i[25];
1954   const u32 K26 = pws[gid].i[26];
1955   const u32 K27 = pws[gid].i[27];
1956   const u32 K28 = pws[gid].i[28];
1957   const u32 K29 = pws[gid].i[29];
1958   const u32 K30 = pws[gid].i[30];
1959   const u32 K31 = pws[gid].i[31];
1960   const u32 K32 = pws[gid].i[32];
1961   const u32 K33 = pws[gid].i[33];
1962   const u32 K34 = pws[gid].i[34];
1963   const u32 K35 = pws[gid].i[35];
1964   const u32 K36 = pws[gid].i[36];
1965   const u32 K37 = pws[gid].i[37];
1966   const u32 K38 = pws[gid].i[38];
1967   const u32 K39 = pws[gid].i[39];
1968   const u32 K40 = pws[gid].i[40];
1969   const u32 K41 = pws[gid].i[41];
1970   const u32 K42 = pws[gid].i[42];
1971   const u32 K43 = pws[gid].i[43];
1972   const u32 K44 = pws[gid].i[44];
1973   const u32 K45 = pws[gid].i[45];
1974   const u32 K46 = pws[gid].i[46];
1975   const u32 K47 = pws[gid].i[47];
1976   const u32 K48 = pws[gid].i[48];
1977   const u32 K49 = pws[gid].i[49];
1978   const u32 K50 = pws[gid].i[50];
1979   const u32 K51 = pws[gid].i[51];
1980   const u32 K52 = pws[gid].i[52];
1981   const u32 K53 = pws[gid].i[53];
1982   const u32 K54 = pws[gid].i[54];
1983   const u32 K55 = pws[gid].i[55];
1984
1985   /**
1986    * inner loop
1987    */
1988
1989   const u32 pc_pos = get_local_id (1);
1990
1991   const u32 il_pos = pc_pos * 32;
1992
1993   u32 k00 = K00;
1994   u32 k01 = K01;
1995   u32 k02 = K02;
1996   u32 k03 = K03;
1997   u32 k04 = K04;
1998   u32 k05 = K05;
1999   u32 k06 = K06;
2000   u32 k07 = K07;
2001   u32 k08 = K08;
2002   u32 k09 = K09;
2003   u32 k10 = K10;
2004   u32 k11 = K11;
2005   u32 k12 = K12;
2006   u32 k13 = K13;
2007   u32 k14 = K14;
2008   u32 k15 = K15;
2009   u32 k16 = K16;
2010   u32 k17 = K17;
2011   u32 k18 = K18;
2012   u32 k19 = K19;
2013   u32 k20 = K20;
2014   u32 k21 = K21;
2015   u32 k22 = K22;
2016   u32 k23 = K23;
2017   u32 k24 = K24;
2018   u32 k25 = K25;
2019   u32 k26 = K26;
2020   u32 k27 = K27;
2021
2022   k00 |= words_buf_r[pc_pos].b[ 0];
2023   k01 |= words_buf_r[pc_pos].b[ 1];
2024   k02 |= words_buf_r[pc_pos].b[ 2];
2025   k03 |= words_buf_r[pc_pos].b[ 3];
2026   k04 |= words_buf_r[pc_pos].b[ 4];
2027   k05 |= words_buf_r[pc_pos].b[ 5];
2028   k06 |= words_buf_r[pc_pos].b[ 6];
2029   k07 |= words_buf_r[pc_pos].b[ 7];
2030   k08 |= words_buf_r[pc_pos].b[ 8];
2031   k09 |= words_buf_r[pc_pos].b[ 9];
2032   k10 |= words_buf_r[pc_pos].b[10];
2033   k11 |= words_buf_r[pc_pos].b[11];
2034   k12 |= words_buf_r[pc_pos].b[12];
2035   k13 |= words_buf_r[pc_pos].b[13];
2036   k14 |= words_buf_r[pc_pos].b[14];
2037   k15 |= words_buf_r[pc_pos].b[15];
2038   k16 |= words_buf_r[pc_pos].b[16];
2039   k17 |= words_buf_r[pc_pos].b[17];
2040   k18 |= words_buf_r[pc_pos].b[18];
2041   k19 |= words_buf_r[pc_pos].b[19];
2042   k20 |= words_buf_r[pc_pos].b[20];
2043   k21 |= words_buf_r[pc_pos].b[21];
2044   k22 |= words_buf_r[pc_pos].b[22];
2045   k23 |= words_buf_r[pc_pos].b[23];
2046   k24 |= words_buf_r[pc_pos].b[24];
2047   k25 |= words_buf_r[pc_pos].b[25];
2048   k26 |= words_buf_r[pc_pos].b[26];
2049   k27 |= words_buf_r[pc_pos].b[27];
2050
2051   u32 D00 = 0;
2052   u32 D01 = 0;
2053   u32 D02 = 0;
2054   u32 D03 = 0;
2055   u32 D04 = 0;
2056   u32 D05 = 0;
2057   u32 D06 = 0;
2058   u32 D07 = 0;
2059   u32 D08 = 0;
2060   u32 D09 = 0;
2061   u32 D10 = 0;
2062   u32 D11 = 0;
2063   u32 D12 = 0;
2064   u32 D13 = 0;
2065   u32 D14 = 0;
2066   u32 D15 = 0;
2067   u32 D16 = 0;
2068   u32 D17 = 0;
2069   u32 D18 = 0;
2070   u32 D19 = 0;
2071   u32 D20 = 0;
2072   u32 D21 = 0;
2073   u32 D22 = 0;
2074   u32 D23 = 0;
2075   u32 D24 = 0;
2076   u32 D25 = 0;
2077   u32 D26 = 0;
2078   u32 D27 = 0;
2079   u32 D28 = 0;
2080   u32 D29 = 0;
2081   u32 D30 = 0;
2082   u32 D31 = 0;
2083   u32 D32 = 0;
2084   u32 D33 = 0;
2085   u32 D34 = 0;
2086   u32 D35 = 0;
2087   u32 D36 = 0;
2088   u32 D37 = 0;
2089   u32 D38 = 0;
2090   u32 D39 = 0;
2091   u32 D40 = 0;
2092   u32 D41 = 0;
2093   u32 D42 = 0;
2094   u32 D43 = 0;
2095   u32 D44 = 0;
2096   u32 D45 = 0;
2097   u32 D46 = 0;
2098   u32 D47 = 0;
2099   u32 D48 = 0;
2100   u32 D49 = 0;
2101   u32 D50 = 0;
2102   u32 D51 = 0;
2103   u32 D52 = 0;
2104   u32 D53 = 0;
2105   u32 D54 = 0;
2106   u32 D55 = 0;
2107   u32 D56 = 0;
2108   u32 D57 = 0;
2109   u32 D58 = 0;
2110   u32 D59 = 0;
2111   u32 D60 = 0;
2112   u32 D61 = 0;
2113   u32 D62 = 0;
2114   u32 D63 = 0;
2115
2116   DESCrypt
2117   (
2118     salt,
2119     k00, k01, k02, k03, k04, k05, k06,
2120     k07, k08, k09, k10, k11, k12, k13,
2121     k14, k15, k16, k17, k18, k19, k20,
2122     k21, k22, k23, k24, k25, k26, k27,
2123     K28, K29, K30, K31, K32, K33, K34,
2124     K35, K36, K37, K38, K39, K40, K41,
2125     K42, K43, K44, K45, K46, K47, K48,
2126     K49, K50, K51, K52, K53, K54, K55,
2127     &D00, &D01, &D02, &D03, &D04, &D05, &D06, &D07,
2128     &D08, &D09, &D10, &D11, &D12, &D13, &D14, &D15,
2129     &D16, &D17, &D18, &D19, &D20, &D21, &D22, &D23,
2130     &D24, &D25, &D26, &D27, &D28, &D29, &D30, &D31,
2131     &D32, &D33, &D34, &D35, &D36, &D37, &D38, &D39,
2132     &D40, &D41, &D42, &D43, &D44, &D45, &D46, &D47,
2133     &D48, &D49, &D50, &D51, &D52, &D53, &D54, &D55,
2134     &D56, &D57, &D58, &D59, &D60, &D61, &D62, &D63
2135   );
2136
2137   u32 out[64];
2138
2139   out[ 0] = D00;
2140   out[ 1] = D01;
2141   out[ 2] = D02;
2142   out[ 3] = D03;
2143   out[ 4] = D04;
2144   out[ 5] = D05;
2145   out[ 6] = D06;
2146   out[ 7] = D07;
2147   out[ 8] = D08;
2148   out[ 9] = D09;
2149   out[10] = D10;
2150   out[11] = D11;
2151   out[12] = D12;
2152   out[13] = D13;
2153   out[14] = D14;
2154   out[15] = D15;
2155   out[16] = D16;
2156   out[17] = D17;
2157   out[18] = D18;
2158   out[19] = D19;
2159   out[20] = D20;
2160   out[21] = D21;
2161   out[22] = D22;
2162   out[23] = D23;
2163   out[24] = D24;
2164   out[25] = D25;
2165   out[26] = D26;
2166   out[27] = D27;
2167   out[28] = D28;
2168   out[29] = D29;
2169   out[30] = D30;
2170   out[31] = D31;
2171   out[32] = D32;
2172   out[33] = D33;
2173   out[34] = D34;
2174   out[35] = D35;
2175   out[36] = D36;
2176   out[37] = D37;
2177   out[38] = D38;
2178   out[39] = D39;
2179   out[40] = D40;
2180   out[41] = D41;
2181   out[42] = D42;
2182   out[43] = D43;
2183   out[44] = D44;
2184   out[45] = D45;
2185   out[46] = D46;
2186   out[47] = D47;
2187   out[48] = D48;
2188   out[49] = D49;
2189   out[50] = D50;
2190   out[51] = D51;
2191   out[52] = D52;
2192   out[53] = D53;
2193   out[54] = D54;
2194   out[55] = D55;
2195   out[56] = D56;
2196   out[57] = D57;
2197   out[58] = D58;
2198   out[59] = D59;
2199   out[60] = D60;
2200   out[61] = D61;
2201   out[62] = D62;
2202   out[63] = D63;
2203
2204   if (digests_cnt < 16)
2205   {
2206     for (u32 d = 0; d < digests_cnt; d++)
2207     {
2208       const u32 final_hash_pos = digests_offset + d;
2209
2210       if (hashes_shown[final_hash_pos]) continue;
2211
2212       u32 search[2];
2213
2214       search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0];
2215       search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1];
2216
2217       u32 tmpResult = 0;
2218
2219       #pragma unroll
2220       for (int i = 0; i < 32; i++)
2221       {
2222         const u32 b0 = -((search[0] >> i) & 1);
2223         const u32 b1 = -((search[1] >> i) & 1);
2224
2225         tmpResult |= out[ 0 + i] ^ b0;
2226         tmpResult |= out[32 + i] ^ b1;
2227       }
2228
2229       if (tmpResult == 0xffffffff) continue;
2230
2231       const u32 slice = 31 - clz (~tmpResult);
2232
2233       const u32 r0 = search[0];
2234       const u32 r1 = search[1];
2235       const u32 r2 = 0;
2236       const u32 r3 = 0;
2237
2238       #include COMPARE_M
2239     }
2240   }
2241   else
2242   {
2243     u32 out0[32];
2244     u32 out1[32];
2245
2246     #pragma unroll
2247     for (int i = 0; i < 32; i++)
2248     {
2249       out0[i] = out[ 0 + 31 - i];
2250       out1[i] = out[32 + 31 - i];
2251     }
2252
2253     transpose32c (out0);
2254     transpose32c (out1);
2255
2256     #pragma unroll
2257     for (int slice = 0; slice < 32; slice++)
2258     {
2259       const u32 r0 = out0[31 - slice];
2260       const u32 r1 = out1[31 - slice];
2261       const u32 r2 = 0;
2262       const u32 r3 = 0;
2263
2264       #include COMPARE_M
2265     }
2266   }
2267 }
2268
2269 static void m01500s (__local u32 *s_S, __global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2270 {
2271   /**
2272    * base
2273    */
2274
2275   const u32 gid = get_global_id (0);
2276   const u32 lid = get_local_id (0);
2277
2278   /**
2279    * salt
2280    */
2281
2282   const u32 salt = salt_bufs[salt_pos].salt_buf[0];
2283
2284   /**
2285    * digest
2286    */
2287
2288   #define S00 s_S[ 0]
2289   #define S01 s_S[ 1]
2290   #define S02 s_S[ 2]
2291   #define S03 s_S[ 3]
2292   #define S04 s_S[ 4]
2293   #define S05 s_S[ 5]
2294   #define S06 s_S[ 6]
2295   #define S07 s_S[ 7]
2296   #define S08 s_S[ 8]
2297   #define S09 s_S[ 9]
2298   #define S10 s_S[10]
2299   #define S11 s_S[11]
2300   #define S12 s_S[12]
2301   #define S13 s_S[13]
2302   #define S14 s_S[14]
2303   #define S15 s_S[15]
2304   #define S16 s_S[16]
2305   #define S17 s_S[17]
2306   #define S18 s_S[18]
2307   #define S19 s_S[19]
2308   #define S20 s_S[20]
2309   #define S21 s_S[21]
2310   #define S22 s_S[22]
2311   #define S23 s_S[23]
2312   #define S24 s_S[24]
2313   #define S25 s_S[25]
2314   #define S26 s_S[26]
2315   #define S27 s_S[27]
2316   #define S28 s_S[28]
2317   #define S29 s_S[29]
2318   #define S30 s_S[30]
2319   #define S31 s_S[31]
2320   #define S32 s_S[32]
2321   #define S33 s_S[33]
2322   #define S34 s_S[34]
2323   #define S35 s_S[35]
2324   #define S36 s_S[36]
2325   #define S37 s_S[37]
2326   #define S38 s_S[38]
2327   #define S39 s_S[39]
2328   #define S40 s_S[40]
2329   #define S41 s_S[41]
2330   #define S42 s_S[42]
2331   #define S43 s_S[43]
2332   #define S44 s_S[44]
2333   #define S45 s_S[45]
2334   #define S46 s_S[46]
2335   #define S47 s_S[47]
2336   #define S48 s_S[48]
2337   #define S49 s_S[49]
2338   #define S50 s_S[50]
2339   #define S51 s_S[51]
2340   #define S52 s_S[52]
2341   #define S53 s_S[53]
2342   #define S54 s_S[54]
2343   #define S55 s_S[55]
2344   #define S56 s_S[56]
2345   #define S57 s_S[57]
2346   #define S58 s_S[58]
2347   #define S59 s_S[59]
2348   #define S60 s_S[60]
2349   #define S61 s_S[61]
2350   #define S62 s_S[62]
2351   #define S63 s_S[63]
2352
2353   /**
2354    * keys
2355    */
2356
2357   const u32 K00 = pws[gid].i[ 0];
2358   const u32 K01 = pws[gid].i[ 1];
2359   const u32 K02 = pws[gid].i[ 2];
2360   const u32 K03 = pws[gid].i[ 3];
2361   const u32 K04 = pws[gid].i[ 4];
2362   const u32 K05 = pws[gid].i[ 5];
2363   const u32 K06 = pws[gid].i[ 6];
2364   const u32 K07 = pws[gid].i[ 7];
2365   const u32 K08 = pws[gid].i[ 8];
2366   const u32 K09 = pws[gid].i[ 9];
2367   const u32 K10 = pws[gid].i[10];
2368   const u32 K11 = pws[gid].i[11];
2369   const u32 K12 = pws[gid].i[12];
2370   const u32 K13 = pws[gid].i[13];
2371   const u32 K14 = pws[gid].i[14];
2372   const u32 K15 = pws[gid].i[15];
2373   const u32 K16 = pws[gid].i[16];
2374   const u32 K17 = pws[gid].i[17];
2375   const u32 K18 = pws[gid].i[18];
2376   const u32 K19 = pws[gid].i[19];
2377   const u32 K20 = pws[gid].i[20];
2378   const u32 K21 = pws[gid].i[21];
2379   const u32 K22 = pws[gid].i[22];
2380   const u32 K23 = pws[gid].i[23];
2381   const u32 K24 = pws[gid].i[24];
2382   const u32 K25 = pws[gid].i[25];
2383   const u32 K26 = pws[gid].i[26];
2384   const u32 K27 = pws[gid].i[27];
2385   const u32 K28 = pws[gid].i[28];
2386   const u32 K29 = pws[gid].i[29];
2387   const u32 K30 = pws[gid].i[30];
2388   const u32 K31 = pws[gid].i[31];
2389   const u32 K32 = pws[gid].i[32];
2390   const u32 K33 = pws[gid].i[33];
2391   const u32 K34 = pws[gid].i[34];
2392   const u32 K35 = pws[gid].i[35];
2393   const u32 K36 = pws[gid].i[36];
2394   const u32 K37 = pws[gid].i[37];
2395   const u32 K38 = pws[gid].i[38];
2396   const u32 K39 = pws[gid].i[39];
2397   const u32 K40 = pws[gid].i[40];
2398   const u32 K41 = pws[gid].i[41];
2399   const u32 K42 = pws[gid].i[42];
2400   const u32 K43 = pws[gid].i[43];
2401   const u32 K44 = pws[gid].i[44];
2402   const u32 K45 = pws[gid].i[45];
2403   const u32 K46 = pws[gid].i[46];
2404   const u32 K47 = pws[gid].i[47];
2405   const u32 K48 = pws[gid].i[48];
2406   const u32 K49 = pws[gid].i[49];
2407   const u32 K50 = pws[gid].i[50];
2408   const u32 K51 = pws[gid].i[51];
2409   const u32 K52 = pws[gid].i[52];
2410   const u32 K53 = pws[gid].i[53];
2411   const u32 K54 = pws[gid].i[54];
2412   const u32 K55 = pws[gid].i[55];
2413
2414   /**
2415    * inner loop
2416    */
2417
2418   const u32 pc_pos = get_local_id (1);
2419
2420   const u32 il_pos = pc_pos * 32;
2421
2422   u32 k00 = K00;
2423   u32 k01 = K01;
2424   u32 k02 = K02;
2425   u32 k03 = K03;
2426   u32 k04 = K04;
2427   u32 k05 = K05;
2428   u32 k06 = K06;
2429   u32 k07 = K07;
2430   u32 k08 = K08;
2431   u32 k09 = K09;
2432   u32 k10 = K10;
2433   u32 k11 = K11;
2434   u32 k12 = K12;
2435   u32 k13 = K13;
2436   u32 k14 = K14;
2437   u32 k15 = K15;
2438   u32 k16 = K16;
2439   u32 k17 = K17;
2440   u32 k18 = K18;
2441   u32 k19 = K19;
2442   u32 k20 = K20;
2443   u32 k21 = K21;
2444   u32 k22 = K22;
2445   u32 k23 = K23;
2446   u32 k24 = K24;
2447   u32 k25 = K25;
2448   u32 k26 = K26;
2449   u32 k27 = K27;
2450
2451   k00 |= words_buf_r[pc_pos].b[ 0];
2452   k01 |= words_buf_r[pc_pos].b[ 1];
2453   k02 |= words_buf_r[pc_pos].b[ 2];
2454   k03 |= words_buf_r[pc_pos].b[ 3];
2455   k04 |= words_buf_r[pc_pos].b[ 4];
2456   k05 |= words_buf_r[pc_pos].b[ 5];
2457   k06 |= words_buf_r[pc_pos].b[ 6];
2458   k07 |= words_buf_r[pc_pos].b[ 7];
2459   k08 |= words_buf_r[pc_pos].b[ 8];
2460   k09 |= words_buf_r[pc_pos].b[ 9];
2461   k10 |= words_buf_r[pc_pos].b[10];
2462   k11 |= words_buf_r[pc_pos].b[11];
2463   k12 |= words_buf_r[pc_pos].b[12];
2464   k13 |= words_buf_r[pc_pos].b[13];
2465   k14 |= words_buf_r[pc_pos].b[14];
2466   k15 |= words_buf_r[pc_pos].b[15];
2467   k16 |= words_buf_r[pc_pos].b[16];
2468   k17 |= words_buf_r[pc_pos].b[17];
2469   k18 |= words_buf_r[pc_pos].b[18];
2470   k19 |= words_buf_r[pc_pos].b[19];
2471   k20 |= words_buf_r[pc_pos].b[20];
2472   k21 |= words_buf_r[pc_pos].b[21];
2473   k22 |= words_buf_r[pc_pos].b[22];
2474   k23 |= words_buf_r[pc_pos].b[23];
2475   k24 |= words_buf_r[pc_pos].b[24];
2476   k25 |= words_buf_r[pc_pos].b[25];
2477   k26 |= words_buf_r[pc_pos].b[26];
2478   k27 |= words_buf_r[pc_pos].b[27];
2479
2480   u32 D00 = 0;
2481   u32 D01 = 0;
2482   u32 D02 = 0;
2483   u32 D03 = 0;
2484   u32 D04 = 0;
2485   u32 D05 = 0;
2486   u32 D06 = 0;
2487   u32 D07 = 0;
2488   u32 D08 = 0;
2489   u32 D09 = 0;
2490   u32 D10 = 0;
2491   u32 D11 = 0;
2492   u32 D12 = 0;
2493   u32 D13 = 0;
2494   u32 D14 = 0;
2495   u32 D15 = 0;
2496   u32 D16 = 0;
2497   u32 D17 = 0;
2498   u32 D18 = 0;
2499   u32 D19 = 0;
2500   u32 D20 = 0;
2501   u32 D21 = 0;
2502   u32 D22 = 0;
2503   u32 D23 = 0;
2504   u32 D24 = 0;
2505   u32 D25 = 0;
2506   u32 D26 = 0;
2507   u32 D27 = 0;
2508   u32 D28 = 0;
2509   u32 D29 = 0;
2510   u32 D30 = 0;
2511   u32 D31 = 0;
2512   u32 D32 = 0;
2513   u32 D33 = 0;
2514   u32 D34 = 0;
2515   u32 D35 = 0;
2516   u32 D36 = 0;
2517   u32 D37 = 0;
2518   u32 D38 = 0;
2519   u32 D39 = 0;
2520   u32 D40 = 0;
2521   u32 D41 = 0;
2522   u32 D42 = 0;
2523   u32 D43 = 0;
2524   u32 D44 = 0;
2525   u32 D45 = 0;
2526   u32 D46 = 0;
2527   u32 D47 = 0;
2528   u32 D48 = 0;
2529   u32 D49 = 0;
2530   u32 D50 = 0;
2531   u32 D51 = 0;
2532   u32 D52 = 0;
2533   u32 D53 = 0;
2534   u32 D54 = 0;
2535   u32 D55 = 0;
2536   u32 D56 = 0;
2537   u32 D57 = 0;
2538   u32 D58 = 0;
2539   u32 D59 = 0;
2540   u32 D60 = 0;
2541   u32 D61 = 0;
2542   u32 D62 = 0;
2543   u32 D63 = 0;
2544
2545   DESCrypt
2546   (
2547     salt,
2548     k00, k01, k02, k03, k04, k05, k06,
2549     k07, k08, k09, k10, k11, k12, k13,
2550     k14, k15, k16, k17, k18, k19, k20,
2551     k21, k22, k23, k24, k25, k26, k27,
2552     K28, K29, K30, K31, K32, K33, K34,
2553     K35, K36, K37, K38, K39, K40, K41,
2554     K42, K43, K44, K45, K46, K47, K48,
2555     K49, K50, K51, K52, K53, K54, K55,
2556     &D00, &D01, &D02, &D03, &D04, &D05, &D06, &D07,
2557     &D08, &D09, &D10, &D11, &D12, &D13, &D14, &D15,
2558     &D16, &D17, &D18, &D19, &D20, &D21, &D22, &D23,
2559     &D24, &D25, &D26, &D27, &D28, &D29, &D30, &D31,
2560     &D32, &D33, &D34, &D35, &D36, &D37, &D38, &D39,
2561     &D40, &D41, &D42, &D43, &D44, &D45, &D46, &D47,
2562     &D48, &D49, &D50, &D51, &D52, &D53, &D54, &D55,
2563     &D56, &D57, &D58, &D59, &D60, &D61, &D62, &D63
2564   );
2565
2566   u32 tmpResult = 0;
2567
2568   tmpResult |= D00 ^ S00;
2569   tmpResult |= D01 ^ S01;
2570   tmpResult |= D02 ^ S02;
2571   tmpResult |= D03 ^ S03;
2572   tmpResult |= D04 ^ S04;
2573   tmpResult |= D05 ^ S05;
2574   tmpResult |= D06 ^ S06;
2575   tmpResult |= D07 ^ S07;
2576   tmpResult |= D08 ^ S08;
2577   tmpResult |= D09 ^ S09;
2578   tmpResult |= D10 ^ S10;
2579   tmpResult |= D11 ^ S11;
2580   tmpResult |= D12 ^ S12;
2581   tmpResult |= D13 ^ S13;
2582   tmpResult |= D14 ^ S14;
2583   tmpResult |= D15 ^ S15;
2584   tmpResult |= D16 ^ S16;
2585   tmpResult |= D17 ^ S17;
2586   tmpResult |= D18 ^ S18;
2587   tmpResult |= D19 ^ S19;
2588   tmpResult |= D20 ^ S20;
2589   tmpResult |= D21 ^ S21;
2590   tmpResult |= D22 ^ S22;
2591   tmpResult |= D23 ^ S23;
2592   tmpResult |= D24 ^ S24;
2593   tmpResult |= D25 ^ S25;
2594   tmpResult |= D26 ^ S26;
2595   tmpResult |= D27 ^ S27;
2596   tmpResult |= D28 ^ S28;
2597   tmpResult |= D29 ^ S29;
2598   tmpResult |= D30 ^ S30;
2599   tmpResult |= D31 ^ S31;
2600   tmpResult |= D32 ^ S32;
2601   tmpResult |= D33 ^ S33;
2602   tmpResult |= D34 ^ S34;
2603   tmpResult |= D35 ^ S35;
2604   tmpResult |= D36 ^ S36;
2605   tmpResult |= D37 ^ S37;
2606   tmpResult |= D38 ^ S38;
2607   tmpResult |= D39 ^ S39;
2608   tmpResult |= D40 ^ S40;
2609   tmpResult |= D41 ^ S41;
2610   tmpResult |= D42 ^ S42;
2611   tmpResult |= D43 ^ S43;
2612   tmpResult |= D44 ^ S44;
2613   tmpResult |= D45 ^ S45;
2614   tmpResult |= D46 ^ S46;
2615   tmpResult |= D47 ^ S47;
2616
2617   if (tmpResult == 0xffffffff) return;
2618
2619   tmpResult |= D48 ^ S48;
2620   tmpResult |= D49 ^ S49;
2621   tmpResult |= D50 ^ S50;
2622   tmpResult |= D51 ^ S51;
2623   tmpResult |= D52 ^ S52;
2624   tmpResult |= D53 ^ S53;
2625   tmpResult |= D54 ^ S54;
2626   tmpResult |= D55 ^ S55;
2627   tmpResult |= D56 ^ S56;
2628   tmpResult |= D57 ^ S57;
2629   tmpResult |= D58 ^ S58;
2630   tmpResult |= D59 ^ S59;
2631   tmpResult |= D60 ^ S60;
2632   tmpResult |= D61 ^ S61;
2633   tmpResult |= D62 ^ S62;
2634   tmpResult |= D63 ^ S63;
2635
2636   if (tmpResult == 0xffffffff) return;
2637
2638   const u32 slice = 31 - clz (~tmpResult);
2639
2640   #include COMPARE_S
2641 }
2642
2643 //
2644 // transpose bitslice base : easy because no overlapping buffers
2645 //                    mod  : attention race conditions, need different buffers for *in and *out
2646 //
2647
2648 __kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_tb (__global pw_t *pws)
2649 {
2650   const u32 gid = get_global_id (0);
2651
2652   const u32 w0 = pws[gid].i[0];
2653   const u32 w1 = pws[gid].i[1];
2654
2655   const u32 w0s = (w0 << 1) & 0xfefefefe;
2656   const u32 w1s = (w1 << 1) & 0xfefefefe;
2657
2658   #pragma unroll
2659   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
2660   {
2661     pws[gid].i[j +  0 + 0] = -((w0s >> (i + 7)) & 1);
2662     pws[gid].i[j +  0 + 1] = -((w0s >> (i + 6)) & 1);
2663     pws[gid].i[j +  0 + 2] = -((w0s >> (i + 5)) & 1);
2664     pws[gid].i[j +  0 + 3] = -((w0s >> (i + 4)) & 1);
2665     pws[gid].i[j +  0 + 4] = -((w0s >> (i + 3)) & 1);
2666     pws[gid].i[j +  0 + 5] = -((w0s >> (i + 2)) & 1);
2667     pws[gid].i[j +  0 + 6] = -((w0s >> (i + 1)) & 1);
2668   }
2669
2670   #pragma unroll
2671   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
2672   {
2673     pws[gid].i[j + 28 + 0] = -((w1s >> (i + 7)) & 1);
2674     pws[gid].i[j + 28 + 1] = -((w1s >> (i + 6)) & 1);
2675     pws[gid].i[j + 28 + 2] = -((w1s >> (i + 5)) & 1);
2676     pws[gid].i[j + 28 + 3] = -((w1s >> (i + 4)) & 1);
2677     pws[gid].i[j + 28 + 4] = -((w1s >> (i + 3)) & 1);
2678     pws[gid].i[j + 28 + 5] = -((w1s >> (i + 2)) & 1);
2679     pws[gid].i[j + 28 + 6] = -((w1s >> (i + 1)) & 1);
2680   }
2681 }
2682
2683 __kernel void __attribute__((reqd_work_group_size (32, 1, 1))) m01500_tm (__global u32 *mod, __global bs_word_t *words_buf_r)
2684 {
2685   const u32 gid = get_global_id (0);
2686   const u32 lid = get_local_id (0);
2687
2688   const u32 block = gid / 32;
2689   const u32 slice = gid % 32;
2690
2691   const u32 w0 = mod[gid];
2692
2693   const u32 w0s = (w0 << 1) & 0xfefefefe;
2694
2695   #pragma unroll
2696   for (int i = 0, j = 0; i < 32; i += 8, j += 7)
2697   {
2698     atomic_or (&words_buf_r[block].b[j + 0], (((w0s >> (i + 7)) & 1) << slice));
2699     atomic_or (&words_buf_r[block].b[j + 1], (((w0s >> (i + 6)) & 1) << slice));
2700     atomic_or (&words_buf_r[block].b[j + 2], (((w0s >> (i + 5)) & 1) << slice));
2701     atomic_or (&words_buf_r[block].b[j + 3], (((w0s >> (i + 4)) & 1) << slice));
2702     atomic_or (&words_buf_r[block].b[j + 4], (((w0s >> (i + 3)) & 1) << slice));
2703     atomic_or (&words_buf_r[block].b[j + 5], (((w0s >> (i + 2)) & 1) << slice));
2704     atomic_or (&words_buf_r[block].b[j + 6], (((w0s >> (i + 1)) & 1) << slice));
2705   }
2706 }
2707
2708 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2709 {
2710   /**
2711    * base
2712    */
2713
2714   const u32 gid = get_global_id (0);
2715   const u32 lid = get_local_id (0);
2716   const u32 vid = get_local_id (1);
2717
2718   const u32 s0 = digests_buf[digests_offset].digest_buf[0];
2719   const u32 s1 = digests_buf[digests_offset].digest_buf[1];
2720
2721   __local u32 s_S[64];
2722
2723   if (lid == 0)
2724   {
2725     s_S[ 0 + vid] = -((s0 >> vid) & 1);
2726   }
2727   else if (lid == 1)
2728   {
2729     s_S[32 + vid] = -((s1 >> vid) & 1);
2730   }
2731
2732   barrier (CLK_LOCAL_MEM_FENCE);
2733
2734   if (gid >= gid_max) return;
2735
2736   /**
2737    * main
2738    */
2739
2740   m01500m (s_S, 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);
2741 }
2742
2743 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2744 {
2745 }
2746
2747 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2748 {
2749 }
2750
2751 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s04 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2752 {
2753   /**
2754    * base
2755    */
2756
2757   const u32 gid = get_global_id (0);
2758   const u32 lid = get_local_id (0);
2759   const u32 vid = get_local_id (1);
2760
2761   const u32 s0 = digests_buf[digests_offset].digest_buf[0];
2762   const u32 s1 = digests_buf[digests_offset].digest_buf[1];
2763
2764   __local u32 s_S[64];
2765
2766   if (lid == 0)
2767   {
2768     s_S[ 0 + vid] = -((s0 >> vid) & 1);
2769   }
2770   else if (lid == 1)
2771   {
2772     s_S[32 + vid] = -((s1 >> vid) & 1);
2773   }
2774
2775   barrier (CLK_LOCAL_MEM_FENCE);
2776
2777   if (gid >= gid_max) return;
2778
2779   /**
2780    * main
2781    */
2782
2783   m01500s (s_S, 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);
2784 }
2785
2786 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s08 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2787 {
2788 }
2789
2790 __kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s16 (__global pw_t *pws, __global kernel_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * 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)
2791 {
2792 }