xref: /plan9/sys/src/cmd/unix/drawterm/libsec/des.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include "os.h"
2 #include <libsec.h>
3 
4 /*
5  * integrated sbox & p perm
6  */
7 static u32int spbox[] = {
8 
9 0x00808200,0x00000000,0x00008000,0x00808202,0x00808002,0x00008202,0x00000002,0x00008000,
10 0x00000200,0x00808200,0x00808202,0x00000200,0x00800202,0x00808002,0x00800000,0x00000002,
11 0x00000202,0x00800200,0x00800200,0x00008200,0x00008200,0x00808000,0x00808000,0x00800202,
12 0x00008002,0x00800002,0x00800002,0x00008002,0x00000000,0x00000202,0x00008202,0x00800000,
13 0x00008000,0x00808202,0x00000002,0x00808000,0x00808200,0x00800000,0x00800000,0x00000200,
14 0x00808002,0x00008000,0x00008200,0x00800002,0x00000200,0x00000002,0x00800202,0x00008202,
15 0x00808202,0x00008002,0x00808000,0x00800202,0x00800002,0x00000202,0x00008202,0x00808200,
16 0x00000202,0x00800200,0x00800200,0x00000000,0x00008002,0x00008200,0x00000000,0x00808002,
17 
18 0x40084010,0x40004000,0x00004000,0x00084010,0x00080000,0x00000010,0x40080010,0x40004010,
19 0x40000010,0x40084010,0x40084000,0x40000000,0x40004000,0x00080000,0x00000010,0x40080010,
20 0x00084000,0x00080010,0x40004010,0x00000000,0x40000000,0x00004000,0x00084010,0x40080000,
21 0x00080010,0x40000010,0x00000000,0x00084000,0x00004010,0x40084000,0x40080000,0x00004010,
22 0x00000000,0x00084010,0x40080010,0x00080000,0x40004010,0x40080000,0x40084000,0x00004000,
23 0x40080000,0x40004000,0x00000010,0x40084010,0x00084010,0x00000010,0x00004000,0x40000000,
24 0x00004010,0x40084000,0x00080000,0x40000010,0x00080010,0x40004010,0x40000010,0x00080010,
25 0x00084000,0x00000000,0x40004000,0x00004010,0x40000000,0x40080010,0x40084010,0x00084000,
26 
27 0x00000104,0x04010100,0x00000000,0x04010004,0x04000100,0x00000000,0x00010104,0x04000100,
28 0x00010004,0x04000004,0x04000004,0x00010000,0x04010104,0x00010004,0x04010000,0x00000104,
29 0x04000000,0x00000004,0x04010100,0x00000100,0x00010100,0x04010000,0x04010004,0x00010104,
30 0x04000104,0x00010100,0x00010000,0x04000104,0x00000004,0x04010104,0x00000100,0x04000000,
31 0x04010100,0x04000000,0x00010004,0x00000104,0x00010000,0x04010100,0x04000100,0x00000000,
32 0x00000100,0x00010004,0x04010104,0x04000100,0x04000004,0x00000100,0x00000000,0x04010004,
33 0x04000104,0x00010000,0x04000000,0x04010104,0x00000004,0x00010104,0x00010100,0x04000004,
34 0x04010000,0x04000104,0x00000104,0x04010000,0x00010104,0x00000004,0x04010004,0x00010100,
35 
36 0x80401000,0x80001040,0x80001040,0x00000040,0x00401040,0x80400040,0x80400000,0x80001000,
37 0x00000000,0x00401000,0x00401000,0x80401040,0x80000040,0x00000000,0x00400040,0x80400000,
38 0x80000000,0x00001000,0x00400000,0x80401000,0x00000040,0x00400000,0x80001000,0x00001040,
39 0x80400040,0x80000000,0x00001040,0x00400040,0x00001000,0x00401040,0x80401040,0x80000040,
40 0x00400040,0x80400000,0x00401000,0x80401040,0x80000040,0x00000000,0x00000000,0x00401000,
41 0x00001040,0x00400040,0x80400040,0x80000000,0x80401000,0x80001040,0x80001040,0x00000040,
42 0x80401040,0x80000040,0x80000000,0x00001000,0x80400000,0x80001000,0x00401040,0x80400040,
43 0x80001000,0x00001040,0x00400000,0x80401000,0x00000040,0x00400000,0x00001000,0x00401040,
44 
45 0x00000080,0x01040080,0x01040000,0x21000080,0x00040000,0x00000080,0x20000000,0x01040000,
46 0x20040080,0x00040000,0x01000080,0x20040080,0x21000080,0x21040000,0x00040080,0x20000000,
47 0x01000000,0x20040000,0x20040000,0x00000000,0x20000080,0x21040080,0x21040080,0x01000080,
48 0x21040000,0x20000080,0x00000000,0x21000000,0x01040080,0x01000000,0x21000000,0x00040080,
49 0x00040000,0x21000080,0x00000080,0x01000000,0x20000000,0x01040000,0x21000080,0x20040080,
50 0x01000080,0x20000000,0x21040000,0x01040080,0x20040080,0x00000080,0x01000000,0x21040000,
51 0x21040080,0x00040080,0x21000000,0x21040080,0x01040000,0x00000000,0x20040000,0x21000000,
52 0x00040080,0x01000080,0x20000080,0x00040000,0x00000000,0x20040000,0x01040080,0x20000080,
53 
54 0x10000008,0x10200000,0x00002000,0x10202008,0x10200000,0x00000008,0x10202008,0x00200000,
55 0x10002000,0x00202008,0x00200000,0x10000008,0x00200008,0x10002000,0x10000000,0x00002008,
56 0x00000000,0x00200008,0x10002008,0x00002000,0x00202000,0x10002008,0x00000008,0x10200008,
57 0x10200008,0x00000000,0x00202008,0x10202000,0x00002008,0x00202000,0x10202000,0x10000000,
58 0x10002000,0x00000008,0x10200008,0x00202000,0x10202008,0x00200000,0x00002008,0x10000008,
59 0x00200000,0x10002000,0x10000000,0x00002008,0x10000008,0x10202008,0x00202000,0x10200000,
60 0x00202008,0x10202000,0x00000000,0x10200008,0x00000008,0x00002000,0x10200000,0x00202008,
61 0x00002000,0x00200008,0x10002008,0x00000000,0x10202000,0x10000000,0x00200008,0x10002008,
62 
63 0x00100000,0x02100001,0x02000401,0x00000000,0x00000400,0x02000401,0x00100401,0x02100400,
64 0x02100401,0x00100000,0x00000000,0x02000001,0x00000001,0x02000000,0x02100001,0x00000401,
65 0x02000400,0x00100401,0x00100001,0x02000400,0x02000001,0x02100000,0x02100400,0x00100001,
66 0x02100000,0x00000400,0x00000401,0x02100401,0x00100400,0x00000001,0x02000000,0x00100400,
67 0x02000000,0x00100400,0x00100000,0x02000401,0x02000401,0x02100001,0x02100001,0x00000001,
68 0x00100001,0x02000000,0x02000400,0x00100000,0x02100400,0x00000401,0x00100401,0x02100400,
69 0x00000401,0x02000001,0x02100401,0x02100000,0x00100400,0x00000000,0x00000001,0x02100401,
70 0x00000000,0x00100401,0x02100000,0x00000400,0x02000001,0x02000400,0x00000400,0x00100001,
71 
72 0x08000820,0x00000800,0x00020000,0x08020820,0x08000000,0x08000820,0x00000020,0x08000000,
73 0x00020020,0x08020000,0x08020820,0x00020800,0x08020800,0x00020820,0x00000800,0x00000020,
74 0x08020000,0x08000020,0x08000800,0x00000820,0x00020800,0x00020020,0x08020020,0x08020800,
75 0x00000820,0x00000000,0x00000000,0x08020020,0x08000020,0x08000800,0x00020820,0x00020000,
76 0x00020820,0x00020000,0x08020800,0x00000800,0x00000020,0x08020020,0x00000800,0x00020820,
77 0x08000800,0x00000020,0x08000020,0x08020000,0x08020020,0x08000000,0x00020000,0x08000820,
78 0x00000000,0x08020820,0x00020020,0x08000020,0x08020000,0x08000800,0x08000820,0x00000000,
79 0x08020820,0x00020800,0x00020800,0x00000820,0x00000820,0x00020020,0x08000000,0x08020800,
80 };
81 
82 /*
83  * for manual index calculation
84  * #define fetch(box, i, sh) (*((u32int*)((uchar*)spbox + (box << 8) + ((i >> (sh)) & 0xfc))))
85  */
86 #define fetch(box, i, sh) ((spbox+(box << 6))[((i >> (sh + 2)) & 0x3f)])
87 
88 /*
89  * DES electronic codebook encryption of one block
90  */
91 void
block_cipher(ulong key[32],uchar text[8],int decrypting)92 block_cipher(ulong key[32], uchar text[8], int decrypting)
93 {
94 	u32int right, left, v0, v1;
95 	int i, keystep;
96 
97 	/*
98 	 * initial permutation
99 	 */
100 	v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24);
101 	left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24);
102 	right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555);
103 	left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555);
104 	left = ((left << 6) & 0x33003300)
105 		| (left & 0xcc33cc33)
106 		| ((left >> 6) & 0x00cc00cc);
107 	left = ((left << 12) & 0x0f0f0000)
108 		| (left & 0xf0f00f0f)
109 		| ((left >> 12) & 0x0000f0f0);
110 	right = ((right << 6) & 0x33003300)
111 		| (right & 0xcc33cc33)
112 		| ((right >> 6) & 0x00cc00cc);
113 	right = ((right << 12) & 0x0f0f0000)
114 		| (right & 0xf0f00f0f)
115 		| ((right >> 12) & 0x0000f0f0);
116 
117 	if (decrypting) {
118 		keystep = -2;
119 		key = key + 32 - 2;
120 	} else
121 		keystep = 2;
122 	for (i = 0; i < 8; i++) {
123 		v0 = key[0];
124 		v0 ^= (right >> 1) | (right << 31);
125 		left ^= fetch(0, v0, 24)
126 			^ fetch(2, v0, 16)
127 			^ fetch(4, v0, 8)
128 			^ fetch(6, v0, 0);
129 		v1 = key[1];
130 		v1 ^= (right << 3) | (right >> 29);
131 		left ^= fetch(1, v1, 24)
132 			^ fetch(3, v1, 16)
133 			^ fetch(5, v1, 8)
134 			^ fetch(7, v1, 0);
135 		key += keystep;
136 
137 		v0 = key[0];
138 		v0 ^= (left >> 1) | (left << 31);
139 		right ^= fetch(0, v0, 24)
140 			^ fetch(2, v0, 16)
141 			^ fetch(4, v0, 8)
142 			^ fetch(6, v0, 0);
143 		v1 = key[1];
144 		v1 ^= (left << 3) | (left >> 29);
145 		right ^= fetch(1, v1, 24)
146 			^ fetch(3, v1, 16)
147 			^ fetch(5, v1, 8)
148 			^ fetch(7, v1, 0);
149 		key += keystep;
150 	}
151 
152 	/*
153 	 * final permutation, inverse initial permutation
154 	 */
155 	v0 = ((left << 1) & 0xaaaaaaaa) | (right & 0x55555555);
156 	v1 = (left & 0xaaaaaaaa) | ((right >> 1) & 0x55555555);
157 	v1 = ((v1 << 6) & 0x33003300)
158 		| (v1 & 0xcc33cc33)
159 		| ((v1 >> 6) & 0x00cc00cc);
160 	v1 = ((v1 << 12) & 0x0f0f0000)
161 		| (v1 & 0xf0f00f0f)
162 		| ((v1 >> 12) & 0x0000f0f0);
163 	v0 = ((v0 << 6) & 0x33003300)
164 		| (v0 & 0xcc33cc33)
165 		| ((v0 >> 6) & 0x00cc00cc);
166 	v0 = ((v0 << 12) & 0x0f0f0000)
167 		| (v0 & 0xf0f00f0f)
168 		| ((v0 >> 12) & 0x0000f0f0);
169 	text[0] = v0;
170 	text[2] = v0 >> 8;
171 	text[4] = v0 >> 16;
172 	text[6] = v0 >> 24;
173 	text[1] = v1;
174 	text[3] = v1 >> 8;
175 	text[5] = v1 >> 16;
176 	text[7] = v1 >> 24;
177 }
178 
179 /*
180  * triple DES electronic codebook encryption of one block
181  */
182 void
triple_block_cipher(ulong expanded_key[3][32],uchar text[8],int ende)183 triple_block_cipher(ulong expanded_key[3][32], uchar text[8], int ende)
184 {
185 	ulong *key;
186 	u32int right, left, v0, v1;
187 	int i, j, keystep;
188 
189 	/*
190 	 * initial permutation
191 	 */
192 	v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24);
193 	left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24);
194 	right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555);
195 	left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555);
196 	left = ((left << 6) & 0x33003300)
197 		| (left & 0xcc33cc33)
198 		| ((left >> 6) & 0x00cc00cc);
199 	left = ((left << 12) & 0x0f0f0000)
200 		| (left & 0xf0f00f0f)
201 		| ((left >> 12) & 0x0000f0f0);
202 	right = ((right << 6) & 0x33003300)
203 		| (right & 0xcc33cc33)
204 		| ((right >> 6) & 0x00cc00cc);
205 	right = ((right << 12) & 0x0f0f0000)
206 		| (right & 0xf0f00f0f)
207 		| ((right >> 12) & 0x0000f0f0);
208 
209 	for(j = 0; j < 3; j++){
210 		if((ende & 1) == DES3D) {
211 			key = &expanded_key[2-j][32-2];
212 			keystep = -2;
213 		} else {
214 			key = &expanded_key[j][0];
215 			keystep = 2;
216 		}
217 		ende >>= 1;
218 		for (i = 0; i < 8; i++) {
219 			v0 = key[0];
220 			v0 ^= (right >> 1) | (right << 31);
221 			left ^= fetch(0, v0, 24)
222 				^ fetch(2, v0, 16)
223 				^ fetch(4, v0, 8)
224 				^ fetch(6, v0, 0);
225 			v1 = key[1];
226 			v1 ^= (right << 3) | (right >> 29);
227 			left ^= fetch(1, v1, 24)
228 				^ fetch(3, v1, 16)
229 				^ fetch(5, v1, 8)
230 				^ fetch(7, v1, 0);
231 			key += keystep;
232 
233 			v0 = key[0];
234 			v0 ^= (left >> 1) | (left << 31);
235 			right ^= fetch(0, v0, 24)
236 				^ fetch(2, v0, 16)
237 				^ fetch(4, v0, 8)
238 				^ fetch(6, v0, 0);
239 			v1 = key[1];
240 			v1 ^= (left << 3) | (left >> 29);
241 			right ^= fetch(1, v1, 24)
242 				^ fetch(3, v1, 16)
243 				^ fetch(5, v1, 8)
244 				^ fetch(7, v1, 0);
245 			key += keystep;
246 		}
247 
248 		v0 = left;
249 		left = right;
250 		right = v0;
251 	}
252 
253 	/*
254 	 * final permutation, inverse initial permutation
255 	 * left and right are swapped here
256 	 */
257 	v0 = ((right << 1) & 0xaaaaaaaa) | (left & 0x55555555);
258 	v1 = (right & 0xaaaaaaaa) | ((left >> 1) & 0x55555555);
259 	v1 = ((v1 << 6) & 0x33003300)
260 		| (v1 & 0xcc33cc33)
261 		| ((v1 >> 6) & 0x00cc00cc);
262 	v1 = ((v1 << 12) & 0x0f0f0000)
263 		| (v1 & 0xf0f00f0f)
264 		| ((v1 >> 12) & 0x0000f0f0);
265 	v0 = ((v0 << 6) & 0x33003300)
266 		| (v0 & 0xcc33cc33)
267 		| ((v0 >> 6) & 0x00cc00cc);
268 	v0 = ((v0 << 12) & 0x0f0f0000)
269 		| (v0 & 0xf0f00f0f)
270 		| ((v0 >> 12) & 0x0000f0f0);
271 	text[0] = v0;
272 	text[2] = v0 >> 8;
273 	text[4] = v0 >> 16;
274 	text[6] = v0 >> 24;
275 	text[1] = v1;
276 	text[3] = v1 >> 8;
277 	text[5] = v1 >> 16;
278 	text[7] = v1 >> 24;
279 }
280 
281 /*
282  * key compression permutation, 4 bits at a time
283  */
284 static u32int comptab[] = {
285 
286 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088,
287 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088,
288 
289 0x000000,0x100000,0x000800,0x100800,0x000000,0x100000,0x000800,0x100800,
290 0x002000,0x102000,0x002800,0x102800,0x002000,0x102000,0x002800,0x102800,
291 
292 0x000000,0x000004,0x000400,0x000404,0x000000,0x000004,0x000400,0x000404,
293 0x400000,0x400004,0x400400,0x400404,0x400000,0x400004,0x400400,0x400404,
294 
295 0x000000,0x000020,0x008000,0x008020,0x800000,0x800020,0x808000,0x808020,
296 0x000002,0x000022,0x008002,0x008022,0x800002,0x800022,0x808002,0x808022,
297 
298 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200,
299 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200,
300 
301 0x000000,0x000040,0x000010,0x000050,0x004000,0x004040,0x004010,0x004050,
302 0x040000,0x040040,0x040010,0x040050,0x044000,0x044040,0x044010,0x044050,
303 
304 0x000000,0x000100,0x020000,0x020100,0x000001,0x000101,0x020001,0x020101,
305 0x080000,0x080100,0x0a0000,0x0a0100,0x080001,0x080101,0x0a0001,0x0a0101,
306 
307 0x000000,0x000100,0x040000,0x040100,0x000000,0x000100,0x040000,0x040100,
308 0x000040,0x000140,0x040040,0x040140,0x000040,0x000140,0x040040,0x040140,
309 
310 0x000000,0x400000,0x008000,0x408000,0x000008,0x400008,0x008008,0x408008,
311 0x000400,0x400400,0x008400,0x408400,0x000408,0x400408,0x008408,0x408408,
312 
313 0x000000,0x001000,0x080000,0x081000,0x000020,0x001020,0x080020,0x081020,
314 0x004000,0x005000,0x084000,0x085000,0x004020,0x005020,0x084020,0x085020,
315 
316 0x000000,0x000800,0x000000,0x000800,0x000010,0x000810,0x000010,0x000810,
317 0x800000,0x800800,0x800000,0x800800,0x800010,0x800810,0x800010,0x800810,
318 
319 0x000000,0x010000,0x000200,0x010200,0x000000,0x010000,0x000200,0x010200,
320 0x100000,0x110000,0x100200,0x110200,0x100000,0x110000,0x100200,0x110200,
321 
322 0x000000,0x000004,0x000000,0x000004,0x000080,0x000084,0x000080,0x000084,
323 0x002000,0x002004,0x002000,0x002004,0x002080,0x002084,0x002080,0x002084,
324 
325 0x000000,0x000001,0x200000,0x200001,0x020000,0x020001,0x220000,0x220001,
326 0x000002,0x000003,0x200002,0x200003,0x020002,0x020003,0x220002,0x220003,
327 };
328 
329 static int keysh[] =
330 {
331 	1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
332 };
333 
334 static void
keycompperm(u32int left,u32int right,ulong * ek)335 keycompperm(u32int left, u32int right, ulong *ek)
336 {
337 	u32int v0, v1;
338 	int i;
339 
340 	for(i = 0; i < 16; i++){
341 		left = (left << keysh[i]) | (left >> (28 - keysh[i]));
342 		left &= 0xfffffff0;
343 		right = (right << keysh[i]) | (right >> (28 - keysh[i]));
344 		right &= 0xfffffff0;
345 		v0 = comptab[6 * (1 << 4) + ((left >> (32-4)) & 0xf)]
346 			| comptab[5 * (1 << 4) + ((left >> (32-8)) & 0xf)]
347 			| comptab[4 * (1 << 4) + ((left >> (32-12)) & 0xf)]
348 			| comptab[3 * (1 << 4) + ((left >> (32-16)) & 0xf)]
349 			| comptab[2 * (1 << 4) + ((left >> (32-20)) & 0xf)]
350 			| comptab[1 * (1 << 4) + ((left >> (32-24)) & 0xf)]
351 			| comptab[0 * (1 << 4) + ((left >> (32-28)) & 0xf)];
352 		v1 = comptab[13 * (1 << 4) + ((right >> (32-4)) & 0xf)]
353 			| comptab[12 * (1 << 4) + ((right >> (32-8)) & 0xf)]
354 			| comptab[11 * (1 << 4) + ((right >> (32-12)) & 0xf)]
355 			| comptab[10 * (1 << 4) + ((right >> (32-16)) & 0xf)]
356 			| comptab[9 * (1 << 4) + ((right >> (32-20)) & 0xf)]
357 			| comptab[8 * (1 << 4) + ((right >> (32-24)) & 0xf)]
358 			| comptab[7 * (1 << 4) + ((right >> (32-28)) & 0xf)];
359 		ek[0] = (((v0 >> (24-6)) & 0x3f) << 26)
360 			| (((v0 >> (24-18)) & 0x3f) << 18)
361 			| (((v1 >> (24-6)) & 0x3f) << 10)
362 			| (((v1 >> (24-18)) & 0x3f) << 2);
363 		ek[1] = (((v0 >> (24-12)) & 0x3f) << 26)
364 			| (((v0 >> (24-24)) & 0x3f) << 18)
365 			| (((v1 >> (24-12)) & 0x3f) << 10)
366 			| (((v1 >> (24-24)) & 0x3f) << 2);
367 		ek += 2;
368 	}
369 }
370 
371 void
des_key_setup(uchar key[8],ulong * ek)372 des_key_setup(uchar key[8], ulong *ek)
373 {
374 	u32int left, right, v0, v1;
375 
376 	v0 = key[0] | ((u32int)key[2] << 8) | ((u32int)key[4] << 16) | ((u32int)key[6] << 24);
377 	v1 = key[1] | ((u32int)key[3] << 8) | ((u32int)key[5] << 16) | ((u32int)key[7] << 24);
378 	left = ((v0 >> 1) & 0x40404040)
379 		| ((v0 >> 2) & 0x10101010)
380 		| ((v0 >> 3) & 0x04040404)
381 		| ((v0 >> 4) & 0x01010101)
382 		| ((v1 >> 0) & 0x80808080)
383 		| ((v1 >> 1) & 0x20202020)
384 		| ((v1 >> 2) & 0x08080808)
385 		| ((v1 >> 3) & 0x02020202);
386 	right = ((v0 >> 1) & 0x04040404)
387 		| ((v0 << 2) & 0x10101010)
388 		| ((v0 << 5) & 0x40404040)
389 		| ((v1 << 0) & 0x08080808)
390 		| ((v1 << 3) & 0x20202020)
391 		| ((v1 << 6) & 0x80808080);
392 	left = ((left << 6) & 0x33003300)
393 		| (left & 0xcc33cc33)
394 		| ((left >> 6) & 0x00cc00cc);
395 	v0 = ((left << 12) & 0x0f0f0000)
396 		| (left & 0xf0f00f0f)
397 		| ((left >> 12) & 0x0000f0f0);
398 	right = ((right << 6) & 0x33003300)
399 		| (right & 0xcc33cc33)
400 		| ((right >> 6) & 0x00cc00cc);
401 	v1 = ((right << 12) & 0x0f0f0000)
402 		| (right & 0xf0f00f0f)
403 		| ((right >> 12) & 0x0000f0f0);
404 	left = v0 & 0xfffffff0;
405 	right = (v1 & 0xffffff00) | ((v0 << 4) & 0xf0);
406 
407 	keycompperm(left, right, ek);
408 }
409 
410 static uchar parity[128] =
411 {
412 	0x01, 0x02, 0x04, 0x07, 0x08, 0x0b, 0x0d, 0x0e,
413 	0x10, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1f,
414 	0x20, 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x2f,
415 	0x31, 0x32, 0x34, 0x37, 0x38, 0x3b, 0x3d, 0x3e,
416 	0x40, 0x43, 0x45, 0x46, 0x49, 0x4a, 0x4c, 0x4f,
417 	0x51, 0x52, 0x54, 0x57, 0x58, 0x5b, 0x5d, 0x5e,
418 	0x61, 0x62, 0x64, 0x67, 0x68, 0x6b, 0x6d, 0x6e,
419 	0x70, 0x73, 0x75, 0x76, 0x79, 0x7a, 0x7c, 0x7f,
420 	0x80, 0x83, 0x85, 0x86, 0x89, 0x8a, 0x8c, 0x8f,
421 	0x91, 0x92, 0x94, 0x97, 0x98, 0x9b, 0x9d, 0x9e,
422 	0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xab, 0xad, 0xae,
423 	0xb0, 0xb3, 0xb5, 0xb6, 0xb9, 0xba, 0xbc, 0xbf,
424 	0xc1, 0xc2, 0xc4, 0xc7, 0xc8, 0xcb, 0xcd, 0xce,
425 	0xd0, 0xd3, 0xd5, 0xd6, 0xd9, 0xda, 0xdc, 0xdf,
426 	0xe0, 0xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef,
427 	0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe,
428 };
429 
430 /*
431  *  convert a 7 byte key to an 8 byte one
432  */
433 void
des56to64(uchar * k56,uchar * k64)434 des56to64(uchar *k56, uchar *k64)
435 {
436 	u32int hi, lo;
437 
438 	hi = ((u32int)k56[0]<<24)|((u32int)k56[1]<<16)|((u32int)k56[2]<<8)|k56[3];
439 	lo = ((u32int)k56[4]<<24)|((u32int)k56[5]<<16)|((u32int)k56[6]<<8);
440 
441 	k64[0] = parity[(hi>>25)&0x7f];
442 	k64[1] = parity[(hi>>18)&0x7f];
443 	k64[2] = parity[(hi>>11)&0x7f];
444 	k64[3] = parity[(hi>>4)&0x7f];
445 	k64[4] = parity[((hi<<3)|(lo>>29))&0x7f];
446 	k64[5] = parity[(lo>>22)&0x7f];
447 	k64[6] = parity[(lo>>15)&0x7f];
448 	k64[7] = parity[(lo>>8)&0x7f];
449 }
450 
451 /*
452  *  convert an 8 byte key to a 7 byte one
453  */
454 void
des64to56(uchar * k64,uchar * k56)455 des64to56(uchar *k64, uchar *k56)
456 {
457 	u32int hi, lo;
458 
459 	hi = (((u32int)k64[0]&0xfe)<<24)|(((u32int)k64[1]&0xfe)<<17)|(((u32int)k64[2]&0xfe)<<10)
460 		|((k64[3]&0xfe)<<3)|(k64[4]>>4);
461 	lo = (((u32int)k64[4]&0xfe)<<28)|(((u32int)k64[5]&0xfe)<<21)|(((u32int)k64[6]&0xfe)<<14)
462 		|(((u32int)k64[7]&0xfe)<<7);
463 
464 	k56[0] = hi>>24;
465 	k56[1] = hi>>16;
466 	k56[2] = hi>>8;
467 	k56[3] = hi>>0;
468 	k56[4] = lo>>24;
469 	k56[5] = lo>>16;
470 	k56[6] = lo>>8;
471 }
472 
473 void
key_setup(uchar key[7],ulong * ek)474 key_setup(uchar key[7], ulong *ek)
475 {
476 	uchar k64[8];
477 
478 	des56to64(key, k64);
479 	des_key_setup(k64, ek);
480 }
481