~ubuntu-branches/ubuntu/breezy/uclibc/breezy

« back to all changes in this revision

Viewing changes to libcrypt/des.c

  • Committer: Bazaar Package Importer
  • Author(s): David Schleef
  • Date: 2005-04-18 13:29:53 UTC
  • mfrom: (1.1.1 upstream) (2.1.2 hoary)
  • Revision ID: james.westby@ubuntu.com-20050418132953-hzuzafmpkxuj0gvj
Tags: 0.9.27-1
* New upstream release.
* Acknowledge NMU (Closes: #268989) and fix the bug it caused
  (Closes: #284326)
* Add gross versioned dependency for gcc-3.3, and make sure we use
  gcc-3.3 in the gcc wrapper. (Closes: #304806)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* vi: set sw=4 ts=4: */
2
1
/*
3
 
 * The one and only crypt(3) function.
4
 
 *
5
 
 * This source code is derived from Minix's pwdauth.c, which was based
6
 
 * on Andy Tanenbaum's book "Computer Networks", and then rewritten in
7
 
 * C by Kees J. Bot, 7 Feb 1994.  This code was ported from Minix to
8
 
 * uClibc on June 28, 2001 by Manuel Novoa III, and then reshuffled to
9
 
 * be reentrant by Erik Andersen <andersen@uclibc.org> on June 28, 2001. 
10
 
 *
11
 
 * This program is free software; you can redistribute it and/or modify it
12
 
 * under the terms of the GNU Library General Public License as published by
13
 
 * the Free Software Foundation; either version 2 of the License, or (at your
14
 
 * option) any later version.
15
 
 *
16
 
 * This program is distributed in the hope that it will be useful, but WITHOUT
17
 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
 
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
19
 
 * for more details.
20
 
 *
21
 
 * You should have received a copy of the GNU Library General Public License
22
 
 * along with this program; if not, write to the Free Software Foundation,
23
 
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
 
 *
25
 
 * Original copyright notice is retained at the end of this file.
26
 
 *
27
 
 */
28
 
 
29
 
 
30
 
 
31
 
/* This program gets as input the key and salt arguments of the crypt(3)
32
 
 * function as two null terminated strings.  The crypt result is output as
33
 
 * one null terminated string.  Input and output must be <= 1024 characters.
34
 
 * The exit code will be 1 on any error.
35
 
 *
36
 
 * If the key has the form '##name' then the key will be encrypted and the
37
 
 * result checked to be equal to the encrypted password in the shadow password
38
 
 * file.  If equal than '##name' will be returned, otherwise exit code 2.
39
 
 *
40
 
 * Otherwise the key will be encrypted normally and the result returned.
41
 
 *
42
 
 * As a special case, anything matches a null encrypted password to allow
43
 
 * a no-password login.
44
 
 */
45
 
 
 
2
 * FreeSec: libcrypt for NetBSD
 
3
 *
 
4
 * Copyright (c) 1994 David Burren
 
5
 * All rights reserved.
 
6
 *
 
7
 * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet
 
8
 *      this file should now *only* export crypt(), in order to make
 
9
 *      binaries of libcrypt exportable from the USA
 
10
 *
 
11
 * Adapted for FreeBSD-4.0 by Mark R V Murray
 
12
 *      this file should now *only* export crypt_des(), in order to make
 
13
 *      a module that can be optionally included in libcrypt.
 
14
 *
 
15
 * Redistribution and use in source and binary forms, with or without
 
16
 * modification, are permitted provided that the following conditions
 
17
 * are met:
 
18
 * 1. Redistributions of source code must retain the above copyright
 
19
 *    notice, this list of conditions and the following disclaimer.
 
20
 * 2. Redistributions in binary form must reproduce the above copyright
 
21
 *    notice, this list of conditions and the following disclaimer in the
 
22
 *    documentation and/or other materials provided with the distribution.
 
23
 * 3. Neither the name of the author nor the names of other contributors
 
24
 *    may be used to endorse or promote products derived from this software
 
25
 *    without specific prior written permission.
 
26
 *
 
27
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 
28
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
29
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
30
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 
31
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
32
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
33
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
34
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
35
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
36
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
37
 * SUCH DAMAGE.
 
38
 *
 
39
 * This is an original implementation of the DES and the crypt(3) interfaces
 
40
 * by David Burren <davidb@werj.com.au>.
 
41
 *
 
42
 * An excellent reference on the underlying algorithm (and related
 
43
 * algorithms) is:
 
44
 *
 
45
 *      B. Schneier, Applied Cryptography: protocols, algorithms,
 
46
 *      and source code in C, John Wiley & Sons, 1994.
 
47
 *
 
48
 * Note that in that book's description of DES the lookups for the initial,
 
49
 * pbox, and final permutations are inverted (this has been brought to the
 
50
 * attention of the author).  A list of errata for this book has been
 
51
 * posted to the sci.crypt newsgroup by the author and is available for FTP.
 
52
 *
 
53
 * ARCHITECTURE ASSUMPTIONS:
 
54
 *      It is assumed that the 8-byte arrays passed by reference can be
 
55
 *      addressed as arrays of u_int32_t's (ie. the CPU is not picky about
 
56
 *      alignment).
 
57
 */
 
58
 
 
59
#define __FORCE_GLIBC
 
60
#include <sys/cdefs.h>
 
61
#include <sys/types.h>
 
62
#include <sys/param.h>
 
63
#include <netinet/in.h>
 
64
#include <pwd.h>
46
65
#include <string.h>
47
66
#include <crypt.h>
48
67
 
49
 
extern char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data);
50
 
 
51
 
static const struct ordering InitialTr = { {
52
 
        58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
53
 
        62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
54
 
        57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
55
 
        61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,
56
 
} };
57
 
 
58
 
static const struct ordering FinalTr = { {
59
 
        40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
60
 
        38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
61
 
        36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
62
 
        34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25,
63
 
} };
64
 
 
65
 
static const struct ordering swap = { {
66
 
        33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
67
 
        49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,
68
 
         1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,
69
 
        17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
70
 
} };
71
 
 
72
 
static const struct ordering KeyTr1 = { {
73
 
        57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
74
 
        10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
75
 
        63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
76
 
        14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4,
77
 
} };
78
 
 
79
 
static const struct ordering KeyTr2 = { {
80
 
        14,17,11,24, 1, 5, 3,28,15, 6,21,10,
81
 
        23,19,12, 4,26, 8,16, 7,27,20,13, 2,
82
 
        41,52,31,37,47,55,30,40,51,45,33,48,
83
 
        44,49,39,56,34,53,46,42,50,36,29,32,
84
 
} };
85
 
 
86
 
static const struct ordering etr = { {
87
 
        32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
88
 
         8, 9,10,11,12,13,12,13,14,15,16,17,
89
 
        16,17,18,19,20,21,20,21,22,23,24,25,
90
 
        24,25,26,27,28,29,28,29,30,31,32, 1,
91
 
} };
92
 
 
93
 
static const struct ordering ptr = { {
94
 
        16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
95
 
         2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,
96
 
} };
97
 
 
98
 
static const unsigned char s_boxes[8][64] = {
99
 
{       14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
100
 
         0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
101
 
         4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
102
 
        15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
103
 
},
104
 
 
105
 
{       15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
106
 
         3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
107
 
         0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
108
 
        13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
109
 
},
110
 
 
111
 
{       10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
112
 
        13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
113
 
        13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
114
 
         1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
115
 
},
116
 
 
117
 
{        7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
118
 
        13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
119
 
        10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
120
 
         3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
121
 
},
122
 
 
123
 
{        2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
124
 
        14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
125
 
         4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
126
 
        11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
127
 
},
128
 
 
129
 
{       12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
130
 
        10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
131
 
         9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
132
 
         4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
133
 
},
134
 
 
135
 
{        4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
136
 
        13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
137
 
         1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
138
 
         6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
139
 
},
140
 
 
141
 
{       13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
142
 
         1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
143
 
         7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
144
 
         2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
145
 
},
146
 
};
147
 
 
148
 
static const int rots[] = {
149
 
        1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
150
 
};
151
 
 
152
 
static void transpose(struct block *data, const struct ordering *t, int n)
153
 
{
154
 
        struct block x;
155
 
 
156
 
        x = *data;
157
 
 
158
 
        while (n-- > 0) {
159
 
                data->b_data[n] = x.b_data[t->o_data[n] - 1];
160
 
        }
161
 
}
162
 
 
163
 
static void rotate(struct block *key)
164
 
{
165
 
        unsigned char *p = key->b_data;
166
 
        unsigned char *ep = &(key->b_data[55]);
167
 
        int data0 = key->b_data[0], data28 = key->b_data[28];
168
 
 
169
 
        while (p++ < ep) *(p-1) = *p;
170
 
        key->b_data[27] = data0;
171
 
        key->b_data[55] = data28;
172
 
}
173
 
 
174
 
static void f(int i, struct block *key, struct block *a, struct block *x, struct crypt_data *data)
175
 
{
176
 
        struct block e, ikey, y;
177
 
        int k;
178
 
        unsigned char *p, *q, *r;
179
 
 
180
 
        e = *a;
181
 
        transpose(&e, data->EP, 48);
182
 
        for (k = rots[i]; k; k--) rotate(key);
183
 
        ikey = *key;
184
 
        transpose(&ikey, &KeyTr2, 48);
185
 
        p = &(y.b_data[48]);
186
 
        q = &(e.b_data[48]);
187
 
        r = &(ikey.b_data[48]);
188
 
        while (p > y.b_data) {
189
 
                *--p = *--q ^ *--r;
190
 
        }
191
 
        q = x->b_data;
 
68
/* Re-entrantify me -- all this junk needs to be in 
 
69
 * struct crypt_data to make this really reentrant... */
 
70
static u_char   inv_key_perm[64];
 
71
static u_char   inv_comp_perm[56];
 
72
static u_char   u_sbox[8][64];
 
73
static u_char   un_pbox[32];
 
74
static u_int32_t en_keysl[16], en_keysr[16];
 
75
static u_int32_t de_keysl[16], de_keysr[16];
 
76
static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
 
77
static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
 
78
static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
 
79
static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
 
80
static u_int32_t saltbits;
 
81
static u_int32_t old_salt;
 
82
static u_int32_t old_rawkey0, old_rawkey1;
 
83
 
 
84
 
 
85
/* Static stuff that stays resident and doesn't change after 
 
86
 * being initialized, and therefore doesn't need to be made 
 
87
 * reentrant. */
 
88
static u_char   init_perm[64], final_perm[64];
 
89
static u_char   m_sbox[4][4096];
 
90
static u_int32_t psbox[4][256];
 
91
 
 
92
 
 
93
 
 
94
 
 
95
/* A pile of data */
 
96
static const u_char     ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 
97
 
 
98
static const u_char     IP[64] = {
 
99
        58, 50, 42, 34, 26, 18, 10,  2, 60, 52, 44, 36, 28, 20, 12,  4,
 
100
        62, 54, 46, 38, 30, 22, 14,  6, 64, 56, 48, 40, 32, 24, 16,  8,
 
101
        57, 49, 41, 33, 25, 17,  9,  1, 59, 51, 43, 35, 27, 19, 11,  3,
 
102
        61, 53, 45, 37, 29, 21, 13,  5, 63, 55, 47, 39, 31, 23, 15,  7
 
103
};
 
104
 
 
105
static const u_char     key_perm[56] = {
 
106
        57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18,
 
107
        10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
 
108
        63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
 
109
        14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
 
110
};
 
111
 
 
112
static const u_char     key_shifts[16] = {
 
113
        1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
 
114
};
 
115
 
 
116
static const u_char     comp_perm[48] = {
 
117
        14, 17, 11, 24,  1,  5,  3, 28, 15,  6, 21, 10,
 
118
        23, 19, 12,  4, 26,  8, 16,  7, 27, 20, 13,  2,
 
119
        41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
 
120
        44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
 
121
};
 
122
 
 
123
/*
 
124
 *      No E box is used, as it's replaced by some ANDs, shifts, and ORs.
 
125
 */
 
126
 
 
127
static const u_char     sbox[8][64] = {
 
128
        {
 
129
                14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
 
130
                 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
 
131
                 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
 
132
                15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13
 
133
        },
 
134
        {
 
135
                15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
 
136
                 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
 
137
                 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
 
138
                13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9
 
139
        },
 
140
        {
 
141
                10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
 
142
                13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
 
143
                13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
 
144
                 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12
 
145
        },
 
146
        {
 
147
                 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
 
148
                13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
 
149
                10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
 
150
                 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14
 
151
        },
 
152
        {
 
153
                 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
 
154
                14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
 
155
                 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
 
156
                11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3
 
157
        },
 
158
        {
 
159
                12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
 
160
                10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
 
161
                 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
 
162
                 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13
 
163
        },
 
164
        {
 
165
                 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
 
166
                13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
 
167
                 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
 
168
                 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12
 
169
        },
 
170
        {
 
171
                13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
 
172
                 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
 
173
                 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
 
174
                 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
 
175
        }
 
176
};
 
177
 
 
178
static const u_char     pbox[32] = {
 
179
        16,  7, 20, 21, 29, 12, 28, 17,  1, 15, 23, 26,  5, 18, 31, 10,
 
180
         2,  8, 24, 14, 32, 27,  3,  9, 19, 13, 30,  6, 22, 11,  4, 25
 
181
};
 
182
 
 
183
static const u_int32_t bits32[32] =
 
184
{
 
185
        0x80000000, 0x40000000, 0x20000000, 0x10000000,
 
186
        0x08000000, 0x04000000, 0x02000000, 0x01000000,
 
187
        0x00800000, 0x00400000, 0x00200000, 0x00100000,
 
188
        0x00080000, 0x00040000, 0x00020000, 0x00010000,
 
189
        0x00008000, 0x00004000, 0x00002000, 0x00001000,
 
190
        0x00000800, 0x00000400, 0x00000200, 0x00000100,
 
191
        0x00000080, 0x00000040, 0x00000020, 0x00000010,
 
192
        0x00000008, 0x00000004, 0x00000002, 0x00000001
 
193
};
 
194
 
 
195
static const u_char     bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
 
196
static const u_int32_t *bits28, *bits24;
 
197
 
 
198
 
 
199
static int 
 
200
ascii_to_bin(char ch)
 
201
{
 
202
        if (ch > 'z')
 
203
                return(0);
 
204
        if (ch >= 'a')
 
205
                return(ch - 'a' + 38);
 
206
        if (ch > 'Z')
 
207
                return(0);
 
208
        if (ch >= 'A')
 
209
                return(ch - 'A' + 12);
 
210
        if (ch > '9')
 
211
                return(0);
 
212
        if (ch >= '.')
 
213
                return(ch - '.');
 
214
        return(0);
 
215
}
 
216
 
 
217
static void
 
218
des_init(void)
 
219
{
 
220
        int     i, j, b, k, inbit, obit;
 
221
        u_int32_t       *p, *il, *ir, *fl, *fr;
 
222
        static int des_initialised = 0;
 
223
 
 
224
        if (des_initialised==1)
 
225
            return;
 
226
 
 
227
        old_rawkey0 = old_rawkey1 = 0L;
 
228
        saltbits = 0L;
 
229
        old_salt = 0L;
 
230
        bits24 = (bits28 = bits32 + 4) + 4;
 
231
 
 
232
        /*
 
233
         * Invert the S-boxes, reordering the input bits.
 
234
         */
 
235
        for (i = 0; i < 8; i++)
 
236
                for (j = 0; j < 64; j++) {
 
237
                        b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
 
238
                        u_sbox[i][j] = sbox[i][b];
 
239
                }
 
240
 
 
241
        /*
 
242
         * Convert the inverted S-boxes into 4 arrays of 8 bits.
 
243
         * Each will handle 12 bits of the S-box input.
 
244
         */
 
245
        for (b = 0; b < 4; b++)
 
246
                for (i = 0; i < 64; i++)
 
247
                        for (j = 0; j < 64; j++)
 
248
                                m_sbox[b][(i << 6) | j] =
 
249
                                        (u_char)((u_sbox[(b << 1)][i] << 4) |
 
250
                                        u_sbox[(b << 1) + 1][j]);
 
251
 
 
252
        /*
 
253
         * Set up the initial & final permutations into a useful form, and
 
254
         * initialise the inverted key permutation.
 
255
         */
 
256
        for (i = 0; i < 64; i++) {
 
257
                init_perm[final_perm[i] = IP[i] - 1] = (u_char)i;
 
258
                inv_key_perm[i] = 255;
 
259
        }
 
260
 
 
261
        /*
 
262
         * Invert the key permutation and initialise the inverted key
 
263
         * compression permutation.
 
264
         */
 
265
        for (i = 0; i < 56; i++) {
 
266
                inv_key_perm[key_perm[i] - 1] = (u_char)i;
 
267
                inv_comp_perm[i] = 255;
 
268
        }
 
269
 
 
270
        /*
 
271
         * Invert the key compression permutation.
 
272
         */
 
273
        for (i = 0; i < 48; i++) {
 
274
                inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
 
275
        }
 
276
 
 
277
        /*
 
278
         * Set up the OR-mask arrays for the initial and final permutations,
 
279
         * and for the key initial and compression permutations.
 
280
         */
192
281
        for (k = 0; k < 8; k++) {
193
 
                int xb, r;
194
 
 
195
 
                r = *p++ << 5;
196
 
                r += *p++ << 3;
197
 
                r += *p++ << 2;
198
 
                r += *p++ << 1;
199
 
                r += *p++;
200
 
                r += *p++ << 4;
201
 
 
202
 
                xb = s_boxes[k][r];
203
 
 
204
 
                *q++ = (xb >> 3) & 1;
205
 
                *q++ = (xb>>2) & 1;
206
 
                *q++ = (xb>>1) & 1;
207
 
                *q++ = (xb & 1);
208
 
        }
209
 
        transpose(x, &ptr, 32);
210
 
}
211
 
 
212
 
void setkey_r(const char *k, struct crypt_data *data)
213
 
{
214
 
        struct block *key = &(data->key);
215
 
        memcpy(key, k, (sizeof(struct block)));
216
 
        transpose(key, &KeyTr1, 56);
217
 
}
218
 
 
219
 
extern void encrypt_r(char *blck, int edflag, struct crypt_data *data)
220
 
{
221
 
        struct block *key = &(data->key);
222
 
        struct block *p = (struct block *) blck;
223
 
        int i;
224
 
 
225
 
        transpose(p, &InitialTr, 64);
226
 
        for (i = 15; i>= 0; i--) {
227
 
                int j = edflag ? i : 15 - i;
228
 
                int k;
229
 
                struct block b, x;
230
 
 
231
 
                b = *p;
232
 
                for (k = 31; k >= 0; k--) {
233
 
                        p->b_data[k] = b.b_data[k + 32];
234
 
                }
235
 
                f(j, key, p, &x, data);
236
 
                for (k = 31; k >= 0; k--) {
237
 
                        p->b_data[k+32] = b.b_data[k] ^ x.b_data[k];
238
 
                }
239
 
        }
240
 
        transpose(p, &swap, 64);
241
 
        transpose(p, &FinalTr, 64);
242
 
}
243
 
 
244
 
extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data)
245
 
{
246
 
        char pwb[66];
247
 
        char *cp;
248
 
        static char result[16];
249
 
        char *p = pwb;
250
 
        struct ordering new_etr;
251
 
        int i;
252
 
 
253
 
        /* First, check if we are supposed to be using the MD5 replacement
254
 
         * instead of DES...  */
255
 
        if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$')
256
 
                return md5_crypt_r(pw, salt, data);
257
 
 
258
 
        data->EP = &etr;
259
 
        while (*pw && p < &pwb[64]) {
260
 
                int j = 7;
261
 
 
262
 
                while (j--) {
263
 
                        *p++ = (*pw >> j) & 01;
264
 
                }
265
 
                pw++;
266
 
                *p++ = 0;
267
 
        }
268
 
        while (p < &pwb[64]) *p++ = 0;
269
 
 
270
 
        setkey_r(p = pwb, data);
271
 
 
272
 
        while (p < &pwb[66]) *p++ = 0;
273
 
 
274
 
        new_etr = etr;
275
 
        data->EP = &new_etr;
276
 
        if (salt[0] == 0 || salt[1] == 0) salt = "**";
 
282
                for (i = 0; i < 256; i++) {
 
283
                        *(il = &ip_maskl[k][i]) = 0L;
 
284
                        *(ir = &ip_maskr[k][i]) = 0L;
 
285
                        *(fl = &fp_maskl[k][i]) = 0L;
 
286
                        *(fr = &fp_maskr[k][i]) = 0L;
 
287
                        for (j = 0; j < 8; j++) {
 
288
                                inbit = 8 * k + j;
 
289
                                if (i & bits8[j]) {
 
290
                                        if ((obit = init_perm[inbit]) < 32)
 
291
                                                *il |= bits32[obit];
 
292
                                        else
 
293
                                                *ir |= bits32[obit-32];
 
294
                                        if ((obit = final_perm[inbit]) < 32)
 
295
                                                *fl |= bits32[obit];
 
296
                                        else
 
297
                                                *fr |= bits32[obit - 32];
 
298
                                }
 
299
                        }
 
300
                }
 
301
                for (i = 0; i < 128; i++) {
 
302
                        *(il = &key_perm_maskl[k][i]) = 0L;
 
303
                        *(ir = &key_perm_maskr[k][i]) = 0L;
 
304
                        for (j = 0; j < 7; j++) {
 
305
                                inbit = 8 * k + j;
 
306
                                if (i & bits8[j + 1]) {
 
307
                                        if ((obit = inv_key_perm[inbit]) == 255)
 
308
                                                continue;
 
309
                                        if (obit < 28)
 
310
                                                *il |= bits28[obit];
 
311
                                        else
 
312
                                                *ir |= bits28[obit - 28];
 
313
                                }
 
314
                        }
 
315
                        *(il = &comp_maskl[k][i]) = 0L;
 
316
                        *(ir = &comp_maskr[k][i]) = 0L;
 
317
                        for (j = 0; j < 7; j++) {
 
318
                                inbit = 7 * k + j;
 
319
                                if (i & bits8[j + 1]) {
 
320
                                        if ((obit=inv_comp_perm[inbit]) == 255)
 
321
                                                continue;
 
322
                                        if (obit < 24)
 
323
                                                *il |= bits24[obit];
 
324
                                        else
 
325
                                                *ir |= bits24[obit - 24];
 
326
                                }
 
327
                        }
 
328
                }
 
329
        }
 
330
 
 
331
        /*
 
332
         * Invert the P-box permutation, and convert into OR-masks for
 
333
         * handling the output of the S-box arrays setup above.
 
334
         */
 
335
        for (i = 0; i < 32; i++)
 
336
                un_pbox[pbox[i] - 1] = (u_char)i;
 
337
 
 
338
        for (b = 0; b < 4; b++)
 
339
                for (i = 0; i < 256; i++) {
 
340
                        *(p = &psbox[b][i]) = 0L;
 
341
                        for (j = 0; j < 8; j++) {
 
342
                                if (i & bits8[j])
 
343
                                        *p |= bits32[un_pbox[8 * b + j]];
 
344
                        }
 
345
                }
 
346
 
 
347
        des_initialised = 1;
 
348
}
 
