getopt: fix null pointer arithmetic ub
[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 }