]> git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/crypt/crypt_des.c
WASI libc prototype implementation.
[wasi-libc.git] / libc-top-half / musl / src / crypt / crypt_des.c
1 /*
2 * This version has been further modified by Rich Felker, primary author
3 * and maintainer of musl libc, to remove table generation code and
4 * replaced all runtime-generated constant tables with static-initialized
5 * tables in the binary, in the interest of minimizing non-shareable
6 * memory usage and stack size requirements.
7 */
8 /*
9 * This version is derived from the original implementation of FreeSec
10 * (release 1.1) by David Burren. I've made it reentrant, reduced its memory
11 * usage from about 70 KB to about 7 KB (with only minimal performance impact
12 * and keeping code size about the same), made the handling of invalid salts
13 * mostly UFC-crypt compatible, added a quick runtime self-test (which also
14 * serves to zeroize the stack from sensitive data), and added optional tests.
15 * - Solar Designer <solar at openwall.com>
16 */
17
18 /*
19 * FreeSec: libcrypt for NetBSD
20 *
21 * Copyright (c) 1994 David Burren
22 * Copyright (c) 2000,2002,2010,2012 Solar Designer
23 * All rights reserved.
24 *
25 * Redistribution and use in source and binary forms, with or without
26 * modification, are permitted provided that the following conditions
27 * are met:
28 * 1. Redistributions of source code must retain the above copyright
29 * notice, this list of conditions and the following disclaimer.
30 * 2. Redistributions in binary form must reproduce the above copyright
31 * notice, this list of conditions and the following disclaimer in the
32 * documentation and/or other materials provided with the distribution.
33 * 3. Neither the name of the author nor the names of other contributors
34 * may be used to endorse or promote products derived from this software
35 * without specific prior written permission.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
38 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
41 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
42 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
43 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
45 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
46 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 * SUCH DAMAGE.
48 *
49 * $Owl: Owl/packages/glibc/crypt_freesec.c,v 1.6 2010/02/20 14:45:06 solar Exp $
50 * $Id: crypt.c,v 1.15 1994/09/13 04:58:49 davidb Exp $
51 *
52 * This is an original implementation of the DES and the crypt(3) interfaces
53 * by David Burren. It has been heavily re-worked by Solar Designer.
54 */
55
56 #include <stdint.h>
57 #include <string.h>
58
59 #include "crypt_des.h"
60
61 #define _PASSWORD_EFMT1 '_'
62
63 static const unsigned char key_shifts[16] = {
64 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
65 };
66
67 static const uint32_t psbox[8][64] = {
68 {
69 0x00808200,0x00000000,0x00008000,0x00808202,
70 0x00808002,0x00008202,0x00000002,0x00008000,
71 0x00000200,0x00808200,0x00808202,0x00000200,
72 0x00800202,0x00808002,0x00800000,0x00000002,
73 0x00000202,0x00800200,0x00800200,0x00008200,
74 0x00008200,0x00808000,0x00808000,0x00800202,
75 0x00008002,0x00800002,0x00800002,0x00008002,
76 0x00000000,0x00000202,0x00008202,0x00800000,
77 0x00008000,0x00808202,0x00000002,0x00808000,
78 0x00808200,0x00800000,0x00800000,0x00000200,
79 0x00808002,0x00008000,0x00008200,0x00800002,
80 0x00000200,0x00000002,0x00800202,0x00008202,
81 0x00808202,0x00008002,0x00808000,0x00800202,
82 0x00800002,0x00000202,0x00008202,0x00808200,
83 0x00000202,0x00800200,0x00800200,0x00000000,
84 0x00008002,0x00008200,0x00000000,0x00808002,
85 },{
86 0x40084010,0x40004000,0x00004000,0x00084010,
87 0x00080000,0x00000010,0x40080010,0x40004010,
88 0x40000010,0x40084010,0x40084000,0x40000000,
89 0x40004000,0x00080000,0x00000010,0x40080010,
90 0x00084000,0x00080010,0x40004010,0x00000000,
91 0x40000000,0x00004000,0x00084010,0x40080000,
92 0x00080010,0x40000010,0x00000000,0x00084000,
93 0x00004010,0x40084000,0x40080000,0x00004010,
94 0x00000000,0x00084010,0x40080010,0x00080000,
95 0x40004010,0x40080000,0x40084000,0x00004000,
96 0x40080000,0x40004000,0x00000010,0x40084010,
97 0x00084010,0x00000010,0x00004000,0x40000000,
98 0x00004010,0x40084000,0x00080000,0x40000010,
99 0x00080010,0x40004010,0x40000010,0x00080010,
100 0x00084000,0x00000000,0x40004000,0x00004010,
101 0x40000000,0x40080010,0x40084010,0x00084000,
102 },{
103 0x00000104,0x04010100,0x00000000,0x04010004,
104 0x04000100,0x00000000,0x00010104,0x04000100,
105 0x00010004,0x04000004,0x04000004,0x00010000,
106 0x04010104,0x00010004,0x04010000,0x00000104,
107 0x04000000,0x00000004,0x04010100,0x00000100,
108 0x00010100,0x04010000,0x04010004,0x00010104,
109 0x04000104,0x00010100,0x00010000,0x04000104,
110 0x00000004,0x04010104,0x00000100,0x04000000,
111 0x04010100,0x04000000,0x00010004,0x00000104,
112 0x00010000,0x04010100,0x04000100,0x00000000,
113 0x00000100,0x00010004,0x04010104,0x04000100,
114 0x04000004,0x00000100,0x00000000,0x04010004,
115 0x04000104,0x00010000,0x04000000,0x04010104,
116 0x00000004,0x00010104,0x00010100,0x04000004,
117 0x04010000,0x04000104,0x00000104,0x04010000,
118 0x00010104,0x00000004,0x04010004,0x00010100,
119 },{
120 0x80401000,0x80001040,0x80001040,0x00000040,
121 0x00401040,0x80400040,0x80400000,0x80001000,
122 0x00000000,0x00401000,0x00401000,0x80401040,
123 0x80000040,0x00000000,0x00400040,0x80400000,
124 0x80000000,0x00001000,0x00400000,0x80401000,
125 0x00000040,0x00400000,0x80001000,0x00001040,
126 0x80400040,0x80000000,0x00001040,0x00400040,
127 0x00001000,0x00401040,0x80401040,0x80000040,
128 0x00400040,0x80400000,0x00401000,0x80401040,
129 0x80000040,0x00000000,0x00000000,0x00401000,
130 0x00001040,0x00400040,0x80400040,0x80000000,
131 0x80401000,0x80001040,0x80001040,0x00000040,
132 0x80401040,0x80000040,0x80000000,0x00001000,
133 0x80400000,0x80001000,0x00401040,0x80400040,
134 0x80001000,0x00001040,0x00400000,0x80401000,
135 0x00000040,0x00400000,0x00001000,0x00401040,
136 },{
137 0x00000080,0x01040080,0x01040000,0x21000080,
138 0x00040000,0x00000080,0x20000000,0x01040000,
139 0x20040080,0x00040000,0x01000080,0x20040080,
140 0x21000080,0x21040000,0x00040080,0x20000000,
141 0x01000000,0x20040000,0x20040000,0x00000000,
142 0x20000080,0x21040080,0x21040080,0x01000080,
143 0x21040000,0x20000080,0x00000000,0x21000000,
144 0x01040080,0x01000000,0x21000000,0x00040080,
145 0x00040000,0x21000080,0x00000080,0x01000000,
146 0x20000000,0x01040000,0x21000080,0x20040080,
147 0x01000080,0x20000000,0x21040000,0x01040080,
148 0x20040080,0x00000080,0x01000000,0x21040000,
149 0x21040080,0x00040080,0x21000000,0x21040080,
150 0x01040000,0x00000000,0x20040000,0x21000000,
151 0x00040080,0x01000080,0x20000080,0x00040000,
152 0x00000000,0x20040000,0x01040080,0x20000080,
153 },{
154 0x10000008,0x10200000,0x00002000,0x10202008,
155 0x10200000,0x00000008,0x10202008,0x00200000,
156 0x10002000,0x00202008,0x00200000,0x10000008,
157 0x00200008,0x10002000,0x10000000,0x00002008,
158 0x00000000,0x00200008,0x10002008,0x00002000,
159 0x00202000,0x10002008,0x00000008,0x10200008,
160 0x10200008,0x00000000,0x00202008,0x10202000,
161 0x00002008,0x00202000,0x10202000,0x10000000,
162 0x10002000,0x00000008,0x10200008,0x00202000,
163 0x10202008,0x00200000,0x00002008,0x10000008,
164 0x00200000,0x10002000,0x10000000,0x00002008,
165 0x10000008,0x10202008,0x00202000,0x10200000,
166 0x00202008,0x10202000,0x00000000,0x10200008,
167 0x00000008,0x00002000,0x10200000,0x00202008,
168 0x00002000,0x00200008,0x10002008,0x00000000,
169 0x10202000,0x10000000,0x00200008,0x10002008,
170 },{
171 0x00100000,0x02100001,0x02000401,0x00000000,
172 0x00000400,0x02000401,0x00100401,0x02100400,
173 0x02100401,0x00100000,0x00000000,0x02000001,
174 0x00000001,0x02000000,0x02100001,0x00000401,
175 0x02000400,0x00100401,0x00100001,0x02000400,
176 0x02000001,0x02100000,0x02100400,0x00100001,
177 0x02100000,0x00000400,0x00000401,0x02100401,
178 0x00100400,0x00000001,0x02000000,0x00100400,
179 0x02000000,0x00100400,0x00100000,0x02000401,
180 0x02000401,0x02100001,0x02100001,0x00000001,
181 0x00100001,0x02000000,0x02000400,0x00100000,
182 0x02100400,0x00000401,0x00100401,0x02100400,
183 0x00000401,0x02000001,0x02100401,0x02100000,
184 0x00100400,0x00000000,0x00000001,0x02100401,
185 0x00000000,0x00100401,0x02100000,0x00000400,
186 0x02000001,0x02000400,0x00000400,0x00100001,
187 },{
188 0x08000820,0x00000800,0x00020000,0x08020820,
189 0x08000000,0x08000820,0x00000020,0x08000000,
190 0x00020020,0x08020000,0x08020820,0x00020800,
191 0x08020800,0x00020820,0x00000800,0x00000020,
192 0x08020000,0x08000020,0x08000800,0x00000820,
193 0x00020800,0x00020020,0x08020020,0x08020800,
194 0x00000820,0x00000000,0x00000000,0x08020020,
195 0x08000020,0x08000800,0x00020820,0x00020000,
196 0x00020820,0x00020000,0x08020800,0x00000800,
197 0x00000020,0x08020020,0x00000800,0x00020820,
198 0x08000800,0x00000020,0x08000020,0x08020000,
199 0x08020020,0x08000000,0x00020000,0x08000820,
200 0x00000000,0x08020820,0x00020020,0x08000020,
201 0x08020000,0x08000800,0x08000820,0x00000000,
202 0x08020820,0x00020800,0x00020800,0x00000820,
203 0x00000820,0x00020020,0x08000000,0x08020800,
204 },
205 };
206 static const uint32_t ip_maskl[16][16] = {
207 {
208 0x00000000,0x00010000,0x00000000,0x00010000,
209 0x01000000,0x01010000,0x01000000,0x01010000,
210 0x00000000,0x00010000,0x00000000,0x00010000,
211 0x01000000,0x01010000,0x01000000,0x01010000,
212 },{
213 0x00000000,0x00000001,0x00000000,0x00000001,
214 0x00000100,0x00000101,0x00000100,0x00000101,
215 0x00000000,0x00000001,0x00000000,0x00000001,
216 0x00000100,0x00000101,0x00000100,0x00000101,
217 },{
218 0x00000000,0x00020000,0x00000000,0x00020000,
219 0x02000000,0x02020000,0x02000000,0x02020000,
220 0x00000000,0x00020000,0x00000000,0x00020000,
221 0x02000000,0x02020000,0x02000000,0x02020000,
222 },{
223 0x00000000,0x00000002,0x00000000,0x00000002,
224 0x00000200,0x00000202,0x00000200,0x00000202,
225 0x00000000,0x00000002,0x00000000,0x00000002,
226 0x00000200,0x00000202,0x00000200,0x00000202,
227 },{
228 0x00000000,0x00040000,0x00000000,0x00040000,
229 0x04000000,0x04040000,0x04000000,0x04040000,
230 0x00000000,0x00040000,0x00000000,0x00040000,
231 0x04000000,0x04040000,0x04000000,0x04040000,
232 },{
233 0x00000000,0x00000004,0x00000000,0x00000004,
234 0x00000400,0x00000404,0x00000400,0x00000404,
235 0x00000000,0x00000004,0x00000000,0x00000004,
236 0x00000400,0x00000404,0x00000400,0x00000404,
237 },{
238 0x00000000,0x00080000,0x00000000,0x00080000,
239 0x08000000,0x08080000,0x08000000,0x08080000,
240 0x00000000,0x00080000,0x00000000,0x00080000,
241 0x08000000,0x08080000,0x08000000,0x08080000,
242 },{
243 0x00000000,0x00000008,0x00000000,0x00000008,
244 0x00000800,0x00000808,0x00000800,0x00000808,
245 0x00000000,0x00000008,0x00000000,0x00000008,
246 0x00000800,0x00000808,0x00000800,0x00000808,
247 },{
248 0x00000000,0x00100000,0x00000000,0x00100000,
249 0x10000000,0x10100000,0x10000000,0x10100000,
250 0x00000000,0x00100000,0x00000000,0x00100000,
251 0x10000000,0x10100000,0x10000000,0x10100000,
252 },{
253 0x00000000,0x00000010,0x00000000,0x00000010,
254 0x00001000,0x00001010,0x00001000,0x00001010,
255 0x00000000,0x00000010,0x00000000,0x00000010,
256 0x00001000,0x00001010,0x00001000,0x00001010,
257 },{
258 0x00000000,0x00200000,0x00000000,0x00200000,
259 0x20000000,0x20200000,0x20000000,0x20200000,
260 0x00000000,0x00200000,0x00000000,0x00200000,
261 0x20000000,0x20200000,0x20000000,0x20200000,
262 },{
263 0x00000000,0x00000020,0x00000000,0x00000020,
264 0x00002000,0x00002020,0x00002000,0x00002020,
265 0x00000000,0x00000020,0x00000000,0x00000020,
266 0x00002000,0x00002020,0x00002000,0x00002020,
267 },{
268 0x00000000,0x00400000,0x00000000,0x00400000,
269 0x40000000,0x40400000,0x40000000,0x40400000,
270 0x00000000,0x00400000,0x00000000,0x00400000,
271 0x40000000,0x40400000,0x40000000,0x40400000,
272 },{
273 0x00000000,0x00000040,0x00000000,0x00000040,
274 0x00004000,0x00004040,0x00004000,0x00004040,
275 0x00000000,0x00000040,0x00000000,0x00000040,
276 0x00004000,0x00004040,0x00004000,0x00004040,
277 },{
278 0x00000000,0x00800000,0x00000000,0x00800000,
279 0x80000000,0x80800000,0x80000000,0x80800000,
280 0x00000000,0x00800000,0x00000000,0x00800000,
281 0x80000000,0x80800000,0x80000000,0x80800000,
282 },{
283 0x00000000,0x00000080,0x00000000,0x00000080,
284 0x00008000,0x00008080,0x00008000,0x00008080,
285 0x00000000,0x00000080,0x00000000,0x00000080,
286 0x00008000,0x00008080,0x00008000,0x00008080,
287 },
288 };
289 static const uint32_t ip_maskr[16][16] = {
290 {
291 0x00000000,0x00000000,0x00010000,0x00010000,
292 0x00000000,0x00000000,0x00010000,0x00010000,
293 0x01000000,0x01000000,0x01010000,0x01010000,
294 0x01000000,0x01000000,0x01010000,0x01010000,
295 },{
296 0x00000000,0x00000000,0x00000001,0x00000001,
297 0x00000000,0x00000000,0x00000001,0x00000001,
298 0x00000100,0x00000100,0x00000101,0x00000101,
299 0x00000100,0x00000100,0x00000101,0x00000101,
300 },{
301 0x00000000,0x00000000,0x00020000,0x00020000,
302 0x00000000,0x00000000,0x00020000,0x00020000,
303 0x02000000,0x02000000,0x02020000,0x02020000,
304 0x02000000,0x02000000,0x02020000,0x02020000,
305 },{
306 0x00000000,0x00000000,0x00000002,0x00000002,
307 0x00000000,0x00000000,0x00000002,0x00000002,
308 0x00000200,0x00000200,0x00000202,0x00000202,
309 0x00000200,0x00000200,0x00000202,0x00000202,
310 },{
311 0x00000000,0x00000000,0x00040000,0x00040000,
312 0x00000000,0x00000000,0x00040000,0x00040000,
313 0x04000000,0x04000000,0x04040000,0x04040000,
314 0x04000000,0x04000000,0x04040000,0x04040000,
315 },{
316 0x00000000,0x00000000,0x00000004,0x00000004,
317 0x00000000,0x00000000,0x00000004,0x00000004,
318 0x00000400,0x00000400,0x00000404,0x00000404,
319 0x00000400,0x00000400,0x00000404,0x00000404,
320 },{
321 0x00000000,0x00000000,0x00080000,0x00080000,
322 0x00000000,0x00000000,0x00080000,0x00080000,
323 0x08000000,0x08000000,0x08080000,0x08080000,
324 0x08000000,0x08000000,0x08080000,0x08080000,
325 },{
326 0x00000000,0x00000000,0x00000008,0x00000008,
327 0x00000000,0x00000000,0x00000008,0x00000008,
328 0x00000800,0x00000800,0x00000808,0x00000808,
329 0x00000800,0x00000800,0x00000808,0x00000808,
330 },{
331 0x00000000,0x00000000,0x00100000,0x00100000,
332 0x00000000,0x00000000,0x00100000,0x00100000,
333 0x10000000,0x10000000,0x10100000,0x10100000,
334 0x10000000,0x10000000,0x10100000,0x10100000,
335 },{
336 0x00000000,0x00000000,0x00000010,0x00000010,
337 0x00000000,0x00000000,0x00000010,0x00000010,
338 0x00001000,0x00001000,0x00001010,0x00001010,
339 0x00001000,0x00001000,0x00001010,0x00001010,
340 },{
341 0x00000000,0x00000000,0x00200000,0x00200000,
342 0x00000000,0x00000000,0x00200000,0x00200000,
343 0x20000000,0x20000000,0x20200000,0x20200000,
344 0x20000000,0x20000000,0x20200000,0x20200000,
345 },{
346 0x00000000,0x00000000,0x00000020,0x00000020,
347 0x00000000,0x00000000,0x00000020,0x00000020,
348 0x00002000,0x00002000,0x00002020,0x00002020,
349 0x00002000,0x00002000,0x00002020,0x00002020,
350 },{
351 0x00000000,0x00000000,0x00400000,0x00400000,
352 0x00000000,0x00000000,0x00400000,0x00400000,
353 0x40000000,0x40000000,0x40400000,0x40400000,
354 0x40000000,0x40000000,0x40400000,0x40400000,
355 },{
356 0x00000000,0x00000000,0x00000040,0x00000040,
357 0x00000000,0x00000000,0x00000040,0x00000040,
358 0x00004000,0x00004000,0x00004040,0x00004040,
359 0x00004000,0x00004000,0x00004040,0x00004040,
360 },{
361 0x00000000,0x00000000,0x00800000,0x00800000,
362 0x00000000,0x00000000,0x00800000,0x00800000,
363 0x80000000,0x80000000,0x80800000,0x80800000,
364 0x80000000,0x80000000,0x80800000,0x80800000,
365 },{
366 0x00000000,0x00000000,0x00000080,0x00000080,
367 0x00000000,0x00000000,0x00000080,0x00000080,
368 0x00008000,0x00008000,0x00008080,0x00008080,
369 0x00008000,0x00008000,0x00008080,0x00008080,
370 },
371 };
372 static const uint32_t fp_maskl[8][16] = {
373 {
374 0x00000000,0x40000000,0x00400000,0x40400000,
375 0x00004000,0x40004000,0x00404000,0x40404000,
376 0x00000040,0x40000040,0x00400040,0x40400040,
377 0x00004040,0x40004040,0x00404040,0x40404040,
378 },{
379 0x00000000,0x10000000,0x00100000,0x10100000,
380 0x00001000,0x10001000,0x00101000,0x10101000,
381 0x00000010,0x10000010,0x00100010,0x10100010,
382 0x00001010,0x10001010,0x00101010,0x10101010,
383 },{
384 0x00000000,0x04000000,0x00040000,0x04040000,
385 0x00000400,0x04000400,0x00040400,0x04040400,
386 0x00000004,0x04000004,0x00040004,0x04040004,
387 0x00000404,0x04000404,0x00040404,0x04040404,
388 },{
389 0x00000000,0x01000000,0x00010000,0x01010000,
390 0x00000100,0x01000100,0x00010100,0x01010100,
391 0x00000001,0x01000001,0x00010001,0x01010001,
392 0x00000101,0x01000101,0x00010101,0x01010101,
393 },{
394 0x00000000,0x80000000,0x00800000,0x80800000,
395 0x00008000,0x80008000,0x00808000,0x80808000,
396 0x00000080,0x80000080,0x00800080,0x80800080,
397 0x00008080,0x80008080,0x00808080,0x80808080,
398 },{
399 0x00000000,0x20000000,0x00200000,0x20200000,
400 0x00002000,0x20002000,0x00202000,0x20202000,
401 0x00000020,0x20000020,0x00200020,0x20200020,
402 0x00002020,0x20002020,0x00202020,0x20202020,
403 },{
404 0x00000000,0x08000000,0x00080000,0x08080000,
405 0x00000800,0x08000800,0x00080800,0x08080800,
406 0x00000008,0x08000008,0x00080008,0x08080008,
407 0x00000808,0x08000808,0x00080808,0x08080808,
408 },{
409 0x00000000,0x02000000,0x00020000,0x02020000,
410 0x00000200,0x02000200,0x00020200,0x02020200,
411 0x00000002,0x02000002,0x00020002,0x02020002,
412 0x00000202,0x02000202,0x00020202,0x02020202,
413 },
414 };
415 static const uint32_t fp_maskr[8][16] = {
416 {
417 0x00000000,0x40000000,0x00400000,0x40400000,
418 0x00004000,0x40004000,0x00404000,0x40404000,
419 0x00000040,0x40000040,0x00400040,0x40400040,
420 0x00004040,0x40004040,0x00404040,0x40404040,
421 },{
422 0x00000000,0x10000000,0x00100000,0x10100000,
423 0x00001000,0x10001000,0x00101000,0x10101000,
424 0x00000010,0x10000010,0x00100010,0x10100010,
425 0x00001010,0x10001010,0x00101010,0x10101010,
426 },{
427 0x00000000,0x04000000,0x00040000,0x04040000,
428 0x00000400,0x04000400,0x00040400,0x04040400,
429 0x00000004,0x04000004,0x00040004,0x04040004,
430 0x00000404,0x04000404,0x00040404,0x04040404,
431 },{
432 0x00000000,0x01000000,0x00010000,0x01010000,
433 0x00000100,0x01000100,0x00010100,0x01010100,
434 0x00000001,0x01000001,0x00010001,0x01010001,
435 0x00000101,0x01000101,0x00010101,0x01010101,
436 },{
437 0x00000000,0x80000000,0x00800000,0x80800000,
438 0x00008000,0x80008000,0x00808000,0x80808000,
439 0x00000080,0x80000080,0x00800080,0x80800080,
440 0x00008080,0x80008080,0x00808080,0x80808080,
441 },{
442 0x00000000,0x20000000,0x00200000,0x20200000,
443 0x00002000,0x20002000,0x00202000,0x20202000,
444 0x00000020,0x20000020,0x00200020,0x20200020,
445 0x00002020,0x20002020,0x00202020,0x20202020,
446 },{
447 0x00000000,0x08000000,0x00080000,0x08080000,
448 0x00000800,0x08000800,0x00080800,0x08080800,
449 0x00000008,0x08000008,0x00080008,0x08080008,
450 0x00000808,0x08000808,0x00080808,0x08080808,
451 },{
452 0x00000000,0x02000000,0x00020000,0x02020000,
453 0x00000200,0x02000200,0x00020200,0x02020200,
454 0x00000002,0x02000002,0x00020002,0x02020002,
455 0x00000202,0x02000202,0x00020202,0x02020202,
456 },
457 };
458 static const uint32_t key_perm_maskl[8][16] = {
459 {
460 0x00000000,0x00000000,0x00000010,0x00000010,
461 0x00001000,0x00001000,0x00001010,0x00001010,
462 0x00100000,0x00100000,0x00100010,0x00100010,
463 0x00101000,0x00101000,0x00101010,0x00101010,
464 },{
465 0x00000000,0x00000000,0x00000020,0x00000020,
466 0x00002000,0x00002000,0x00002020,0x00002020,
467 0x00200000,0x00200000,0x00200020,0x00200020,
468 0x00202000,0x00202000,0x00202020,0x00202020,
469 },{
470 0x00000000,0x00000000,0x00000040,0x00000040,
471 0x00004000,0x00004000,0x00004040,0x00004040,
472 0x00400000,0x00400000,0x00400040,0x00400040,
473 0x00404000,0x00404000,0x00404040,0x00404040,
474 },{
475 0x00000000,0x00000000,0x00000080,0x00000080,
476 0x00008000,0x00008000,0x00008080,0x00008080,
477 0x00800000,0x00800000,0x00800080,0x00800080,
478 0x00808000,0x00808000,0x00808080,0x00808080,
479 },{
480 0x00000000,0x00000001,0x00000100,0x00000101,
481 0x00010000,0x00010001,0x00010100,0x00010101,
482 0x01000000,0x01000001,0x01000100,0x01000101,
483 0x01010000,0x01010001,0x01010100,0x01010101,
484 },{
485 0x00000000,0x00000002,0x00000200,0x00000202,
486 0x00020000,0x00020002,0x00020200,0x00020202,
487 0x02000000,0x02000002,0x02000200,0x02000202,
488 0x02020000,0x02020002,0x02020200,0x02020202,
489 },{
490 0x00000000,0x00000004,0x00000400,0x00000404,
491 0x00040000,0x00040004,0x00040400,0x00040404,
492 0x04000000,0x04000004,0x04000400,0x04000404,
493 0x04040000,0x04040004,0x04040400,0x04040404,
494 },{
495 0x00000000,0x00000008,0x00000800,0x00000808,
496 0x00080000,0x00080008,0x00080800,0x00080808,
497 0x08000000,0x08000008,0x08000800,0x08000808,
498 0x08080000,0x08080008,0x08080800,0x08080808,
499 },
500 };
501 static const uint32_t key_perm_maskr[12][16] = {
502 {
503 0x00000000,0x00000001,0x00000000,0x00000001,
504 0x00000000,0x00000001,0x00000000,0x00000001,
505 0x00000000,0x00000001,0x00000000,0x00000001,
506 0x00000000,0x00000001,0x00000000,0x00000001,
507 },{
508 0x00000000,0x00000000,0x00100000,0x00100000,
509 0x00001000,0x00001000,0x00101000,0x00101000,
510 0x00000010,0x00000010,0x00100010,0x00100010,
511 0x00001010,0x00001010,0x00101010,0x00101010,
512 },{
513 0x00000000,0x00000002,0x00000000,0x00000002,
514 0x00000000,0x00000002,0x00000000,0x00000002,
515 0x00000000,0x00000002,0x00000000,0x00000002,
516 0x00000000,0x00000002,0x00000000,0x00000002,
517 },{
518 0x00000000,0x00000000,0x00200000,0x00200000,
519 0x00002000,0x00002000,0x00202000,0x00202000,
520 0x00000020,0x00000020,0x00200020,0x00200020,
521 0x00002020,0x00002020,0x00202020,0x00202020,
522 },{
523 0x00000000,0x00000004,0x00000000,0x00000004,
524 0x00000000,0x00000004,0x00000000,0x00000004,
525 0x00000000,0x00000004,0x00000000,0x00000004,
526 0x00000000,0x00000004,0x00000000,0x00000004,
527 },{
528 0x00000000,0x00000000,0x00400000,0x00400000,
529 0x00004000,0x00004000,0x00404000,0x00404000,
530 0x00000040,0x00000040,0x00400040,0x00400040,
531 0x00004040,0x00004040,0x00404040,0x00404040,
532 },{
533 0x00000000,0x00000008,0x00000000,0x00000008,
534 0x00000000,0x00000008,0x00000000,0x00000008,
535 0x00000000,0x00000008,0x00000000,0x00000008,
536 0x00000000,0x00000008,0x00000000,0x00000008,
537 },{
538 0x00000000,0x00000000,0x00800000,0x00800000,
539 0x00008000,0x00008000,0x00808000,0x00808000,
540 0x00000080,0x00000080,0x00800080,0x00800080,
541 0x00008080,0x00008080,0x00808080,0x00808080,
542 },{
543 0x00000000,0x00000000,0x01000000,0x01000000,
544 0x00010000,0x00010000,0x01010000,0x01010000,
545 0x00000100,0x00000100,0x01000100,0x01000100,
546 0x00010100,0x00010100,0x01010100,0x01010100,
547 },{
548 0x00000000,0x00000000,0x02000000,0x02000000,
549 0x00020000,0x00020000,0x02020000,0x02020000,
550 0x00000200,0x00000200,0x02000200,0x02000200,
551 0x00020200,0x00020200,0x02020200,0x02020200,
552 },{
553 0x00000000,0x00000000,0x04000000,0x04000000,
554 0x00040000,0x00040000,0x04040000,0x04040000,
555 0x00000400,0x00000400,0x04000400,0x04000400,
556 0x00040400,0x00040400,0x04040400,0x04040400,
557 },{
558 0x00000000,0x00000000,0x08000000,0x08000000,
559 0x00080000,0x00080000,0x08080000,0x08080000,
560 0x00000800,0x00000800,0x08000800,0x08000800,
561 0x00080800,0x00080800,0x08080800,0x08080800,
562 },
563 };
564 static const uint32_t comp_maskl0[4][8] = {
565 {
566 0x00000000,0x00020000,0x00000001,0x00020001,
567 0x00080000,0x000a0000,0x00080001,0x000a0001,
568 },{
569 0x00000000,0x00001000,0x00000000,0x00001000,
570 0x00000040,0x00001040,0x00000040,0x00001040,
571 },{
572 0x00000000,0x00400000,0x00000020,0x00400020,
573 0x00008000,0x00408000,0x00008020,0x00408020,
574 },{
575 0x00000000,0x00100000,0x00000800,0x00100800,
576 0x00000000,0x00100000,0x00000800,0x00100800,
577 },
578 };
579 static const uint32_t comp_maskr0[4][8] = {
580 {
581 0x00000000,0x00200000,0x00020000,0x00220000,
582 0x00000002,0x00200002,0x00020002,0x00220002,
583 },{
584 0x00000000,0x00000000,0x00100000,0x00100000,
585 0x00000004,0x00000004,0x00100004,0x00100004,
586 },{
587 0x00000000,0x00004000,0x00000800,0x00004800,
588 0x00000000,0x00004000,0x00000800,0x00004800,
589 },{
590 0x00000000,0x00400000,0x00008000,0x00408000,
591 0x00000008,0x00400008,0x00008008,0x00408008,
592 },
593 };
594 static const uint32_t comp_maskl1[4][16] = {
595 {
596 0x00000000,0x00000010,0x00004000,0x00004010,
597 0x00040000,0x00040010,0x00044000,0x00044010,
598 0x00000100,0x00000110,0x00004100,0x00004110,
599 0x00040100,0x00040110,0x00044100,0x00044110,
600 },{
601 0x00000000,0x00800000,0x00000002,0x00800002,
602 0x00000200,0x00800200,0x00000202,0x00800202,
603 0x00200000,0x00a00000,0x00200002,0x00a00002,
604 0x00200200,0x00a00200,0x00200202,0x00a00202,
605 },{
606 0x00000000,0x00002000,0x00000004,0x00002004,
607 0x00000400,0x00002400,0x00000404,0x00002404,
608 0x00000000,0x00002000,0x00000004,0x00002004,
609 0x00000400,0x00002400,0x00000404,0x00002404,
610 },{
611 0x00000000,0x00010000,0x00000008,0x00010008,
612 0x00000080,0x00010080,0x00000088,0x00010088,
613 0x00000000,0x00010000,0x00000008,0x00010008,
614 0x00000080,0x00010080,0x00000088,0x00010088,
615 },
616 };
617 static const uint32_t comp_maskr1[4][16] = {
618 {
619 0x00000000,0x00000000,0x00000080,0x00000080,
620 0x00002000,0x00002000,0x00002080,0x00002080,
621 0x00000001,0x00000001,0x00000081,0x00000081,
622 0x00002001,0x00002001,0x00002081,0x00002081,
623 },{
624 0x00000000,0x00000010,0x00800000,0x00800010,
625 0x00010000,0x00010010,0x00810000,0x00810010,
626 0x00000200,0x00000210,0x00800200,0x00800210,
627 0x00010200,0x00010210,0x00810200,0x00810210,
628 },{
629 0x00000000,0x00000400,0x00001000,0x00001400,
630 0x00080000,0x00080400,0x00081000,0x00081400,
631 0x00000020,0x00000420,0x00001020,0x00001420,
632 0x00080020,0x00080420,0x00081020,0x00081420,
633 },{
634 0x00000000,0x00000100,0x00040000,0x00040100,
635 0x00000000,0x00000100,0x00040000,0x00040100,
636 0x00000040,0x00000140,0x00040040,0x00040140,
637 0x00000040,0x00000140,0x00040040,0x00040140,
638 },
639 };
640
641 static const unsigned char ascii64[] =
642 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
643 /* 0000000000111111111122222222223333333333444444444455555555556666 */
644 /* 0123456789012345678901234567890123456789012345678901234567890123 */
645
646 /*
647 * We match the behavior of UFC-crypt on systems where "char" is signed by
648 * default (the majority), regardless of char's signedness on our system.
649 */
650 static uint32_t ascii_to_bin(int ch)
651 {
652 int sch = (ch < 0x80) ? ch : -(0x100 - ch);
653 int retval;
654
655 retval = sch - '.';
656 if (sch >= 'A') {
657 retval = sch - ('A' - 12);
658 if (sch >= 'a')
659 retval = sch - ('a' - 38);
660 }
661 retval &= 0x3f;
662
663 return retval;
664 }
665
666 /*
667 * When we choose to "support" invalid salts, nevertheless disallow those
668 * containing characters that would violate the passwd file format.
669 */
670 static inline int ascii_is_unsafe(unsigned char ch)
671 {
672 return !ch || ch == '\n' || ch == ':';
673 }
674
675 static uint32_t setup_salt(uint32_t salt)
676 {
677 uint32_t obit, saltbit, saltbits;
678 unsigned int i;
679
680 saltbits = 0;
681 saltbit = 1;
682 obit = 0x800000;
683 for (i = 0; i < 24; i++) {
684 if (salt & saltbit)
685 saltbits |= obit;
686 saltbit <<= 1;
687 obit >>= 1;
688 }
689
690 return saltbits;
691 }
692
693 void __des_setkey(const unsigned char *key, struct expanded_key *ekey)
694 {
695 uint32_t k0, k1, rawkey0, rawkey1;
696 unsigned int shifts, round, i, ibit;
697
698 rawkey0 =
699 (uint32_t)key[3] |
700 ((uint32_t)key[2] << 8) |
701 ((uint32_t)key[1] << 16) |
702 ((uint32_t)key[0] << 24);
703 rawkey1 =
704 (uint32_t)key[7] |
705 ((uint32_t)key[6] << 8) |
706 ((uint32_t)key[5] << 16) |
707 ((uint32_t)key[4] << 24);
708
709 /*
710 * Do key permutation and split into two 28-bit subkeys.
711 */
712 k0 = k1 = 0;
713 for (i = 0, ibit = 28; i < 4; i++, ibit -= 4) {
714 unsigned int j = i << 1;
715 k0 |= key_perm_maskl[i][(rawkey0 >> ibit) & 0xf] |
716 key_perm_maskl[i + 4][(rawkey1 >> ibit) & 0xf];
717 k1 |= key_perm_maskr[j][(rawkey0 >> ibit) & 0xf];
718 ibit -= 4;
719 k1 |= key_perm_maskr[j + 1][(rawkey0 >> ibit) & 0xf] |
720 key_perm_maskr[i + 8][(rawkey1 >> ibit) & 0xf];
721 }
722
723 /*
724 * Rotate subkeys and do compression permutation.
725 */
726 shifts = 0;
727 for (round = 0; round < 16; round++) {
728 uint32_t t0, t1;
729 uint32_t kl, kr;
730
731 shifts += key_shifts[round];
732
733 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
734 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
735
736 kl = kr = 0;
737 ibit = 25;
738 for (i = 0; i < 4; i++) {
739 kl |= comp_maskl0[i][(t0 >> ibit) & 7];
740 kr |= comp_maskr0[i][(t1 >> ibit) & 7];
741 ibit -= 4;
742 kl |= comp_maskl1[i][(t0 >> ibit) & 0xf];
743 kr |= comp_maskr1[i][(t1 >> ibit) & 0xf];
744 ibit -= 3;
745 }
746 ekey->l[round] = kl;
747 ekey->r[round] = kr;
748 }
749 }
750
751 /*
752 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
753 */
754 void __do_des(uint32_t l_in, uint32_t r_in,
755 uint32_t *l_out, uint32_t *r_out,
756 uint32_t count, uint32_t saltbits, const struct expanded_key *ekey)
757 {
758 uint32_t l, r;
759
760 /*
761 * Do initial permutation (IP).
762 */
763 l = r = 0;
764 if (l_in | r_in) {
765 unsigned int i, ibit;
766 for (i = 0, ibit = 28; i < 8; i++, ibit -= 4) {
767 l |= ip_maskl[i][(l_in >> ibit) & 0xf] |
768 ip_maskl[i + 8][(r_in >> ibit) & 0xf];
769 r |= ip_maskr[i][(l_in >> ibit) & 0xf] |
770 ip_maskr[i + 8][(r_in >> ibit) & 0xf];
771 }
772 }
773
774 while (count--) {
775 /*
776 * Do each round.
777 */
778 unsigned int round = 16;
779 const uint32_t *kl = ekey->l;
780 const uint32_t *kr = ekey->r;
781 uint32_t f;
782 while (round--) {
783 uint32_t r48l, r48r;
784 /*
785 * Expand R to 48 bits (simulate the E-box).
786 */
787 r48l = ((r & 0x00000001) << 23)
788 | ((r & 0xf8000000) >> 9)
789 | ((r & 0x1f800000) >> 11)
790 | ((r & 0x01f80000) >> 13)
791 | ((r & 0x001f8000) >> 15);
792
793 r48r = ((r & 0x0001f800) << 7)
794 | ((r & 0x00001f80) << 5)
795 | ((r & 0x000001f8) << 3)
796 | ((r & 0x0000001f) << 1)
797 | ((r & 0x80000000) >> 31);
798 /*
799 * Do salting for crypt() and friends, and
800 * XOR with the permuted key.
801 */
802 f = (r48l ^ r48r) & saltbits;
803 r48l ^= f ^ *kl++;
804 r48r ^= f ^ *kr++;
805 /*
806 * Do S-box lookups (which shrink it back to 32 bits)
807 * and do the P-box permutation at the same time.
808 */
809 f = psbox[0][r48l >> 18]
810 | psbox[1][(r48l >> 12) & 0x3f]
811 | psbox[2][(r48l >> 6) & 0x3f]
812 | psbox[3][r48l & 0x3f]
813 | psbox[4][r48r >> 18]
814 | psbox[5][(r48r >> 12) & 0x3f]
815 | psbox[6][(r48r >> 6) & 0x3f]
816 | psbox[7][r48r & 0x3f];
817 /*
818 * Now that we've permuted things, complete f().
819 */
820 f ^= l;
821 l = r;
822 r = f;
823 }
824 r = l;
825 l = f;
826 }
827
828 /*
829 * Do final permutation (inverse of IP).
830 */
831 {
832 unsigned int i, ibit;
833 uint32_t lo, ro;
834 lo = ro = 0;
835 for (i = 0, ibit = 28; i < 4; i++, ibit -= 4) {
836 ro |= fp_maskr[i][(l >> ibit) & 0xf] |
837 fp_maskr[i + 4][(r >> ibit) & 0xf];
838 ibit -= 4;
839 lo |= fp_maskl[i][(l >> ibit) & 0xf] |
840 fp_maskl[i + 4][(r >> ibit) & 0xf];
841 }
842 *l_out = lo;
843 *r_out = ro;
844 }
845 }
846
847 static void des_cipher(const unsigned char *in, unsigned char *out,
848 uint32_t count, uint32_t saltbits, const struct expanded_key *ekey)
849 {
850 uint32_t l_out, r_out, rawl, rawr;
851
852 rawl =
853 (uint32_t)in[3] |
854 ((uint32_t)in[2] << 8) |
855 ((uint32_t)in[1] << 16) |
856 ((uint32_t)in[0] << 24);
857 rawr =
858 (uint32_t)in[7] |
859 ((uint32_t)in[6] << 8) |
860 ((uint32_t)in[5] << 16) |
861 ((uint32_t)in[4] << 24);
862
863 __do_des(rawl, rawr, &l_out, &r_out, count, saltbits, ekey);
864
865 out[0] = l_out >> 24;
866 out[1] = l_out >> 16;
867 out[2] = l_out >> 8;
868 out[3] = l_out;
869 out[4] = r_out >> 24;
870 out[5] = r_out >> 16;
871 out[6] = r_out >> 8;
872 out[7] = r_out;
873 }
874
875 static char *_crypt_extended_r_uut(const char *_key, const char *_setting, char *output)
876 {
877 const unsigned char *key = (const unsigned char *)_key;
878 const unsigned char *setting = (const unsigned char *)_setting;
879 struct expanded_key ekey;
880 unsigned char keybuf[8];
881 unsigned char *p, *q;
882 uint32_t count, salt, l, r0, r1;
883 unsigned int i;
884
885 /*
886 * Copy the key, shifting each character left by one bit and padding
887 * with zeroes.
888 */
889 q = keybuf;
890 while (q <= &keybuf[sizeof(keybuf) - 1]) {
891 *q++ = *key << 1;
892 if (*key)
893 key++;
894 }
895 __des_setkey(keybuf, &ekey);
896
897 if (*setting == _PASSWORD_EFMT1) {
898 /*
899 * "new"-style:
900 * setting - underscore, 4 chars of count, 4 chars of salt
901 * key - unlimited characters
902 */
903 for (i = 1, count = 0; i < 5; i++) {
904 uint32_t value = ascii_to_bin(setting[i]);
905 if (ascii64[value] != setting[i])
906 return NULL;
907 count |= value << (i - 1) * 6;
908 }
909 if (!count)
910 return NULL;
911
912 for (i = 5, salt = 0; i < 9; i++) {
913 uint32_t value = ascii_to_bin(setting[i]);
914 if (ascii64[value] != setting[i])
915 return NULL;
916 salt |= value << (i - 5) * 6;
917 }
918
919 while (*key) {
920 /*
921 * Encrypt the key with itself.
922 */
923 des_cipher(keybuf, keybuf, 1, 0, &ekey);
924 /*
925 * And XOR with the next 8 characters of the key.
926 */
927 q = keybuf;
928 while (q <= &keybuf[sizeof(keybuf) - 1] && *key)
929 *q++ ^= *key++ << 1;
930 __des_setkey(keybuf, &ekey);
931 }
932
933 memcpy(output, setting, 9);
934 output[9] = '\0';
935 p = (unsigned char *)output + 9;
936 } else {
937 /*
938 * "old"-style:
939 * setting - 2 chars of salt
940 * key - up to 8 characters
941 */
942 count = 25;
943
944 if (ascii_is_unsafe(setting[0]) || ascii_is_unsafe(setting[1]))
945 return NULL;
946
947 salt = (ascii_to_bin(setting[1]) << 6)
948 | ascii_to_bin(setting[0]);
949
950 output[0] = setting[0];
951 output[1] = setting[1];
952 p = (unsigned char *)output + 2;
953 }
954
955 /*
956 * Do it.
957 */
958 __do_des(0, 0, &r0, &r1, count, setup_salt(salt), &ekey);
959
960 /*
961 * Now encode the result...
962 */
963 l = (r0 >> 8);
964 *p++ = ascii64[(l >> 18) & 0x3f];
965 *p++ = ascii64[(l >> 12) & 0x3f];
966 *p++ = ascii64[(l >> 6) & 0x3f];
967 *p++ = ascii64[l & 0x3f];
968
969 l = (r0 << 16) | ((r1 >> 16) & 0xffff);
970 *p++ = ascii64[(l >> 18) & 0x3f];
971 *p++ = ascii64[(l >> 12) & 0x3f];
972 *p++ = ascii64[(l >> 6) & 0x3f];
973 *p++ = ascii64[l & 0x3f];
974
975 l = r1 << 2;
976 *p++ = ascii64[(l >> 12) & 0x3f];
977 *p++ = ascii64[(l >> 6) & 0x3f];
978 *p++ = ascii64[l & 0x3f];
979 *p = 0;
980
981 return output;
982 }
983
984 char *__crypt_des(const char *key, const char *setting, char *output)
985 {
986 const char *test_key = "\x80\xff\x80\x01 "
987 "\x7f\x81\x80\x80\x0d\x0a\xff\x7f \x81 test";
988 const char *test_setting = "_0.../9Zz";
989 const char *test_hash = "_0.../9ZzX7iSJNd21sU";
990 char test_buf[21];
991 char *retval;
992 const char *p;
993
994 if (*setting != _PASSWORD_EFMT1) {
995 test_setting = "\x80x";
996 test_hash = "\x80x22/wK52ZKGA";
997 }
998
999 /*
1000 * Hash the supplied password.
1001 */
1002 retval = _crypt_extended_r_uut(key, setting, output);
1003
1004 /*
1005 * Perform a quick self-test. It is important that we make both calls
1006 * to _crypt_extended_r_uut() from the same scope such that they likely
1007 * use the same stack locations, which makes the second call overwrite
1008 * the first call's sensitive data on the stack and makes it more
1009 * likely that any alignment related issues would be detected.
1010 */
1011 p = _crypt_extended_r_uut(test_key, test_setting, test_buf);
1012 if (p && !strcmp(p, test_hash) && retval)
1013 return retval;
1014
1015 return (setting[0]=='*') ? "x" : "*";
1016 }