349
 
 
350
 
 
351
static void
 
352
setup_salt(long salt)
 
353
{
 
354
        u_int32_t       obit, saltbit;
 
355
        int     i;
 
356
 
 
357
        if (salt == old_salt)
 
358
                return;
 
359
        old_salt = salt;
 
360
 
 
361
        saltbits = 0L;
 
362
        saltbit = 1;
 
363
        obit = 0x800000;
 
364
        for (i = 0; i < 24; i++) {
 
365
                if (salt & saltbit)
 
366
                        saltbits |= obit;
 
367
                saltbit <<= 1;
 
368
                obit >>= 1;
 
369
        }
 
370
}
 
371
 
 
372
 
 
373
static int
 
374
des_setkey(const char *key)
 
375
{
 
376
        u_int32_t       k0, k1, rawkey0, rawkey1;
 
377
        int             shifts, round;
 
378
 
 
379
        des_init();
 
380
 
 
381
        rawkey0 = ntohl(*(const u_int32_t *) key);
 
382
        rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
 
383
 
 
384
        if ((rawkey0 | rawkey1)
 
385
            && rawkey0 == old_rawkey0
 
386
            && rawkey1 == old_rawkey1) {
 
387
                /*
 
388
                 * Already setup for this key.
 
389
                 * This optimisation fails on a zero key (which is weak and
 
390
                 * has bad parity anyway) in order to simplify the starting
 
391
                 * conditions.
 
392
                 */
 
393
                return(0);
 
394
        }
 
395
        old_rawkey0 = rawkey0;
 
396
        old_rawkey1 = rawkey1;
 
397
 
 
398
        /*
 
399
         *      Do key permutation and split into two 28-bit subkeys.
 
400
         */
 
401
        k0 = key_perm_maskl[0][rawkey0 >> 25]
 
402
           | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]
 
