fe1ee3129de6157bbfa81c8cb6b050e0b6f99d50
[openafs.git] / src / des / crypt.c
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Tom Truscott.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *      This product includes software developed by the University of
19  *      California, Berkeley and its contributors.
20  * 4. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  */
36
37 #include <afsconfig.h>
38 #include <afs/param.h>
39
40 RCSID
41     ("$Header$");
42
43 #ifdef AFS_NT40_ENV
44 #include <windows.h>
45 #endif
46 #include <stdlib.h>
47 #ifdef HAVE_STRING_H
48 #include <string.h>
49 #else
50 #ifdef HAVE_STRINGS_H
51 #include <strings.h>
52 #endif
53 #endif
54
55 /*
56  * UNIX password, and DES, encryption.
57  * By Tom Truscott, trt@rti.rti.org,
58  * from algorithms by Robert W. Baldwin and James Gillogly.
59  *
60  * References:
61  * "Mathematical Cryptology for Computer Scientists and Mathematicians,"
62  * by Wayne Patterson, 1987, ISBN 0-8476-7438-X.
63  *
64  * "Password Security: A Case History," R. Morris and Ken Thompson,
65  * Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.
66  *
67  * "DES will be Totally Insecure within Ten Years," M.E. Hellman,
68  * IEEE Spectrum, vol. 16, pp. 32-39, July 1979.
69  */
70
71 /* =====  Configuration ==================== */
72
73 /*
74  * define "MUST_ALIGN" if your compiler cannot load/store
75  * long integers at arbitrary (e.g. odd) memory locations.
76  * (Either that or never pass unaligned addresses to des_cipher!)
77  */
78 #if !defined(vax)
79 #define MUST_ALIGN
80 #endif
81
82 #ifdef CHAR_BITS
83 #if CHAR_BITS != 8
84 #error C_block structure assumes 8 bit characters
85 #endif
86 #endif
87
88 /*
89  * define "LONG_IS_32_BITS" only if sizeof(long)==4.
90  * This avoids use of bit fields (your compiler may be sloppy with them).
91  */
92
93 /* XXX shouldn't this be !AFS_64BIT_ENV ? */
94 #if !defined(cray) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) && !defined(AFS_AMD64_LINUX20_ENV)
95 #define LONG_IS_32_BITS
96 #endif
97
98 /*
99  * define "B64" to be the declaration for a 64 bit integer.
100  * XXX this feature is currently unused, see "endian" comment below.
101  */
102 #if defined(cray)
103 #define B64     long
104 #endif
105 #if defined(convex)
106 #define B64     long long
107 #endif
108
109 /*
110  * define "LARGEDATA" to get faster permutations, by using about 72 kilobytes
111  * of lookup tables.  This speeds up des_setkey() and des_cipher(), but has
112  * little effect on crypt().
113  */
114 #if defined(notdef)
115 #define LARGEDATA
116 #endif
117
118 /* compile with "-DSTATIC=int" when profiling */
119 #ifndef STATIC
120 #define STATIC  static
121 #endif
122 STATIC void init_des();
123 STATIC void permute();
124 STATIC void init_perm();
125
126 STATIC int des_setkey(const char *key);
127 STATIC int des_cipher(const char *in, char *out, long salt, int num_iter);
128
129 #ifdef CRYPT_DEBUG
130 STATIC prtab();
131 #endif
132
133 /* ==================================== */
134
135 /*
136  * Cipher-block representation (Bob Baldwin):
137  *
138  * DES operates on groups of 64 bits, numbered 1..64 (sigh).  One
139  * representation is to store one bit per byte in an array of bytes.  Bit N of
140  * the NBS spec is stored as the LSB of the Nth byte (index N-1) in the array.
141  * Another representation stores the 64 bits in 8 bytes, with bits 1..8 in the
142  * first byte, 9..16 in the second, and so on.  The DES spec apparently has
143  * bit 1 in the MSB of the first byte, but that is particularly noxious so we
144  * bit-reverse each byte so that bit 1 is the LSB of the first byte, bit 8 is
145  * the MSB of the first byte.  Specifically, the 64-bit input data and key are
146  * converted to LSB format, and the output 64-bit block is converted back into
147  * MSB format.
148  *
149  * DES operates internally on groups of 32 bits which are expanded to 48 bits
150  * by permutation E and shrunk back to 32 bits by the S boxes.  To speed up
151  * the computation, the expansion is applied only once, the expanded
152  * representation is maintained during the encryption, and a compression
153  * permutation is applied only at the end.  To speed up the S-box lookups,
154  * the 48 bits are maintained as eight 6 bit groups, one per byte, which
155  * directly feed the eight S-boxes.  Within each byte, the 6 bits are the
156  * most significant ones.  The low two bits of each byte are zero.  (Thus,
157  * bit 1 of the 48 bit E expansion is stored as the "4"-valued bit of the
158  * first byte in the eight byte representation, bit 2 of the 48 bit value is
159  * the "8"-valued bit, and so on.)  In fact, a combined "SPE"-box lookup is
160  * used, in which the output is the 64 bit result of an S-box lookup which
161  * has been permuted by P and expanded by E, and is ready for use in the next
162  * iteration.  Two 32-bit wide tables, SPE[0] and SPE[1], are used for this
163  * lookup.  Since each byte in the 48 bit path is a multiple of four, indexed
164  * lookup of SPE[0] and SPE[1] is simple and fast.  The key schedule and
165  * "salt" are also converted to this 8*(6+2) format.  The SPE table size is
166  * 8*64*8 = 4K bytes.
167  *
168  * To speed up bit-parallel operations (such as XOR), the 8 byte
169  * representation is "union"ed with 32 bit values "i0" and "i1", and, on
170  * machines which support it, a 64 bit value "b64".  This data structure,
171  * "C_block", has two problems.  First, alignment restrictions must be
172  * honored.  Second, the byte-order (e.g. little-endian or big-endian) of
173  * the architecture becomes visible.
174  *
175  * The byte-order problem is unfortunate, since on the one hand it is good
176  * to have a machine-independent C_block representation (bits 1..8 in the
177  * first byte, etc.), and on the other hand it is good for the LSB of the
178  * first byte to be the LSB of i0.  We cannot have both these things, so we
179  * currently use the "little-endian" representation and avoid any multi-byte
180  * operations that depend on byte order.  This largely precludes use of the
181  * 64-bit datatype since the relative order of i0 and i1 are unknown.  It
182  * also inhibits grouping the SPE table to look up 12 bits at a time.  (The
183  * 12 bits can be stored in a 16-bit field with 3 low-order zeroes and 1
184  * high-order zero, providing fast indexing into a 64-bit wide SPE.)  On the
185  * other hand, 64-bit datatypes are currently rare, and a 12-bit SPE lookup
186  * requires a 128 kilobyte table, so perhaps this is not a big loss.
187  *
188  * Permutation representation (Jim Gillogly):
189  *
190  * A transformation is defined by its effect on each of the 8 bytes of the
191  * 64-bit input.  For each byte we give a 64-bit output that has the bits in
192  * the input distributed appropriately.  The transformation is then the OR
193  * of the 8 sets of 64-bits.  This uses 8*256*8 = 16K bytes of storage for
194  * each transformation.  Unless LARGEDATA is defined, however, a more compact
195  * table is used which looks up 16 4-bit "chunks" rather than 8 8-bit chunks.
196  * The smaller table uses 16*16*8 = 2K bytes for each transformation.  This
197  * is slower but tolerable, particularly for password encryption in which
198  * the SPE transformation is iterated many times.  The small tables total 9K
199  * bytes, the large tables total 72K bytes.
200  *
201  * The transformations used are:
202  * IE3264: MSB->LSB conversion, initial permutation, and expansion.
203  *      This is done by collecting the 32 even-numbered bits and applying
204  *      a 32->64 bit transformation, and then collecting the 32 odd-numbered
205  *      bits and applying the same transformation.  Since there are only
206  *      32 input bits, the IE3264 transformation table is half the size of
207  *      the usual table.
208  * CF6464: Compression, final permutation, and LSB->MSB conversion.
209  *      This is done by two trivial 48->32 bit compressions to obtain
210  *      a 64-bit block (the bit numbering is given in the "CIFP" table)
211  *      followed by a 64->64 bit "cleanup" transformation.  (It would
212  *      be possible to group the bits in the 64-bit block so that 2
213  *      identical 32->32 bit transformations could be used instead,
214  *      saving a factor of 4 in space and possibly 2 in time, but
215  *      byte-ordering and other complications rear their ugly head.
216  *      Similar opportunities/problems arise in the key schedule
217  *      transforms.)
218  * PC1ROT: MSB->LSB, PC1 permutation, rotate, and PC2 permutation.
219  *      This admittedly baroque 64->64 bit transformation is used to
220  *      produce the first code (in 8*(6+2) format) of the key schedule.
221  * PC2ROT[0]: Inverse PC2 permutation, rotate, and PC2 permutation.
222  *      It would be possible to define 15 more transformations, each
223  *      with a different rotation, to generate the entire key schedule.
224  *      To save space, however, we instead permute each code into the
225  *      next by using a transformation that "undoes" the PC2 permutation,
226  *      rotates the code, and then applies PC2.  Unfortunately, PC2
227  *      transforms 56 bits into 48 bits, dropping 8 bits, so PC2 is not
228  *      invertible.  We get around that problem by using a modified PC2
229  *      which retains the 8 otherwise-lost bits in the unused low-order
230  *      bits of each byte.  The low-order bits are cleared when the
231  *      codes are stored into the key schedule.
232  * PC2ROT[1]: Same as PC2ROT[0], but with two rotations.
233  *      This is faster than applying PC2ROT[0] twice,
234  *
235  * The Bell Labs "salt" (Bob Baldwin):
236  *
237  * The salting is a simple permutation applied to the 48-bit result of E.
238  * Specifically, if bit i (1 <= i <= 24) of the salt is set then bits i and
239  * i+24 of the result are swapped.  The salt is thus a 24 bit number, with
240  * 16777216 possible values.  (The original salt was 12 bits and could not
241  * swap bits 13..24 with 36..48.)
242  *
243  * It is possible, but ugly, to warp the SPE table to account for the salt
244  * permutation.  Fortunately, the conditional bit swapping requires only
245  * about four machine instructions and can be done on-the-fly with about an
246  * 8% performance penalty.
247  */
248
249 typedef union {
250     unsigned char b[8];
251     struct {
252 #if defined(LONG_IS_32_BITS)
253         /* long is often faster than a 32-bit bit field */
254         long i0;
255         long i1;
256 #else
257         long i0:32;
258         long i1:32;
259 #endif
260     } b32;
261 #if defined(B64)
262     B64 b64;
263 #endif
264 } C_block;
265
266 /*
267  * Convert twenty-four-bit long in host-order
268  * to six bits (and 2 low-order zeroes) per char little-endian format.
269  */
270 #define TO_SIX_BIT(rslt, src) {                                         \
271                 C_block cvt;                                            \
272                 cvt.b[0] = (unsigned char) src; src >>= 6;              \
273                 cvt.b[1] = (unsigned char) src; src >>= 6;              \
274                 cvt.b[2] = (unsigned char) src; src >>= 6;              \
275                 cvt.b[3] = (unsigned char) src;                         \
276                 rslt = (cvt.b32.i0 & 0x3f3f3f3fL) << 2;                 \
277         }
278
279 /*
280  * These macros may someday permit efficient use of 64-bit integers.
281  */
282 #define ZERO(d,d0,d1)                   d0 = 0, d1 = 0
283 #define LOAD(d,d0,d1,bl)                d0 = (bl).b32.i0, d1 = (bl).b32.i1
284 #define LOADREG(d,d0,d1,s,s0,s1)        d0 = s0, d1 = s1
285 #define OR(d,d0,d1,bl)                  d0 |= (bl).b32.i0, d1 |= (bl).b32.i1
286 #define STORE(s,s0,s1,bl)               (bl).b32.i0 = s0, (bl).b32.i1 = s1
287 #define DCL_BLOCK(d,d0,d1)              long d0, d1
288
289 #if defined(LARGEDATA)
290         /* Waste memory like crazy.  Also, do permutations in line */
291 #define LGCHUNKBITS     3
292 #define CHUNKBITS       (1<<LGCHUNKBITS)
293 #define PERM6464(d,d0,d1,cpp,p)                         \
294         LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);             \
295         OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);              \
296         OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);              \
297         OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);              \
298         OR (d,d0,d1,(p)[(4<<CHUNKBITS)+(cpp)[4]]);              \
299         OR (d,d0,d1,(p)[(5<<CHUNKBITS)+(cpp)[5]]);              \
300         OR (d,d0,d1,(p)[(6<<CHUNKBITS)+(cpp)[6]]);              \
301         OR (d,d0,d1,(p)[(7<<CHUNKBITS)+(cpp)[7]]);
302 #define PERM3264(d,d0,d1,cpp,p)                         \
303         LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);             \
304         OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);              \
305         OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);              \
306         OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);
307 #else
308         /* "small data" */
309 #define LGCHUNKBITS     2
310 #define CHUNKBITS       (1<<LGCHUNKBITS)
311 #define PERM6464(d,d0,d1,cpp,p)                         \
312         { C_block tblk; permute(cpp,&tblk,p,8); LOAD (d,d0,d1,tblk); }
313 #define PERM3264(d,d0,d1,cpp,p)                         \
314         { C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }
315
316 STATIC void
317 permute(cp, out, p, chars_in)
318      unsigned char *cp;
319      C_block *out;
320      register C_block *p;
321      int chars_in;
322 {
323     register DCL_BLOCK(D, D0, D1);
324     register C_block *tp;
325     register int t;
326
327     ZERO(D, D0, D1);
328     do {
329         t = *cp++;
330         tp = &p[t & 0xf];
331         OR(D, D0, D1, *tp);
332         p += (1 << CHUNKBITS);
333         tp = &p[t >> 4];
334         OR(D, D0, D1, *tp);
335         p += (1 << CHUNKBITS);
336     } while (--chars_in > 0);
337     STORE(D, D0, D1, *out);
338 }
339 #endif /* LARGEDATA */
340
341
342 /* =====  (mostly) Standard DES Tables ==================== */
343
344 static unsigned char IP[] = {   /* initial permutation */
345     58, 50, 42, 34, 26, 18, 10, 2,
346     60, 52, 44, 36, 28, 20, 12, 4,
347     62, 54, 46, 38, 30, 22, 14, 6,
348     64, 56, 48, 40, 32, 24, 16, 8,
349     57, 49, 41, 33, 25, 17, 9, 1,
350     59, 51, 43, 35, 27, 19, 11, 3,
351     61, 53, 45, 37, 29, 21, 13, 5,
352     63, 55, 47, 39, 31, 23, 15, 7,
353 };
354
355 /* The final permutation is the inverse of IP - no table is necessary */
356
357 static unsigned char ExpandTr[] = {     /* expansion operation */
358     32, 1, 2, 3, 4, 5,
359     4, 5, 6, 7, 8, 9,
360     8, 9, 10, 11, 12, 13,
361     12, 13, 14, 15, 16, 17,
362     16, 17, 18, 19, 20, 21,
363     20, 21, 22, 23, 24, 25,
364     24, 25, 26, 27, 28, 29,
365     28, 29, 30, 31, 32, 1,
366 };
367
368 static unsigned char PC1[] = {  /* permuted choice table 1 */
369     57, 49, 41, 33, 25, 17, 9,
370     1, 58, 50, 42, 34, 26, 18,
371     10, 2, 59, 51, 43, 35, 27,
372     19, 11, 3, 60, 52, 44, 36,
373
374     63, 55, 47, 39, 31, 23, 15,
375     7, 62, 54, 46, 38, 30, 22,
376     14, 6, 61, 53, 45, 37, 29,
377     21, 13, 5, 28, 20, 12, 4,
378 };
379
380 static unsigned char Rotates[] = {      /* PC1 rotation schedule */
381     1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
382 };
383
384 /* note: each "row" of PC2 is left-padded with bits that make it invertible */
385 static unsigned char PC2[] = {  /* permuted choice table 2 */
386     9, 18, 14, 17, 11, 24, 1, 5,
387     22, 25, 3, 28, 15, 6, 21, 10,
388     35, 38, 23, 19, 12, 4, 26, 8,
389     43, 54, 16, 7, 27, 20, 13, 2,
390
391     0, 0, 41, 52, 31, 37, 47, 55,
392     0, 0, 30, 40, 51, 45, 33, 48,
393     0, 0, 44, 49, 39, 56, 34, 53,
394     0, 0, 46, 42, 50, 36, 29, 32,
395 };
396
397 static unsigned char S[8][64] = {       /* 48->32 bit substitution tables */
398     /* S[1]                 */
399     {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
400      0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
401      4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
402      15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,},
403     /* S[2]                 */
404     {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
405      3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
406      0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
407      13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,},
408     /* S[3]                 */
409     {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
410      13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
411      13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
412      1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,},
413     /* S[4]                 */
414     {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
415      13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
416      10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
417      3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,},
418     /* S[5]                 */
419     {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
420      14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
421      4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
422      11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,},
423     /* S[6]                 */
424     {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
425      10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
426      9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
427      4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,},
428     /* S[7]                 */
429     {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
430      13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
431      1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
432      6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,},
433     /* S[8]                 */
434     {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
435      1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
436      7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
437      2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,}
438 };
439
440 static unsigned char P32Tr[] = {        /* 32-bit permutation function */
441     16, 7, 20, 21,
442     29, 12, 28, 17,
443     1, 15, 23, 26,
444     5, 18, 31, 10,
445     2, 8, 24, 14,
446     32, 27, 3, 9,
447     19, 13, 30, 6,
448     22, 11, 4, 25,
449 };
450
451 static unsigned char CIFP[] = { /* compressed/interleaved permutation */
452     1, 2, 3, 4, 17, 18, 19, 20,
453     5, 6, 7, 8, 21, 22, 23, 24,
454     9, 10, 11, 12, 25, 26, 27, 28,
455     13, 14, 15, 16, 29, 30, 31, 32,
456
457     33, 34, 35, 36, 49, 50, 51, 52,
458     37, 38, 39, 40, 53, 54, 55, 56,
459     41, 42, 43, 44, 57, 58, 59, 60,
460     45, 46, 47, 48, 61, 62, 63, 64,
461 };
462
463 static unsigned char itoa64[] = /* 0..63 => ascii-64 */
464     "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
465
466
467 /* =====  Tables that are initialized at run time  ==================== */
468
469
470 static unsigned char a64toi[128];       /* ascii-64 => 0..63 */
471
472 /* Initial key schedule permutation */
473 static C_block PC1ROT[64 / CHUNKBITS][1 << CHUNKBITS];
474
475 /* Subsequent key schedule rotation permutations */
476 static C_block PC2ROT[2][64 / CHUNKBITS][1 << CHUNKBITS];
477
478 /* Initial permutation/expansion table */
479 static C_block IE3264[32 / CHUNKBITS][1 << CHUNKBITS];
480
481 /* Table that combines the S, P, and E operations.  */
482 static long SPE[2][8][64];
483
484 /* compressed/interleaved => final permutation table */
485 static C_block CF6464[64 / CHUNKBITS][1 << CHUNKBITS];
486
487
488 /* ==================================== */
489
490
491 static C_block constdatablock;  /* encryption constant */
492 static char cryptresult[1 + 4 + 4 + 11 + 1];    /* encrypted result */
493
494 /*
495  * Return a pointer to static data consisting of the "setting"
496  * followed by an encryption produced by the "key" and "setting".
497  */
498 char *
499 crypt(key, setting)
500      register const char *key;
501      register const char *setting;
502 {
503     register char *encp;
504     register long i;
505     register int t;
506     long salt;
507     int num_iter, salt_size;
508     C_block keyblock, rsltblock;
509
510
511     for (i = 0; i < 8; i++) {
512         if ((t = 2 * (unsigned char)(*key)) != 0)
513             key++;
514         keyblock.b[i] = t;
515     }
516     if (des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */
517         return (NULL);
518
519     encp = &cryptresult[0];
520     switch (*setting) {
521     case '_':                   /* was EFMT1 */
522         /*
523          * Involve the rest of the password 8 characters at a time.
524          */
525         while (*key) {
526             if (des_cipher((char *)&keyblock, (char *)&keyblock, 0L, 1))
527                 return (NULL);
528             for (i = 0; i < 8; i++) {
529                 if ((t = 2 * (unsigned char)(*key)) != 0)
530                     key++;
531                 keyblock.b[i] ^= t;
532             }
533             if (des_setkey((char *)keyblock.b))
534                 return (NULL);
535         }
536
537         *encp++ = *setting++;
538
539         /* get iteration count */
540         num_iter = 0;
541         for (i = 4; --i >= 0;) {
542             if ((t = (unsigned char)setting[i]) == '\0')
543                 t = '.';
544             encp[i] = t;
545             num_iter = (num_iter << 6) | a64toi[t];
546         }
547         setting += 4;
548         encp += 4;
549         salt_size = 4;
550         break;
551     default:
552         num_iter = 25;
553         salt_size = 2;
554     }
555
556     salt = 0;
557     for (i = salt_size; --i >= 0;) {
558         if ((t = (unsigned char)setting[i]) == '\0')
559             t = '.';
560         encp[i] = t;
561         salt = (salt << 6) | a64toi[t];
562     }
563     encp += salt_size;
564     if (des_cipher
565         ((char *)&constdatablock, (char *)&rsltblock, salt, num_iter))
566         return (NULL);
567
568     /*
569      * Encode the 64 cipher bits as 11 ascii characters.
570      */
571     i = ((long)((rsltblock.b[0] << 8) | rsltblock.b[1]) << 8) | rsltblock.
572         b[2];
573     encp[3] = itoa64[i & 0x3f];
574     i >>= 6;
575     encp[2] = itoa64[i & 0x3f];
576     i >>= 6;
577     encp[1] = itoa64[i & 0x3f];
578     i >>= 6;
579     encp[0] = itoa64[i];
580     encp += 4;
581     i = ((long)((rsltblock.b[3] << 8) | rsltblock.b[4]) << 8) | rsltblock.
582         b[5];
583     encp[3] = itoa64[i & 0x3f];
584     i >>= 6;
585     encp[2] = itoa64[i & 0x3f];
586     i >>= 6;
587     encp[1] = itoa64[i & 0x3f];
588     i >>= 6;
589     encp[0] = itoa64[i];
590     encp += 4;
591     i = ((long)((rsltblock.b[6]) << 8) | rsltblock.b[7]) << 2;
592     encp[2] = itoa64[i & 0x3f];
593     i >>= 6;
594     encp[1] = itoa64[i & 0x3f];
595     i >>= 6;
596     encp[0] = itoa64[i];
597
598     encp[3] = 0;
599
600     return (cryptresult);
601 }
602
603
604 /*
605  * The Key Schedule, filled in by des_setkey() or setkey().
606  */
607 #define KS_SIZE 16
608 static C_block KS[KS_SIZE];
609
610 /*
611  * Set up the key schedule from the key.
612  */
613 STATIC int
614 des_setkey(key)
615      register const char *key;
616 {
617     register DCL_BLOCK(K, K0, K1);
618     register C_block *ptabp;
619     register int i;
620     static int des_ready = 0;
621
622     if (!des_ready) {
623         init_des();
624         des_ready = 1;
625     }
626
627     PERM6464(K, K0, K1, (unsigned char *)key, (C_block *) PC1ROT);
628     key = (char *)&KS[0];
629     STORE(K & ~0x03030303L, K0 & ~0x03030303L, K1, *(C_block *) key);
630     for (i = 1; i < 16; i++) {
631         key += sizeof(C_block);
632         STORE(K, K0, K1, *(C_block *) key);
633         ptabp = (C_block *) PC2ROT[Rotates[i] - 1];
634         PERM6464(K, K0, K1, (unsigned char *)key, ptabp);
635         STORE(K & ~0x03030303L, K0 & ~0x03030303L, K1, *(C_block *) key);
636     }
637     return (0);
638 }
639
640 /*
641  * Encrypt (or decrypt if num_iter < 0) the 8 chars at "in" with abs(num_iter)
642  * iterations of DES, using the the given 24-bit salt and the pre-computed key
643  * schedule, and store the resulting 8 chars at "out" (in == out is permitted).
644  *
645  * NOTE: the performance of this routine is critically dependent on your
646  * compiler and machine architecture.
647  */
648 STATIC int
649 des_cipher(in, out, salt, num_iter)
650      const char *in;
651      char *out;
652      long salt;
653      int num_iter;
654 {
655     /* variables that we want in registers, most important first */
656 #if defined(pdp11)
657     register int j;
658 #endif
659     register long L0, L1, R0, R1, k;
660     register C_block *kp;
661     register int ks_inc, loop_count;
662     C_block B;
663
664     L0 = salt;
665     TO_SIX_BIT(salt, L0);       /* convert to 4*(6+2) format */
666
667 #if defined(vax) || defined(pdp11)
668     salt = ~salt;               /* "x &~ y" is faster than "x & y". */
669 #define SALT (~salt)
670 #else
671 #define SALT salt
672 #endif
673
674 #if defined(MUST_ALIGN)
675     B.b[0] = in[0];
676     B.b[1] = in[1];
677     B.b[2] = in[2];
678     B.b[3] = in[3];
679     B.b[4] = in[4];
680     B.b[5] = in[5];
681     B.b[6] = in[6];
682     B.b[7] = in[7];
683     LOAD(L, L0, L1, B);
684 #else
685     LOAD(L, L0, L1, *(C_block *) in);
686 #endif
687     LOADREG(R, R0, R1, L, L0, L1);
688     L0 &= 0x55555555L;
689     L1 &= 0x55555555L;
690     L0 = (L0 << 1) | L1;        /* L0 is the even-numbered input bits */
691     R0 &= 0xaaaaaaaaL;
692     R1 = (R1 >> 1) & 0x55555555L;
693     L1 = R0 | R1;               /* L1 is the odd-numbered input bits */
694     STORE(L, L0, L1, B);
695     PERM3264(L, L0, L1, B.b, (C_block *) IE3264);       /* even bits */
696     PERM3264(R, R0, R1, B.b + 4, (C_block *) IE3264);   /* odd bits */
697
698     if (num_iter >= 0) {        /* encryption */
699         kp = &KS[0];
700         ks_inc = sizeof(*kp);
701     } else {                    /* decryption */
702         num_iter = -num_iter;
703         kp = &KS[KS_SIZE - 1];
704         ks_inc = -((long)sizeof(*kp));
705     }
706
707     while (--num_iter >= 0) {
708         loop_count = 8;
709         do {
710
711 #define SPTAB(t, i)     (*(long *)((unsigned char *)t + i*(sizeof(long)/4)))
712 #if defined(gould)
713             /* use this if B.b[i] is evaluated just once ... */
714 #define DOXOR(x,y,i)    x^=SPTAB(SPE[0][i],B.b[i]); y^=SPTAB(SPE[1][i],B.b[i]);
715 #else
716 #if defined(pdp11)
717             /* use this if your "long" int indexing is slow */
718 #define DOXOR(x,y,i)    j=B.b[i]; x^=SPTAB(SPE[0][i],j); y^=SPTAB(SPE[1][i],j);
719 #else
720             /* use this if "k" is allocated to a register ... */
721 #define DOXOR(x,y,i)    k=B.b[i]; x^=SPTAB(SPE[0][i],k); y^=SPTAB(SPE[1][i],k);
722 #endif
723 #endif
724
725 #define CRUNCH(p0, p1, q0, q1)  \
726                         k = (q0 ^ q1) & SALT;   \
727                         B.b32.i0 = k ^ q0 ^ kp->b32.i0;         \
728                         B.b32.i1 = k ^ q1 ^ kp->b32.i1;         \
729                         kp = (C_block *)((char *)kp+ks_inc);    \
730                                                         \
731                         DOXOR(p0, p1, 0);               \
732                         DOXOR(p0, p1, 1);               \
733                         DOXOR(p0, p1, 2);               \
734                         DOXOR(p0, p1, 3);               \
735                         DOXOR(p0, p1, 4);               \
736                         DOXOR(p0, p1, 5);               \
737                         DOXOR(p0, p1, 6);               \
738                         DOXOR(p0, p1, 7);
739
740             CRUNCH(L0, L1, R0, R1);
741             CRUNCH(R0, R1, L0, L1);
742         } while (--loop_count != 0);
743         kp = (C_block *) ((char *)kp - (ks_inc * KS_SIZE));
744
745
746         /* swap L and R */
747         L0 ^= R0;
748         L1 ^= R1;
749         R0 ^= L0;
750         R1 ^= L1;
751         L0 ^= R0;
752         L1 ^= R1;
753     }
754
755     /* store the encrypted (or decrypted) result */
756     L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);
757     L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);
758     STORE(L, L0, L1, B);
759     PERM6464(L, L0, L1, B.b, (C_block *) CF6464);
760 #if defined(MUST_ALIGN)
761     STORE(L, L0, L1, B);
762     out[0] = B.b[0];
763     out[1] = B.b[1];
764     out[2] = B.b[2];
765     out[3] = B.b[3];
766     out[4] = B.b[4];
767     out[5] = B.b[5];
768     out[6] = B.b[6];
769     out[7] = B.b[7];
770 #else
771     STORE(L, L0, L1, *(C_block *) out);
772 #endif
773     return (0);
774 }
775
776
777 /*
778  * Initialize various tables.  This need only be done once.  It could even be
779  * done at compile time, if the compiler were capable of that sort of thing.
780  */
781 STATIC void
782 init_des()
783 {
784     register int i, j;
785     register long k;
786     register int tableno;
787     static unsigned char perm[64], tmp32[32];   /* "static" for speed */
788
789     /*
790      * table that converts chars "./0-9A-Za-z"to integers 0-63.
791      */
792     for (i = 0; i < 64; i++)
793         a64toi[itoa64[i]] = i;
794
795     /*
796      * PC1ROT - bit reverse, then PC1, then Rotate, then PC2.
797      */
798     for (i = 0; i < 64; i++)
799         perm[i] = 0;
800     for (i = 0; i < 64; i++) {
801         if ((k = PC2[i]) == 0)
802             continue;
803         k += Rotates[0] - 1;
804         if ((k % 28) < Rotates[0])
805             k -= 28;
806         k = PC1[k];
807         if (k > 0) {
808             k--;
809             k = (k | 07) - (k & 07);
810             k++;
811         }
812         perm[i] = (unsigned char)k;
813     }
814 #ifdef CRYPT_DEBUG
815     prtab("pc1tab", perm, 8);
816 #endif
817     init_perm(PC1ROT, perm, 8, 8);
818
819     /*
820      * PC2ROT - PC2 inverse, then Rotate (once or twice), then PC2.
821      */
822     for (j = 0; j < 2; j++) {
823         unsigned char pc2inv[64];
824         for (i = 0; i < 64; i++)
825             perm[i] = pc2inv[i] = 0;
826         for (i = 0; i < 64; i++) {
827             if ((k = PC2[i]) == 0)
828                 continue;
829             pc2inv[k - 1] = i + 1;
830         }
831         for (i = 0; i < 64; i++) {
832             if ((k = PC2[i]) == 0)
833                 continue;
834             k += j;
835             if ((k % 28) <= j)
836                 k -= 28;
837             perm[i] = pc2inv[k];
838         }
839 #ifdef CRYPT_DEBUG
840         prtab("pc2tab", perm, 8);
841 #endif
842         init_perm(PC2ROT[j], perm, 8, 8);
843     }
844
845     /*
846      * Bit reverse, then initial permutation, then expansion.
847      */
848     for (i = 0; i < 8; i++) {
849         for (j = 0; j < 8; j++) {
850             k = (j < 2) ? 0 : IP[ExpandTr[i * 6 + j - 2] - 1];
851             if (k > 32)
852                 k -= 32;
853             else if (k > 0)
854                 k--;
855             if (k > 0) {
856                 k--;
857                 k = (k | 07) - (k & 07);
858                 k++;
859             }
860             perm[i * 8 + j] = (unsigned char)k;
861         }
862     }
863 #ifdef CRYPT_DEBUG
864     prtab("ietab", perm, 8);
865 #endif
866     init_perm(IE3264, perm, 4, 8);
867
868     /*
869      * Compression, then final permutation, then bit reverse.
870      */
871     for (i = 0; i < 64; i++) {
872         k = IP[CIFP[i] - 1];
873         if (k > 0) {
874             k--;
875             k = (k | 07) - (k & 07);
876             k++;
877         }
878         perm[k - 1] = i + 1;
879     }
880 #ifdef CRYPT_DEBUG
881     prtab("cftab", perm, 8);
882 #endif
883     init_perm(CF6464, perm, 8, 8);
884
885     /*
886      * SPE table
887      */
888     for (i = 0; i < 48; i++)
889         perm[i] = P32Tr[ExpandTr[i] - 1];
890     for (tableno = 0; tableno < 8; tableno++) {
891         for (j = 0; j < 64; j++) {
892             k = (((j >> 0) & 01) << 5) | (((j >> 1) & 01) << 3) |
893                 (((j >> 2) & 01) << 2) | (((j >> 3) & 01) << 1) |
894                 (((j >> 4) & 01) << 0) | (((j >> 5) & 01) << 4);
895             k = S[tableno][k];
896             k = (((k >> 3) & 01) << 0) | (((k >> 2) & 01) << 1) |
897                 (((k >> 1) & 01) << 2) | (((k >> 0) & 01) << 3);
898             for (i = 0; i < 32; i++)
899                 tmp32[i] = 0;
900             for (i = 0; i < 4; i++)
901                 tmp32[4 * tableno + i] = (k >> i) & 01;
902             k = 0;
903             for (i = 24; --i >= 0;)
904                 k = (k << 1) | tmp32[perm[i] - 1];
905             TO_SIX_BIT(SPE[0][tableno][j], k);
906             k = 0;
907             for (i = 24; --i >= 0;)
908                 k = (k << 1) | tmp32[perm[i + 24] - 1];
909             TO_SIX_BIT(SPE[1][tableno][j], k);
910         }
911     }
912 }
913
914 /*
915  * Initialize "perm" to represent transformation "p", which rearranges
916  * (perhaps with expansion and/or contraction) one packed array of bits
917  * (of size "chars_in" characters) into another array (of size "chars_out"
918  * characters).
919  *
920  * "perm" must be all-zeroes on entry to this routine.
921  */
922 STATIC void
923 init_perm(perm, p, chars_in, chars_out)
924      C_block perm[64 / CHUNKBITS][1 << CHUNKBITS];
925      unsigned char p[64];
926      int chars_in, chars_out;
927 {
928     register int i, j, k, l;
929
930     for (k = 0; k < chars_out * 8; k++) {       /* each output bit position */
931         l = p[k] - 1;           /* where this bit comes from */
932         if (l < 0)
933             continue;           /* output bit is always 0 */
934         i = l >> LGCHUNKBITS;   /* which chunk this bit comes from */
935         l = 1 << (l & (CHUNKBITS - 1)); /* mask for this bit */
936         for (j = 0; j < (1 << CHUNKBITS); j++) {        /* each chunk value */
937             if ((j & l) != 0)
938                 perm[i][j].b[k >> 3] |= 1 << (k & 07);
939         }
940     }
941 }
942
943 /*
944  * "setkey" routine (for backwards compatibility)
945  */
946 #if 0                           /* static and doesn't appear to be referenced */
947 STATIC int
948 setkey(key)
949      register const char *key;
950 {
951     register int i, j, k;
952     C_block keyblock;
953
954     for (i = 0; i < 8; i++) {
955         k = 0;
956         for (j = 0; j < 8; j++) {
957             k <<= 1;
958             k |= (unsigned char)*key++;
959         }
960         keyblock.b[i] = k;
961     }
962     return (des_setkey((char *)keyblock.b));
963 }
964 #endif
965
966 /*
967  * "encrypt" routine (for backwards compatibility)
968  */
969 int
970 encrypt(block, flag)
971      register char *block;
972      int flag;
973 {
974     register int i, j, k;
975     C_block cblock;
976
977     for (i = 0; i < 8; i++) {
978         k = 0;
979         for (j = 0; j < 8; j++) {
980             k <<= 1;
981             k |= (unsigned char)*block++;
982         }
983         cblock.b[i] = k;
984     }
985     if (des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1 : 1)))
986         return (1);
987     for (i = 7; i >= 0; i--) {
988         k = cblock.b[i];
989         for (j = 7; j >= 0; j--) {
990             *--block = k & 01;
991             k >>= 1;
992         }
993     }
994     return (0);
995 }
996
997 #ifdef CRYPT_DEBUG
998 STATIC
999 prtab(s, t, num_rows)
1000      char *s;
1001      unsigned char *t;
1002      int num_rows;
1003 {
1004     register int i, j;
1005
1006     (void)printf("%s:\n", s);
1007     for (i = 0; i < num_rows; i++) {
1008         for (j = 0; j < 8; j++) {
1009             (void)printf("%3d", t[i * 8 + j]);
1010         }
1011         (void)printf("\n");
1012     }
1013     (void)printf("\n");
1014 }
1015 #endif