]> Git Repo - uclibc-ng.git/blame - libcrypt/des.c
tmp
[uclibc-ng.git] / libcrypt / des.c
CommitLineData
08012e24 1/*
cf0a78c8 2 * FreeSec: libcrypt for NetBSD
08012e24 3 *
3e87ecb2
EA
4 * Copyright (c) 1994 David Burren
5 * All rights reserved.
08012e24 6 *
cf0a78c8
EA
7 * Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet
8 * this file should now *only* export crypt(), in order to make
9 * binaries of libcrypt exportable from the USA
10 *
11 * Adapted for FreeBSD-4.0 by Mark R V Murray
12 * this file should now *only* export crypt_des(), in order to make
13 * a module that can be optionally included in libcrypt.
14 *
3e87ecb2
EA
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
cf0a78c8 23 * 3. Neither the name of the author nor the names of other contributors
3e87ecb2
EA
24 * may be used to endorse or promote products derived from this software
25 * without specific prior written permission.
08012e24 26 *
3e87ecb2
EA
27 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
08012e24 38 *
3e87ecb2
EA
39 * This is an original implementation of the DES and the crypt(3) interfaces
40 * by David Burren <[email protected]>.
08012e24 41 *
3e87ecb2
EA
42 * An excellent reference on the underlying algorithm (and related
43 * algorithms) is:
44 *
45 * B. Schneier, Applied Cryptography: protocols, algorithms,
46 * and source code in C, John Wiley & Sons, 1994.
aa4ceea1 47 *
3e87ecb2
EA
48 * Note that in that book's description of DES the lookups for the initial,
49 * pbox, and final permutations are inverted (this has been brought to the
50 * attention of the author). A list of errata for this book has been
51 * posted to the sci.crypt newsgroup by the author and is available for FTP.
aa4ceea1 52 *
cf0a78c8
EA
53 * ARCHITECTURE ASSUMPTIONS:
54 * It is assumed that the 8-byte arrays passed by reference can be
55 * addressed as arrays of u_int32_t's (ie. the CPU is not picky about
56 * alignment).
aa4ceea1
EA
57 */
58
3e87ecb2
EA
59#include <sys/cdefs.h>
60#include <sys/types.h>
61#include <sys/param.h>
62#include <netinet/in.h>
63#include <pwd.h>
2f98c425 64#include <string.h>
08012e24 65#include <crypt.h>
8d9ff89b 66#include "libcrypt.h"
08012e24 67
212bd82f
BS
68/* Re-entrantify me -- all this junk needs to be in
69 * struct crypt_data to make this really reentrant... */
70static u_char inv_key_perm[64];
71static u_char inv_comp_perm[56];
72static u_char un_pbox[32];
73static u_int32_t en_keysl[16], en_keysr[16];
74static u_int32_t de_keysl[16], de_keysr[16];
75static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
76static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
77static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
78static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
79static u_int32_t saltbits;
80static u_int32_t old_salt;
81static u_int32_t old_rawkey0, old_rawkey1;
82
3a4b78aa 83
1f020b17
BRF
84/* Static stuff that stays resident and doesn't change after
85 * being initialized, and therefore doesn't need to be made
3a4b78aa 86 * reentrant. */
212bd82f
BS
87static u_char init_perm[64], final_perm[64];
88static u_char m_sbox[4][4096];
89static u_int32_t psbox[4][256];
90
91
3a4b78aa 92
3e87ecb2 93
3a4b78aa
EA
94/* A pile of data */
95static const u_char ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
96
97static const u_char IP[64] = {
3e87ecb2
EA
98 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
99 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
100 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
101 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
08012e24
EA
102};
103
3a4b78aa 104static const u_char key_perm[56] = {
3e87ecb2
EA
105 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
106 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
107 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
108 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
08012e24
EA
109};
110
3a4b78aa 111static const u_char key_shifts[16] = {
3e87ecb2
EA
112 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
113};
114
3a4b78aa 115static const u_char comp_perm[48] = {
3e87ecb2
EA
116 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
117 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
118 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
119 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
120};
08012e24 121
3e87ecb2
EA
122/*
123 * No E box is used, as it's replaced by some ANDs, shifts, and ORs.
124 */
08012e24 125
3a4b78aa 126static const u_char sbox[8][64] = {
3e87ecb2
EA
127 {
128 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
129 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
130 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
131 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
132 },
133 {
134 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
135 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
136 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
137 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
138 },
139 {
140 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
141 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
142 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
143 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
144 },
145 {
146 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
147 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
148 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
149 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
150 },
151 {
152 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
153 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
154 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
155 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
156 },
157 {
158 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
159 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
160 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
161 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
162 },
163 {
164 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
165 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
166 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
167 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
168 },
169 {
170 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
171 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
172 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
173 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
aa4ceea1 174 }
3e87ecb2
EA
175};
176
3a4b78aa 177static const u_char pbox[32] = {
3e87ecb2
EA
178 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
179 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
180};
08012e24 181
3a4b78aa 182static const u_int32_t bits32[32] =
aa4ceea1 183{
3e87ecb2
EA
184 0x80000000, 0x40000000, 0x20000000, 0x10000000,
185 0x08000000, 0x04000000, 0x02000000, 0x01000000,
186 0x00800000, 0x00400000, 0x00200000, 0x00100000,
187 0x00080000, 0x00040000, 0x00020000, 0x00010000,
188 0x00008000, 0x00004000, 0x00002000, 0x00001000,
189 0x00000800, 0x00000400, 0x00000200, 0x00000100,
190 0x00000080, 0x00000040, 0x00000020, 0x00000010,
191 0x00000008, 0x00000004, 0x00000002, 0x00000001
192};
08012e24 193
3a4b78aa 194static const u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
3a4b78aa 195
3e87ecb2 196
1f020b17 197static int
cf0a78c8 198ascii_to_bin(char ch)
3e87ecb2
EA
199{
200 if (ch > 'z')
201 return(0);
202 if (ch >= 'a')
203 return(ch - 'a' + 38);
204 if (ch > 'Z')
205 return(0);
206 if (ch >= 'A')
207 return(ch - 'A' + 12);
208 if (ch > '9')
209 return(0);
210 if (ch >= '.')
211 return(ch - '.');
212 return(0);
aa4ceea1 213}
08012e24 214
cf0a78c8
EA
215static void
216des_init(void)
08012e24 217{
212bd82f
BS
218 static int des_initialised = 0;
219
3e87ecb2
EA
220 int i, j, b, k, inbit, obit;
221 u_int32_t *p, *il, *ir, *fl, *fr;
373fe15a
DV
222 const u_int32_t *bits28, *bits24;
223 u_char u_sbox[8][64];
3a4b78aa 224
212bd82f 225 if (des_initialised==1)
373fe15a 226 return;
3e87ecb2 227
cf0a78c8
EA
228 old_rawkey0 = old_rawkey1 = 0L;
229 saltbits = 0L;
230 old_salt = 0L;
3e87ecb2
EA
231 bits24 = (bits28 = bits32 + 4) + 4;
232
233 /*
234 * Invert the S-boxes, reordering the input bits.
235 */
236 for (i = 0; i < 8; i++)
237 for (j = 0; j < 64; j++) {
238 b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
239 u_sbox[i][j] = sbox[i][b];
240 }
241
242 /*
243 * Convert the inverted S-boxes into 4 arrays of 8 bits.
244 * Each will handle 12 bits of the S-box input.
245 */
246 for (b = 0; b < 4; b++)
247 for (i = 0; i < 64; i++)
248 for (j = 0; j < 64; j++)
249 m_sbox[b][(i << 6) | j] =
cf0a78c8
EA
250 (u_char)((u_sbox[(b << 1)][i] << 4) |
251 u_sbox[(b << 1) + 1][j]);
3e87ecb2
EA
252
253 /*
254 * Set up the initial & final permutations into a useful form, and
255 * initialise the inverted key permutation.
256 */
257 for (i = 0; i < 64; i++) {
cf0a78c8 258 init_perm[final_perm[i] = IP[i] - 1] = (u_char)i;
3e87ecb2 259 inv_key_perm[i] = 255;
aa4ceea1 260 }
aa4ceea1 261
3e87ecb2
EA
262 /*
263 * Invert the key permutation and initialise the inverted key
264 * compression permutation.
265 */
266 for (i = 0; i < 56; i++) {
cf0a78c8 267 inv_key_perm[key_perm[i] - 1] = (u_char)i;
3e87ecb2
EA
268 inv_comp_perm[i] = 255;
269 }
aa4ceea1 270
3e87ecb2
EA
271 /*
272 * Invert the key compression permutation.
273 */
274 for (i = 0; i < 48; i++) {
cf0a78c8 275 inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
3e87ecb2 276 }
aa4ceea1 277
3e87ecb2
EA
278 /*
279 * Set up the OR-mask arrays for the initial and final permutations,
280 * and for the key initial and compression permutations.
281 */
282 for (k = 0; k < 8; k++) {
283 for (i = 0; i < 256; i++) {
cf0a78c8
EA
284 *(il = &ip_maskl[k][i]) = 0L;
285 *(ir = &ip_maskr[k][i]) = 0L;
286 *(fl = &fp_maskl[k][i]) = 0L;
287 *(fr = &fp_maskr[k][i]) = 0L;
3e87ecb2
EA
288 for (j = 0; j < 8; j++) {
289 inbit = 8 * k + j;
290 if (i & bits8[j]) {
291 if ((obit = init_perm[inbit]) < 32)
292 *il |= bits32[obit];
293 else
294 *ir |= bits32[obit-32];
295 if ((obit = final_perm[inbit]) < 32)
296 *fl |= bits32[obit];
297 else
298 *fr |= bits32[obit - 32];
299 }
300 }
301 }
302 for (i = 0; i < 128; i++) {
cf0a78c8
EA
303 *(il = &key_perm_maskl[k][i]) = 0L;
304 *(ir = &key_perm_maskr[k][i]) = 0L;
3e87ecb2
EA
305 for (j = 0; j < 7; j++) {
306 inbit = 8 * k + j;
307 if (i & bits8[j + 1]) {
308 if ((obit = inv_key_perm[inbit]) == 255)
309 continue;
310 if (obit < 28)
311 *il |= bits28[obit];
312 else
313 *ir |= bits28[obit - 28];
314 }
315 }
cf0a78c8
EA
316 *(il = &comp_maskl[k][i]) = 0L;
317 *(ir = &comp_maskr[k][i]) = 0L;
3e87ecb2
EA
318 for (j = 0; j < 7; j++) {
319 inbit = 7 * k + j;
320 if (i & bits8[j + 1]) {
321 if ((obit=inv_comp_perm[inbit]) == 255)
322 continue;
323 if (obit < 24)
324 *il |= bits24[obit];
325 else
326 *ir |= bits24[obit - 24];
327 }
328 }
329 }
aa4ceea1 330 }
3e87ecb2
EA
331
332 /*
333 * Invert the P-box permutation, and convert into OR-masks for
334 * handling the output of the S-box arrays setup above.
335 */
336 for (i = 0; i < 32; i++)
cf0a78c8 337 un_pbox[pbox[i] - 1] = (u_char)i;
3e87ecb2
EA
338
339 for (b = 0; b < 4; b++)
340 for (i = 0; i < 256; i++) {
cf0a78c8 341 *(p = &psbox[b][i]) = 0L;
3e87ecb2
EA
342 for (j = 0; j < 8; j++) {
343 if (i & bits8[j])
344 *p |= bits32[un_pbox[8 * b + j]];
345 }
346 }
347
348 des_initialised = 1;
08012e24
EA
349}
350
cf0a78c8
EA
351
352static void
73d592f6 353setup_salt(u_int32_t salt)
aa4ceea1 354{
3e87ecb2
EA
355 u_int32_t obit, saltbit;
356 int i;
357
358 if (salt == old_salt)
359 return;
360 old_salt = salt;
361
cf0a78c8 362 saltbits = 0L;
3e87ecb2
EA
363 saltbit = 1;
364 obit = 0x800000;
365 for (i = 0; i < 24; i++) {
366 if (salt & saltbit)
367 saltbits |= obit;
368 saltbit <<= 1;
369 obit >>= 1;
370 }
aa4ceea1 371}
08012e24 372
cf0a78c8 373
ee6e93f1 374static void
cf0a78c8
EA
375des_setkey(const char *key)
376{
377 u_int32_t k0, k1, rawkey0, rawkey1;
378 int shifts, round;
379
380 des_init();
381
382 rawkey0 = ntohl(*(const u_int32_t *) key);
383 rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
384
385 if ((rawkey0 | rawkey1)
386 && rawkey0 == old_rawkey0
387 && rawkey1 == old_rawkey1) {
388 /*
389 * Already setup for this key.
390 * This optimisation fails on a zero key (which is weak and
391 * has bad parity anyway) in order to simplify the starting
392 * conditions.
393 */
ee6e93f1 394 return;
cf0a78c8
EA
395 }
396 old_rawkey0 = rawkey0;
397 old_rawkey1 = rawkey1;
398
399 /*
400 * Do key permutation and split into two 28-bit subkeys.
401 */
402 k0 = key_perm_maskl[0][rawkey0 >> 25]
403 | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]
404 | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]
405 | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]
406 | key_perm_maskl[4][rawkey1 >> 25]
407 | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]
408 | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]
409 | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];
410 k1 = key_perm_maskr[0][rawkey0 >> 25]
411 | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]
412 | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]
413 | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]
414 | key_perm_maskr[4][rawkey1 >> 25]
415 | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]
416 | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]
417 | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];
418 /*
419 * Rotate subkeys and do compression permutation.
420 */
421 shifts = 0;
422 for (round = 0; round < 16; round++) {
423 u_int32_t t0, t1;
424
425 shifts += key_shifts[round];
426
427 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
428 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
429
430 de_keysl[15 - round] =
431 en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
432 | comp_maskl[1][(t0 >> 14) & 0x7f]
433 | comp_maskl[2][(t0 >> 7) & 0x7f]
434 | comp_maskl[3][t0 & 0x7f]
435 | comp_maskl[4][(t1 >> 21) & 0x7f]
436 | comp_maskl[5][(t1 >> 14) & 0x7f]
437 | comp_maskl[6][(t1 >> 7) & 0x7f]
438 | comp_maskl[7][t1 & 0x7f];
439
440 de_keysr[15 - round] =
441 en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
442 | comp_maskr[1][(t0 >> 14) & 0x7f]
443 | comp_maskr[2][(t0 >> 7) & 0x7f]
444 | comp_maskr[3][t0 & 0x7f]
445 | comp_maskr[4][(t1 >> 21) & 0x7f]
446 | comp_maskr[5][(t1 >> 14) & 0x7f]
447 | comp_maskr[6][(t1 >> 7) & 0x7f]
448 | comp_maskr[7][t1 & 0x7f];
449 }
cf0a78c8
EA
450}
451
452
453static int
454do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
08012e24 455{
1a21daad 456 /* l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format. */
3e87ecb2 457 u_int32_t l, r, *kl, *kr, *kl1, *kr1;
212bd82f 458 u_int32_t f, r48l, r48r;
cf0a78c8 459 int round;
3e87ecb2
EA
460
461 if (count == 0) {
1a21daad
DV
462 return 1;
463 }
464 if (count > 0) {
465 /* Encrypting */
3e87ecb2
EA
466 kl1 = en_keysl;
467 kr1 = en_keysr;
468 } else {
1a21daad 469 /* Decrypting */
3e87ecb2
EA
470 count = -count;
471 kl1 = de_keysl;
472 kr1 = de_keysr;
473 }
474
1a21daad 475 /* Do initial permutation (IP). */
3e87ecb2
EA
476 l = ip_maskl[0][l_in >> 24]
477 | ip_maskl[1][(l_in >> 16) & 0xff]
478 | ip_maskl[2][(l_in >> 8) & 0xff]
479 | ip_maskl[3][l_in & 0xff]
480 | ip_maskl[4][r_in >> 24]
481 | ip_maskl[5][(r_in >> 16) & 0xff]
482 | ip_maskl[6][(r_in >> 8) & 0xff]
483 | ip_maskl[7][r_in & 0xff];
484 r = ip_maskr[0][l_in >> 24]
485 | ip_maskr[1][(l_in >> 16) & 0xff]
486 | ip_maskr[2][(l_in >> 8) & 0xff]
487 | ip_maskr[3][l_in & 0xff]
488 | ip_maskr[4][r_in >> 24]
489 | ip_maskr[5][(r_in >> 16) & 0xff]
490 | ip_maskr[6][(r_in >> 8) & 0xff]
491 | ip_maskr[7][r_in & 0xff];
492
493 while (count--) {
1a21daad 494 /* Do each round. */
3e87ecb2
EA
495 kl = kl1;
496 kr = kr1;
497 round = 16;
1a21daad
DV
498 do {
499 /* Expand R to 48 bits (simulate the E-box). */
3e87ecb2
EA
500 r48l = ((r & 0x00000001) << 23)
501 | ((r & 0xf8000000) >> 9)
502 | ((r & 0x1f800000) >> 11)
503 | ((r & 0x01f80000) >> 13)
504 | ((r & 0x001f8000) >> 15);
3e87ecb2
EA
505 r48r = ((r & 0x0001f800) << 7)
506 | ((r & 0x00001f80) << 5)
507 | ((r & 0x000001f8) << 3)
508 | ((r & 0x0000001f) << 1)
509 | ((r & 0x80000000) >> 31);
510 /*
511 * Do salting for crypt() and friends, and
512 * XOR with the permuted key.
513 */
514 f = (r48l ^ r48r) & saltbits;
515 r48l ^= f ^ *kl++;
516 r48r ^= f ^ *kr++;
517 /*
518 * Do sbox lookups (which shrink it back to 32 bits)
519 * and do the pbox permutation at the same time.
520 */
521 f = psbox[0][m_sbox[0][r48l >> 12]]
522 | psbox[1][m_sbox[1][r48l & 0xfff]]
523 | psbox[2][m_sbox[2][r48r >> 12]]
524 | psbox[3][m_sbox[3][r48r & 0xfff]];
1a21daad 525 /* Now that we've permuted things, complete f(). */
3e87ecb2
EA
526 f ^= l;
527 l = r;
528 r = f;
1a21daad 529 } while (--round);
3e87ecb2
EA
530 r = l;
531 l = f;
aa4ceea1 532 }
1a21daad 533 /* Do final permutation (inverse of IP). */
3e87ecb2
EA
534 *l_out = fp_maskl[0][l >> 24]
535 | fp_maskl[1][(l >> 16) & 0xff]
536 | fp_maskl[2][(l >> 8) & 0xff]
537 | fp_maskl[3][l & 0xff]
538 | fp_maskl[4][r >> 24]
539 | fp_maskl[5][(r >> 16) & 0xff]
540 | fp_maskl[6][(r >> 8) & 0xff]
541 | fp_maskl[7][r & 0xff];
542 *r_out = fp_maskr[0][l >> 24]
543 | fp_maskr[1][(l >> 16) & 0xff]
544 | fp_maskr[2][(l >> 8) & 0xff]
545 | fp_maskr[3][l & 0xff]
546 | fp_maskr[4][r >> 24]
547 | fp_maskr[5][(r >> 16) & 0xff]
548 | fp_maskr[6][(r >> 8) & 0xff]
549 | fp_maskr[7][r & 0xff];
550 return(0);
08012e24
EA
551}
552
3a4b78aa 553
3e87ecb2 554#if 0
cf0a78c8
EA
555static int
556des_cipher(const char *in, char *out, u_int32_t salt, int count)
557{
558 u_int32_t l_out, r_out, rawl, rawr;
559 int retval;
560 union {
561 u_int32_t *ui32;
562 const char *c;
563 } trans;
3e87ecb2 564
3a4b78aa 565 des_init();
3e87ecb2 566
cf0a78c8 567 setup_salt(salt);
3e87ecb2 568
cf0a78c8
EA
569 trans.c = in;
570 rawl = ntohl(*trans.ui32++);
571 rawr = ntohl(*trans.ui32);
3e87ecb2 572
cf0a78c8 573 retval = do_des(rawl, rawr, &l_out, &r_out, count);
3e87ecb2 574
cf0a78c8
EA
575 trans.c = out;
576 *trans.ui32++ = htonl(l_out);
577 *trans.ui32 = htonl(r_out);
578 return(retval);
3e87ecb2 579}
cf0a78c8
EA
580#endif
581
aa4ceea1 582
cf0a78c8
EA
583void
584setkey(const char *key)
3e87ecb2
EA
585{
586 int i, j;
cf0a78c8 587 u_int32_t packed_keys[2];
3e87ecb2 588 u_char *p;
aa4ceea1 589
3e87ecb2 590 p = (u_char *) packed_keys;
aa4ceea1 591
3e87ecb2
EA
592 for (i = 0; i < 8; i++) {
593 p[i] = 0;
594 for (j = 0; j < 8; j++)
595 if (*key++ & 1)
596 p[i] |= bits8[j];
aa4ceea1 597 }
4fd42edd 598 des_setkey((char *)p);
3e87ecb2 599}
aa4ceea1 600
cf0a78c8
EA
601
602void
603encrypt(char *block, int flag)
3e87ecb2 604{
cf0a78c8 605 u_int32_t io[2];
3e87ecb2 606 u_char *p;
cf0a78c8 607 int i, j;
aa4ceea1 608
3a4b78aa 609 des_init();
aa4ceea1 610
cf0a78c8 611 setup_salt(0L);
4fd42edd 612 p = (u_char*)block;
3e87ecb2
EA
613 for (i = 0; i < 2; i++) {
614 io[i] = 0L;
615 for (j = 0; j < 32; j++)
616 if (*p++ & 1)
617 io[i] |= bits32[j];
aa4ceea1 618 }
cf0a78c8 619 do_des(io[0], io[1], io, io + 1, flag ? -1 : 1);
3e87ecb2
EA
620 for (i = 0; i < 2; i++)
621 for (j = 0; j < 32; j++)
622 block[(i << 5) | j] = (io[i] & bits32[j]) ? 1 : 0;
08012e24
EA
623}
624
8d9ff89b 625char *__des_crypt(const unsigned char *key, const unsigned char *setting)
3e87ecb2
EA
626{
627 u_int32_t count, salt, l, r0, r1, keybuf[2];
628 u_char *p, *q;
212bd82f 629 static char output[21];
3e87ecb2 630
3a4b78aa 631 des_init();
3e87ecb2
EA
632
633 /*
634 * Copy the key, shifting each character up by one bit
635 * and padding with zeros.
636 */
637 q = (u_char *)keybuf;
638 while (q - (u_char *)keybuf - 8) {
639 *q++ = *key << 1;
640 if (*(q - 1))
641 key++;
642 }
ee6e93f1 643 des_setkey((char *)keybuf);
3e87ecb2
EA
644
645#if 0
646 if (*setting == _PASSWORD_EFMT1) {
cf0a78c8 647 int i;
3e87ecb2
EA
648 /*
649 * "new"-style:
650 * setting - underscore, 4 bytes of count, 4 bytes of salt
651 * key - unlimited characters
652 */
653 for (i = 1, count = 0L; i < 5; i++)
654 count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
655
656 for (i = 5, salt = 0L; i < 9; i++)
657 salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
658
659 while (*key) {
660 /*
661 * Encrypt the key with itself.
662 */
cf0a78c8 663 if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
3e87ecb2
EA
664 return(NULL);
665 /*
666 * And XOR with the next 8 characters of the key.
667 */
668 q = (u_char *)keybuf;
669 while (q - (u_char *)keybuf - 8 && *key)
670 *q++ ^= *key++ << 1;
671
ee6e93f1 672 des_setkey((char *)keybuf);
3e87ecb2
EA
673 }
674 strncpy(output, setting, 9);
675
676 /*
677 * Double check that we weren't given a short setting.
678 * If we were, the above code will probably have created
679 * wierd values for count and salt, but we don't really care.
680 * Just make sure the output string doesn't have an extra
681 * NUL in it.
682 */
683 output[9] = '\0';
684 p = (u_char *)output + strlen(output);
1f020b17 685 } else
3e87ecb2
EA
686#endif
687 {
688 /*
689 * "old"-style:
690 * setting - 2 bytes of salt
691 * key - up to 8 characters
692 */
693 count = 25;
694
695 salt = (ascii_to_bin(setting[1]) << 6)
696 | ascii_to_bin(setting[0]);
697
698 output[0] = setting[0];
699 /*
700 * If the encrypted password that the salt was extracted from
701 * is only 1 character long, the salt will be corrupted. We
702 * need to ensure that the output string doesn't have an extra
703 * NUL in it!
704 */
705 output[1] = setting[1] ? setting[1] : output[0];
706
707 p = (u_char *)output + 2;
708 }
709 setup_salt(salt);
710 /*
711 * Do it.
712 */
cf0a78c8 713 if (do_des(0L, 0L, &r0, &r1, (int)count))
3e87ecb2
EA
714 return(NULL);
715 /*
716 * Now encode the result...
717 */
718 l = (r0 >> 8);
719 *p++ = ascii64[(l >> 18) & 0x3f];
720 *p++ = ascii64[(l >> 12) & 0x3f];
721 *p++ = ascii64[(l >> 6) & 0x3f];
722 *p++ = ascii64[l & 0x3f];
723
724 l = (r0 << 16) | ((r1 >> 16) & 0xffff);
725 *p++ = ascii64[(l >> 18) & 0x3f];
726 *p++ = ascii64[(l >> 12) & 0x3f];
727 *p++ = ascii64[(l >> 6) & 0x3f];
728 *p++ = ascii64[l & 0x3f];
729
730 l = r1 << 2;
731 *p++ = ascii64[(l >> 12) & 0x3f];
732 *p++ = ascii64[(l >> 6) & 0x3f];
733 *p++ = ascii64[l & 0x3f];
734 *p = 0;
735
cf0a78c8 736 return(output);
3e87ecb2 737}
41cb95ae 738
This page took 0.322932 seconds and 4 git commands to generate.