403
           | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]
 
404
           | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]
 
405
           | key_perm_maskl[4][rawkey1 >> 25]
 
406
           | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]
 
407
           | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]
 
408
           | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];
 
409
        k1 = key_perm_maskr[0][rawkey0 >> 25]
 
410
           | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]
 
411
           | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]
 
412
           | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]
 
413
           | key_perm_maskr[4][rawkey1 >> 25]
 
414
           | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]
 
415
           | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]
 
416
           | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];
 
417
        /*
 
418
         *      Rotate subkeys and do compression permutation.
 
419
         */
 
420
        shifts = 0;
 
421
        for (round = 0; round < 16; round++) {
 
422
                u_int32_t       t0, t1;
 
423
 
 
424
                shifts += key_shifts[round];
 
425
 
 
426
                t0 = (k0 << shifts) | (k0 >> (28 - shifts));
 
427
                t1 = (k1 << shifts) | (k1 >> (28 - shifts));
 
428
 
 
429
                de_keysl[15 - round] =
 
430
                en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
 
431
                                | comp_maskl[1][(t0 >> 14) & 0x7f]
 
432
                                | comp_maskl[2][(t0 >> 7) & 0x7f]
 
433
                                | comp_maskl[3][t0 & 0x7f]
 
434
                                | comp_maskl[4][(t1 >> 21) & 0x7f]
 
435
                                | comp_maskl[5][(t1 >> 14) & 0x7f]
 
436
                                | comp_maskl[6][(t1 >> 7) & 0x7f]
 
437
                                | comp_maskl[7][t1 & 0x7f];
 
438
 
 
439
                de_keysr[15 - round] =
 
440
                en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
 
441
                                | comp_maskr[1][(t0 >> 14) & 0x7f]
 
442
                                | comp_maskr[2][(t0 >> 7) & 0x7f]
 
443
                                | comp_maskr[3][t0 & 0x7f]
 
444
                                | comp_maskr[4][(t1 >> 21) & 0x7f]
 
445
                                | comp_maskr[5][(t1 >> 14) & 0x7f]
 
446
                                | comp_maskr[6][(t1 >> 7) & 0x7f]
 
447
                                | comp_maskr[7][t1 & 0x7f];
 
448
        }
 
