Initial commit
[hashcat.git] / include / cpu-des.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 static const uint c_SPtrans[8][64] =
7 {
8 {
9 /* nibble 0 */
10 0x02080800, 0x00080000, 0x02000002, 0x02080802,
11 0x02000000, 0x00080802, 0x00080002, 0x02000002,
12 0x00080802, 0x02080800, 0x02080000, 0x00000802,
13 0x02000802, 0x02000000, 0x00000000, 0x00080002,
14 0x00080000, 0x00000002, 0x02000800, 0x00080800,
15 0x02080802, 0x02080000, 0x00000802, 0x02000800,
16 0x00000002, 0x00000800, 0x00080800, 0x02080002,
17 0x00000800, 0x02000802, 0x02080002, 0x00000000,
18 0x00000000, 0x02080802, 0x02000800, 0x00080002,
19 0x02080800, 0x00080000, 0x00000802, 0x02000800,
20 0x02080002, 0x00000800, 0x00080800, 0x02000002,
21 0x00080802, 0x00000002, 0x02000002, 0x02080000,
22 0x02080802, 0x00080800, 0x02080000, 0x02000802,
23 0x02000000, 0x00000802, 0x00080002, 0x00000000,
24 0x00080000, 0x02000000, 0x02000802, 0x02080800,
25 0x00000002, 0x02080002, 0x00000800, 0x00080802,
26 },
27 {
28 /* nibble 1 */
29 0x40108010, 0x00000000, 0x00108000, 0x40100000,
30 0x40000010, 0x00008010, 0x40008000, 0x00108000,
31 0x00008000, 0x40100010, 0x00000010, 0x40008000,
32 0x00100010, 0x40108000, 0x40100000, 0x00000010,
33 0x00100000, 0x40008010, 0x40100010, 0x00008000,
34 0x00108010, 0x40000000, 0x00000000, 0x00100010,
35 0x40008010, 0x00108010, 0x40108000, 0x40000010,
36 0x40000000, 0x00100000, 0x00008010, 0x40108010,
37 0x00100010, 0x40108000, 0x40008000, 0x00108010,
38 0x40108010, 0x00100010, 0x40000010, 0x00000000,
39 0x40000000, 0x00008010, 0x00100000, 0x40100010,
40 0x00008000, 0x40000000, 0x00108010, 0x40008010,
41 0x40108000, 0x00008000, 0x00000000, 0x40000010,
42 0x00000010, 0x40108010, 0x00108000, 0x40100000,
43 0x40100010, 0x00100000, 0x00008010, 0x40008000,
44 0x40008010, 0x00000010, 0x40100000, 0x00108000,
45 },
46 {
47 /* nibble 2 */
48 0x04000001, 0x04040100, 0x00000100, 0x04000101,
49 0x00040001, 0x04000000, 0x04000101, 0x00040100,
50 0x04000100, 0x00040000, 0x04040000, 0x00000001,
51 0x04040101, 0x00000101, 0x00000001, 0x04040001,
52 0x00000000, 0x00040001, 0x04040100, 0x00000100,
53 0x00000101, 0x04040101, 0x00040000, 0x04000001,
54 0x04040001, 0x04000100, 0x00040101, 0x04040000,
55 0x00040100, 0x00000000, 0x04000000, 0x00040101,
56 0x04040100, 0x00000100, 0x00000001, 0x00040000,
57 0x00000101, 0x00040001, 0x04040000, 0x04000101,
58 0x00000000, 0x04040100, 0x00040100, 0x04040001,
59 0x00040001, 0x04000000, 0x04040101, 0x00000001,
60 0x00040101, 0x04000001, 0x04000000, 0x04040101,
61 0x00040000, 0x04000100, 0x04000101, 0x00040100,
62 0x04000100, 0x00000000, 0x04040001, 0x00000101,
63 0x04000001, 0x00040101, 0x00000100, 0x04040000,
64 },
65 {
66 /* nibble 3 */
67 0x00401008, 0x10001000, 0x00000008, 0x10401008,
68 0x00000000, 0x10400000, 0x10001008, 0x00400008,
69 0x10401000, 0x10000008, 0x10000000, 0x00001008,
70 0x10000008, 0x00401008, 0x00400000, 0x10000000,
71 0x10400008, 0x00401000, 0x00001000, 0x00000008,
72 0x00401000, 0x10001008, 0x10400000, 0x00001000,
73 0x00001008, 0x00000000, 0x00400008, 0x10401000,
74 0x10001000, 0x10400008, 0x10401008, 0x00400000,
75 0x10400008, 0x00001008, 0x00400000, 0x10000008,
76 0x00401000, 0x10001000, 0x00000008, 0x10400000,
77 0x10001008, 0x00000000, 0x00001000, 0x00400008,
78 0x00000000, 0x10400008, 0x10401000, 0x00001000,
79 0x10000000, 0x10401008, 0x00401008, 0x00400000,
80 0x10401008, 0x00000008, 0x10001000, 0x00401008,
81 0x00400008, 0x00401000, 0x10400000, 0x10001008,
82 0x00001008, 0x10000000, 0x10000008, 0x10401000,
83 },
84 {
85 /* nibble 4 */
86 0x08000000, 0x00010000, 0x00000400, 0x08010420,
87 0x08010020, 0x08000400, 0x00010420, 0x08010000,
88 0x00010000, 0x00000020, 0x08000020, 0x00010400,
89 0x08000420, 0x08010020, 0x08010400, 0x00000000,
90 0x00010400, 0x08000000, 0x00010020, 0x00000420,
91 0x08000400, 0x00010420, 0x00000000, 0x08000020,
92 0x00000020, 0x08000420, 0x08010420, 0x00010020,
93 0x08010000, 0x00000400, 0x00000420, 0x08010400,
94 0x08010400, 0x08000420, 0x00010020, 0x08010000,
95 0x00010000, 0x00000020, 0x08000020, 0x08000400,
96 0x08000000, 0x00010400, 0x08010420, 0x00000000,
97 0x00010420, 0x08000000, 0x00000400, 0x00010020,
98 0x08000420, 0x00000400, 0x00000000, 0x08010420,
99 0x08010020, 0x08010400, 0x00000420, 0x00010000,
100 0x00010400, 0x08010020, 0x08000400, 0x00000420,
101 0x00000020, 0x00010420, 0x08010000, 0x08000020,
102 },
103 {
104 /* nibble 5 */
105 0x80000040, 0x00200040, 0x00000000, 0x80202000,
106 0x00200040, 0x00002000, 0x80002040, 0x00200000,
107 0x00002040, 0x80202040, 0x00202000, 0x80000000,
108 0x80002000, 0x80000040, 0x80200000, 0x00202040,
109 0x00200000, 0x80002040, 0x80200040, 0x00000000,
110 0x00002000, 0x00000040, 0x80202000, 0x80200040,
111 0x80202040, 0x80200000, 0x80000000, 0x00002040,
112 0x00000040, 0x00202000, 0x00202040, 0x80002000,
113 0x00002040, 0x80000000, 0x80002000, 0x00202040,
114 0x80202000, 0x00200040, 0x00000000, 0x80002000,
115 0x80000000, 0x00002000, 0x80200040, 0x00200000,
116 0x00200040, 0x80202040, 0x00202000, 0x00000040,
117 0x80202040, 0x00202000, 0x00200000, 0x80002040,
118 0x80000040, 0x80200000, 0x00202040, 0x00000000,
119 0x00002000, 0x80000040, 0x80002040, 0x80202000,
120 0x80200000, 0x00002040, 0x00000040, 0x80200040,
121 },
122 {
123 /* nibble 6 */
124 0x00004000, 0x00000200, 0x01000200, 0x01000004,
125 0x01004204, 0x00004004, 0x00004200, 0x00000000,
126 0x01000000, 0x01000204, 0x00000204, 0x01004000,
127 0x00000004, 0x01004200, 0x01004000, 0x00000204,
128 0x01000204, 0x00004000, 0x00004004, 0x01004204,
129 0x00000000, 0x01000200, 0x01000004, 0x00004200,
130 0x01004004, 0x00004204, 0x01004200, 0x00000004,
131 0x00004204, 0x01004004, 0x00000200, 0x01000000,
132 0x00004204, 0x01004000, 0x01004004, 0x00000204,
133 0x00004000, 0x00000200, 0x01000000, 0x01004004,
134 0x01000204, 0x00004204, 0x00004200, 0x00000000,
135 0x00000200, 0x01000004, 0x00000004, 0x01000200,
136 0x00000000, 0x01000204, 0x01000200, 0x00004200,
137 0x00000204, 0x00004000, 0x01004204, 0x01000000,
138 0x01004200, 0x00000004, 0x00004004, 0x01004204,
139 0x01000004, 0x01004200, 0x01004000, 0x00004004,
140 },
141 {
142 /* nibble 7 */
143 0x20800080, 0x20820000, 0x00020080, 0x00000000,
144 0x20020000, 0x00800080, 0x20800000, 0x20820080,
145 0x00000080, 0x20000000, 0x00820000, 0x00020080,
146 0x00820080, 0x20020080, 0x20000080, 0x20800000,
147 0x00020000, 0x00820080, 0x00800080, 0x20020000,
148 0x20820080, 0x20000080, 0x00000000, 0x00820000,
149 0x20000000, 0x00800000, 0x20020080, 0x20800080,
150 0x00800000, 0x00020000, 0x20820000, 0x00000080,
151 0x00800000, 0x00020000, 0x20000080, 0x20820080,
152 0x00020080, 0x20000000, 0x00000000, 0x00820000,
153 0x20800080, 0x20020080, 0x20020000, 0x00800080,
154 0x20820000, 0x00000080, 0x00800080, 0x20020000,
155 0x20820080, 0x00800000, 0x20800000, 0x20000080,
156 0x00820000, 0x00020080, 0x20020080, 0x20800000,
157 0x00000080, 0x20820000, 0x00820080, 0x00000000,
158 0x20000000, 0x20800080, 0x00020000, 0x00820080,
159 },
160 };
161
162 static const uint c_skb[8][64] =
163 {
164 {
165 /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
166 0x00000000, 0x00000010, 0x20000000, 0x20000010,
167 0x00010000, 0x00010010, 0x20010000, 0x20010010,
168 0x00000800, 0x00000810, 0x20000800, 0x20000810,
169 0x00010800, 0x00010810, 0x20010800, 0x20010810,
170 0x00000020, 0x00000030, 0x20000020, 0x20000030,
171 0x00010020, 0x00010030, 0x20010020, 0x20010030,
172 0x00000820, 0x00000830, 0x20000820, 0x20000830,
173 0x00010820, 0x00010830, 0x20010820, 0x20010830,
174 0x00080000, 0x00080010, 0x20080000, 0x20080010,
175 0x00090000, 0x00090010, 0x20090000, 0x20090010,
176 0x00080800, 0x00080810, 0x20080800, 0x20080810,
177 0x00090800, 0x00090810, 0x20090800, 0x20090810,
178 0x00080020, 0x00080030, 0x20080020, 0x20080030,
179 0x00090020, 0x00090030, 0x20090020, 0x20090030,
180 0x00080820, 0x00080830, 0x20080820, 0x20080830,
181 0x00090820, 0x00090830, 0x20090820, 0x20090830,
182 },
183 {
184 /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
185 0x00000000, 0x02000000, 0x00002000, 0x02002000,
186 0x00200000, 0x02200000, 0x00202000, 0x02202000,
187 0x00000004, 0x02000004, 0x00002004, 0x02002004,
188 0x00200004, 0x02200004, 0x00202004, 0x02202004,
189 0x00000400, 0x02000400, 0x00002400, 0x02002400,
190 0x00200400, 0x02200400, 0x00202400, 0x02202400,
191 0x00000404, 0x02000404, 0x00002404, 0x02002404,
192 0x00200404, 0x02200404, 0x00202404, 0x02202404,
193 0x10000000, 0x12000000, 0x10002000, 0x12002000,
194 0x10200000, 0x12200000, 0x10202000, 0x12202000,
195 0x10000004, 0x12000004, 0x10002004, 0x12002004,
196 0x10200004, 0x12200004, 0x10202004, 0x12202004,
197 0x10000400, 0x12000400, 0x10002400, 0x12002400,
198 0x10200400, 0x12200400, 0x10202400, 0x12202400,
199 0x10000404, 0x12000404, 0x10002404, 0x12002404,
200 0x10200404, 0x12200404, 0x10202404, 0x12202404,
201 },
202 {
203 /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
204 0x00000000, 0x00000001, 0x00040000, 0x00040001,
205 0x01000000, 0x01000001, 0x01040000, 0x01040001,
206 0x00000002, 0x00000003, 0x00040002, 0x00040003,
207 0x01000002, 0x01000003, 0x01040002, 0x01040003,
208 0x00000200, 0x00000201, 0x00040200, 0x00040201,
209 0x01000200, 0x01000201, 0x01040200, 0x01040201,
210 0x00000202, 0x00000203, 0x00040202, 0x00040203,
211 0x01000202, 0x01000203, 0x01040202, 0x01040203,
212 0x08000000, 0x08000001, 0x08040000, 0x08040001,
213 0x09000000, 0x09000001, 0x09040000, 0x09040001,
214 0x08000002, 0x08000003, 0x08040002, 0x08040003,
215 0x09000002, 0x09000003, 0x09040002, 0x09040003,
216 0x08000200, 0x08000201, 0x08040200, 0x08040201,
217 0x09000200, 0x09000201, 0x09040200, 0x09040201,
218 0x08000202, 0x08000203, 0x08040202, 0x08040203,
219 0x09000202, 0x09000203, 0x09040202, 0x09040203,
220 },
221 {
222 /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
223 0x00000000, 0x00100000, 0x00000100, 0x00100100,
224 0x00000008, 0x00100008, 0x00000108, 0x00100108,
225 0x00001000, 0x00101000, 0x00001100, 0x00101100,
226 0x00001008, 0x00101008, 0x00001108, 0x00101108,
227 0x04000000, 0x04100000, 0x04000100, 0x04100100,
228 0x04000008, 0x04100008, 0x04000108, 0x04100108,
229 0x04001000, 0x04101000, 0x04001100, 0x04101100,
230 0x04001008, 0x04101008, 0x04001108, 0x04101108,
231 0x00020000, 0x00120000, 0x00020100, 0x00120100,
232 0x00020008, 0x00120008, 0x00020108, 0x00120108,
233 0x00021000, 0x00121000, 0x00021100, 0x00121100,
234 0x00021008, 0x00121008, 0x00021108, 0x00121108,
235 0x04020000, 0x04120000, 0x04020100, 0x04120100,
236 0x04020008, 0x04120008, 0x04020108, 0x04120108,
237 0x04021000, 0x04121000, 0x04021100, 0x04121100,
238 0x04021008, 0x04121008, 0x04021108, 0x04121108,
239 },
240 {
241 /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
242 0x00000000, 0x10000000, 0x00010000, 0x10010000,
243 0x00000004, 0x10000004, 0x00010004, 0x10010004,
244 0x20000000, 0x30000000, 0x20010000, 0x30010000,
245 0x20000004, 0x30000004, 0x20010004, 0x30010004,
246 0x00100000, 0x10100000, 0x00110000, 0x10110000,
247 0x00100004, 0x10100004, 0x00110004, 0x10110004,
248 0x20100000, 0x30100000, 0x20110000, 0x30110000,
249 0x20100004, 0x30100004, 0x20110004, 0x30110004,
250 0x00001000, 0x10001000, 0x00011000, 0x10011000,
251 0x00001004, 0x10001004, 0x00011004, 0x10011004,
252 0x20001000, 0x30001000, 0x20011000, 0x30011000,
253 0x20001004, 0x30001004, 0x20011004, 0x30011004,
254 0x00101000, 0x10101000, 0x00111000, 0x10111000,
255 0x00101004, 0x10101004, 0x00111004, 0x10111004,
256 0x20101000, 0x30101000, 0x20111000, 0x30111000,
257 0x20101004, 0x30101004, 0x20111004, 0x30111004,
258 },
259 {
260 /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
261 0x00000000, 0x08000000, 0x00000008, 0x08000008,
262 0x00000400, 0x08000400, 0x00000408, 0x08000408,
263 0x00020000, 0x08020000, 0x00020008, 0x08020008,
264 0x00020400, 0x08020400, 0x00020408, 0x08020408,
265 0x00000001, 0x08000001, 0x00000009, 0x08000009,
266 0x00000401, 0x08000401, 0x00000409, 0x08000409,
267 0x00020001, 0x08020001, 0x00020009, 0x08020009,
268 0x00020401, 0x08020401, 0x00020409, 0x08020409,
269 0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
270 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
271 0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
272 0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
273 0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
274 0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
275 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
276 0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
277 },
278 {
279 /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
280 0x00000000, 0x00000100, 0x00080000, 0x00080100,
281 0x01000000, 0x01000100, 0x01080000, 0x01080100,
282 0x00000010, 0x00000110, 0x00080010, 0x00080110,
283 0x01000010, 0x01000110, 0x01080010, 0x01080110,
284 0x00200000, 0x00200100, 0x00280000, 0x00280100,
285 0x01200000, 0x01200100, 0x01280000, 0x01280100,
286 0x00200010, 0x00200110, 0x00280010, 0x00280110,
287 0x01200010, 0x01200110, 0x01280010, 0x01280110,
288 0x00000200, 0x00000300, 0x00080200, 0x00080300,
289 0x01000200, 0x01000300, 0x01080200, 0x01080300,
290 0x00000210, 0x00000310, 0x00080210, 0x00080310,
291 0x01000210, 0x01000310, 0x01080210, 0x01080310,
292 0x00200200, 0x00200300, 0x00280200, 0x00280300,
293 0x01200200, 0x01200300, 0x01280200, 0x01280300,
294 0x00200210, 0x00200310, 0x00280210, 0x00280310,
295 0x01200210, 0x01200310, 0x01280210, 0x01280310,
296 },
297 {
298 /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
299 0x00000000, 0x04000000, 0x00040000, 0x04040000,
300 0x00000002, 0x04000002, 0x00040002, 0x04040002,
301 0x00002000, 0x04002000, 0x00042000, 0x04042000,
302 0x00002002, 0x04002002, 0x00042002, 0x04042002,
303 0x00000020, 0x04000020, 0x00040020, 0x04040020,
304 0x00000022, 0x04000022, 0x00040022, 0x04040022,
305 0x00002020, 0x04002020, 0x00042020, 0x04042020,
306 0x00002022, 0x04002022, 0x00042022, 0x04042022,
307 0x00000800, 0x04000800, 0x00040800, 0x04040800,
308 0x00000802, 0x04000802, 0x00040802, 0x04040802,
309 0x00002800, 0x04002800, 0x00042800, 0x04042800,
310 0x00002802, 0x04002802, 0x00042802, 0x04042802,
311 0x00000820, 0x04000820, 0x00040820, 0x04040820,
312 0x00000822, 0x04000822, 0x00040822, 0x04040822,
313 0x00002820, 0x04002820, 0x00042820, 0x04042820,
314 0x00002822, 0x04002822, 0x00042822, 0x04042822
315 }
316 };
317
318 #define PERM_OP(a,b,tt,n,m) \
319 { \
320 tt = a >> n; \
321 tt = tt ^ b; \
322 tt = tt & m; \
323 b = b ^ tt; \
324 tt = tt << n; \
325 a = a ^ tt; \
326 }
327
328 #define HPERM_OP(a,tt,n,m) \
329 { \
330 tt = a << (16 + n); \
331 tt = tt ^ a; \
332 tt = tt & m; \
333 a = a ^ tt; \
334 tt = tt >> (16 + n); \
335 a = a ^ tt; \
336 }
337
338 #define IP(l,r,tt) \
339 { \
340 PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \
341 PERM_OP (l, r, tt, 16, 0x0000ffff); \
342 PERM_OP (r, l, tt, 2, 0x33333333); \
343 PERM_OP (l, r, tt, 8, 0x00ff00ff); \
344 PERM_OP (r, l, tt, 1, 0x55555555); \
345 }
346
347 #define FP(l,r,tt) \
348 { \
349 PERM_OP (l, r, tt, 1, 0x55555555); \
350 PERM_OP (r, l, tt, 8, 0x00ff00ff); \
351 PERM_OP (l, r, tt, 2, 0x33333333); \
352 PERM_OP (r, l, tt, 16, 0x0000ffff); \
353 PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \
354 }
355
356 void _des_keysetup (uint data[2], uint Kc[16], uint Kd[16], const uint s_skb[8][64])
357 {
358 uint c = data[0];
359 uint d = data[1];
360
361 uint tt;
362
363 PERM_OP (d, c, tt, 4, 0x0f0f0f0f);
364 HPERM_OP (c, tt, 2, 0xcccc0000);
365 HPERM_OP (d, tt, 2, 0xcccc0000);
366 PERM_OP (d, c, tt, 1, 0x55555555);
367 PERM_OP (c, d, tt, 8, 0x00ff00ff);
368 PERM_OP (d, c, tt, 1, 0x55555555);
369
370 d = ((d & 0x000000ff) << 16)
371 | ((d & 0x0000ff00) << 0)
372 | ((d & 0x00ff0000) >> 16)
373 | ((c & 0xf0000000) >> 4);
374
375 c = c & 0x0fffffff;
376
377 int i;
378
379 for (i = 0; i < 16; i++)
380 {
381 const uint shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
382 const uint shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 };
383
384 c = c >> shifts3s0[i] | c << shifts3s1[i];
385 d = d >> shifts3s0[i] | d << shifts3s1[i];
386
387 c = c & 0x0fffffff;
388 d = d & 0x0fffffff;
389
390 #define BOX(v,i,S) (S)[(i)][(v)]
391
392 uint s = BOX ((( c >> 0) & 0x3f), 0, s_skb)
393 | BOX ((((c >> 6) & 0x03)
394 | ((c >> 7) & 0x3c)), 1, s_skb)
395 | BOX ((((c >> 13) & 0x0f)
396 | ((c >> 14) & 0x30)), 2, s_skb)
397 | BOX ((((c >> 20) & 0x01)
398 | ((c >> 21) & 0x06)
399 | ((c >> 22) & 0x38)), 3, s_skb);
400
401 uint t = BOX ((( d >> 0) & 0x3f), 4, s_skb)
402 | BOX ((((d >> 7) & 0x03)
403 | ((d >> 8) & 0x3c)), 5, s_skb)
404 | BOX ((((d >> 15) & 0x3f)), 6, s_skb)
405 | BOX ((((d >> 21) & 0x0f)
406 | ((d >> 22) & 0x30)), 7, s_skb);
407
408 Kc[i] = ((t << 16) | (s & 0x0000ffff));
409 Kd[i] = ((s >> 16) | (t & 0xffff0000));
410
411 Kc[i] = ROTATE_LEFT (Kc[i], 2u);
412 Kd[i] = ROTATE_LEFT (Kd[i], 2u);
413 }
414 }
415
416 void _des_encrypt (uint data[2], uint Kc[16], uint Kd[16], const uint s_SPtrans[8][64])
417 {
418 uint r = data[0];
419 uint l = data[1];
420
421 uint tt;
422
423 IP (r, l, tt);
424
425 r = ROTATE_LEFT (r, 3u);
426 l = ROTATE_LEFT (l, 3u);
427
428 int i;
429
430 for (i = 0; i < 16; i++)
431 {
432 uint u = Kc[i] ^ r;
433 uint t = Kd[i] ^ ROTATE_LEFT (r, 28u);
434
435 l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans)
436 | BOX (((u >> 10) & 0x3f), 2, s_SPtrans)
437 | BOX (((u >> 18) & 0x3f), 4, s_SPtrans)
438 | BOX (((u >> 26) & 0x3f), 6, s_SPtrans)
439 | BOX (((t >> 2) & 0x3f), 1, s_SPtrans)
440 | BOX (((t >> 10) & 0x3f), 3, s_SPtrans)
441 | BOX (((t >> 18) & 0x3f), 5, s_SPtrans)
442 | BOX (((t >> 26) & 0x3f), 7, s_SPtrans);
443
444 tt = l;
445 l = r;
446 r = tt;
447 }
448
449 l = ROTATE_LEFT (l, 29u);
450 r = ROTATE_LEFT (r, 29u);
451
452 FP (r, l, tt);
453
454 data[0] = l;
455 data[1] = r;
456 }
457