Header And Logo

PostgreSQL
| The world's most advanced open source database.

crypt.c

Go to the documentation of this file.
00001 /* src/port/crypt.c */
00002 /*  $NetBSD: crypt.c,v 1.18 2001/03/01 14:37:35 wiz Exp $   */
00003 
00004 /*
00005  * Copyright (c) 1989, 1993
00006  *  The Regents of the University of California.  All rights reserved.
00007  *
00008  * This code is derived from software contributed to Berkeley by
00009  * Tom Truscott.
00010  *
00011  * Redistribution and use in source and binary forms, with or without
00012  * modification, are permitted provided that the following conditions
00013  * are met:
00014  * 1. Redistributions of source code must retain the above copyright
00015  *    notice, this list of conditions and the following disclaimer.
00016  * 2. Redistributions in binary form must reproduce the above copyright
00017  *    notice, this list of conditions and the following disclaimer in the
00018  *    documentation and/or other materials provided with the distribution.
00019  * 3. Neither the name of the University nor the names of its contributors
00020  *    may be used to endorse or promote products derived from this software
00021  *    without specific prior written permission.
00022  *
00023  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00024  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00026  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00027  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00028  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00029  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00030  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00031  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00032  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00033  * SUCH DAMAGE.
00034  */
00035 
00036 #if defined(LIBC_SCCS) && !defined(lint)
00037 #if 0
00038 static char sccsid[] = "@(#)crypt.c 8.1.1.1 (Berkeley) 8/18/93";
00039 #else
00040 __RCSID("$NetBSD: crypt.c,v 1.18 2001/03/01 14:37:35 wiz Exp $");
00041 #endif
00042 #endif   /* not lint */
00043 
00044 #include "c.h"
00045 
00046 #include <limits.h>
00047 
00048 #ifndef WIN32
00049 #include <unistd.h>
00050 #endif
00051 
00052 static int  des_setkey(const char *key);
00053 static int  des_cipher(const char *in, char *out, long salt, int num_iter);
00054 
00055 /*
00056  * UNIX password, and DES, encryption.
00057  * By Tom Truscott, [email protected],
00058  * from algorithms by Robert W. Baldwin and James Gillogly.
00059  *
00060  * References:
00061  * "Mathematical Cryptology for Computer Scientists and Mathematicians,"
00062  * by Wayne Patterson, 1987, ISBN 0-8476-7438-X.
00063  *
00064  * "Password Security: A Case History," R. Morris and Ken Thompson,
00065  * Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.
00066  *
00067  * "DES will be Totally Insecure within Ten Years," M.E. Hellman,
00068  * IEEE Spectrum, vol. 16, pp. 32-39, July 1979.
00069  */
00070 
00071 /* =====  Configuration ==================== */
00072 
00073 /*
00074  * define "MUST_ALIGN" if your compiler cannot load/store
00075  * long integers at arbitrary (e.g. odd) memory locations.
00076  * (Either that or never pass unaligned addresses to des_cipher!)
00077  */
00078 /* #define  MUST_ALIGN */
00079 
00080 #ifdef CHAR_BITS
00081 #if CHAR_BITS != 8
00082 #error C_block structure assumes 8 bit characters
00083 #endif
00084 #endif
00085 
00086 /*
00087  * define "B64" to be the declaration for a 64 bit integer.
00088  * XXX this feature is currently unused, see "endian" comment below.
00089  */
00090 #define B64 __int64
00091 
00092 /*
00093  * define "LARGEDATA" to get faster permutations, by using about 72 kilobytes
00094  * of lookup tables.  This speeds up des_setkey() and des_cipher(), but has
00095  * little effect on crypt().
00096  */
00097 /* #define  LARGEDATA */
00098 
00099 /* compile with "-DSTATIC=void" when profiling */
00100 #ifndef STATIC
00101 #define STATIC  static void
00102 #endif
00103 
00104 /*
00105  * Define the "int32_t" type for integral type with a width of at least
00106  * 32 bits.
00107  */
00108 typedef int int32_t;
00109 
00110 /* ==================================== */
00111 
00112 #define _PASSWORD_EFMT1 '_'     /* extended encryption format */
00113 
00114 /*
00115  * Cipher-block representation (Bob Baldwin):
00116  *
00117  * DES operates on groups of 64 bits, numbered 1..64 (sigh).  One
00118  * representation is to store one bit per byte in an array of bytes.  Bit N of
00119  * the NBS spec is stored as the LSB of the Nth byte (index N-1) in the array.
00120  * Another representation stores the 64 bits in 8 bytes, with bits 1..8 in the
00121  * first byte, 9..16 in the second, and so on.  The DES spec apparently has
00122  * bit 1 in the MSB of the first byte, but that is particularly noxious so we
00123  * bit-reverse each byte so that bit 1 is the LSB of the first byte, bit 8 is
00124  * the MSB of the first byte.  Specifically, the 64-bit input data and key are
00125  * converted to LSB format, and the output 64-bit block is converted back into
00126  * MSB format.
00127  *
00128  * DES operates internally on groups of 32 bits which are expanded to 48 bits
00129  * by permutation E and shrunk back to 32 bits by the S boxes.  To speed up
00130  * the computation, the expansion is applied only once, the expanded
00131  * representation is maintained during the encryption, and a compression
00132  * permutation is applied only at the end.  To speed up the S-box lookups,
00133  * the 48 bits are maintained as eight 6 bit groups, one per byte, which
00134  * directly feed the eight S-boxes.  Within each byte, the 6 bits are the
00135  * most significant ones.  The low two bits of each byte are zero.  (Thus,
00136  * bit 1 of the 48 bit E expansion is stored as the "4"-valued bit of the
00137  * first byte in the eight byte representation, bit 2 of the 48 bit value is
00138  * the "8"-valued bit, and so on.)  In fact, a combined "SPE"-box lookup is
00139  * used, in which the output is the 64 bit result of an S-box lookup which
00140  * has been permuted by P and expanded by E, and is ready for use in the next
00141  * iteration.  Two 32-bit wide tables, SPE[0] and SPE[1], are used for this
00142  * lookup.  Since each byte in the 48 bit path is a multiple of four, indexed
00143  * lookup of SPE[0] and SPE[1] is simple and fast.  The key schedule and
00144  * "salt" are also converted to this 8*(6+2) format.  The SPE table size is
00145  * 8*64*8 = 4K bytes.
00146  *
00147  * To speed up bit-parallel operations (such as XOR), the 8 byte
00148  * representation is "union"ed with 32 bit values "i0" and "i1", and, on
00149  * machines which support it, a 64 bit value "b64".  This data structure,
00150  * "C_block", has two problems.  First, alignment restrictions must be
00151  * honored.  Second, the byte-order (e.g. little-endian or big-endian) of
00152  * the architecture becomes visible.
00153  *
00154  * The byte-order problem is unfortunate, since on the one hand it is good
00155  * to have a machine-independent C_block representation (bits 1..8 in the
00156  * first byte, etc.), and on the other hand it is good for the LSB of the
00157  * first byte to be the LSB of i0.  We cannot have both these things, so we
00158  * currently use the "little-endian" representation and avoid any multi-byte
00159  * operations that depend on byte order.  This largely precludes use of the
00160  * 64-bit datatype since the relative order of i0 and i1 are unknown.  It
00161  * also inhibits grouping the SPE table to look up 12 bits at a time.  (The
00162  * 12 bits can be stored in a 16-bit field with 3 low-order zeroes and 1
00163  * high-order zero, providing fast indexing into a 64-bit wide SPE.)  On the
00164  * other hand, 64-bit datatypes are currently rare, and a 12-bit SPE lookup
00165  * requires a 128 kilobyte table, so perhaps this is not a big loss.
00166  *
00167  * Permutation representation (Jim Gillogly):
00168  *
00169  * A transformation is defined by its effect on each of the 8 bytes of the
00170  * 64-bit input.  For each byte we give a 64-bit output that has the bits in
00171  * the input distributed appropriately.  The transformation is then the OR
00172  * of the 8 sets of 64-bits.  This uses 8*256*8 = 16K bytes of storage for
00173  * each transformation.  Unless LARGEDATA is defined, however, a more compact
00174  * table is used which looks up 16 4-bit "chunks" rather than 8 8-bit chunks.
00175  * The smaller table uses 16*16*8 = 2K bytes for each transformation.  This
00176  * is slower but tolerable, particularly for password encryption in which
00177  * the SPE transformation is iterated many times.  The small tables total 9K
00178  * bytes, the large tables total 72K bytes.
00179  *
00180  * The transformations used are:
00181  * IE3264: MSB->LSB conversion, initial permutation, and expansion.
00182  *  This is done by collecting the 32 even-numbered bits and applying
00183  *  a 32->64 bit transformation, and then collecting the 32 odd-numbered
00184  *  bits and applying the same transformation.  Since there are only
00185  *  32 input bits, the IE3264 transformation table is half the size of
00186  *  the usual table.
00187  * CF6464: Compression, final permutation, and LSB->MSB conversion.
00188  *  This is done by two trivial 48->32 bit compressions to obtain
00189  *  a 64-bit block (the bit numbering is given in the "CIFP" table)
00190  *  followed by a 64->64 bit "cleanup" transformation.  (It would
00191  *  be possible to group the bits in the 64-bit block so that 2
00192  *  identical 32->32 bit transformations could be used instead,
00193  *  saving a factor of 4 in space and possibly 2 in time, but
00194  *  byte-ordering and other complications rear their ugly head.
00195  *  Similar opportunities/problems arise in the key schedule
00196  *  transforms.)
00197  * PC1ROT: MSB->LSB, PC1 permutation, rotate, and PC2 permutation.
00198  *  This admittedly baroque 64->64 bit transformation is used to
00199  *  produce the first code (in 8*(6+2) format) of the key schedule.
00200  * PC2ROT[0]: Inverse PC2 permutation, rotate, and PC2 permutation.
00201  *  It would be possible to define 15 more transformations, each
00202  *  with a different rotation, to generate the entire key schedule.
00203  *  To save space, however, we instead permute each code into the
00204  *  next by using a transformation that "undoes" the PC2 permutation,
00205  *  rotates the code, and then applies PC2.  Unfortunately, PC2
00206  *  transforms 56 bits into 48 bits, dropping 8 bits, so PC2 is not
00207  *  invertible.  We get around that problem by using a modified PC2
00208  *  which retains the 8 otherwise-lost bits in the unused low-order
00209  *  bits of each byte.  The low-order bits are cleared when the
00210  *  codes are stored into the key schedule.
00211  * PC2ROT[1]: Same as PC2ROT[0], but with two rotations.
00212  *  This is faster than applying PC2ROT[0] twice,
00213  *
00214  * The Bell Labs "salt" (Bob Baldwin):
00215  *
00216  * The salting is a simple permutation applied to the 48-bit result of E.
00217  * Specifically, if bit i (1 <= i <= 24) of the salt is set then bits i and
00218  * i+24 of the result are swapped.  The salt is thus a 24 bit number, with
00219  * 16777216 possible values.  (The original salt was 12 bits and could not
00220  * swap bits 13..24 with 36..48.)
00221  *
00222  * It is possible, but ugly, to warp the SPE table to account for the salt
00223  * permutation.  Fortunately, the conditional bit swapping requires only
00224  * about four machine instructions and can be done on-the-fly with about an
00225  * 8% performance penalty.
00226  */
00227 
00228 typedef union
00229 {
00230     unsigned char b[8];
00231     struct
00232     {
00233         int32_t     i0;
00234         int32_t     i1;
00235     }           b32;
00236 #if defined(B64)
00237     B64         b64;
00238 #endif
00239 } C_block;
00240 
00241 /*
00242  * Convert twenty-four-bit long in host-order
00243  * to six bits (and 2 low-order zeroes) per char little-endian format.
00244  */
00245 #define TO_SIX_BIT(rslt, src) {             \
00246         C_block cvt;                \
00247         cvt.b[0] = src; src >>= 6;      \
00248         cvt.b[1] = src; src >>= 6;      \
00249         cvt.b[2] = src; src >>= 6;      \
00250         cvt.b[3] = src;             \
00251         rslt = (cvt.b32.i0 & 0x3f3f3f3fL) << 2; \
00252     }
00253 
00254 /*
00255  * These macros may someday permit efficient use of 64-bit integers.
00256  */
00257 #define ZERO(d,d0,d1)           d0 = 0, d1 = 0
00258 #define LOAD(d,d0,d1,bl)        d0 = (bl).b32.i0, d1 = (bl).b32.i1
00259 #define LOADREG(d,d0,d1,s,s0,s1)    d0 = s0, d1 = s1
00260 #define OR(d,d0,d1,bl)          d0 |= (bl).b32.i0, d1 |= (bl).b32.i1
00261 #define STORE(s,s0,s1,bl)       (bl).b32.i0 = s0, (bl).b32.i1 = s1
00262 #define DCL_BLOCK(d,d0,d1)      int32_t d0, d1
00263 
00264 #if defined(LARGEDATA)
00265  /* Waste memory like crazy.  Also, do permutations in line */
00266 #define LGCHUNKBITS 3
00267 #define CHUNKBITS   (1<<LGCHUNKBITS)
00268 #define PERM6464(d,d0,d1,cpp,p)             \
00269     LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);     \
00270     OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);      \
00271     OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);      \
00272     OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);      \
00273     OR (d,d0,d1,(p)[(4<<CHUNKBITS)+(cpp)[4]]);      \
00274     OR (d,d0,d1,(p)[(5<<CHUNKBITS)+(cpp)[5]]);      \
00275     OR (d,d0,d1,(p)[(6<<CHUNKBITS)+(cpp)[6]]);      \
00276     OR (d,d0,d1,(p)[(7<<CHUNKBITS)+(cpp)[7]]);
00277 #define PERM3264(d,d0,d1,cpp,p)             \
00278     LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);     \
00279     OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);      \
00280     OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);      \
00281     OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);
00282 #else
00283  /* "small data" */
00284 #define LGCHUNKBITS 2
00285 #define CHUNKBITS   (1<<LGCHUNKBITS)
00286 #define PERM6464(d,d0,d1,cpp,p)             \
00287     { C_block tblk; permute(cpp,&tblk,p,8); LOAD (d,d0,d1,tblk); }
00288 #define PERM3264(d,d0,d1,cpp,p)             \
00289     { C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }
00290 #endif   /* LARGEDATA */
00291 
00292 STATIC      init_des(void);
00293 STATIC      init_perm(C_block[64 / CHUNKBITS][1 << CHUNKBITS], unsigned char[64], int, int);
00294 
00295 #ifndef LARGEDATA
00296 STATIC      permute(unsigned char *, C_block *, C_block *, int);
00297 #endif
00298 #ifdef DEBUG
00299 STATIC      prtab(char *, unsigned char *, int);
00300 #endif
00301 
00302 
00303 #ifndef LARGEDATA
00304 STATIC
00305 permute(cp, out, p, chars_in)
00306 unsigned char *cp;
00307 C_block    *out;
00308 C_block    *p;
00309 int         chars_in;
00310 {
00311     DCL_BLOCK(D, D0, D1);
00312     C_block    *tp;
00313     int         t;
00314 
00315     ZERO(D, D0, D1);
00316     do
00317     {
00318         t = *cp++;
00319         tp = &p[t & 0xf];
00320         OR(D, D0, D1, *tp);
00321         p += (1 << CHUNKBITS);
00322         tp = &p[t >> 4];
00323         OR(D, D0, D1, *tp);
00324         p += (1 << CHUNKBITS);
00325     } while (--chars_in > 0);
00326     STORE(D, D0, D1, *out);
00327 }
00328 #endif   /* LARGEDATA */
00329 
00330 
00331 /* =====  (mostly) Standard DES Tables ==================== */
00332 
00333 static const unsigned char IP[] = {     /* initial permutation */
00334     58, 50, 42, 34, 26, 18, 10, 2,
00335     60, 52, 44, 36, 28, 20, 12, 4,
00336     62, 54, 46, 38, 30, 22, 14, 6,
00337     64, 56, 48, 40, 32, 24, 16, 8,
00338     57, 49, 41, 33, 25, 17, 9, 1,
00339     59, 51, 43, 35, 27, 19, 11, 3,
00340     61, 53, 45, 37, 29, 21, 13, 5,
00341     63, 55, 47, 39, 31, 23, 15, 7,
00342 };
00343 
00344 /* The final permutation is the inverse of IP - no table is necessary */
00345 
00346 static const unsigned char ExpandTr[] = {       /* expansion operation */
00347     32, 1, 2, 3, 4, 5,
00348     4, 5, 6, 7, 8, 9,
00349     8, 9, 10, 11, 12, 13,
00350     12, 13, 14, 15, 16, 17,
00351     16, 17, 18, 19, 20, 21,
00352     20, 21, 22, 23, 24, 25,
00353     24, 25, 26, 27, 28, 29,
00354     28, 29, 30, 31, 32, 1,
00355 };
00356 
00357 static const unsigned char PC1[] = {    /* permuted choice table 1 */
00358     57, 49, 41, 33, 25, 17, 9,
00359     1, 58, 50, 42, 34, 26, 18,
00360     10, 2, 59, 51, 43, 35, 27,
00361     19, 11, 3, 60, 52, 44, 36,
00362 
00363     63, 55, 47, 39, 31, 23, 15,
00364     7, 62, 54, 46, 38, 30, 22,
00365     14, 6, 61, 53, 45, 37, 29,
00366     21, 13, 5, 28, 20, 12, 4,
00367 };
00368 
00369 static const unsigned char Rotates[] = {        /* PC1 rotation schedule */
00370     1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
00371 };
00372 
00373 /* note: each "row" of PC2 is left-padded with bits that make it invertible */
00374 static const unsigned char PC2[] = {    /* permuted choice table 2 */
00375     9, 18, 14, 17, 11, 24, 1, 5,
00376     22, 25, 3, 28, 15, 6, 21, 10,
00377     35, 38, 23, 19, 12, 4, 26, 8,
00378     43, 54, 16, 7, 27, 20, 13, 2,
00379 
00380     0, 0, 41, 52, 31, 37, 47, 55,
00381     0, 0, 30, 40, 51, 45, 33, 48,
00382     0, 0, 44, 49, 39, 56, 34, 53,
00383     0, 0, 46, 42, 50, 36, 29, 32,
00384 };
00385 
00386 static const unsigned char S[8][64] = { /* 48->32 bit substitution tables */
00387     /* S[1]         */
00388     {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
00389         0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
00390         4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
00391     15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},
00392     /* S[2]         */
00393     {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
00394         3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
00395         0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
00396     13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},
00397     /* S[3]         */
00398     {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
00399         13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
00400         13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
00401     1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
00402     /* S[4]         */
00403     {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
00404         13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
00405         10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
00406     3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
00407     /* S[5]         */
00408     {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
00409         14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
00410         4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
00411     11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
00412     /* S[6]         */
00413     {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
00414         10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
00415         9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
00416     4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
00417     /* S[7]         */
00418     {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
00419         13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
00420         1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
00421     6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
00422     /* S[8]         */
00423     {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
00424         1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
00425         7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
00426     2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}
00427 };
00428 
00429 static const unsigned char P32Tr[] = {  /* 32-bit permutation function */
00430     16, 7, 20, 21,
00431     29, 12, 28, 17,
00432     1, 15, 23, 26,
00433     5, 18, 31, 10,
00434     2, 8, 24, 14,
00435     32, 27, 3, 9,
00436     19, 13, 30, 6,
00437     22, 11, 4, 25,
00438 };
00439 
00440 static const unsigned char CIFP[] = {   /* compressed/interleaved permutation */
00441     1, 2, 3, 4, 17, 18, 19, 20,
00442     5, 6, 7, 8, 21, 22, 23, 24,
00443     9, 10, 11, 12, 25, 26, 27, 28,
00444     13, 14, 15, 16, 29, 30, 31, 32,
00445 
00446     33, 34, 35, 36, 49, 50, 51, 52,
00447     37, 38, 39, 40, 53, 54, 55, 56,
00448     41, 42, 43, 44, 57, 58, 59, 60,
00449     45, 46, 47, 48, 61, 62, 63, 64,
00450 };
00451 
00452 static const unsigned char itoa64[] =   /* 0..63 => ascii-64 */
00453 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
00454 
00455 
00456 /* =====  Tables that are initialized at run time  ==================== */
00457 
00458 
00459 static unsigned char a64toi[128];       /* ascii-64 => 0..63 */
00460 
00461 /* Initial key schedule permutation */
00462 static C_block PC1ROT[64 / CHUNKBITS][1 << CHUNKBITS];
00463 
00464 /* Subsequent key schedule rotation permutations */
00465 static C_block PC2ROT[2][64 / CHUNKBITS][1 << CHUNKBITS];
00466 
00467 /* Initial permutation/expansion table */
00468 static C_block IE3264[32 / CHUNKBITS][1 << CHUNKBITS];
00469 
00470 /* Table that combines the S, P, and E operations.  */
00471 static int32_t SPE[2][8][64];
00472 
00473 /* compressed/interleaved => final permutation table */
00474 static C_block CF6464[64 / CHUNKBITS][1 << CHUNKBITS];
00475 
00476 
00477 /* ==================================== */
00478 
00479 
00480 static C_block constdatablock;  /* encryption constant */
00481 static char cryptresult[1 + 4 + 4 + 11 + 1];    /* encrypted result */
00482 
00483 extern char *__md5crypt(const char *, const char *);    /* XXX */
00484 extern char *__bcrypt(const char *, const char *);      /* XXX */
00485 
00486 
00487 /*
00488  * Return a pointer to static data consisting of the "setting"
00489  * followed by an encryption produced by the "key" and "setting".
00490  */
00491 char *
00492 crypt(key, setting)
00493 const char *key;
00494 const char *setting;
00495 {
00496     char       *encp;
00497     int32_t     i;
00498     int         t;
00499     int32_t     salt;
00500     int         num_iter,
00501                 salt_size;
00502     C_block     keyblock,
00503                 rsltblock;
00504 
00505 #if 0
00506     /* Non-DES encryption schemes hook in here. */
00507     if (setting[0] == _PASSWORD_NONDES)
00508     {
00509         switch (setting[1])
00510         {
00511             case '2':
00512                 return (__bcrypt(key, setting));
00513             case '1':
00514             default:
00515                 return (__md5crypt(key, setting));
00516         }
00517     }
00518 #endif
00519 
00520     for (i = 0; i < 8; i++)
00521     {
00522         if ((t = 2 * (unsigned char) (*key)) != 0)
00523             key++;
00524         keyblock.b[i] = t;
00525     }
00526     if (des_setkey((char *) keyblock.b))        /* also initializes "a64toi" */
00527         return (NULL);
00528 
00529     encp = &cryptresult[0];
00530     switch (*setting)
00531     {
00532         case _PASSWORD_EFMT1:
00533 
00534             /*
00535              * Involve the rest of the password 8 characters at a time.
00536              */
00537             while (*key)
00538             {
00539                 if (des_cipher((char *) (void *) &keyblock,
00540                                (char *) (void *) &keyblock, 0L, 1))
00541                     return (NULL);
00542                 for (i = 0; i < 8; i++)
00543                 {
00544                     if ((t = 2 * (unsigned char) (*key)) != 0)
00545                         key++;
00546                     keyblock.b[i] ^= t;
00547                 }
00548                 if (des_setkey((char *) keyblock.b))
00549                     return (NULL);
00550             }
00551 
00552             *encp++ = *setting++;
00553 
00554             /* get iteration count */
00555             num_iter = 0;
00556             for (i = 4; --i >= 0;)
00557             {
00558                 if ((t = (unsigned char) setting[i]) == '\0')
00559                     t = '.';
00560                 encp[i] = t;
00561                 num_iter = (num_iter << 6) | a64toi[t];
00562             }
00563             setting += 4;
00564             encp += 4;
00565             salt_size = 4;
00566             break;
00567         default:
00568             num_iter = 25;
00569             salt_size = 2;
00570     }
00571 
00572     salt = 0;
00573     for (i = salt_size; --i >= 0;)
00574     {
00575         if ((t = (unsigned char) setting[i]) == '\0')
00576             t = '.';
00577         encp[i] = t;
00578         salt = (salt << 6) | a64toi[t];
00579     }
00580     encp += salt_size;
00581     if (des_cipher((char *) (void *) &constdatablock,
00582                    (char *) (void *) &rsltblock, salt, num_iter))
00583         return (NULL);
00584 
00585     /*
00586      * Encode the 64 cipher bits as 11 ascii characters.
00587      */
00588     i = ((int32_t) ((rsltblock.b[0] << 8) | rsltblock.b[1]) << 8) |
00589         rsltblock.b[2];
00590     encp[3] = itoa64[i & 0x3f];
00591     i >>= 6;
00592     encp[2] = itoa64[i & 0x3f];
00593     i >>= 6;
00594     encp[1] = itoa64[i & 0x3f];
00595     i >>= 6;
00596     encp[0] = itoa64[i];
00597     encp += 4;
00598     i = ((int32_t) ((rsltblock.b[3] << 8) | rsltblock.b[4]) << 8) |
00599         rsltblock.b[5];
00600     encp[3] = itoa64[i & 0x3f];
00601     i >>= 6;
00602     encp[2] = itoa64[i & 0x3f];
00603     i >>= 6;
00604     encp[1] = itoa64[i & 0x3f];
00605     i >>= 6;
00606     encp[0] = itoa64[i];
00607     encp += 4;
00608     i = ((int32_t) ((rsltblock.b[6]) << 8) | rsltblock.b[7]) << 2;
00609     encp[2] = itoa64[i & 0x3f];
00610     i >>= 6;
00611     encp[1] = itoa64[i & 0x3f];
00612     i >>= 6;
00613     encp[0] = itoa64[i];
00614 
00615     encp[3] = 0;
00616 
00617     return (cryptresult);
00618 }
00619 
00620 
00621 /*
00622  * The Key Schedule, filled in by des_setkey() or setkey().
00623  */
00624 #define KS_SIZE 16
00625 static C_block KS[KS_SIZE];
00626 
00627 static volatile int des_ready = 0;
00628 
00629 /*
00630  * Set up the key schedule from the key.
00631  */
00632 static int
00633 des_setkey(key)
00634 const char *key;
00635 {
00636     DCL_BLOCK(K, K0, K1);
00637     C_block    *ptabp;
00638     int         i;
00639 
00640     if (!des_ready)
00641         init_des();
00642 
00643     PERM6464(K, K0, K1, (unsigned char *) key, (C_block *) PC1ROT);
00644     key = (char *) &KS[0];
00645     STORE(K & ~0x03030303L, K0 & ~0x03030303L, K1, *(C_block *) key);
00646     for (i = 1; i < 16; i++)
00647     {
00648         key += sizeof(C_block);
00649         STORE(K, K0, K1, *(C_block *) key);
00650         ptabp = (C_block *) PC2ROT[Rotates[i] - 1];
00651         PERM6464(K, K0, K1, (unsigned char *) key, ptabp);
00652         STORE(K & ~0x03030303L, K0 & ~0x03030303L, K1, *(C_block *) key);
00653     }
00654     return (0);
00655 }
00656 
00657 /*
00658  * Encrypt (or decrypt if num_iter < 0) the 8 chars at "in" with abs(num_iter)
00659  * iterations of DES, using the given 24-bit salt and the pre-computed key
00660  * schedule, and store the resulting 8 chars at "out" (in == out is permitted).
00661  *
00662  * NOTE: the performance of this routine is critically dependent on your
00663  * compiler and machine architecture.
00664  */
00665 static int
00666 des_cipher(in, out, salt, num_iter)
00667 const char *in;
00668 char       *out;
00669 long        salt;
00670 int         num_iter;
00671 {
00672     /* variables that we want in registers, most important first */
00673 #if defined(pdp11)
00674     int         j;
00675 #endif
00676     int32_t     L0,
00677                 L1,
00678                 R0,
00679                 R1,
00680                 k;
00681     C_block    *kp;
00682     int         ks_inc,
00683                 loop_count;
00684     C_block     B;
00685 
00686     L0 = salt;
00687     TO_SIX_BIT(salt, L0);       /* convert to 4*(6+2) format */
00688 
00689 #if defined(__vax__) || defined(pdp11)
00690     salt = ~salt;               /* "x &~ y" is faster than "x & y". */
00691 #define SALT (~salt)
00692 #else
00693 #define SALT salt
00694 #endif
00695 
00696 #if defined(MUST_ALIGN)
00697     B.b[0] = in[0];
00698     B.b[1] = in[1];
00699     B.b[2] = in[2];
00700     B.b[3] = in[3];
00701     B.b[4] = in[4];
00702     B.b[5] = in[5];
00703     B.b[6] = in[6];
00704     B.b[7] = in[7];
00705     LOAD(L, L0, L1, B);
00706 #else
00707     LOAD(L, L0, L1, *(C_block *) in);
00708 #endif
00709     LOADREG(R, R0, R1, L, L0, L1);
00710     L0 &= 0x55555555L;
00711     L1 &= 0x55555555L;
00712     L0 = (L0 << 1) | L1;        /* L0 is the even-numbered input bits */
00713     R0 &= 0xaaaaaaaaL;
00714     R1 = (R1 >> 1) & 0x55555555L;
00715     L1 = R0 | R1;               /* L1 is the odd-numbered input bits */
00716     STORE(L, L0, L1, B);
00717     PERM3264(L, L0, L1, B.b, (C_block *) IE3264);       /* even bits */
00718     PERM3264(R, R0, R1, B.b + 4, (C_block *) IE3264);   /* odd bits */
00719 
00720     if (num_iter >= 0)
00721     {                           /* encryption */
00722         kp = &KS[0];
00723         ks_inc = sizeof(*kp);
00724     }
00725     else
00726     {                           /* decryption */
00727         num_iter = -num_iter;
00728         kp = &KS[KS_SIZE - 1];
00729         ks_inc = -(long) sizeof(*kp);
00730     }
00731 
00732     while (--num_iter >= 0)
00733     {
00734         loop_count = 8;
00735         do
00736         {
00737 
00738 #define SPTAB(t, i) \
00739         (*(int32_t *)((unsigned char *)(t) + (i)*(sizeof(int32_t)/4)))
00740 #if defined(gould)
00741             /* use this if B.b[i] is evaluated just once ... */
00742 #define DOXOR(x,y,i)    x^=SPTAB(SPE[0][i],B.b[i]); y^=SPTAB(SPE[1][i],B.b[i]);
00743 #else
00744 #if defined(pdp11)
00745             /* use this if your "long" int indexing is slow */
00746 #define DOXOR(x,y,i)    j=B.b[i]; x^=SPTAB(SPE[0][i],j); y^=SPTAB(SPE[1][i],j);
00747 #else
00748             /* use this if "k" is allocated to a register ... */
00749 #define DOXOR(x,y,i)    k=B.b[i]; x^=SPTAB(SPE[0][i],k); y^=SPTAB(SPE[1][i],k);
00750 #endif
00751 #endif
00752 
00753 #define CRUNCH(p0, p1, q0, q1)  \
00754             k = ((q0) ^ (q1)) & SALT;               \
00755             B.b32.i0 = k ^ (q0) ^ kp->b32.i0;       \
00756             B.b32.i1 = k ^ (q1) ^ kp->b32.i1;       \
00757             kp = (C_block *)((char *)kp+ks_inc);    \
00758                             \
00759             DOXOR(p0, p1, 0);       \
00760             DOXOR(p0, p1, 1);       \
00761             DOXOR(p0, p1, 2);       \
00762             DOXOR(p0, p1, 3);       \
00763             DOXOR(p0, p1, 4);       \
00764             DOXOR(p0, p1, 5);       \
00765             DOXOR(p0, p1, 6);       \
00766             DOXOR(p0, p1, 7);
00767 
00768             CRUNCH(L0, L1, R0, R1);
00769             CRUNCH(R0, R1, L0, L1);
00770         } while (--loop_count != 0);
00771         kp = (C_block *) ((char *) kp - (ks_inc * KS_SIZE));
00772 
00773 
00774         /* swap L and R */
00775         L0 ^= R0;
00776         L1 ^= R1;
00777         R0 ^= L0;
00778         R1 ^= L1;
00779         L0 ^= R0;
00780         L1 ^= R1;
00781     }
00782 
00783     /* store the encrypted (or decrypted) result */
00784     L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);
00785     L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);
00786     STORE(L, L0, L1, B);
00787     PERM6464(L, L0, L1, B.b, (C_block *) CF6464);
00788 #if defined(MUST_ALIGN)
00789     STORE(L, L0, L1, B);
00790     out[0] = B.b[0];
00791     out[1] = B.b[1];
00792     out[2] = B.b[2];
00793     out[3] = B.b[3];
00794     out[4] = B.b[4];
00795     out[5] = B.b[5];
00796     out[6] = B.b[6];
00797     out[7] = B.b[7];
00798 #else
00799     STORE(L, L0, L1, *(C_block *) out);
00800 #endif
00801     return (0);
00802 }
00803 
00804 
00805 /*
00806  * Initialize various tables.  This need only be done once.  It could even be
00807  * done at compile time, if the compiler were capable of that sort of thing.
00808  */
00809 STATIC
00810 init_des()
00811 {
00812     int         i,
00813                 j;
00814     int32_t     k;
00815     int         tableno;
00816     static unsigned char perm[64],
00817                 tmp32[32];      /* "static" for speed */
00818 
00819 /*  static volatile long init_start = 0; not used */
00820 
00821     /*
00822      * table that converts chars "./0-9A-Za-z"to integers 0-63.
00823      */
00824     for (i = 0; i < 64; i++)
00825         a64toi[itoa64[i]] = i;
00826 
00827     /*
00828      * PC1ROT - bit reverse, then PC1, then Rotate, then PC2.
00829      */
00830     for (i = 0; i < 64; i++)
00831         perm[i] = 0;
00832     for (i = 0; i < 64; i++)
00833     {
00834         if ((k = PC2[i]) == 0)
00835             continue;
00836         k += Rotates[0] - 1;
00837         if ((k % 28) < Rotates[0])
00838             k -= 28;
00839         k = PC1[k];
00840         if (k > 0)
00841         {
00842             k--;
00843             k = (k | 07) - (k & 07);
00844             k++;
00845         }
00846         perm[i] = k;
00847     }
00848 #ifdef DEBUG
00849     prtab("pc1tab", perm, 8);
00850 #endif
00851     init_perm(PC1ROT, perm, 8, 8);
00852 
00853     /*
00854      * PC2ROT - PC2 inverse, then Rotate (once or twice), then PC2.
00855      */
00856     for (j = 0; j < 2; j++)
00857     {
00858         unsigned char pc2inv[64];
00859 
00860         for (i = 0; i < 64; i++)
00861             perm[i] = pc2inv[i] = 0;
00862         for (i = 0; i < 64; i++)
00863         {
00864             if ((k = PC2[i]) == 0)
00865                 continue;
00866             pc2inv[k - 1] = i + 1;
00867         }
00868         for (i = 0; i < 64; i++)
00869         {
00870             if ((k = PC2[i]) == 0)
00871                 continue;
00872             k += j;
00873             if ((k % 28) <= j)
00874                 k -= 28;
00875             perm[i] = pc2inv[k];
00876         }
00877 #ifdef DEBUG
00878         prtab("pc2tab", perm, 8);
00879 #endif
00880         init_perm(PC2ROT[j], perm, 8, 8);
00881     }
00882 
00883     /*
00884      * Bit reverse, then initial permutation, then expansion.
00885      */
00886     for (i = 0; i < 8; i++)
00887     {
00888         for (j = 0; j < 8; j++)
00889         {
00890             k = (j < 2) ? 0 : IP[ExpandTr[i * 6 + j - 2] - 1];
00891             if (k > 32)
00892                 k -= 32;
00893             else if (k > 0)
00894                 k--;
00895             if (k > 0)
00896             {
00897                 k--;
00898                 k = (k | 07) - (k & 07);
00899                 k++;
00900             }
00901             perm[i * 8 + j] = k;
00902         }
00903     }
00904 #ifdef DEBUG
00905     prtab("ietab", perm, 8);
00906 #endif
00907     init_perm(IE3264, perm, 4, 8);
00908 
00909     /*
00910      * Compression, then final permutation, then bit reverse.
00911      */
00912     for (i = 0; i < 64; i++)
00913     {
00914         k = IP[CIFP[i] - 1];
00915         if (k > 0)
00916         {
00917             k--;
00918             k = (k | 07) - (k & 07);
00919             k++;
00920         }
00921         perm[k - 1] = i + 1;
00922     }
00923 #ifdef DEBUG
00924     prtab("cftab", perm, 8);
00925 #endif
00926     init_perm(CF6464, perm, 8, 8);
00927 
00928     /*
00929      * SPE table
00930      */
00931     for (i = 0; i < 48; i++)
00932         perm[i] = P32Tr[ExpandTr[i] - 1];
00933     for (tableno = 0; tableno < 8; tableno++)
00934     {
00935         for (j = 0; j < 64; j++)
00936         {
00937             k = (((j >> 0) & 01) << 5) |
00938                 (((j >> 1) & 01) << 3) |
00939                 (((j >> 2) & 01) << 2) |
00940                 (((j >> 3) & 01) << 1) |
00941                 (((j >> 4) & 01) << 0) |
00942                 (((j >> 5) & 01) << 4);
00943             k = S[tableno][k];
00944             k = (((k >> 3) & 01) << 0) |
00945                 (((k >> 2) & 01) << 1) |
00946                 (((k >> 1) & 01) << 2) |
00947                 (((k >> 0) & 01) << 3);
00948             for (i = 0; i < 32; i++)
00949                 tmp32[i] = 0;
00950             for (i = 0; i < 4; i++)
00951                 tmp32[4 * tableno + i] = (k >> i) & 01;
00952             k = 0;
00953             for (i = 24; --i >= 0;)
00954                 k = (k << 1) | tmp32[perm[i] - 1];
00955             TO_SIX_BIT(SPE[0][tableno][j], k);
00956             k = 0;
00957             for (i = 24; --i >= 0;)
00958                 k = (k << 1) | tmp32[perm[i + 24] - 1];
00959             TO_SIX_BIT(SPE[1][tableno][j], k);
00960         }
00961     }
00962 
00963     des_ready = 1;
00964 }
00965 
00966 /*
00967  * Initialize "perm" to represent transformation "p", which rearranges
00968  * (perhaps with expansion and/or contraction) one packed array of bits
00969  * (of size "chars_in" characters) into another array (of size "chars_out"
00970  * characters).
00971  *
00972  * "perm" must be all-zeroes on entry to this routine.
00973  */
00974 STATIC
00975 init_perm(perm, p, chars_in, chars_out)
00976 C_block     perm[64 / CHUNKBITS][1 << CHUNKBITS];
00977 unsigned char p[64];
00978 int         chars_in,
00979             chars_out;
00980 {
00981     int         i,
00982                 j,
00983                 k,
00984                 l;
00985 
00986     for (k = 0; k < chars_out * 8; k++)
00987     {                           /* each output bit position */
00988         l = p[k] - 1;           /* where this bit comes from */
00989         if (l < 0)
00990             continue;           /* output bit is always 0 */
00991         i = l >> LGCHUNKBITS;   /* which chunk this bit comes from */
00992         l = 1 << (l & (CHUNKBITS - 1)); /* mask for this bit */
00993         for (j = 0; j < (1 << CHUNKBITS); j++)
00994         {                       /* each chunk value */
00995             if ((j & l) != 0)
00996                 perm[i][j].b[k >> 3] |= 1 << (k & 07);
00997         }
00998     }
00999 }
01000 
01001 /*
01002  * "setkey" routine (for backwards compatibility)
01003  */
01004 #ifdef NOT_USED
01005 int
01006 setkey(key)
01007 const char *key;
01008 {
01009     int         i,
01010                 j,
01011                 k;
01012     C_block     keyblock;
01013 
01014     for (i = 0; i < 8; i++)
01015     {
01016         k = 0;
01017         for (j = 0; j < 8; j++)
01018         {
01019             k <<= 1;
01020             k |= (unsigned char) *key++;
01021         }
01022         keyblock.b[i] = k;
01023     }
01024     return (des_setkey((char *) keyblock.b));
01025 }
01026 
01027 /*
01028  * "encrypt" routine (for backwards compatibility)
01029  */
01030 static int
01031 encrypt(block, flag)
01032 char       *block;
01033 int         flag;
01034 {
01035     int         i,
01036                 j,
01037                 k;
01038     C_block     cblock;
01039 
01040     for (i = 0; i < 8; i++)
01041     {
01042         k = 0;
01043         for (j = 0; j < 8; j++)
01044         {
01045             k <<= 1;
01046             k |= (unsigned char) *block++;
01047         }
01048         cblock.b[i] = k;
01049     }
01050     if (des_cipher((char *) &cblock, (char *) &cblock, 0L, (flag ? -1 : 1)))
01051         return (1);
01052     for (i = 7; i >= 0; i--)
01053     {
01054         k = cblock.b[i];
01055         for (j = 7; j >= 0; j--)
01056         {
01057             *--block = k & 01;
01058             k >>= 1;
01059         }
01060     }
01061     return (0);
01062 }
01063 #endif
01064 
01065 #ifdef DEBUG
01066 STATIC
01067 prtab(s, t, num_rows)
01068 char       *s;
01069 unsigned char *t;
01070 int         num_rows;
01071 {
01072     int         i,
01073                 j;
01074 
01075     (void) printf("%s:\n", s);
01076     for (i = 0; i < num_rows; i++)
01077     {
01078         for (j = 0; j < 8; j++)
01079             (void) printf("%3d", t[i * 8 + j]);
01080         (void) printf("\n");
01081     }
01082     (void) printf("\n");
01083 }
01084 
01085 #endif