449
        return(0);
 
450
}
 
451
 
 
452
 
 
453
static int
 
454
do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
 
455
{
 
456
        /*
 
457
         *      l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
 
458
         */
 
459
        u_int32_t       l, r, *kl, *kr, *kl1, *kr1;
 
460
        u_int32_t       f, r48l, r48r;
 
461
        int             round;
 
462
 
 
463
        if (count == 0) {
 
464
                return(1);
 
465
        } else if (count > 0) {
 
466
                /*
 
467
                 * Encrypting
 
468
                 */
 
469
                kl1 = en_keysl;
 
470
                kr1 = en_keysr;
 
471
        } else {
 
472
                /*
 
473
                 * Decrypting
 
474
                 */
 
475
                count = -count;
 
476
                kl1 = de_keysl;
 
477
                kr1 = de_keysr;
 
478
        }
 
479
 
 
480
        /*
 
481
         *      Do initial permutation (IP).
 
482
         */
 
483
        l = ip_maskl[0][l_in >> 24]
 
484
          | ip_maskl[1][(l_in >> 16) & 0xff]
 
485
          | ip_maskl[2][(l_in >> 8) & 0xff]
 
486
          | ip_maskl[3][l_in & 0xff]
 
487
          | ip_maskl[4][r_in >> 24]
 
488
          | ip_maskl[5][(r_in >> 16) & 0xff]
 
489
          | ip_maskl[6][(r_in >> 8) & 0xff]
 
490
          | ip_maskl[7][r_in & 0xff];
 
491
        r = ip_maskr[0][l_in >> 24]
 
492
          | ip_maskr[1][(l_in >> 16) & 0xff]
 
493
          | ip_maskr[2][(l_in >> 8) & 0xff]
 
494
          | ip_maskr[3][l_in & 0xff]
 
495
          | ip_maskr[4][r_in >> 24]
 
496
          | ip_maskr[5][(r_in >> 16) & 0xff]
 
497
          | ip_maskr[6][(r_in >> 8) & 0xff]
 
498
          | ip_maskr[7][r_in & 0xff];
 
499
 
 
500
        while (count--) {
 
501
                /*
 
502
                 * Do each round.
 
503
                 */
 
504
                kl = kl1;
 
505
                kr = kr1;
 
506
                round = 16;
 
507
                while (round--) {
 
508
                        /*
 
509
                         * Expand R to 48 bits (simulate the E-box).
 
510
                         */
 
511
                        r48l    = ((r & 0x00000001) << 23)
 
512
                                | ((r & 0xf8000000) >> 9)
 
513
                                | ((r & 0x1f800000) >> 11)
 
514
                                | ((r & 0x01f80000) >> 13)
 
515
                                | ((r & 0x001f8000) >> 15);
 
516
 
 
517
                        r48r    = ((r & 0x0001f800) << 7)
 
518
                                | ((r & 0x00001f80) << 5)
 
519
                                | ((r & 0x000001f8) << 3)
 
520
                                | ((r & 0x0000001f) << 1)
 
521
                                | ((r & 0x80000000) >> 31);
 
522
                        /*
 
523
                         * Do salting for crypt() and friends, and
 
524
                         * XOR with the permuted key.
 
525
                         */
 
526
                        f = (r48l ^ r48r) & saltbits;
 
527
                        r48l ^= f ^ *kl++;
 
528
                        r48r ^= f ^ *kr++;
 
529
                        /*
 
530
                         * Do sbox lookups (which shrink it back to 32 bits)
 
531
                         * and do the pbox permutation at the same time.
 
532
                         */
 
533
                        f = psbox[0][m_sbox[0][r48l >> 12]]
 
534
                          | psbox[1][m_sbox[1][r48l & 0xfff]]
 
535
                          | psbox[2][m_sbox[2][r48r >> 12]]
 
536
                          | psbox[3][m_sbox[3][r48r & 0xfff]];
 
537
                        /*
 
538
                         * Now that we've permuted things, complete f().
 
539
                         */
 
540
                        f ^= l;
 
541
                        l = r;
 
542
                        r = f;
 
543
                }
 
544
                r = l;
 
545
                l = f;
 
546
        }
 
547
        /*
 
548
         * Do final permutation (inverse of IP).
 
549
         */
 
550
        *l_out  = fp_maskl[0][l >> 24]
 
551
                | fp_maskl[1][(l >> 16) & 0xff]
 
552
                | fp_maskl[2][(l >> 8) & 0xff]
 
553
                | fp_maskl[3][l & 0xff]
 
554
                | fp_maskl[4][r >> 24]
 
555
                | fp_maskl[5][(r >> 16) & 0xff]
 
556
                | fp_maskl[6][(r >> 8) & 0xff]
 
557
                | fp_maskl[7][r & 0xff];
 
558
        *r_out  = fp_maskr[0][l >> 24]
 
559
                | fp_maskr[1][(l >> 16) & 0xff]
 
560
                | fp_maskr[2][(l >> 8) & 0xff]
 
561
                | fp_maskr[3][l & 0xff]
 
562
                | fp_maskr[4][r >> 24]
 
563
                | fp_maskr[5][(r >> 16) & 0xff]
 
564
                | fp_maskr[6][(r >> 8) & 0xff]
 
565
                | fp_maskr[7][r & 0xff];
 
566
        return(0);
 
567
}
 
