~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/port/crypt.c

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

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