Home | History | Annotate | Download | only in common
      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 /*
     23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*      Copyright (c) 1984,1988 AT&T */
     28 /*        All Rights Reserved   */
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 /*LINTLIBRARY*/
     33 /*
     34  * This program implements the
     35  * Proposed Federal Information Processing
     36  *  Data Encryption Standard.
     37  * See Federal Register, March 17, 1975 (40FR12134)
     38  */
     39 
     40 /*
     41  * Initial permutation,
     42  */
     43 static	char	IP[] = {
     44 	58,50,42,34,26,18,10, 2,
     45 	60,52,44,36,28,20,12, 4,
     46 	62,54,46,38,30,22,14, 6,
     47 	64,56,48,40,32,24,16, 8,
     48 	57,49,41,33,25,17, 9, 1,
     49 	59,51,43,35,27,19,11, 3,
     50 	61,53,45,37,29,21,13, 5,
     51 	63,55,47,39,31,23,15, 7,
     52 };
     53 
     54 /*
     55  * Final permutation, FP = IP^(-1)
     56  */
     57 static	char	FP[] = {
     58 	40, 8,48,16,56,24,64,32,
     59 	39, 7,47,15,55,23,63,31,
     60 	38, 6,46,14,54,22,62,30,
     61 	37, 5,45,13,53,21,61,29,
     62 	36, 4,44,12,52,20,60,28,
     63 	35, 3,43,11,51,19,59,27,
     64 	34, 2,42,10,50,18,58,26,
     65 	33, 1,41, 9,49,17,57,25,
     66 };
     67 
     68 /*
     69  * Permuted-choice 1 from the key bits
     70  * to yield C and D.
     71  * Note that bits 8,16... are left out:
     72  * They are intended for a parity check.
     73  */
     74 static	char	PC1_C[] = {
     75 	57,49,41,33,25,17, 9,
     76 	 1,58,50,42,34,26,18,
     77 	10, 2,59,51,43,35,27,
     78 	19,11, 3,60,52,44,36,
     79 };
     80 
     81 static	char	PC1_D[] = {
     82 	63,55,47,39,31,23,15,
     83 	 7,62,54,46,38,30,22,
     84 	14, 6,61,53,45,37,29,
     85 	21,13, 5,28,20,12, 4,
     86 };
     87 
     88 /*
     89  * Sequence of shifts used for the key schedule.
     90  */
     91 static	char	shifts[] = {
     92 	1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
     93 };
     94 
     95 /*
     96  * Permuted-choice 2, to pick out the bits from
     97  * the CD array that generate the key schedule.
     98  */
     99 static	char	PC2_C[] = {
    100 	14,17,11,24, 1, 5,
    101 	 3,28,15, 6,21,10,
    102 	23,19,12, 4,26, 8,
    103 	16, 7,27,20,13, 2,
    104 };
    105 
    106 static	char	PC2_D[] = {
    107 	41,52,31,37,47,55,
    108 	30,40,51,45,33,48,
    109 	44,49,39,56,34,53,
    110 	46,42,50,36,29,32,
    111 };
    112 
    113 static struct _crypt {
    114 	/*
    115 	 * The C and D arrays used to calculate the key schedule.
    116 	 */
    117 	char	_C[28];
    118 	char	_D[28];
    119 	/*
    120 	 * The key schedule.
    121 	 * Generated from the key.
    122 	 */
    123 	char	_KS[16][48];
    124 	/*
    125 	 * The E bit-selection table.
    126 	 */
    127 	char	_E[48];
    128 	/*
    129 	 * The current block, divided into 2 halves.
    130 	 */
    131 	char	_L[32], _R[32];
    132 	char	_tempL[32];
    133 	char	_f[32];
    134 	/*
    135 	 * The combination of the key and the input, before selection.
    136 	 */
    137 	char	_preS[48];
    138 	/*
    139 	 * Temps for crypt
    140 	 */
    141 	char	_ablock[66], _iobuf[16];
    142 } *__crypt;
    143 #define	C	(_c->_C)
    144 #define	D	(_c->_D)
    145 #define	KS	(_c->_KS)
    146 #define	E	(_c->_E)
    147 #define	L	(_c->_L)
    148 #define	R	(_c->_R)
    149 #define	tempL	(_c->_tempL)
    150 #define	f	(_c->_f)
    151 #define	preS	(_c->_preS)
    152 #define	ablock	(_c->_ablock)
    153 #define	iobuf	(_c->_iobuf)
    154 
    155 static void	_cryptinit(void);
    156 
    157 /*
    158  * Set up the key schedule from the key.
    159  */
    160 
    161 #ifndef CRYPT
    162 static
    163 #endif
    164 void
    165 setkey(char *key)
    166 {
    167 	int i, j, k;
    168 	int t;
    169 	struct _crypt *_c = __crypt;
    170 
    171 	if (!_c) {
    172 		_cryptinit();
    173 		_c = __crypt;
    174 	}
    175 	/*
    176 	 * First, generate C and D by permuting
    177 	 * the key.  The low order bit of each
    178 	 * 8-bit char is not used, so C and D are only 28
    179 	 * bits apiece.
    180 	 */
    181 	for (i=0; i<28; i++) {
    182 		C[i] = key[PC1_C[i]-1];
    183 		D[i] = key[PC1_D[i]-1];
    184 	}
    185 	/*
    186 	 * To generate Ki, rotate C and D according
    187 	 * to schedule and pick up a permutation
    188 	 * using PC2.
    189 	 */
    190 	for (i=0; i<16; i++) {
    191 		/*
    192 		 * rotate.
    193 		 */
    194 		for (k=0; k<shifts[i]; k++) {
    195 			t = C[0];
    196 			for (j=0; j<28-1; j++)
    197 				C[j] = C[j+1];
    198 			C[27] = t;
    199 			t = D[0];
    200 			for (j=0; j<28-1; j++)
    201 				D[j] = D[j+1];
    202 			D[27] = t;
    203 		}
    204 		/*
    205 		 * get Ki. Note C and D are concatenated.
    206 		 */
    207 		for (j=0; j<24; j++) {
    208 			KS[i][j] = C[PC2_C[j]-1];
    209 			KS[i][j+24] = D[PC2_D[j]-28-1];
    210 		}
    211 	}
    212 }
    213 
    214 /*
    215  * The E bit-selection table.
    216  */
    217 static	char	e[] = {
    218 	32, 1, 2, 3, 4, 5,
    219 	 4, 5, 6, 7, 8, 9,
    220 	 8, 9,10,11,12,13,
    221 	12,13,14,15,16,17,
    222 	16,17,18,19,20,21,
    223 	20,21,22,23,24,25,
    224 	24,25,26,27,28,29,
    225 	28,29,30,31,32, 1,
    226 };
    227 
    228 /*
    229  * The 8 selection functions.
    230  * For some reason, they give a 0-origin
    231  * index, unlike everything else.
    232  */
    233 static	char	S[8][64] = {
    234 	14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
    235 	 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
    236 	 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
    237 	15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
    238 
    239 	15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
    240 	 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
    241 	 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
    242 	13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
    243 
    244 	10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
    245 	13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
    246 	13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
    247 	 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
    248 
    249 	 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
    250 	13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
    251 	10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
    252 	 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
    253 
    254 	 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
    255 	14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
    256 	 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
    257 	11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
    258 
    259 	12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
    260 	10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
    261 	 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
    262 	 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
    263 
    264 	 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
    265 	13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
    266 	 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
    267 	 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
    268 
    269 	13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
    270 	 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
    271 	 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
    272 	 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
    273 };
    274 
    275 /*
    276  * P is a permutation on the selected combination
    277  * of the current L and key.
    278  */
    279 static	char	P[] = {
    280 	16, 7,20,21,
    281 	29,12,28,17,
    282 	 1,15,23,26,
    283 	 5,18,31,10,
    284 	 2, 8,24,14,
    285 	32,27, 3, 9,
    286 	19,13,30, 6,
    287 	22,11, 4,25,
    288 };
    289 
    290 
    291 /*
    292  * The payoff: encrypt a block.
    293  */
    294 
    295 void
    296 encrypt(char *block, int edflag)
    297 {
    298 	int	i, ii;
    299 	int t, j, k;
    300 	struct _crypt *_c = __crypt;
    301 
    302 	if (!_c) {
    303 		_cryptinit();
    304 		_c = __crypt;
    305 	}
    306 	/*
    307 	 * First, permute the bits in the input
    308 	 */
    309 	for (j=0; j<64; j++)
    310 		L[j] = block[IP[j]-1];
    311 	/*
    312 	 * Perform an encryption operation 16 times.
    313 	 */
    314 	for (ii=0; ii<16; ii++) {
    315 		/*
    316 		 * Set direction
    317 		 */
    318 #ifdef CRYPT
    319 		if (edflag)
    320 			i = 15-ii;
    321 		else
    322 #endif
    323 			i = ii;
    324 		/*
    325 		 * Save the R array,
    326 		 * which will be the new L.
    327 		 */
    328 		for (j=0; j<32; j++)
    329 			tempL[j] = R[j];
    330 		/*
    331 		 * Expand R to 48 bits using the E selector;
    332 		 * exclusive-or with the current key bits.
    333 		 */
    334 		for (j=0; j<48; j++)
    335 			preS[j] = R[E[j]-1] ^ KS[i][j];
    336 		/*
    337 		 * The pre-select bits are now considered
    338 		 * in 8 groups of 6 bits each.
    339 		 * The 8 selection functions map these
    340 		 * 6-bit quantities into 4-bit quantities
    341 		 * and the results permuted
    342 		 * to make an f(R, K).
    343 		 * The indexing into the selection functions
    344 		 * is peculiar; it could be simplified by
    345 		 * rewriting the tables.
    346 		 */
    347 		for (j=0; j<8; j++) {
    348 			t = 6*j;
    349 			k = S[j][(preS[t+0]<<5)+
    350 				(preS[t+1]<<3)+
    351 				(preS[t+2]<<2)+
    352 				(preS[t+3]<<1)+
    353 				(preS[t+4]<<0)+
    354 				(preS[t+5]<<4)];
    355 			t = 4*j;
    356 			f[t+0] = (k>>3)&01;
    357 			f[t+1] = (k>>2)&01;
    358 			f[t+2] = (k>>1)&01;
    359 			f[t+3] = (k>>0)&01;
    360 		}
    361 		/*
    362 		 * The new R is L ^ f(R, K).
    363 		 * The f here has to be permuted first, though.
    364 		 */
    365 		for (j=0; j<32; j++)
    366 			R[j] = L[j] ^ f[P[j]-1];
    367 		/*
    368 		 * Finally, the new L (the original R)
    369 		 * is copied back.
    370 		 */
    371 		for (j=0; j<32; j++)
    372 			L[j] = tempL[j];
    373 	}
    374 	/*
    375 	 * The output L and R are reversed.
    376 	 */
    377 	for (j=0; j<32; j++) {
    378 		t = L[j];
    379 		L[j] = R[j];
    380 		R[j] = t;
    381 	}
    382 	/*
    383 	 * The final output
    384 	 * gets the inverse permutation of the very original.
    385 	 */
    386 	for (j=0; j<64; j++)
    387 		block[j] = L[FP[j]-1];
    388 }
    389 
    390 char *
    391 _crypt(char *pw, char *salt)
    392 {
    393 	int i, j, c;
    394 	int	temp;
    395 	struct _crypt *_c = __crypt;
    396 
    397 	if (!_c) {
    398 		_cryptinit();
    399 		_c = __crypt;
    400 	}
    401 	for(i=0; i<66; i++)
    402 		ablock[i] = 0;
    403 	for(i=0; (c= *pw) && i<64; pw++){
    404 		for(j=0; j<7; j++, i++)
    405 			ablock[i] = (c>>(6-j)) & 01;
    406 		i++;
    407 	}
    408 
    409 	setkey(ablock);
    410 
    411 	for(i=0; i<66; i++)
    412 		ablock[i] = 0;
    413 
    414 	for(i=0;i<48;i++)
    415 		E[i] = e[i];
    416 
    417 	for(i=0;i<2;i++){
    418 		c = *salt++;
    419 		iobuf[i] = c;
    420 		if(c > 'Z')
    421 			c -= 6;
    422 		if(c > '9')
    423 			c -= 7;
    424 		c -= '.';
    425 		for(j=0;j<6;j++){
    426 			if((c>>j) & 01){
    427 				temp = E[6*i+j];
    428 				E[6*i+j] = E[6*i+j+24];
    429 				E[6*i+j+24] = temp;
    430 			}
    431 		}
    432 	}
    433 
    434 	for(i=0; i<25; i++)
    435 		encrypt(ablock,0);
    436 
    437 	for(i=0; i < 11; i++) {
    438 		c = 0;
    439 		for(j=0; j<6; j++){
    440 			c <<= 1;
    441 			c |= ablock[6*i+j];
    442 		}
    443 		c += '.';
    444 		if(c > '9')
    445 			c += 7;
    446 		if(c > 'Z')
    447 			c += 6;
    448 		iobuf[i+2] = c;
    449 	}
    450 	iobuf[i+2] = 0;
    451 	if(iobuf[1]==0)
    452 		iobuf[1] = iobuf[0];
    453 	return(iobuf);
    454 }
    455 
    456 static void
    457 _cryptinit(void)
    458 {
    459 	struct _crypt *_c = __crypt;
    460 	int i;
    461 
    462 	if (_c)
    463 		return;
    464 	_c = __crypt = (struct _crypt *)calloc(1, sizeof (struct _crypt));
    465 	if (_c == 0)
    466 		abort();
    467 
    468 	for(i=0;i<48;i++)
    469 		E[i] = e[i];
    470 }
    471