568
 
 
569
 
 
570
#if 0
 
571
static int
 
572
des_cipher(const char *in, char *out, u_int32_t salt, int count)
 
573
{
 
574
        u_int32_t       l_out, r_out, rawl, rawr;
 
575
        int             retval;
 
576
        union {
 
577
                u_int32_t       *ui32;
 
578
                const char      *c;
 
579
        } trans;
 
580
 
 
581
        des_init();
 
582
 
 
583
        setup_salt(salt);
 
584
 
 
585
        trans.c = in;
 
586
        rawl = ntohl(*trans.ui32++);
 
587
        rawr = ntohl(*trans.ui32);
 
588
 
 
589
        retval = do_des(rawl, rawr, &l_out, &r_out, count);
 
590
 
 
591
        trans.c = out;
 
592
        *trans.ui32++ = htonl(l_out);
 
593
        *trans.ui32 = htonl(r_out);
 
594
        return(retval);
 
595
}
 
596
#endif
 
597
 
 
598
 
 
599
void
 
600
setkey(const char *key)
 
601
{
 
602
        int     i, j;
 
603
        u_int32_t       packed_keys[2];
 
604
        u_char  *p;
 
605
 
 
606
        p = (u_char *) packed_keys;
 
607
 
 
608
        for (i = 0; i < 8; i++) {
 
609
                p[i] = 0;
 
610
                for (j = 0; j < 8; j++)
 
611
                        if (*key++ & 1)
 
612
                                p[i] |= bits8[j];
 
613
        }
 
614
        des_setkey(p);
 
615
}
 
