#include "FEATURE/uwin"12#if !_UWIN || _lib_crypt34void _STUB_crypt(){}56#else78/*9* Copyright (c) 1989, 199310* The Regents of the University of California. All rights reserved.11*12* This code is derived from software contributed to Berkeley by13* Tom Truscott.14*15* Redistribution and use in source and binary forms, with or without16* modification, are permitted provided that the following conditions17* are met:18* 1. Redistributions of source code must retain the above copyright19* notice, this list of conditions and the following disclaimer.20* 2. Redistributions in binary form must reproduce the above copyright21* notice, this list of conditions and the following disclaimer in the22* documentation and/or other materials provided with the distribution.23* 3. Neither the name of the University nor the names of its contributors24* may be used to endorse or promote products derived from this software25* without specific prior written permission.26*27* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND28* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE29* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE30* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE31* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL32* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS33* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)34* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT35* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY36* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF37* SUCH DAMAGE.38*/3940#if defined(LIBC_SCCS) && !defined(lint)41static char sccsid[] = "@(#)crypt.c 8.1 (Berkeley) 6/4/93";42#endif /* LIBC_SCCS and not lint */4344#define crypt ______crypt45#define encrypt ______encrypt46#define setkey ______setkey4748/* #include <unistd.h> */49#include <stdio.h>50#include <limits.h>51#include <pwd.h>5253#undef crypt54#undef encrypt55#undef setkey5657#ifndef _PASSWORD_EFMT158#define _PASSWORD_EFMT1 '-'59#endif6061#if defined(__EXPORT__)62#define extern __EXPORT__63#endif6465/*66* UNIX password, and DES, encryption.67* By Tom Truscott, [email protected],68* from algorithms by Robert W. Baldwin and James Gillogly.69*70* References:71* "Mathematical Cryptology for Computer Scientists and Mathematicians,"72* by Wayne Patterson, 1987, ISBN 0-8476-7438-X.73*74* "Password Security: A Case History," R. Morris and Ken Thompson,75* Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.76*77* "DES will be Totally Insecure within Ten Years," M.E. Hellman,78* IEEE Spectrum, vol. 16, pp. 32-39, July 1979.79*/8081/* ===== Configuration ==================== */8283/*84* define "MUST_ALIGN" if your compiler cannot load/store85* long integers at arbitrary (e.g. odd) memory locations.86* (Either that or never pass unaligned addresses to des_cipher!)87*/88#if !defined(vax)89#define MUST_ALIGN90#endif9192#ifdef CHAR_BITS93#if CHAR_BITS != 894#error C_block structure assumes 8 bit characters95#endif96#endif9798/*99* define "LONG_IS_32_BITS" only if sizeof(long)==4.100* This avoids use of bit fields (your compiler may be sloppy with them).101*/102#if !defined(cray)103#define LONG_IS_32_BITS104#endif105106/*107* define "B64" to be the declaration for a 64 bit integer.108* XXX this feature is currently unused, see "endian" comment below.109*/110#if defined(cray)111#define B64 long112#endif113#if defined(convex)114#define B64 long long115#endif116117/*118* define "LARGEDATA" to get faster permutations, by using about 72 kilobytes119* of lookup tables. This speeds up des_setkey() and des_cipher(), but has120* little effect on crypt().121*/122#if defined(notdef)123#define LARGEDATA124#endif125126/* ==================================== */127128/*129* Cipher-block representation (Bob Baldwin):130*131* DES operates on groups of 64 bits, numbered 1..64 (sigh). One132* representation is to store one bit per byte in an array of bytes. Bit N of133* the NBS spec is stored as the LSB of the Nth byte (index N-1) in the array.134* Another representation stores the 64 bits in 8 bytes, with bits 1..8 in the135* first byte, 9..16 in the second, and so on. The DES spec apparently has136* bit 1 in the MSB of the first byte, but that is particularly noxious so we137* bit-reverse each byte so that bit 1 is the LSB of the first byte, bit 8 is138* the MSB of the first byte. Specifically, the 64-bit input data and key are139* converted to LSB format, and the output 64-bit block is converted back into140* MSB format.141*142* DES operates internally on groups of 32 bits which are expanded to 48 bits143* by permutation E and shrunk back to 32 bits by the S boxes. To speed up144* the computation, the expansion is applied only once, the expanded145* representation is maintained during the encryption, and a compression146* permutation is applied only at the end. To speed up the S-box lookups,147* the 48 bits are maintained as eight 6 bit groups, one per byte, which148* directly feed the eight S-boxes. Within each byte, the 6 bits are the149* most significant ones. The low two bits of each byte are zero. (Thus,150* bit 1 of the 48 bit E expansion is stored as the "4"-valued bit of the151* first byte in the eight byte representation, bit 2 of the 48 bit value is152* the "8"-valued bit, and so on.) In fact, a combined "SPE"-box lookup is153* used, in which the output is the 64 bit result of an S-box lookup which154* has been permuted by P and expanded by E, and is ready for use in the next155* iteration. Two 32-bit wide tables, SPE[0] and SPE[1], are used for this156* lookup. Since each byte in the 48 bit path is a multiple of four, indexed157* lookup of SPE[0] and SPE[1] is simple and fast. The key schedule and158* "salt" are also converted to this 8*(6+2) format. The SPE table size is159* 8*64*8 = 4K bytes.160*161* To speed up bit-parallel operations (such as XOR), the 8 byte162* representation is "union"ed with 32 bit values "i0" and "i1", and, on163* machines which support it, a 64 bit value "b64". This data structure,164* "C_block", has two problems. First, alignment restrictions must be165* honored. Second, the byte-order (e.g. little-endian or big-endian) of166* the architecture becomes visible.167*168* The byte-order problem is unfortunate, since on the one hand it is good169* to have a machine-independent C_block representation (bits 1..8 in the170* first byte, etc.), and on the other hand it is good for the LSB of the171* first byte to be the LSB of i0. We cannot have both these things, so we172* currently use the "little-endian" representation and avoid any multi-byte173* operations that depend on byte order. This largely precludes use of the174* 64-bit datatype since the relative order of i0 and i1 are unknown. It175* also inhibits grouping the SPE table to look up 12 bits at a time. (The176* 12 bits can be stored in a 16-bit field with 3 low-order zeroes and 1177* high-order zero, providing fast indexing into a 64-bit wide SPE.) On the178* other hand, 64-bit datatypes are currently rare, and a 12-bit SPE lookup179* requires a 128 kilobyte table, so perhaps this is not a big loss.180*181* Permutation representation (Jim Gillogly):182*183* A transformation is defined by its effect on each of the 8 bytes of the184* 64-bit input. For each byte we give a 64-bit output that has the bits in185* the input distributed appropriately. The transformation is then the OR186* of the 8 sets of 64-bits. This uses 8*256*8 = 16K bytes of storage for187* each transformation. Unless LARGEDATA is defined, however, a more compact188* table is used which looks up 16 4-bit "chunks" rather than 8 8-bit chunks.189* The smaller table uses 16*16*8 = 2K bytes for each transformation. This190* is slower but tolerable, particularly for password encryption in which191* the SPE transformation is iterated many times. The small tables total 9K192* bytes, the large tables total 72K bytes.193*194* The transformations used are:195* IE3264: MSB->LSB conversion, initial permutation, and expansion.196* This is done by collecting the 32 even-numbered bits and applying197* a 32->64 bit transformation, and then collecting the 32 odd-numbered198* bits and applying the same transformation. Since there are only199* 32 input bits, the IE3264 transformation table is half the size of200* the usual table.201* CF6464: Compression, final permutation, and LSB->MSB conversion.202* This is done by two trivial 48->32 bit compressions to obtain203* a 64-bit block (the bit numbering is given in the "CIFP" table)204* followed by a 64->64 bit "cleanup" transformation. (It would205* be possible to group the bits in the 64-bit block so that 2206* identical 32->32 bit transformations could be used instead,207* saving a factor of 4 in space and possibly 2 in time, but208* byte-ordering and other complications rear their ugly head.209* Similar opportunities/problems arise in the key schedule210* transforms.)211* PC1ROT: MSB->LSB, PC1 permutation, rotate, and PC2 permutation.212* This admittedly baroque 64->64 bit transformation is used to213* produce the first code (in 8*(6+2) format) of the key schedule.214* PC2ROT[0]: Inverse PC2 permutation, rotate, and PC2 permutation.215* It would be possible to define 15 more transformations, each216* with a different rotation, to generate the entire key schedule.217* To save space, however, we instead permute each code into the218* next by using a transformation that "undoes" the PC2 permutation,219* rotates the code, and then applies PC2. Unfortunately, PC2220* transforms 56 bits into 48 bits, dropping 8 bits, so PC2 is not221* invertible. We get around that problem by using a modified PC2222* which retains the 8 otherwise-lost bits in the unused low-order223* bits of each byte. The low-order bits are cleared when the224* codes are stored into the key schedule.225* PC2ROT[1]: Same as PC2ROT[0], but with two rotations.226* This is faster than applying PC2ROT[0] twice,227*228* The Bell Labs "salt" (Bob Baldwin):229*230* The salting is a simple permutation applied to the 48-bit result of E.231* Specifically, if bit i (1 <= i <= 24) of the salt is set then bits i and232* i+24 of the result are swapped. The salt is thus a 24 bit number, with233* 16777216 possible values. (The original salt was 12 bits and could not234* swap bits 13..24 with 36..48.)235*236* It is possible, but ugly, to warp the SPE table to account for the salt237* permutation. Fortunately, the conditional bit swapping requires only238* about four machine instructions and can be done on-the-fly with about an239* 8% performance penalty.240*/241242typedef union {243unsigned char b[8];244struct {245#if defined(LONG_IS_32_BITS)246/* long is often faster than a 32-bit bit field */247long i0;248long i1;249#else250long i0: 32;251long i1: 32;252#endif253} b32;254#if defined(B64)255B64 b64;256#endif257} C_block;258259/*260* Convert twenty-four-bit long in host-order261* to six bits (and 2 low-order zeroes) per char little-endian format.262*/263#define TO_SIX_BIT(rslt, src) { \264C_block cvt; \265cvt.b[0] = (unsigned char) src; src >>= 6; \266cvt.b[1] = (unsigned char) src; src >>= 6; \267cvt.b[2] = (unsigned char) src; src >>= 6; \268cvt.b[3] = (unsigned char) src; \269rslt = (cvt.b32.i0 & 0x3f3f3f3fL) << 2; \270}271272/*273* These macros may someday permit efficient use of 64-bit integers.274*/275#define ZERO(d,d0,d1) d0 = 0, d1 = 0276#define LOAD(d,d0,d1,bl) d0 = (bl).b32.i0, d1 = (bl).b32.i1277#define LOADREG(d,d0,d1,s,s0,s1) d0 = s0, d1 = s1278#define OR(d,d0,d1,bl) d0 |= (bl).b32.i0, d1 |= (bl).b32.i1279#define STORE(s,s0,s1,bl) (bl).b32.i0 = s0, (bl).b32.i1 = s1280#define DCL_BLOCK(d,d0,d1) long d0, d1281/* proto(1) workarounds -- barf */282#define DCL_BLOCK_D DCL_BLOCK(D,D0,D1)283#define DCL_BLOCK_K DCL_BLOCK(K,K0,K1)284285#if defined(LARGEDATA)286/* Waste memory like crazy. Also, do permutations in line */287#define LGCHUNKBITS 3288#define CHUNKBITS (1<<LGCHUNKBITS)289#define PERM6464(d,d0,d1,cpp,p) \290LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]); \291OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]); \292OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]); \293OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]); \294OR (d,d0,d1,(p)[(4<<CHUNKBITS)+(cpp)[4]]); \295OR (d,d0,d1,(p)[(5<<CHUNKBITS)+(cpp)[5]]); \296OR (d,d0,d1,(p)[(6<<CHUNKBITS)+(cpp)[6]]); \297OR (d,d0,d1,(p)[(7<<CHUNKBITS)+(cpp)[7]]);298#define PERM3264(d,d0,d1,cpp,p) \299LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]); \300OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]); \301OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]); \302OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);303#else304/* "small data" */305#define LGCHUNKBITS 2306#define CHUNKBITS (1<<LGCHUNKBITS)307#define PERM6464(d,d0,d1,cpp,p) \308{ C_block tblk; permute(cpp,&tblk,p,8); LOAD (d,d0,d1,tblk); }309#define PERM3264(d,d0,d1,cpp,p) \310{ C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }311312static void permute(unsigned char *cp, C_block *out, register C_block *p, int chars_in) {313register DCL_BLOCK_D;314register C_block *tp;315register int t;316317ZERO(D,D0,D1);318do {319t = *cp++;320tp = &p[t&0xf]; OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);321tp = &p[t>>4]; OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);322} while (--chars_in > 0);323STORE(D,D0,D1,*out);324}325#endif /* LARGEDATA */326327328/* ===== (mostly) Standard DES Tables ==================== */329330static unsigned char IP[] = { /* initial permutation */33158, 50, 42, 34, 26, 18, 10, 2,33260, 52, 44, 36, 28, 20, 12, 4,33362, 54, 46, 38, 30, 22, 14, 6,33464, 56, 48, 40, 32, 24, 16, 8,33557, 49, 41, 33, 25, 17, 9, 1,33659, 51, 43, 35, 27, 19, 11, 3,33761, 53, 45, 37, 29, 21, 13, 5,33863, 55, 47, 39, 31, 23, 15, 7,339};340341/* The final permutation is the inverse of IP - no table is necessary */342343static unsigned char ExpandTr[] = { /* expansion operation */34432, 1, 2, 3, 4, 5,3454, 5, 6, 7, 8, 9,3468, 9, 10, 11, 12, 13,34712, 13, 14, 15, 16, 17,34816, 17, 18, 19, 20, 21,34920, 21, 22, 23, 24, 25,35024, 25, 26, 27, 28, 29,35128, 29, 30, 31, 32, 1,352};353354static unsigned char PC1[] = { /* permuted choice table 1 */35557, 49, 41, 33, 25, 17, 9,3561, 58, 50, 42, 34, 26, 18,35710, 2, 59, 51, 43, 35, 27,35819, 11, 3, 60, 52, 44, 36,35936063, 55, 47, 39, 31, 23, 15,3617, 62, 54, 46, 38, 30, 22,36214, 6, 61, 53, 45, 37, 29,36321, 13, 5, 28, 20, 12, 4,364};365366static unsigned char Rotates[] = { /* PC1 rotation schedule */3671, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,368};369370/* note: each "row" of PC2 is left-padded with bits that make it invertible */371static unsigned char PC2[] = { /* permuted choice table 2 */3729, 18, 14, 17, 11, 24, 1, 5,37322, 25, 3, 28, 15, 6, 21, 10,37435, 38, 23, 19, 12, 4, 26, 8,37543, 54, 16, 7, 27, 20, 13, 2,3763770, 0, 41, 52, 31, 37, 47, 55,3780, 0, 30, 40, 51, 45, 33, 48,3790, 0, 44, 49, 39, 56, 34, 53,3800, 0, 46, 42, 50, 36, 29, 32,381};382383static unsigned char S[8][64] = { /* 48->32 bit substitution tables */384/* S[1] */38514, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,3860, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,3874, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,38815, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,389/* S[2] */39015, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3913, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,3920, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,39313, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,394/* S[3] */39510, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,39613, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,39713, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,3981, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,399/* S[4] */4007, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,40113, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,40210, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,4033, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,404/* S[5] */4052, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,40614, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,4074, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,40811, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,409/* S[6] */41012, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,41110, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,4129, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,4134, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,414/* S[7] */4154, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,41613, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,4171, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,4186, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,419/* S[8] */42013, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,4211, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,4227, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,4232, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,424};425426static unsigned char P32Tr[] = { /* 32-bit permutation function */42716, 7, 20, 21,42829, 12, 28, 17,4291, 15, 23, 26,4305, 18, 31, 10,4312, 8, 24, 14,43232, 27, 3, 9,43319, 13, 30, 6,43422, 11, 4, 25,435};436437static unsigned char CIFP[] = { /* compressed/interleaved permutation */4381, 2, 3, 4, 17, 18, 19, 20,4395, 6, 7, 8, 21, 22, 23, 24,4409, 10, 11, 12, 25, 26, 27, 28,44113, 14, 15, 16, 29, 30, 31, 32,44244333, 34, 35, 36, 49, 50, 51, 52,44437, 38, 39, 40, 53, 54, 55, 56,44541, 42, 43, 44, 57, 58, 59, 60,44645, 46, 47, 48, 61, 62, 63, 64,447};448449static unsigned char itoa64[] = /* 0..63 => ascii-64 */450"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";451452453/* ===== Tables that are initialized at run time ==================== */454455456static unsigned char a64toi[128]; /* ascii-64 => 0..63 */457458/* Initial key schedule permutation */459static C_block PC1ROT[64/CHUNKBITS][1<<CHUNKBITS];460461/* Subsequent key schedule rotation permutations */462static C_block PC2ROT[2][64/CHUNKBITS][1<<CHUNKBITS];463464/* Initial permutation/expansion table */465static C_block IE3264[32/CHUNKBITS][1<<CHUNKBITS];466467/* Table that combines the S, P, and E operations. */468static long SPE[2][8][64];469470/* compressed/interleaved => final permutation table */471static C_block CF6464[64/CHUNKBITS][1<<CHUNKBITS];472473474/* ==================================== */475476static C_block constdatablock; /* encryption constant */477static char cryptresult[1+4+4+11+1]; /* encrypted result */478479/*480* Initialize "perm" to represent transformation "p", which rearranges481* (perhaps with expansion and/or contraction) one packed array of bits482* (of size "chars_in" characters) into another array (of size "chars_out"483* characters).484*485* "perm" must be all-zeroes on entry to this routine.486*/487static void init_perm(C_block perm[64/CHUNKBITS][1<<CHUNKBITS],488unsigned char p[64], int chars_in, int chars_out) {489register int i, j, k, l;490491for (k = 0; k < chars_out*8; k++) { /* each output bit position */492l = p[k] - 1; /* where this bit comes from */493if (l < 0)494continue; /* output bit is always 0 */495i = l>>LGCHUNKBITS; /* which chunk this bit comes from */496l = 1<<(l&(CHUNKBITS-1)); /* mask for this bit */497for (j = 0; j < (1<<CHUNKBITS); j++) { /* each chunk value */498if ((j & l) != 0)499perm[i][j].b[k>>3] |= 1<<(k&07);500}501}502}503504/*505* Initialize various tables. This need only be done once. It could even be506* done at compile time, if the compiler were capable of that sort of thing.507*/508static void init_des(void) {509register int i, j;510register long k;511register int tableno;512static unsigned char perm[64], tmp32[32]; /* "static" for speed */513514/*515* table that converts chars "./0-9A-Za-z"to integers 0-63.516*/517for (i = 0; i < 64; i++)518a64toi[itoa64[i]] = i;519520/*521* PC1ROT - bit reverse, then PC1, then Rotate, then PC2.522*/523for (i = 0; i < 64; i++)524perm[i] = 0;525for (i = 0; i < 64; i++) {526if ((k = PC2[i]) == 0)527continue;528k += Rotates[0]-1;529if ((k%28) < Rotates[0]) k -= 28;530k = PC1[k];531if (k > 0) {532k--;533k = (k|07) - (k&07);534k++;535}536perm[i] = (unsigned char) k;537}538#ifdef DEBUG539prtab("pc1tab", perm, 8);540#endif541init_perm(PC1ROT, perm, 8, 8);542543/*544* PC2ROT - PC2 inverse, then Rotate (once or twice), then PC2.545*/546for (j = 0; j < 2; j++) {547unsigned char pc2inv[64];548for (i = 0; i < 64; i++)549perm[i] = pc2inv[i] = 0;550for (i = 0; i < 64; i++) {551if ((k = PC2[i]) == 0)552continue;553pc2inv[k-1] = i+1;554}555for (i = 0; i < 64; i++) {556if ((k = PC2[i]) == 0)557continue;558k += j;559if ((k%28) <= j) k -= 28;560perm[i] = pc2inv[k];561}562#ifdef DEBUG563prtab("pc2tab", perm, 8);564#endif565init_perm(PC2ROT[j], perm, 8, 8);566}567568/*569* Bit reverse, then initial permutation, then expansion.570*/571for (i = 0; i < 8; i++) {572for (j = 0; j < 8; j++) {573k = (j < 2)? 0: IP[ExpandTr[i*6+j-2]-1];574if (k > 32)575k -= 32;576else if (k > 0)577k--;578if (k > 0) {579k--;580k = (k|07) - (k&07);581k++;582}583perm[i*8+j] = (unsigned char) k;584}585}586#ifdef DEBUG587prtab("ietab", perm, 8);588#endif589init_perm(IE3264, perm, 4, 8);590591/*592* Compression, then final permutation, then bit reverse.593*/594for (i = 0; i < 64; i++) {595k = IP[CIFP[i]-1];596if (k > 0) {597k--;598k = (k|07) - (k&07);599k++;600}601perm[k-1] = i+1;602}603#ifdef DEBUG604prtab("cftab", perm, 8);605#endif606init_perm(CF6464, perm, 8, 8);607608/*609* SPE table610*/611for (i = 0; i < 48; i++)612perm[i] = P32Tr[ExpandTr[i]-1];613for (tableno = 0; tableno < 8; tableno++) {614for (j = 0; j < 64; j++) {615k = (((j >> 0) &01) << 5)|616(((j >> 1) &01) << 3)|617(((j >> 2) &01) << 2)|618(((j >> 3) &01) << 1)|619(((j >> 4) &01) << 0)|620(((j >> 5) &01) << 4);621k = S[tableno][k];622k = (((k >> 3)&01) << 0)|623(((k >> 2)&01) << 1)|624(((k >> 1)&01) << 2)|625(((k >> 0)&01) << 3);626for (i = 0; i < 32; i++)627tmp32[i] = 0;628for (i = 0; i < 4; i++)629tmp32[4 * tableno + i] = (k >> i) & 01;630k = 0;631for (i = 24; --i >= 0; )632k = (k<<1) | tmp32[perm[i]-1];633TO_SIX_BIT(SPE[0][tableno][j], k);634k = 0;635for (i = 24; --i >= 0; )636k = (k<<1) | tmp32[perm[i+24]-1];637TO_SIX_BIT(SPE[1][tableno][j], k);638}639}640}641642/*643* The Key Schedule, filled in by des_setkey() or setkey().644*/645#define KS_SIZE 16646static C_block KS[KS_SIZE];647648/*649* Set up the key schedule from the key.650*/651static int des_setkey(register const char *key) {652register DCL_BLOCK_K;653register C_block *ptabp;654register int i;655static int des_ready = 0;656657if (!des_ready) {658init_des();659des_ready = 1;660}661662PERM6464(K,K0,K1,(unsigned char *)key,(C_block *)PC1ROT);663key = (char *)&KS[0];664STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);665for (i = 1; i < 16; i++) {666key += sizeof(C_block);667STORE(K,K0,K1,*(C_block *)key);668ptabp = (C_block *)PC2ROT[Rotates[i]-1];669PERM6464(K,K0,K1,(unsigned char *)key,ptabp);670STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);671}672return (0);673}674675/*676* Encrypt (or decrypt if num_iter < 0) the 8 chars at "in" with abs(num_iter)677* iterations of DES, using the the given 24-bit salt and the pre-computed key678* schedule, and store the resulting 8 chars at "out" (in == out is permitted).679*680* NOTE: the performance of this routine is critically dependent on your681* compiler and machine architecture.682*/683static int des_cipher(const char *in, char *out, long salt, int num_iter) {684/* variables that we want in registers, most important first */685#if defined(pdp11)686register int j;687#endif688register long L0, L1, R0, R1, k;689register C_block *kp;690register int ks_inc, loop_count;691C_block B;692693L0 = salt;694TO_SIX_BIT(salt, L0); /* convert to 4*(6+2) format */695696#if defined(vax) || defined(pdp11)697salt = ~salt; /* "x &~ y" is faster than "x & y". */698#define SALT (~salt)699#else700#define SALT salt701#endif702703#if defined(MUST_ALIGN)704B.b[0] = in[0]; B.b[1] = in[1]; B.b[2] = in[2]; B.b[3] = in[3];705B.b[4] = in[4]; B.b[5] = in[5]; B.b[6] = in[6]; B.b[7] = in[7];706LOAD(L,L0,L1,B);707#else708LOAD(L,L0,L1,*(C_block *)in);709#endif710LOADREG(R,R0,R1,L,L0,L1);711L0 &= 0x55555555L;712L1 &= 0x55555555L;713L0 = (L0 << 1) | L1; /* L0 is the even-numbered input bits */714R0 &= 0xaaaaaaaaL;715R1 = (R1 >> 1) & 0x55555555L;716L1 = R0 | R1; /* L1 is the odd-numbered input bits */717STORE(L,L0,L1,B);718PERM3264(L,L0,L1,B.b, (C_block *)IE3264); /* even bits */719PERM3264(R,R0,R1,B.b+4,(C_block *)IE3264); /* odd bits */720721if (num_iter >= 0)722{ /* encryption */723kp = &KS[0];724ks_inc = sizeof(*kp);725}726else727{ /* decryption */728num_iter = -num_iter;729kp = &KS[KS_SIZE-1];730ks_inc = -((int) sizeof(*kp));731}732733while (--num_iter >= 0) {734loop_count = 8;735do {736737#define SPTAB(t, i) (*(long *)((unsigned char *)t + i*(sizeof(long)/4)))738#if defined(gould)739/* use this if B.b[i] is evaluated just once ... */740#define DOXOR(x,y,i) x^=SPTAB(SPE[0][i],B.b[i]); y^=SPTAB(SPE[1][i],B.b[i]);741#else742#if defined(pdp11)743/* use this if your "long" int indexing is slow */744#define DOXOR(x,y,i) j=B.b[i]; x^=SPTAB(SPE[0][i],j); y^=SPTAB(SPE[1][i],j);745#else746/* use this if "k" is allocated to a register ... */747#define DOXOR(x,y,i) k=B.b[i]; x^=SPTAB(SPE[0][i],k); y^=SPTAB(SPE[1][i],k);748#endif749#endif750751#define CRUNCH(p0, p1, q0, q1) \752k = (q0 ^ q1) & SALT; \753B.b32.i0 = k ^ q0 ^ kp->b32.i0; \754B.b32.i1 = k ^ q1 ^ kp->b32.i1; \755kp = (C_block *)((char *)kp+ks_inc); \756\757DOXOR(p0, p1, 0); \758DOXOR(p0, p1, 1); \759DOXOR(p0, p1, 2); \760DOXOR(p0, p1, 3); \761DOXOR(p0, p1, 4); \762DOXOR(p0, p1, 5); \763DOXOR(p0, p1, 6); \764DOXOR(p0, p1, 7);765766CRUNCH(L0, L1, R0, R1);767CRUNCH(R0, R1, L0, L1);768} while (--loop_count != 0);769kp = (C_block *)((char *)kp-(ks_inc*KS_SIZE));770771772/* swap L and R */773L0 ^= R0; L1 ^= R1;774R0 ^= L0; R1 ^= L1;775L0 ^= R0; L1 ^= R1;776}777778/* store the encrypted (or decrypted) result */779L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);780L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);781STORE(L,L0,L1,B);782PERM6464(L,L0,L1,B.b, (C_block *)CF6464);783#if defined(MUST_ALIGN)784STORE(L,L0,L1,B);785out[0] = B.b[0]; out[1] = B.b[1]; out[2] = B.b[2]; out[3] = B.b[3];786out[4] = B.b[4]; out[5] = B.b[5]; out[6] = B.b[6]; out[7] = B.b[7];787#else788STORE(L,L0,L1,*(C_block *)out);789#endif790return (0);791}792793/*794* "setkey" routine (for backwards compatibility)795*/796extern int setkey(register const char *key) {797register int i, j, k;798C_block keyblock;799800for (i = 0; i < 8; i++) {801k = 0;802for (j = 0; j < 8; j++) {803k <<= 1;804k |= (unsigned char)*key++;805}806keyblock.b[i] = k;807}808return (des_setkey((char *)keyblock.b));809}810811/*812* "encrypt" routine (for backwards compatibility)813*/814extern int encrypt(register char *block, int flag) {815register int i, j, k;816C_block cblock;817818for (i = 0; i < 8; i++) {819k = 0;820for (j = 0; j < 8; j++) {821k <<= 1;822k |= (unsigned char)*block++;823}824cblock.b[i] = k;825}826if (des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1: 1)))827return (1);828for (i = 7; i >= 0; i--) {829k = cblock.b[i];830for (j = 7; j >= 0; j--) {831*--block = k&01;832k >>= 1;833}834}835return (0);836}837838/*839* Return a pointer to static data consisting of the "setting"840* followed by an encryption produced by the "key" and "setting".841*/842extern char * crypt(register const char *key, register const char *setting) {843register char *encp;844register long i;845register int t;846long salt;847int num_iter, salt_size;848C_block keyblock, rsltblock;849850#ifdef HL_NOENCRYPTION851char buff[1024];852strncpy(buff, key, 1024);853buff[1023] = 0;854return buff;855#endif856857for (i = 0; i < 8; i++) {858if ((t = 2*(unsigned char)(*key)) != 0)859key++;860keyblock.b[i] = t;861}862if (des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */863return (NULL);864865encp = &cryptresult[0];866switch (*setting) {867case _PASSWORD_EFMT1:868/*869* Involve the rest of the password 8 characters at a time.870*/871while (*key) {872if (des_cipher((char *)&keyblock,873(char *)&keyblock, 0L, 1))874return (NULL);875for (i = 0; i < 8; i++) {876if ((t = 2*(unsigned char)(*key)) != 0)877key++;878keyblock.b[i] ^= t;879}880if (des_setkey((char *)keyblock.b))881return (NULL);882}883884*encp++ = *setting++;885886/* get iteration count */887num_iter = 0;888for (i = 4; --i >= 0; ) {889if ((t = (unsigned char)setting[i]) == '\0')890t = '.';891encp[i] = t;892num_iter = (num_iter<<6) | a64toi[t];893}894setting += 4;895encp += 4;896salt_size = 4;897break;898default:899num_iter = 25;900salt_size = 2;901}902903salt = 0;904for (i = salt_size; --i >= 0; ) {905if ((t = (unsigned char)setting[i]) == '\0')906t = '.';907encp[i] = t;908salt = (salt<<6) | a64toi[t];909}910encp += salt_size;911if (des_cipher((char *)&constdatablock, (char *)&rsltblock,912salt, num_iter))913return (NULL);914915/*916* Encode the 64 cipher bits as 11 ascii characters.917*/918i = ((long)((rsltblock.b[0]<<8) | rsltblock.b[1])<<8) | rsltblock.b[2];919encp[3] = itoa64[i&0x3f]; i >>= 6;920encp[2] = itoa64[i&0x3f]; i >>= 6;921encp[1] = itoa64[i&0x3f]; i >>= 6;922encp[0] = itoa64[i]; encp += 4;923i = ((long)((rsltblock.b[3]<<8) | rsltblock.b[4])<<8) | rsltblock.b[5];924encp[3] = itoa64[i&0x3f]; i >>= 6;925encp[2] = itoa64[i&0x3f]; i >>= 6;926encp[1] = itoa64[i&0x3f]; i >>= 6;927encp[0] = itoa64[i]; encp += 4;928i = ((long)((rsltblock.b[6])<<8) | rsltblock.b[7])<<2;929encp[2] = itoa64[i&0x3f]; i >>= 6;930encp[1] = itoa64[i&0x3f]; i >>= 6;931encp[0] = itoa64[i];932933encp[3] = 0;934935return (cryptresult);936}937938#ifdef DEBUG939STATIC940prtab(s, t, num_rows)941char *s;942unsigned char *t;943int num_rows;944{945register int i, j;946947(void)printf("%s:\n", s);948for (i = 0; i < num_rows; i++) {949for (j = 0; j < 8; j++) {950(void)printf("%3d", t[i*8+j]);951}952(void)printf("\n");953}954(void)printf("\n");955}956#endif957958#endif959960961