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