]> git.wh0rd.org - ICEs.git/blame - not-unused/des.c.0
initial import
[ICEs.git] / not-unused / des.c.0
CommitLineData
45516216 1/*
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>
65#include <string.h>
66#include <crypt.h>
67
68/* prototypes for internal crypt functions
69 *
70 * Copyright (C) 2000-2006 by Erik Andersen <andersen@uclibc.org>
71 *
72 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
73 */
74
75#ifndef __LIBCRYPT_H__
76#define __LIBCRYPT_H__
77
78extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt);
79extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt);
80
81/* shut up gcc-4.x signed warnings */
82#define strcpy(dst,src) strcpy((char*)dst,(char*)src)
83#define strlen(s) strlen((char*)s)
84#define strncat(dst,src,n) strncat((char*)dst,(char*)src,n)
85#define strncmp(s1,s2,n) strncmp((char*)s1,(char*)s2,n)
86
87#endif
88
89/* Re-entrantify me -- all this junk needs to be in
90 * struct crypt_data to make this really reentrant... */
91static u_char inv_key_perm[64];
92static u_char inv_comp_perm[56];
93static u_char u_sbox[8][64];
94static u_char un_pbox[32];
95static u_int32_t en_keysl[16], en_keysr[16];
96static u_int32_t de_keysl[16], de_keysr[16];
97static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
98static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
99static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
100static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
101static u_int32_t saltbits;
102static u_int32_t old_salt;
103static u_int32_t old_rawkey0, old_rawkey1;
104
105
106/* Static stuff that stays resident and doesn't change after
107 * being initialized, and therefore doesn't need to be made
108 * reentrant. */
109static u_char init_perm[64], final_perm[64];
110static u_char m_sbox[4][4096];
111static u_int32_t psbox[4][256];
112
113
114
115
116/* A pile of data */
117static const u_char ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
118
119static const u_char IP[64] = {
120 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
121 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
122 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
123 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
124};
125
126static const u_char key_perm[56] = {
127 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
128 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
129 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
130 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
131};
132
133static const u_char key_shifts[16] = {
134 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
135};
136
137static const u_char comp_perm[48] = {
138 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
139 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
140 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
141 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
142};
143
144/*
145 * No E box is used, as it's replaced by some ANDs, shifts, and ORs.
146 */
147
148static const u_char sbox[8][64] = {
149 {
150 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
151 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
152 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
153 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
154 },
155 {
156 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
157 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
158 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
159 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
160 },
161 {
162 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
163 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
164 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
165 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
166 },
167 {
168 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
169 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
170 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
171 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
172 },
173 {
174 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
175 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
176 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
177 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
178 },
179 {
180 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
181 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
182 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
183 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
184 },
185 {
186 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
187 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
188 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
189 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
190 },
191 {
192 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
193 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
194 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
195 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
196 }
197};
198
199static const u_char pbox[32] = {
200 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
201 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
202};
203
204static const u_int32_t bits32[32] =
205{
206 0x80000000, 0x40000000, 0x20000000, 0x10000000,
207 0x08000000, 0x04000000, 0x02000000, 0x01000000,
208 0x00800000, 0x00400000, 0x00200000, 0x00100000,
209 0x00080000, 0x00040000, 0x00020000, 0x00010000,
210 0x00008000, 0x00004000, 0x00002000, 0x00001000,
211 0x00000800, 0x00000400, 0x00000200, 0x00000100,
212 0x00000080, 0x00000040, 0x00000020, 0x00000010,
213 0x00000008, 0x00000004, 0x00000002, 0x00000001
214};
215
216static const u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
217static const u_int32_t *bits28, *bits24;
218
219
220static int
221ascii_to_bin(char ch)
222{
223 if (ch > 'z')
224 return(0);
225 if (ch >= 'a')
226 return(ch - 'a' + 38);
227 if (ch > 'Z')
228 return(0);
229 if (ch >= 'A')
230 return(ch - 'A' + 12);
231 if (ch > '9')
232 return(0);
233 if (ch >= '.')
234 return(ch - '.');
235 return(0);
236}
237
238static void
239des_init(void)
240{
241 int i, j, b, k, inbit, obit;
242 u_int32_t *p, *il, *ir, *fl, *fr;
243 static int des_initialised = 0;
244
245 if (des_initialised==1)
246 return;
247
248 old_rawkey0 = old_rawkey1 = 0L;
249 saltbits = 0L;
250 old_salt = 0L;
251 bits24 = (bits28 = bits32 + 4) + 4;
252
253 /*
254 * Invert the S-boxes, reordering the input bits.
255 */
256 for (i = 0; i < 8; i++)
257 for (j = 0; j < 64; j++) {
258 b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
259 u_sbox[i][j] = sbox[i][b];
260 }
261
262 /*
263 * Convert the inverted S-boxes into 4 arrays of 8 bits.
264 * Each will handle 12 bits of the S-box input.
265 */
266 for (b = 0; b < 4; b++)
267 for (i = 0; i < 64; i++)
268 for (j = 0; j < 64; j++)
269 m_sbox[b][(i << 6) | j] =
270 (u_char)((u_sbox[(b << 1)][i] << 4) |
271 u_sbox[(b << 1) + 1][j]);
272
273 /*
274 * Set up the initial & final permutations into a useful form, and
275 * initialise the inverted key permutation.
276 */
277 for (i = 0; i < 64; i++) {
278 init_perm[final_perm[i] = IP[i] - 1] = (u_char)i;
279 inv_key_perm[i] = 255;
280 }
281
282 /*
283 * Invert the key permutation and initialise the inverted key
284 * compression permutation.
285 */
286 for (i = 0; i < 56; i++) {
287 inv_key_perm[key_perm[i] - 1] = (u_char)i;
288 inv_comp_perm[i] = 255;
289 }
290
291 /*
292 * Invert the key compression permutation.
293 */
294 for (i = 0; i < 48; i++) {
295 inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
296 }
297
298 /*
299 * Set up the OR-mask arrays for the initial and final permutations,
300 * and for the key initial and compression permutations.
301 */
302 for (k = 0; k < 8; k++) {
303 for (i = 0; i < 256; i++) {
304 *(il = &ip_maskl[k][i]) = 0L;
305 *(ir = &ip_maskr[k][i]) = 0L;
306 *(fl = &fp_maskl[k][i]) = 0L;
307 *(fr = &fp_maskr[k][i]) = 0L;
308 for (j = 0; j < 8; j++) {
309 inbit = 8 * k + j;
310 if (i & bits8[j]) {
311 if ((obit = init_perm[inbit]) < 32)
312 *il |= bits32[obit];
313 else
314 *ir |= bits32[obit-32];
315 if ((obit = final_perm[inbit]) < 32)
316 *fl |= bits32[obit];
317 else
318 *fr |= bits32[obit - 32];
319 }
320 }
321 }
322 for (i = 0; i < 128; i++) {
323 *(il = &key_perm_maskl[k][i]) = 0L;
324 *(ir = &key_perm_maskr[k][i]) = 0L;
325 for (j = 0; j < 7; j++) {
326 inbit = 8 * k + j;
327 if (i & bits8[j + 1]) {
328 if ((obit = inv_key_perm[inbit]) == 255)
329 continue;
330 if (obit < 28)
331 *il |= bits28[obit];
332 else
333 *ir |= bits28[obit - 28];
334 }
335 }
336 *(il = &comp_maskl[k][i]) = 0L;
337 *(ir = &comp_maskr[k][i]) = 0L;
338 for (j = 0; j < 7; j++) {
339 inbit = 7 * k + j;
340 if (i & bits8[j + 1]) {
341 if ((obit=inv_comp_perm[inbit]) == 255)
342 continue;
343 if (obit < 24)
344 *il |= bits24[obit];
345 else
346 *ir |= bits24[obit - 24];
347 }
348 }
349 }
350 }
351
352 /*
353 * Invert the P-box permutation, and convert into OR-masks for
354 * handling the output of the S-box arrays setup above.
355 */
356 for (i = 0; i < 32; i++)
357 un_pbox[pbox[i] - 1] = (u_char)i;
358
359 for (b = 0; b < 4; b++)
360 for (i = 0; i < 256; i++) {
361 *(p = &psbox[b][i]) = 0L;
362 for (j = 0; j < 8; j++) {
363 if (i & bits8[j])
364 *p |= bits32[un_pbox[8 * b + j]];
365 }
366 }
367
368 des_initialised = 1;
369}
370
371
372static void
373setup_salt(u_int32_t salt)
374{
375 u_int32_t obit, saltbit;
376 int i;
377
378 if (salt == old_salt)
379 return;
380 old_salt = salt;
381
382 saltbits = 0L;
383 saltbit = 1;
384 obit = 0x800000;
385 for (i = 0; i < 24; i++) {
386 if (salt & saltbit)
387 saltbits |= obit;
388 saltbit <<= 1;
389 obit >>= 1;
390 }
391}
392
393
394static int
395des_setkey(const char *key)
396{
397 u_int32_t k0, k1, rawkey0, rawkey1;
398 int shifts, round;
399
400 des_init();
401
402 rawkey0 = ntohl(*(const u_int32_t *) key);
403 rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
404
405 if ((rawkey0 | rawkey1)
406 && rawkey0 == old_rawkey0
407 && rawkey1 == old_rawkey1) {
408 /*
409 * Already setup for this key.
410 * This optimisation fails on a zero key (which is weak and
411 * has bad parity anyway) in order to simplify the starting
412 * conditions.
413 */
414 return(0);
415 }
416 old_rawkey0 = rawkey0;
417 old_rawkey1 = rawkey1;
418
419 /*
420 * Do key permutation and split into two 28-bit subkeys.
421 */
422 k0 = key_perm_maskl[0][rawkey0 >> 25]
423 | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]
424 | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]
425 | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]
426 | key_perm_maskl[4][rawkey1 >> 25]
427 | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]
428 | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]
429 | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];
430 k1 = key_perm_maskr[0][rawkey0 >> 25]
431 | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]
432 | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]
433 | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]
434 | key_perm_maskr[4][rawkey1 >> 25]
435 | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]
436 | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]
437 | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];
438 /*
439 * Rotate subkeys and do compression permutation.
440 */
441 shifts = 0;
442 for (round = 0; round < 16; round++) {
443 u_int32_t t0, t1;
444
445 shifts += key_shifts[round];
446
447 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
448 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
449
450 de_keysl[15 - round] =
451 en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
452 | comp_maskl[1][(t0 >> 14) & 0x7f]
453 | comp_maskl[2][(t0 >> 7) & 0x7f]
454 | comp_maskl[3][t0 & 0x7f]
455 | comp_maskl[4][(t1 >> 21) & 0x7f]
456 | comp_maskl[5][(t1 >> 14) & 0x7f]
457 | comp_maskl[6][(t1 >> 7) & 0x7f]
458 | comp_maskl[7][t1 & 0x7f];
459
460 de_keysr[15 - round] =
461 en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
462 | comp_maskr[1][(t0 >> 14) & 0x7f]
463 | comp_maskr[2][(t0 >> 7) & 0x7f]
464 | comp_maskr[3][t0 & 0x7f]
465 | comp_maskr[4][(t1 >> 21) & 0x7f]
466 | comp_maskr[5][(t1 >> 14) & 0x7f]
467 | comp_maskr[6][(t1 >> 7) & 0x7f]
468 | comp_maskr[7][t1 & 0x7f];
469 }
470 return(0);
471}
472
473
474static int
475do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
476{
477 /*
478 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
479 */
480 u_int32_t l, r, *kl, *kr, *kl1, *kr1;
481 u_int32_t f, r48l, r48r;
482 int round;
483
484 if (count == 0) {
485 return(1);
486 } else if (count > 0) {
487 /*
488 * Encrypting
489 */
490 kl1 = en_keysl;
491 kr1 = en_keysr;
492 } else {
493 /*
494 * Decrypting
495 */
496 count = -count;
497 kl1 = de_keysl;
498 kr1 = de_keysr;
499 }
500
501 /*
502 * Do initial permutation (IP).
503 */
504 l = ip_maskl[0][l_in >> 24]
505 | ip_maskl[1][(l_in >> 16) & 0xff]
506 | ip_maskl[2][(l_in >> 8) & 0xff]
507 | ip_maskl[3][l_in & 0xff]
508 | ip_maskl[4][r_in >> 24]
509 | ip_maskl[5][(r_in >> 16) & 0xff]
510 | ip_maskl[6][(r_in >> 8) & 0xff]
511 | ip_maskl[7][r_in & 0xff];
512 r = ip_maskr[0][l_in >> 24]
513 | ip_maskr[1][(l_in >> 16) & 0xff]
514 | ip_maskr[2][(l_in >> 8) & 0xff]
515 | ip_maskr[3][l_in & 0xff]
516 | ip_maskr[4][r_in >> 24]
517 | ip_maskr[5][(r_in >> 16) & 0xff]
518 | ip_maskr[6][(r_in >> 8) & 0xff]
519 | ip_maskr[7][r_in & 0xff];
520
521 while (count--) {
522 /*
523 * Do each round.
524 */
525 kl = kl1;
526 kr = kr1;
527 round = 16;
528 while (round--) {
529 /*
530 * Expand R to 48 bits (simulate the E-box).
531 */
532 r48l = ((r & 0x00000001) << 23)
533 | ((r & 0xf8000000) >> 9)
534 | ((r & 0x1f800000) >> 11)
535 | ((r & 0x01f80000) >> 13)
536 | ((r & 0x001f8000) >> 15);
537
538 r48r = ((r & 0x0001f800) << 7)
539 | ((r & 0x00001f80) << 5)
540 | ((r & 0x000001f8) << 3)
541 | ((r & 0x0000001f) << 1)
542 | ((r & 0x80000000) >> 31);
543 /*
544 * Do salting for crypt() and friends, and
545 * XOR with the permuted key.
546 */
547 f = (r48l ^ r48r) & saltbits;
548 r48l ^= f ^ *kl++;
549 r48r ^= f ^ *kr++;
550 /*
551 * Do sbox lookups (which shrink it back to 32 bits)
552 * and do the pbox permutation at the same time.
553 */
554 f = psbox[0][m_sbox[0][r48l >> 12]]
555 | psbox[1][m_sbox[1][r48l & 0xfff]]
556 | psbox[2][m_sbox[2][r48r >> 12]]
557 | psbox[3][m_sbox[3][r48r & 0xfff]];
558 /*
559 * Now that we've permuted things, complete f().
560 */
561 f ^= l;
562 l = r;
563 r = f;
564 }
565 r = l;
566 l = f;
567 }
568 /*
569 * Do final permutation (inverse of IP).
570 */
571 *l_out = fp_maskl[0][l >> 24]
572 | fp_maskl[1][(l >> 16) & 0xff]
573 | fp_maskl[2][(l >> 8) & 0xff]
574 | fp_maskl[3][l & 0xff]
575 | fp_maskl[4][r >> 24]
576 | fp_maskl[5][(r >> 16) & 0xff]
577 | fp_maskl[6][(r >> 8) & 0xff]
578 | fp_maskl[7][r & 0xff];
579 *r_out = fp_maskr[0][l >> 24]
580 | fp_maskr[1][(l >> 16) & 0xff]
581 | fp_maskr[2][(l >> 8) & 0xff]
582 | fp_maskr[3][l & 0xff]
583 | fp_maskr[4][r >> 24]
584 | fp_maskr[5][(r >> 16) & 0xff]
585 | fp_maskr[6][(r >> 8) & 0xff]
586 | fp_maskr[7][r & 0xff];
587 return(0);
588}
589
590
591#if 0
592static int
593des_cipher(const char *in, char *out, u_int32_t salt, int count)
594{
595 u_int32_t l_out, r_out, rawl, rawr;
596 int retval;
597 union {
598 u_int32_t *ui32;
599 const char *c;
600 } trans;
601
602 des_init();
603
604 setup_salt(salt);
605
606 trans.c = in;
607 rawl = ntohl(*trans.ui32++);
608 rawr = ntohl(*trans.ui32);
609
610 retval = do_des(rawl, rawr, &l_out, &r_out, count);
611
612 trans.c = out;
613 *trans.ui32++ = htonl(l_out);
614 *trans.ui32 = htonl(r_out);
615 return(retval);
616}
617#endif
618
619
620void
621setkey(const char *key)
622{
623 int i, j;
624 u_int32_t packed_keys[2];
625 u_char *p;
626
627 p = (u_char *) packed_keys;
628
629 for (i = 0; i < 8; i++) {
630 p[i] = 0;
631 for (j = 0; j < 8; j++)
632 if (*key++ & 1)
633 p[i] |= bits8[j];
634 }
635 des_setkey((char *)p);
636}
637
638
639void
640encrypt(char *block, int flag)
641{
642 u_int32_t io[2];
643 u_char *p;
644 int i, j;
645
646 des_init();
647
648 setup_salt(0L);
649 p = (u_char*)block;
650 for (i = 0; i < 2; i++) {
651 io[i] = 0L;
652 for (j = 0; j < 32; j++)
653 if (*p++ & 1)
654 io[i] |= bits32[j];
655 }
656 do_des(io[0], io[1], io, io + 1, flag ? -1 : 1);
657 for (i = 0; i < 2; i++)
658 for (j = 0; j < 32; j++)
659 block[(i << 5) | j] = (io[i] & bits32[j]) ? 1 : 0;
660}
661
662char *__des_crypt(const unsigned char *key, const unsigned char *setting)
663{
664 u_int32_t count, salt, l, r0, r1, keybuf[2];
665 u_char *p, *q;
666 static char output[21];
667
668 des_init();
669
670 /*
671 * Copy the key, shifting each character up by one bit
672 * and padding with zeros.
673 */
674 q = (u_char *)keybuf;
675 while (q - (u_char *)keybuf - 8) {
676 *q++ = *key << 1;
677 if (*(q - 1))
678 key++;
679 }
680 if (des_setkey((char *)keybuf))
681 return(NULL);
682
683#if 0
684 if (*setting == _PASSWORD_EFMT1) {
685 int i;
686 /*
687 * "new"-style:
688 * setting - underscore, 4 bytes of count, 4 bytes of salt
689 * key - unlimited characters
690 */
691 for (i = 1, count = 0L; i < 5; i++)
692 count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
693
694 for (i = 5, salt = 0L; i < 9; i++)
695 salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
696
697 while (*key) {
698 /*
699 * Encrypt the key with itself.
700 */
701 if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
702 return(NULL);
703 /*
704 * And XOR with the next 8 characters of the key.
705 */
706 q = (u_char *)keybuf;
707 while (q - (u_char *)keybuf - 8 && *key)
708 *q++ ^= *key++ << 1;
709
710 if (des_setkey((char *)keybuf))
711 return(NULL);
712 }
713 strncpy(output, setting, 9);
714
715 /*
716 * Double check that we weren't given a short setting.
717 * If we were, the above code will probably have created
718 * wierd values for count and salt, but we don't really care.
719 * Just make sure the output string doesn't have an extra
720 * NUL in it.
721 */
722 output[9] = '\0';
723 p = (u_char *)output + strlen(output);
724 } else
725#endif
726 {
727 /*
728 * "old"-style:
729 * setting - 2 bytes of salt
730 * key - up to 8 characters
731 */
732 count = 25;
733
734 salt = (ascii_to_bin(setting[1]) << 6)
735 | ascii_to_bin(setting[0]);
736
737 output[0] = setting[0];
738 /*
739 * If the encrypted password that the salt was extracted from
740 * is only 1 character long, the salt will be corrupted. We
741 * need to ensure that the output string doesn't have an extra
742 * NUL in it!
743 */
744 output[1] = setting[1] ? setting[1] : output[0];
745
746 p = (u_char *)output + 2;
747 }
748 setup_salt(salt);
749 /*
750 * Do it.
751 */
752 if (do_des(0L, 0L, &r0, &r1, (int)count))
753 return(NULL);
754 /*
755 * Now encode the result...
756 */
757 l = (r0 >> 8);
758 *p++ = ascii64[(l >> 18) & 0x3f];
759 *p++ = ascii64[(l >> 12) & 0x3f];
760 *p++ = ascii64[(l >> 6) & 0x3f];
761 *p++ = ascii64[l & 0x3f];
762
763 l = (r0 << 16) | ((r1 >> 16) & 0xffff);
764 *p++ = ascii64[(l >> 18) & 0x3f];
765 *p++ = ascii64[(l >> 12) & 0x3f];
766 *p++ = ascii64[(l >> 6) & 0x3f];
767 *p++ = ascii64[l & 0x3f];
768
769 l = r1 << 2;
770 *p++ = ascii64[(l >> 12) & 0x3f];
771 *p++ = ascii64[(l >> 6) & 0x3f];
772 *p++ = ascii64[l & 0x3f];
773 *p = 0;
774
775 return(output);
776}
777