616
 
 
617
 
 
618
void
 
619
encrypt(char *block, int flag)
 
620
{
 
621
        u_int32_t       io[2];
 
622
        u_char  *p;
 
623
        int     i, j;
 
624
 
 
625
        des_init();
 
626
 
 
627
        setup_salt(0L);
 
628
        p = block;
277
629
        for (i = 0; i < 2; i++) {
278
 
                char c = *salt++;
279
 
                int j;
280
 
 
281
 
                result[i] = c;
282
 
                if ( c > 'Z') c -= 6 + 7 + '.'; /* c was a lower case letter */
283
 
                else if ( c > '9') c -= 7 + '.';/* c was upper case letter */
284
 
                else c -= '.';                  /* c was digit, '.' or '/'. */
285
 
                                                /* now, 0 <= c <= 63 */
286
 
                for (j = 0; j < 6; j++) {
287
 
                        if ((c >> j) & 01) {
288
 
                                int t = 6*i + j;
289
 
                                int temp = new_etr.o_data[t];
290
 
                                new_etr.o_data[t] = new_etr.o_data[t+24];
291
 
                                new_etr.o_data[t+24] = temp;
292
 
                        }
293
 
                }
294
 
        }
295
 
 
296
 
        if (result[1] == 0) result[1] = result[0];
297
 
 
298
 
        for (i = 0; i < 25; i++) encrypt_r(pwb,0, data);
299
 
        data->EP = &etr;
300
 
 
301
 
        p = pwb;
302
 
        cp = result+2;
303
 
        while (p < &pwb[66]) {
304
 
                int c = 0;
305
 
                int j = 6;
306
 
 
307
 
                while (j--) {
308
 
                        c <<= 1;
309
 
                        c |= *p++;
310
 
                }
311
 
                c += '.';               /* becomes >= '.' */
312
 
                if (c > '9') c += 7;    /* not in [./0-9], becomes upper */
313
 
                if (c > 'Z') c += 6;    /* not in [A-Z], becomes lower */
314
 
                *cp++ = c;
315
 
        }
316
 
        *cp = 0;
317
 
        return result;
318
 
}
319
 
 
320
 
 
321
 
