xref: /titanic_51/usr/src/lib/libcrypt/common/des_crypt.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1988 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 /*LINTLIBRARY*/
33 
34 #pragma weak des_crypt = _des_crypt
35 #pragma weak des_encrypt = _des_encrypt
36 #pragma weak des_setkey = _des_setkey
37 
38 #include "synonyms.h"
39 #include "mtlib.h"
40 #include <sys/types.h>
41 #include <crypt.h>
42 #include "des_soft.h"
43 
44 #include <stdlib.h>
45 #include <thread.h>
46 #include <synch.h>
47 #include <sys/types.h>
48 
49 /* EXPORT DELETE START */
50 /*
51  * This program implements the
52  * Proposed Federal Information Processing
53  *  Data Encryption Standard.
54  * See Federal Register, March 17, 1975 (40FR12134)
55  */
56 
57 /*
58  * Initial permutation,
59  */
60 static char IP[] = {
61 	58, 50, 42, 34, 26, 18, 10, 2,
62 	60, 52, 44, 36, 28, 20, 12, 4,
63 	62, 54, 46, 38, 30, 22, 14, 6,
64 	64, 56, 48, 40, 32, 24, 16, 8,
65 	57, 49, 41, 33, 25, 17, 9, 1,
66 	59, 51, 43, 35, 27, 19, 11, 3,
67 	61, 53, 45, 37, 29, 21, 13, 5,
68 	63, 55, 47, 39, 31, 23, 15, 7,
69 };
70 
71 /*
72  * Final permutation, FP = IP^(-1)
73  */
74 static char FP[] = {
75 	40, 8, 48, 16, 56, 24, 64, 32,
76 	39, 7, 47, 15, 55, 23, 63, 31,
77 	38, 6, 46, 14, 54, 22, 62, 30,
78 	37, 5, 45, 13, 53, 21, 61, 29,
79 	36, 4, 44, 12, 52, 20, 60, 28,
80 	35, 3, 43, 11, 51, 19, 59, 27,
81 	34, 2, 42, 10, 50, 18, 58, 26,
82 	33, 1, 41, 9, 49, 17, 57, 25,
83 };
84 
85 /*
86  * Permuted-choice 1 from the key bits
87  * to yield C and D.
88  * Note that bits 8, 16... are left out:
89  * They are intended for a parity check.
90  */
91 static char PC1_C[] = {
92 	57, 49, 41, 33, 25, 17, 9,
93 	1, 58, 50, 42, 34, 26, 18,
94 	10, 2, 59, 51, 43, 35, 27,
95 	19, 11, 3, 60, 52, 44, 36,
96 };
97 
98 static char PC1_D[] = {
99 	63, 55, 47, 39, 31, 23, 15,
100 	7, 62, 54, 46, 38, 30, 22,
101 	14, 6, 61, 53, 45, 37, 29,
102 	21, 13, 5, 28, 20, 12, 4,
103 };
104 
105 /*
106  * Sequence of shifts used for the key schedule.
107  */
108 static char shifts[] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, };
109 
110 /*
111  * Permuted-choice 2, to pick out the bits from
112  * the CD array that generate the key schedule.
113  */
114 static char PC2_C[] = {
115 	14, 17, 11, 24, 1, 5,
116 	3, 28, 15, 6, 21, 10,
117 	23, 19, 12, 4, 26, 8,
118 	16, 7, 27, 20, 13, 2,
119 };
120 
121 static char PC2_D[] = {
122 	41, 52, 31, 37, 47, 55,
123 	30, 40, 51, 45, 33, 48,
124 	44, 49, 39, 56, 34, 53,
125 	46, 42, 50, 36, 29, 32,
126 };
127 
128 /*
129  * The C and D arrays used to calculate the key schedule.
130  */
131 
132 static char C[28];
133 static char D[28];
134 /*
135  * The key schedule.
136  * Generated from the key.
137  */
138 static char KS[16][48];
139 
140 /*
141  * The E bit-selection table.
142  */
143 static char E[48];
144 static char e2[] = {
145 	32, 1, 2, 3, 4, 5,
146 	4, 5, 6, 7, 8, 9,
147 	8, 9, 10, 11, 12, 13,
148 	12, 13, 14, 15, 16, 17,
149 	16, 17, 18, 19, 20, 21,
150 	20, 21, 22, 23, 24, 25,
151 	24, 25, 26, 27, 28, 29,
152 	28, 29, 30, 31, 32, 1,
153 };
154 
155 /*
156  * Set up the key schedule from the key.
157  */
158 
159 static mutex_t lock = DEFAULTMUTEX;
160 
161 /* EXPORT DELETE END */
162 
163 
164 static void
165 des_setkey_nolock(const char *key)
166 {
167 /* EXPORT DELETE START */
168 	int i, j, k;
169 	char t;
170 
171 	/*
172 	 * First, generate C and D by permuting
173 	 * the key.  The low order bit of each
174 	 * 8-bit char is not used, so C and D are only 28
175 	 * bits apiece.
176 	 */
177 	for (i = 0; i < 28; i++) {
178 		C[i] = key[PC1_C[i]-1];
179 		D[i] = key[PC1_D[i]-1];
180 	}
181 	/*
182 	 * To generate Ki, rotate C and D according
183 	 * to schedule and pick up a permutation
184 	 * using PC2.
185 	 */
186 	for (i = 0; i < 16; i++) {
187 		/*
188 		 * rotate.
189 		 */
190 		for (k = 0; k < shifts[i]; k++) {
191 			t = C[0];
192 			for (j = 0; j < 28-1; j++)
193 				C[j] = C[j+1];
194 			C[27] = (char)t;
195 			t = D[0];
196 			for (j = 0; j < 28-1; j++)
197 				D[j] = D[j+1];
198 			D[27] = (char)t;
199 		}
200 		/*
201 		 * get Ki. Note C and D are concatenated.
202 		 */
203 		for (j = 0; j < 24; j++) {
204 			KS[i][j] = C[PC2_C[j]-1];
205 			KS[i][j+24] = D[PC2_D[j]-28-1];
206 		}
207 	}
208 
209 	for (i = 0; i < 48; i++)
210 		E[i] = e2[i];
211 /* EXPORT DELETE END */
212 }
213 
214 void
215 des_setkey(const char *key)
216 {
217 /* EXPORT DELETE START */
218 	(void) mutex_lock(&lock);
219 	des_setkey_nolock(key);
220 	(void) mutex_unlock(&lock);
221 /* EXPORT DELETE END */
222 }
223 
224 /* EXPORT DELETE START */
225 /*
226  * The 8 selection functions.
227  * For some reason, they give a 0-origin
228  * index, unlike everything else.
229  */
230 static char S[8][64] = {
231 	14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
232 	0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
233 	4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
234 	15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
235 
236 	15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
237 	3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
238 	0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
239 	13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
240 
241 	10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
242 	13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
243 	13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
244 	1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
245 
246 	7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
247 	13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
248 	10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
249 	3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
250 
251 	2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
252 	14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
253 	4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
254 	11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
255 
256 	12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
257 	10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
258 	9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
259 	4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
260 
261 	4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
262 	13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
263 	1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
264 	6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
265 
266 	13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
267 	1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
268 	7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
269 	2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
270 };
271 
272 /*
273  * P is a permutation on the selected combination
274  * of the current L and key.
275  */
276 static char P[] = {
277 	16, 7, 20, 21,
278 	29, 12, 28, 17,
279 	1, 15, 23, 26,
280 	5, 18, 31, 10,
281 	2, 8, 24, 14,
282 	32, 27, 3, 9,
283 	19, 13, 30, 6,
284 	22, 11, 4, 25,
285 };
286 
287 /*
288  * The current block, divided into 2 halves.
289  */
290 static char L[64];
291 static char tempL[32];
292 static char f[32];
293 
294 /*
295  * The combination of the key and the input, before selection.
296  */
297 static char preS[48];
298 
299 /*
300  * The payoff: encrypt a block.
301  */
302 /* EXPORT DELETE END */
303 
304 static void
305 des_encrypt_nolock(char *block, int edflag)
306 {
307 /* EXPORT DELETE START */
308 
309 	if (edflag)
310 		(void) des_decrypt1(block, L, IP, &L[32],
311 		    preS, E, KS, S, f, tempL, P, FP);
312 	else
313 		(void) des_encrypt1(block, L, IP, &L[32],
314 		    preS, E, KS, S, f, tempL, P, FP);
315 
316 /* EXPORT DELETE END */
317 }
318 
319 void
320 des_encrypt(char *block, int edflag)
321 {
322 /* EXPORT DELETE START */
323 	(void) mutex_lock(&lock);
324 	des_encrypt_nolock(block, edflag);
325 	(void) mutex_unlock(&lock);
326 /* EXPORT DELETE END */
327 }
328 
329 
330 
331 #define	IOBUF_SIZE	16
332 
333 static char *
334 _get_iobuf(thread_key_t *key, unsigned size)
335 {
336 	char *iobuf = NULL;
337 
338 	if (thr_getspecific(*key, (void **)&iobuf) != 0) {
339 		if (_thr_keycreate(key, free) != 0) {
340 			return (NULL);
341 		}
342 	}
343 
344 	if (!iobuf) {
345 		if (_thr_setspecific(*key, (void *)(iobuf = malloc(size)))
346 			!= 0) {
347 			if (iobuf)
348 				(void) free(iobuf);
349 			return (NULL);
350 		}
351 	}
352 	return (iobuf);
353 }
354 
355 char *
356 des_crypt(const char *pw, const char *salt)
357 {
358 /* EXPORT DELETE START */
359 	int	i, j;
360 	char	c, temp;
361 	static thread_key_t key = 0;
362 	char block[66], *iobuf = _get_iobuf(&key, IOBUF_SIZE);
363 
364 	(void) mutex_lock(&lock);
365 	for (i = 0; i < 66; i++)
366 		block[i] = 0;
367 	for (i = 0; (c = *pw) && (i < 64); pw++) {
368 		for (j = 0; j < 7; j++, i++)
369 			block[i] = (c>>(6-j)) & 01;
370 		i++;
371 	}
372 
373 	des_setkey_nolock(block);
374 
375 	for (i = 0; i < 66; i++)
376 		block[i] = 0;
377 
378 	for (i = 0; i < 2; i++) {
379 		c = *salt++;
380 		iobuf[i] = (char)c;
381 		if (c > 'Z')
382 			c -= 6;
383 		if (c > '9')
384 			c -= 7;
385 		c -= '.';
386 		for (j = 0; j < 6; j++) {
387 			if ((c>>j) & 01) {
388 				temp = E[6*i+j];
389 				E[6*i+j] = E[6*i+j+24];
390 				E[6*i+j+24] = (char)temp;
391 			}
392 		}
393 	}
394 
395 	for (i = 0; i < 25; i++)
396 		(void) des_encrypt_nolock(block, 0);
397 
398 	for (i = 0; i < 11; i++) {
399 		c = 0;
400 		for (j = 0; j < 6; j++) {
401 			c <<= 1;
402 			c |= block[6*i+j];
403 		}
404 		c += '.';
405 		if (c > '9')
406 			c += 7;
407 		if (c > 'Z')
408 			c += 6;
409 		iobuf[i+2] = (char)c;
410 	}
411 	iobuf[i+2] = 0;
412 	if (iobuf[1] == 0)
413 		iobuf[1] = iobuf[0];
414 	(void) mutex_unlock(&lock);
415 	return (iobuf);
416 #if 0
417 /* EXPORT DELETE END */
418 	return (0);
419 /* EXPORT DELETE START */
420 #endif
421 /* EXPORT DELETE END */
422 }
423