xref: /original-bsd/lib/libc/gen/crypt.c (revision 2e5c0888)
1 #if defined(LIBC_SCCS) && !defined(lint)
2 static char sccsid[] = "@(#)crypt.c	5.3 (Berkeley) 05/11/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 		 * Set direction
259 		 */
260 		if (edflag)
261 			i = 15-ii;
262 		else
263 			i = ii;
264 		/*
265 		 * Save the R array,
266 		 * which will be the new L.
267 		 */
268 		for (j=0; j<32; j++)
269 			tempL[j] = R[j];
270 		/*
271 		 * Expand R to 48 bits using the E selector;
272 		 * exclusive-or with the current key bits.
273 		 */
274 		for (j=0; j<48; j++)
275 			preS[j] = R[E[j]-1] ^ KS[i][j];
276 		/*
277 		 * The pre-select bits are now considered
278 		 * in 8 groups of 6 bits each.
279 		 * The 8 selection functions map these
280 		 * 6-bit quantities into 4-bit quantities
281 		 * and the results permuted
282 		 * to make an f(R, K).
283 		 * The indexing into the selection functions
284 		 * is peculiar; it could be simplified by
285 		 * rewriting the tables.
286 		 */
287 		for (j=0; j<8; j++) {
288 			t = 6*j;
289 			k = S[j][(preS[t+0]<<5)+
290 				(preS[t+1]<<3)+
291 				(preS[t+2]<<2)+
292 				(preS[t+3]<<1)+
293 				(preS[t+4]<<0)+
294 				(preS[t+5]<<4)];
295 			t = 4*j;
296 			f[t+0] = (k>>3)&01;
297 			f[t+1] = (k>>2)&01;
298 			f[t+2] = (k>>1)&01;
299 			f[t+3] = (k>>0)&01;
300 		}
301 		/*
302 		 * The new R is L ^ f(R, K).
303 		 * The f here has to be permuted first, though.
304 		 */
305 		for (j=0; j<32; j++)
306 			R[j] = L[j] ^ f[P[j]-1];
307 		/*
308 		 * Finally, the new L (the original R)
309 		 * is copied back.
310 		 */
311 		for (j=0; j<32; j++)
312 			L[j] = tempL[j];
313 	}
314 	/*
315 	 * The output L and R are reversed.
316 	 */
317 	for (j=0; j<32; j++) {
318 		t = L[j];
319 		L[j] = R[j];
320 		R[j] = t;
321 	}
322 	/*
323 	 * The final output
324 	 * gets the inverse permutation of the very original.
325 	 */
326 	for (j=0; j<64; j++)
327 		block[j] = L[FP[j]-1];
328 }
329 
330 char *
331 crypt(pw,salt)
332 char *pw;
333 char *salt;
334 {
335 	register i, j, c;
336 	int temp;
337 	static char block[66], iobuf[16];
338 
339 	for(i=0; i<66; i++)
340 		block[i] = 0;
341 	for(i=0; (c= *pw) && i<64; pw++){
342 		for(j=0; j<7; j++, i++)
343 			block[i] = (c>>(6-j)) & 01;
344 		i++;
345 	}
346 
347 	setkey(block);
348 
349 	for(i=0; i<66; i++)
350 		block[i] = 0;
351 
352 	for(i=0;i<2;i++){
353 		c = *salt++;
354 		iobuf[i] = c;
355 		if(c>'Z') c -= 6;
356 		if(c>'9') c -= 7;
357 		c -= '.';
358 		for(j=0;j<6;j++){
359 			if((c>>j) & 01){
360 				temp = E[6*i+j];
361 				E[6*i+j] = E[6*i+j+24];
362 				E[6*i+j+24] = temp;
363 				}
364 			}
365 		}
366 
367 	for(i=0; i<25; i++)
368 		encrypt(block,0);
369 
370 	for(i=0; i<11; i++){
371 		c = 0;
372 		for(j=0; j<6; j++){
373 			c <<= 1;
374 			c |= block[6*i+j];
375 			}
376 		c += '.';
377 		if(c>'9') c += 7;
378 		if(c>'Z') c += 6;
379 		iobuf[i+2] = c;
380 	}
381 	iobuf[i+2] = 0;
382 	if(iobuf[1]==0)
383 		iobuf[1] = iobuf[0];
384 	return(iobuf);
385 }
386