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