2 * FreeSec: libcrypt for NetBSD
4 * Copyright (c) 1994 David Burren
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
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.
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
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.
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
39 * This is an original implementation of the DES and the crypt(3) interfaces
40 * by David Burren <davidb@werj.com.au>.
42 * An excellent reference on the underlying algorithm (and related
45 * B. Schneier, Applied Cryptography: protocols, algorithms,
46 * and source code in C, John Wiley & Sons, 1994.
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.
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
60 #include <sys/cdefs.h>
61 #include <sys/types.h>
62 #include <sys/param.h>
63 #include <netinet/in.h>
68 /* prototypes for internal crypt functions
70 * Copyright (C) 2000-2006 by Erik Andersen <andersen@uclibc.org>
72 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
75 #ifndef __LIBCRYPT_H__
76 #define __LIBCRYPT_H__
78 extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt);
79 extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt);
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)
89 /* Re-entrantify me -- all this junk needs to be in
90 * struct crypt_data to make this really reentrant... */
91 static u_char inv_key_perm[64];
92 static u_char inv_comp_perm[56];
93 static u_char u_sbox[8][64];
94 static u_char un_pbox[32];
95 static u_int32_t en_keysl[16], en_keysr[16];
96 static u_int32_t de_keysl[16], de_keysr[16];
97 static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
98 static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
99 static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
100 static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
101 static u_int32_t saltbits;
102 static u_int32_t old_salt;
103 static u_int32_t old_rawkey0, old_rawkey1;
106 /* Static stuff that stays resident and doesn't change after
107 * being initialized, and therefore doesn't need to be made
109 static u_char init_perm[64], final_perm[64];
110 static u_char m_sbox[4][4096];
111 static u_int32_t psbox[4][256];
117 static const u_char ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
119 static 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
126 static 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
133 static const u_char key_shifts[16] = {
134 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
137 static 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
145 * No E box is used, as it's replaced by some ANDs, shifts, and ORs.
148 static const u_char sbox[8][64] = {
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
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
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
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
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
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
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
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
199 static 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
204 static const u_int32_t bits32[32] =
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
216 static const u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
217 static const u_int32_t *bits28, *bits24;
221 ascii_to_bin(char ch)
226 return(ch - 'a' + 38);
230 return(ch - 'A' + 12);
241 int i, j, b, k, inbit, obit;
242 u_int32_t *p, *il, *ir, *fl, *fr;
243 static int des_initialised = 0;
245 if (des_initialised==1)
248 old_rawkey0 = old_rawkey1 = 0L;
251 bits24 = (bits28 = bits32 + 4) + 4;
254 * Invert the S-boxes, reordering the input bits.
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];
263 * Convert the inverted S-boxes into 4 arrays of 8 bits.
264 * Each will handle 12 bits of the S-box input.
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]);
274 * Set up the initial & final permutations into a useful form, and
275 * initialise the inverted key permutation.
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;
283 * Invert the key permutation and initialise the inverted key
284 * compression permutation.
286 for (i = 0; i < 56; i++) {
287 inv_key_perm[key_perm[i] - 1] = (u_char)i;
288 inv_comp_perm[i] = 255;
292 * Invert the key compression permutation.
294 for (i = 0; i < 48; i++) {
295 inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
299 * Set up the OR-mask arrays for the initial and final permutations,
300 * and for the key initial and compression permutations.
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++) {
311 if ((obit = init_perm[inbit]) < 32)
314 *ir |= bits32[obit-32];
315 if ((obit = final_perm[inbit]) < 32)
318 *fr |= bits32[obit - 32];
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++) {
327 if (i & bits8[j + 1]) {
328 if ((obit = inv_key_perm[inbit]) == 255)
333 *ir |= bits28[obit - 28];
336 *(il = &comp_maskl[k][i]) = 0L;
337 *(ir = &comp_maskr[k][i]) = 0L;
338 for (j = 0; j < 7; j++) {
340 if (i & bits8[j + 1]) {
341 if ((obit=inv_comp_perm[inbit]) == 255)
346 *ir |= bits24[obit - 24];
353 * Invert the P-box permutation, and convert into OR-masks for
354 * handling the output of the S-box arrays setup above.
356 for (i = 0; i < 32; i++)
357 un_pbox[pbox[i] - 1] = (u_char)i;
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++) {
364 *p |= bits32[un_pbox[8 * b + j]];
373 setup_salt(u_int32_t salt)
375 u_int32_t obit, saltbit;
378 if (salt == old_salt)
385 for (i = 0; i < 24; i++) {
395 des_setkey(const char *key)
397 u_int32_t k0, k1, rawkey0, rawkey1;
402 rawkey0 = ntohl(*(const u_int32_t *) key);
403 rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
405 if ((rawkey0 | rawkey1)
406 && rawkey0 == old_rawkey0
407 && rawkey1 == old_rawkey1) {
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
416 old_rawkey0 = rawkey0;
417 old_rawkey1 = rawkey1;
420 * Do key permutation and split into two 28-bit subkeys.
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];
439 * Rotate subkeys and do compression permutation.
442 for (round = 0; round < 16; round++) {
445 shifts += key_shifts[round];
447 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
448 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
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];
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];
475 do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
478 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
480 u_int32_t l, r, *kl, *kr, *kl1, *kr1;
481 u_int32_t f, r48l, r48r;
486 } else if (count > 0) {
502 * Do initial permutation (IP).
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];
530 * Expand R to 48 bits (simulate the E-box).
532 r48l = ((r & 0x00000001) << 23)
533 | ((r & 0xf8000000) >> 9)
534 | ((r & 0x1f800000) >> 11)
535 | ((r & 0x01f80000) >> 13)
536 | ((r & 0x001f8000) >> 15);
538 r48r = ((r & 0x0001f800) << 7)
539 | ((r & 0x00001f80) << 5)
540 | ((r & 0x000001f8) << 3)
541 | ((r & 0x0000001f) << 1)
542 | ((r & 0x80000000) >> 31);
544 * Do salting for crypt() and friends, and
545 * XOR with the permuted key.
547 f = (r48l ^ r48r) & saltbits;
551 * Do sbox lookups (which shrink it back to 32 bits)
552 * and do the pbox permutation at the same time.
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]];
559 * Now that we've permuted things, complete f().
569 * Do final permutation (inverse of IP).
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];
593 des_cipher(const char *in, char *out, u_int32_t salt, int count)
595 u_int32_t l_out, r_out, rawl, rawr;
607 rawl = ntohl(*trans.ui32++);
608 rawr = ntohl(*trans.ui32);
610 retval = do_des(rawl, rawr, &l_out, &r_out, count);
613 *trans.ui32++ = htonl(l_out);
614 *trans.ui32 = htonl(r_out);
621 setkey(const char *key)
624 u_int32_t packed_keys[2];
627 p = (u_char *) packed_keys;
629 for (i = 0; i < 8; i++) {
631 for (j = 0; j < 8; j++)
635 des_setkey((char *)p);
640 encrypt(char *block, int flag)
650 for (i = 0; i < 2; i++) {
652 for (j = 0; j < 32; j++)
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;
662 char *__des_crypt(const unsigned char *key, const unsigned char *setting)
664 u_int32_t count, salt, l, r0, r1, keybuf[2];
666 static char output[21];
671 * Copy the key, shifting each character up by one bit
672 * and padding with zeros.
674 q = (u_char *)keybuf;
675 while (q - (u_char *)keybuf - 8) {
680 if (des_setkey((char *)keybuf))
684 if (*setting == _PASSWORD_EFMT1) {
688 * setting - underscore, 4 bytes of count, 4 bytes of salt
689 * key - unlimited characters
691 for (i = 1, count = 0L; i < 5; i++)
692 count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
694 for (i = 5, salt = 0L; i < 9; i++)
695 salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
699 * Encrypt the key with itself.
701 if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
704 * And XOR with the next 8 characters of the key.
706 q = (u_char *)keybuf;
707 while (q - (u_char *)keybuf - 8 && *key)
710 if (des_setkey((char *)keybuf))
713 strncpy(output, setting, 9);
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
723 p = (u_char *)output + strlen(output);
729 * setting - 2 bytes of salt
730 * key - up to 8 characters
734 salt = (ascii_to_bin(setting[1]) << 6)
735 | ascii_to_bin(setting[0]);
737 output[0] = setting[0];
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
744 output[1] = setting[1] ? setting[1] : output[0];
746 p = (u_char *)output + 2;
752 if (do_des(0L, 0L, &r0, &r1, (int)count))
755 * Now encode the result...
758 *p++ = ascii64[(l >> 18) & 0x3f];
759 *p++ = ascii64[(l >> 12) & 0x3f];
760 *p++ = ascii64[(l >> 6) & 0x3f];
761 *p++ = ascii64[l & 0x3f];
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];
770 *p++ = ascii64[(l >> 12) & 0x3f];
771 *p++ = ascii64[(l >> 6) & 0x3f];
772 *p++ = ascii64[l & 0x3f];