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