/*
322
 
 * Copyright (c) 1987,1997, Prentice Hall
323
 
 * All rights reserved.
324
 
 * 
325
 
 * Redistribution and use of the MINIX operating system in source and
326
 
 * binary forms, with or without modification, are permitted provided
327
 
 * that the following conditions are met:
328
 
 * 
329
 
 * Redistributions of source code must retain the above copyright
330
 
 * notice, this list of conditions and the following disclaimer.
331
 
 * 
332
 
 * Redistributions in binary form must reproduce the above
333
 
 * copyright notice, this list of conditions and the following
334
 
 * disclaimer in the documentation and/or other materials provided
335
 
 * with the distribution.
336
 
 * 
337
 
 * Neither the name of Prentice Hall nor the names of the software
338
 
 * authors or contributors may be used to endorse or promote
339
 
 * products derived from this software without specific prior
340
 
 * written permission.
341
 
 * 
342
 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
343
 
 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
344
 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
345
 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
346
 
 * IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE
347
 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
348
 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
349
 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
350
 
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
351
 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
352
 
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
353
 
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
354
 
 *
355
 
 */
356
 
 
 
630
                io[i] = 0L;
 
631
                for (j = 0; j < 32; j++)
 
632
                        if (*p++ & 1)
 
633
                                io[i] |= bits32[j];
 
