1 #if defined(LIBC_SCCS) && !defined(lint) 2 static char sccsid[] = "@(#)crypt.c 5.3.1.1 (Berkeley) 10/21/90"; 3 #endif LIBC_SCCS and not lint 4 5 /* 6 * This program implements the 7 * Proposed Federal Information Processing 8 * Data Encryption Standard. 9 * See Federal Register, March 17, 1975 (40FR12134) 10 */ 11 12 /* 13 * Initial permutation, 14 */ 15 static char IP[] = { 16 58,50,42,34,26,18,10, 2, 17 60,52,44,36,28,20,12, 4, 18 62,54,46,38,30,22,14, 6, 19 64,56,48,40,32,24,16, 8, 20 57,49,41,33,25,17, 9, 1, 21 59,51,43,35,27,19,11, 3, 22 61,53,45,37,29,21,13, 5, 23 63,55,47,39,31,23,15, 7, 24 }; 25 26 /* 27 * Final permutation, FP = IP^(-1) 28 */ 29 static char FP[] = { 30 40, 8,48,16,56,24,64,32, 31 39, 7,47,15,55,23,63,31, 32 38, 6,46,14,54,22,62,30, 33 37, 5,45,13,53,21,61,29, 34 36, 4,44,12,52,20,60,28, 35 35, 3,43,11,51,19,59,27, 36 34, 2,42,10,50,18,58,26, 37 33, 1,41, 9,49,17,57,25, 38 }; 39 40 /* 41 * Permuted-choice 1 from the key bits 42 * to yield C and D. 43 * Note that bits 8,16... are left out: 44 * They are intended for a parity check. 45 */ 46 static char PC1_C[] = { 47 57,49,41,33,25,17, 9, 48 1,58,50,42,34,26,18, 49 10, 2,59,51,43,35,27, 50 19,11, 3,60,52,44,36, 51 }; 52 53 static char PC1_D[] = { 54 63,55,47,39,31,23,15, 55 7,62,54,46,38,30,22, 56 14, 6,61,53,45,37,29, 57 21,13, 5,28,20,12, 4, 58 }; 59 60 /* 61 * Sequence of shifts used for the key schedule. 62 */ 63 static char shifts[] = { 64 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1, 65 }; 66 67 /* 68 * Permuted-choice 2, to pick out the bits from 69 * the CD array that generate the key schedule. 70 */ 71 static char PC2_C[] = { 72 14,17,11,24, 1, 5, 73 3,28,15, 6,21,10, 74 23,19,12, 4,26, 8, 75 16, 7,27,20,13, 2, 76 }; 77 78 static char PC2_D[] = { 79 41,52,31,37,47,55, 80 30,40,51,45,33,48, 81 44,49,39,56,34,53, 82 46,42,50,36,29,32, 83 }; 84 85 /* 86 * The C and D arrays used to calculate the key schedule. 87 */ 88 89 static char C[28]; 90 static char D[28]; 91 /* 92 * The key schedule. 93 * Generated from the key. 94 */ 95 static char KS[16][48]; 96 97 /* 98 * The E bit-selection table. 99 */ 100 static char E[48]; 101 static char e[] = { 102 32, 1, 2, 3, 4, 5, 103 4, 5, 6, 7, 8, 9, 104 8, 9,10,11,12,13, 105 12,13,14,15,16,17, 106 16,17,18,19,20,21, 107 20,21,22,23,24,25, 108 24,25,26,27,28,29, 109 28,29,30,31,32, 1, 110 }; 111 112 /* 113 * Set up the key schedule from the key. 114 */ 115 116 setkey(key) 117 char *key; 118 { 119 register i, j, k; 120 int t; 121 122 /* 123 * First, generate C and D by permuting 124 * the key. The low order bit of each 125 * 8-bit char is not used, so C and D are only 28 126 * bits apiece. 127 */ 128 for (i=0; i<28; i++) { 129 C[i] = key[PC1_C[i]-1]; 130 D[i] = key[PC1_D[i]-1]; 131 } 132 /* 133 * To generate Ki, rotate C and D according 134 * to schedule and pick up a permutation 135 * using PC2. 136 */ 137 for (i=0; i<16; i++) { 138 /* 139 * rotate. 140 */ 141 for (k=0; k<shifts[i]; k++) { 142 t = C[0]; 143 for (j=0; j<28-1; j++) 144 C[j] = C[j+1]; 145 C[27] = t; 146 t = D[0]; 147 for (j=0; j<28-1; j++) 148 D[j] = D[j+1]; 149 D[27] = t; 150 } 151 /* 152 * get Ki. Note C and D are concatenated. 153 */ 154 for (j=0; j<24; j++) { 155 KS[i][j] = C[PC2_C[j]-1]; 156 KS[i][j+24] = D[PC2_D[j]-28-1]; 157 } 158 } 159 160 for(i=0;i<48;i++) 161 E[i] = e[i]; 162 } 163 164 /* 165 * The 8 selection functions. 166 * For some reason, they give a 0-origin 167 * index, unlike everything else. 168 */ 169 static char S[8][64] = { 170 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 171 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, 172 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, 173 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13, 174 175 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, 176 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, 177 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, 178 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9, 179 180 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, 181 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, 182 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, 183 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12, 184 185 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, 186 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, 187 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, 188 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14, 189 190 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, 191 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, 192 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, 193 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3, 194 195 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, 196 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8, 197 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 198 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, 199 200 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, 201 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6, 202 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, 203 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12, 204 205 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, 206 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, 207 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, 208 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11, 209 }; 210 211 /* 212 * P is a permutation on the selected combination 213 * of the current L and key. 214 */ 215 static char P[] = { 216 16, 7,20,21, 217 29,12,28,17, 218 1,15,23,26, 219 5,18,31,10, 220 2, 8,24,14, 221 32,27, 3, 9, 222 19,13,30, 6, 223 22,11, 4,25, 224 }; 225 226 /* 227 * The current block, divided into 2 halves. 228 */ 229 static char L[64], *R = L+32; 230 static char tempL[32]; 231 static char f[32]; 232 233 /* 234 * The combination of the key and the input, before selection. 235 */ 236 static char preS[48]; 237 238 /* 239 * The payoff: encrypt a block. 240 */ 241 242 encrypt(block, edflag) 243 char *block; 244 { 245 int i, ii; 246 register t, j, k; 247 248 /* 249 * First, permute the bits in the input 250 */ 251 for (j=0; j<64; j++) 252 L[j] = block[IP[j]-1]; 253 /* 254 * Perform an encryption operation 16 times. 255 */ 256 for (ii=0; ii<16; ii++) { 257 /* 258 * Only encrypt for now. 259 */ 260 i = ii; 261 /* 262 * Save the R array, 263 * which will be the new L. 264 */ 265 for (j=0; j<32; j++) 266 tempL[j] = R[j]; 267 /* 268 * Expand R to 48 bits using the E selector; 269 * exclusive-or with the current key bits. 270 */ 271 for (j=0; j<48; j++) 272 preS[j] = R[E[j]-1] ^ KS[i][j]; 273 /* 274 * The pre-select bits are now considered 275 * in 8 groups of 6 bits each. 276 * The 8 selection functions map these 277 * 6-bit quantities into 4-bit quantities 278 * and the results permuted 279 * to make an f(R, K). 280 * The indexing into the selection functions 281 * is peculiar; it could be simplified by 282 * rewriting the tables. 283 */ 284 for (j=0; j<8; j++) { 285 t = 6*j; 286 k = S[j][(preS[t+0]<<5)+ 287 (preS[t+1]<<3)+ 288 (preS[t+2]<<2)+ 289 (preS[t+3]<<1)+ 290 (preS[t+4]<<0)+ 291 (preS[t+5]<<4)]; 292 t = 4*j; 293 f[t+0] = (k>>3)&01; 294 f[t+1] = (k>>2)&01; 295 f[t+2] = (k>>1)&01; 296 f[t+3] = (k>>0)&01; 297 } 298 /* 299 * The new R is L ^ f(R, K). 300 * The f here has to be permuted first, though. 301 */ 302 for (j=0; j<32; j++) 303 R[j] = L[j] ^ f[P[j]-1]; 304 /* 305 * Finally, the new L (the original R) 306 * is copied back. 307 */ 308 for (j=0; j<32; j++) 309 L[j] = tempL[j]; 310 } 311 /* 312 * The output L and R are reversed. 313 */ 314 for (j=0; j<32; j++) { 315 t = L[j]; 316 L[j] = R[j]; 317 R[j] = t; 318 } 319 /* 320 * The final output 321 * gets the inverse permutation of the very original. 322 */ 323 for (j=0; j<64; j++) 324 block[j] = L[FP[j]-1]; 325 } 326 327 char * 328 crypt(pw,salt) 329 char *pw; 330 char *salt; 331 { 332 register i, j, c; 333 int temp; 334 static char block[66], iobuf[16]; 335 336 for(i=0; i<66; i++) 337 block[i] = 0; 338 for(i=0; (c= *pw) && i<64; pw++){ 339 for(j=0; j<7; j++, i++) 340 block[i] = (c>>(6-j)) & 01; 341 i++; 342 } 343 344 setkey(block); 345 346 for(i=0; i<66; i++) 347 block[i] = 0; 348 349 for(i=0;i<2;i++){ 350 c = *salt++; 351 iobuf[i] = c; 352 if(c>'Z') c -= 6; 353 if(c>'9') c -= 7; 354 c -= '.'; 355 for(j=0;j<6;j++){ 356 if((c>>j) & 01){ 357 temp = E[6*i+j]; 358 E[6*i+j] = E[6*i+j+24]; 359 E[6*i+j+24] = temp; 360 } 361 } 362 } 363 364 for(i=0; i<25; i++) 365 encrypt(block,0); 366 367 for(i=0; i<11; i++){ 368 c = 0; 369 for(j=0; j<6; j++){ 370 c <<= 1; 371 c |= block[6*i+j]; 372 } 373 c += '.'; 374 if(c>'9') c += 7; 375 if(c>'Z') c += 6; 376 iobuf[i+2] = c; 377 } 378 iobuf[i+2] = 0; 379 if(iobuf[1]==0) 380 iobuf[1] = iobuf[0]; 381 return(iobuf); 382 } 383