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