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