634
        }
 
635
        do_des(io[0], io[1], io, io + 1, flag ? -1 : 1);
 
636
        for (i = 0; i < 2; i++)
 
637
                for (j = 0; j < 32; j++)
 
638
                        block[(i << 5) | j] = (io[i] & bits32[j]) ? 1 : 0;
 
639
}
 
640
 
 
641
char *
 
642
__des_crypt(const char *key, const char *setting)
 
643
{
 
644
        u_int32_t       count, salt, l, r0, r1, keybuf[2];
 
645
        u_char          *p, *q;
 
646
        static char     output[21];
 
647
 
 
648
        des_init();
 
649
 
 
650
        /*
 
651
         * Copy the key, shifting each character up by one bit
 
652
         * and padding with zeros.
 
653
         */
 
654
        q = (u_char *)keybuf;
 
655
        while (q - (u_char *)keybuf - 8) {
 
656
                *q++ = *key << 1;
 
657
                if (*(q - 1))
 
658
                        key++;
 
659
        }
 
660
        if (des_setkey((char *)keybuf))
 
661
                return(NULL);
 
662
 
 
663
#if 0
 
664
        if (*setting == _PASSWORD_EFMT1) {
 
665
                int             i;
 
666
                /*
 
667
                 * "new"-style:
 
668
                 *      setting - underscore, 4 bytes of count, 4 bytes of salt
 
669
                 *      key - unlimited characters
 
670
                 */
 
671
                for (i = 1, count = 0L; i < 5; i++)
 
672
                        count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
 
673
 
 
674
                for (i = 5, salt = 0L; i < 9; i++)
 
675
                        salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
 
676
 
 
677
                while (*key) {
 
678
                        /*
 
679
                         * Encrypt the key with itself.
 
680
                         */
 
681
                        if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
 
682
                                return(NULL);
 
683
                        /*
 
684
                         * And XOR with the next 8 characters of the key.
 
685
                         */
 
686
                        q = (u_char *)keybuf;
 
687
                        while (q - (u_char *)keybuf - 8 && *key)
 
688
                                *q++ ^= *key++ << 1;
 
689
 
 
690
                        if (des_setkey((char *)keybuf))
 
691
                                return(NULL);
 
692
                }
 
693
                strncpy(output, setting, 9);
 
694
 
 
695
                /*
 
696
                 * Double check that we weren't given a short setting.
 
697
                 * If we were, the above code will probably have created
 
698
                 * wierd values for count and salt, but we don't really care.
 
699
                 * Just make sure the output string doesn't have an extra
 
700
                 * NUL in it.
 
701
                 */
 
702
                output[9] = '\0';
 
703
                p = (u_char *)output + strlen(output);
 
704
        } else 
 
705
#endif
 
706
        {
 
707
                /*
 
708
                 * "old"-style:
 
709
                 *      setting - 2 bytes of salt
 
710
                 *      key - up to 8 characters
 
711
                 */
 
712
                count = 25;
 
713
 
 
714
                salt = (ascii_to_bin(setting[1]) << 6)
 
715
                     |  ascii_to_bin(setting[0]);
 
716
 
 
717
                output[0] = setting[0];
 
718
                /*
 
719
                 * If the encrypted password that the salt was extracted from
 
720
                 * is only 1 character long, the salt will be corrupted.  We
 
721
                 * need to ensure that the output string doesn't have an extra
 
722
                 * NUL in it!
 
723
                 */
 
724
                output[1] = setting[1] ? setting[1] : output[0];
 
725
 
 
726
                p = (u_char *)output + 2;
 
727
        }
 
728
        setup_salt(salt);
 
729
        /*
 
730
         * Do it.
 
731
         */
 
732
        if (do_des(0L, 0L, &r0, &r1, (int)count))
 
733
                return(NULL);
 
734
        /*
 
735
         * Now encode the result...
 
736
         */
 
737
        l = (r0 >> 8);
 
738
        *p++ = ascii64[(l >> 18) & 0x3f];
 
739
        *p++ = ascii64[(l >> 12) & 0x3f];
 
740
        *p++ = ascii64[(l >> 6) & 0x3f];
 
741
        *p++ = ascii64[l & 0x3f];
 
742
 
 
743
        l = (r0 << 16) | ((r1 >> 16) & 0xffff);
 
744
        *p++ = ascii64[(l >> 18) & 0x3f];
 
745
        *p++ = ascii64[(l >> 12) & 0x3f];
 
746
        *p++ = ascii64[(l >> 6) & 0x3f];
 
747
        *p++ = ascii64[l & 0x3f];
 
748
 
 
749
        l = r1 << 2;
 
750
        *p++ = ascii64[(l >> 12) & 0x3f];
 
751
        *p++ = ascii64[(l >> 6) & 0x3f];
 
752
        *p++ = ascii64[l & 0x3f];
 
753
        *p = 0;
 
754
 
 
755
        return(output);
 
756
}
357
757