xref: /plan9/sys/src/cmd/unix/u9fs/des.c (revision 6b6b9ac8b0b103b1e30e4d019522a78c950fce74)
1*6b6b9ac8SDavid du Colombier #include <plan9.h>
2*6b6b9ac8SDavid du Colombier 
3*6b6b9ac8SDavid du Colombier /*
4*6b6b9ac8SDavid du Colombier  *	Data Encryption Standard
5*6b6b9ac8SDavid du Colombier  *	D.P.Mitchell  83/06/08.
6*6b6b9ac8SDavid du Colombier  *
7*6b6b9ac8SDavid du Colombier  *	block_cipher(key, block, decrypting)
8*6b6b9ac8SDavid du Colombier  */
9*6b6b9ac8SDavid du Colombier 
10*6b6b9ac8SDavid du Colombier static	long	ip_low(char [8]);
11*6b6b9ac8SDavid du Colombier static	long	ip_high(char [8]);
12*6b6b9ac8SDavid du Colombier static	void	fp(long, long, char[8]);
13*6b6b9ac8SDavid du Colombier 
14*6b6b9ac8SDavid du Colombier extern int chatty9p;
15*6b6b9ac8SDavid du Colombier 
16*6b6b9ac8SDavid du Colombier /*
17*6b6b9ac8SDavid du Colombier  *	Tables for Combined S and P Boxes
18*6b6b9ac8SDavid du Colombier  */
19*6b6b9ac8SDavid du Colombier 
20*6b6b9ac8SDavid du Colombier static long  s0p[] = {
21*6b6b9ac8SDavid du Colombier 0x00410100,0x00010000,0x40400000,0x40410100,0x00400000,0x40010100,0x40010000,0x40400000,
22*6b6b9ac8SDavid du Colombier 0x40010100,0x00410100,0x00410000,0x40000100,0x40400100,0x00400000,0x00000000,0x40010000,
23*6b6b9ac8SDavid du Colombier 0x00010000,0x40000000,0x00400100,0x00010100,0x40410100,0x00410000,0x40000100,0x00400100,
24*6b6b9ac8SDavid du Colombier 0x40000000,0x00000100,0x00010100,0x40410000,0x00000100,0x40400100,0x40410000,0x00000000,
25*6b6b9ac8SDavid du Colombier 0x00000000,0x40410100,0x00400100,0x40010000,0x00410100,0x00010000,0x40000100,0x00400100,
26*6b6b9ac8SDavid du Colombier 0x40410000,0x00000100,0x00010100,0x40400000,0x40010100,0x40000000,0x40400000,0x00410000,
27*6b6b9ac8SDavid du Colombier 0x40410100,0x00010100,0x00410000,0x40400100,0x00400000,0x40000100,0x40010000,0x00000000,
28*6b6b9ac8SDavid du Colombier 0x00010000,0x00400000,0x40400100,0x00410100,0x40000000,0x40410000,0x00000100,0x40010100,
29*6b6b9ac8SDavid du Colombier };
30*6b6b9ac8SDavid du Colombier 
31*6b6b9ac8SDavid du Colombier static long  s1p[] = {
32*6b6b9ac8SDavid du Colombier 0x08021002,0x00000000,0x00021000,0x08020000,0x08000002,0x00001002,0x08001000,0x00021000,
33*6b6b9ac8SDavid du Colombier 0x00001000,0x08020002,0x00000002,0x08001000,0x00020002,0x08021000,0x08020000,0x00000002,
34*6b6b9ac8SDavid du Colombier 0x00020000,0x08001002,0x08020002,0x00001000,0x00021002,0x08000000,0x00000000,0x00020002,
35*6b6b9ac8SDavid du Colombier 0x08001002,0x00021002,0x08021000,0x08000002,0x08000000,0x00020000,0x00001002,0x08021002,
36*6b6b9ac8SDavid du Colombier 0x00020002,0x08021000,0x08001000,0x00021002,0x08021002,0x00020002,0x08000002,0x00000000,
37*6b6b9ac8SDavid du Colombier 0x08000000,0x00001002,0x00020000,0x08020002,0x00001000,0x08000000,0x00021002,0x08001002,
38*6b6b9ac8SDavid du Colombier 0x08021000,0x00001000,0x00000000,0x08000002,0x00000002,0x08021002,0x00021000,0x08020000,
39*6b6b9ac8SDavid du Colombier 0x08020002,0x00020000,0x00001002,0x08001000,0x08001002,0x00000002,0x08020000,0x00021000,
40*6b6b9ac8SDavid du Colombier };
41*6b6b9ac8SDavid du Colombier 
42*6b6b9ac8SDavid du Colombier static long  s2p[] = {
43*6b6b9ac8SDavid du Colombier 0x20800000,0x00808020,0x00000020,0x20800020,0x20008000,0x00800000,0x20800020,0x00008020,
44*6b6b9ac8SDavid du Colombier 0x00800020,0x00008000,0x00808000,0x20000000,0x20808020,0x20000020,0x20000000,0x20808000,
45*6b6b9ac8SDavid du Colombier 0x00000000,0x20008000,0x00808020,0x00000020,0x20000020,0x20808020,0x00008000,0x20800000,
46*6b6b9ac8SDavid du Colombier 0x20808000,0x00800020,0x20008020,0x00808000,0x00008020,0x00000000,0x00800000,0x20008020,
47*6b6b9ac8SDavid du Colombier 0x00808020,0x00000020,0x20000000,0x00008000,0x20000020,0x20008000,0x00808000,0x20800020,
48*6b6b9ac8SDavid du Colombier 0x00000000,0x00808020,0x00008020,0x20808000,0x20008000,0x00800000,0x20808020,0x20000000,
49*6b6b9ac8SDavid du Colombier 0x20008020,0x20800000,0x00800000,0x20808020,0x00008000,0x00800020,0x20800020,0x00008020,
50*6b6b9ac8SDavid du Colombier 0x00800020,0x00000000,0x20808000,0x20000020,0x20800000,0x20008020,0x00000020,0x00808000,
51*6b6b9ac8SDavid du Colombier };
52*6b6b9ac8SDavid du Colombier 
53*6b6b9ac8SDavid du Colombier static long  s3p[] = {
54*6b6b9ac8SDavid du Colombier 0x00080201,0x02000200,0x00000001,0x02080201,0x00000000,0x02080000,0x02000201,0x00080001,
55*6b6b9ac8SDavid du Colombier 0x02080200,0x02000001,0x02000000,0x00000201,0x02000001,0x00080201,0x00080000,0x02000000,
56*6b6b9ac8SDavid du Colombier 0x02080001,0x00080200,0x00000200,0x00000001,0x00080200,0x02000201,0x02080000,0x00000200,
57*6b6b9ac8SDavid du Colombier 0x00000201,0x00000000,0x00080001,0x02080200,0x02000200,0x02080001,0x02080201,0x00080000,
58*6b6b9ac8SDavid du Colombier 0x02080001,0x00000201,0x00080000,0x02000001,0x00080200,0x02000200,0x00000001,0x02080000,
59*6b6b9ac8SDavid du Colombier 0x02000201,0x00000000,0x00000200,0x00080001,0x00000000,0x02080001,0x02080200,0x00000200,
60*6b6b9ac8SDavid du Colombier 0x02000000,0x02080201,0x00080201,0x00080000,0x02080201,0x00000001,0x02000200,0x00080201,
61*6b6b9ac8SDavid du Colombier 0x00080001,0x00080200,0x02080000,0x02000201,0x00000201,0x02000000,0x02000001,0x02080200,
62*6b6b9ac8SDavid du Colombier };
63*6b6b9ac8SDavid du Colombier 
64*6b6b9ac8SDavid du Colombier static long  s4p[] = {
65*6b6b9ac8SDavid du Colombier 0x01000000,0x00002000,0x00000080,0x01002084,0x01002004,0x01000080,0x00002084,0x01002000,
66*6b6b9ac8SDavid du Colombier 0x00002000,0x00000004,0x01000004,0x00002080,0x01000084,0x01002004,0x01002080,0x00000000,
67*6b6b9ac8SDavid du Colombier 0x00002080,0x01000000,0x00002004,0x00000084,0x01000080,0x00002084,0x00000000,0x01000004,
68*6b6b9ac8SDavid du Colombier 0x00000004,0x01000084,0x01002084,0x00002004,0x01002000,0x00000080,0x00000084,0x01002080,
69*6b6b9ac8SDavid du Colombier 0x01002080,0x01000084,0x00002004,0x01002000,0x00002000,0x00000004,0x01000004,0x01000080,
70*6b6b9ac8SDavid du Colombier 0x01000000,0x00002080,0x01002084,0x00000000,0x00002084,0x01000000,0x00000080,0x00002004,
71*6b6b9ac8SDavid du Colombier 0x01000084,0x00000080,0x00000000,0x01002084,0x01002004,0x01002080,0x00000084,0x00002000,
72*6b6b9ac8SDavid du Colombier 0x00002080,0x01002004,0x01000080,0x00000084,0x00000004,0x00002084,0x01002000,0x01000004,
73*6b6b9ac8SDavid du Colombier };
74*6b6b9ac8SDavid du Colombier 
75*6b6b9ac8SDavid du Colombier static long  s5p[] = {
76*6b6b9ac8SDavid du Colombier 0x10000008,0x00040008,0x00000000,0x10040400,0x00040008,0x00000400,0x10000408,0x00040000,
77*6b6b9ac8SDavid du Colombier 0x00000408,0x10040408,0x00040400,0x10000000,0x10000400,0x10000008,0x10040000,0x00040408,
78*6b6b9ac8SDavid du Colombier 0x00040000,0x10000408,0x10040008,0x00000000,0x00000400,0x00000008,0x10040400,0x10040008,
79*6b6b9ac8SDavid du Colombier 0x10040408,0x10040000,0x10000000,0x00000408,0x00000008,0x00040400,0x00040408,0x10000400,
80*6b6b9ac8SDavid du Colombier 0x00000408,0x10000000,0x10000400,0x00040408,0x10040400,0x00040008,0x00000000,0x10000400,
81*6b6b9ac8SDavid du Colombier 0x10000000,0x00000400,0x10040008,0x00040000,0x00040008,0x10040408,0x00040400,0x00000008,
82*6b6b9ac8SDavid du Colombier 0x10040408,0x00040400,0x00040000,0x10000408,0x10000008,0x10040000,0x00040408,0x00000000,
83*6b6b9ac8SDavid du Colombier 0x00000400,0x10000008,0x10000408,0x10040400,0x10040000,0x00000408,0x00000008,0x10040008,
84*6b6b9ac8SDavid du Colombier };
85*6b6b9ac8SDavid du Colombier 
86*6b6b9ac8SDavid du Colombier static long  s6p[] = {
87*6b6b9ac8SDavid du Colombier 0x00000800,0x00000040,0x00200040,0x80200000,0x80200840,0x80000800,0x00000840,0x00000000,
88*6b6b9ac8SDavid du Colombier 0x00200000,0x80200040,0x80000040,0x00200800,0x80000000,0x00200840,0x00200800,0x80000040,
89*6b6b9ac8SDavid du Colombier 0x80200040,0x00000800,0x80000800,0x80200840,0x00000000,0x00200040,0x80200000,0x00000840,
90*6b6b9ac8SDavid du Colombier 0x80200800,0x80000840,0x00200840,0x80000000,0x80000840,0x80200800,0x00000040,0x00200000,
91*6b6b9ac8SDavid du Colombier 0x80000840,0x00200800,0x80200800,0x80000040,0x00000800,0x00000040,0x00200000,0x80200800,
92*6b6b9ac8SDavid du Colombier 0x80200040,0x80000840,0x00000840,0x00000000,0x00000040,0x80200000,0x80000000,0x00200040,
93*6b6b9ac8SDavid du Colombier 0x00000000,0x80200040,0x00200040,0x00000840,0x80000040,0x00000800,0x80200840,0x00200000,
94*6b6b9ac8SDavid du Colombier 0x00200840,0x80000000,0x80000800,0x80200840,0x80200000,0x00200840,0x00200800,0x80000800,
95*6b6b9ac8SDavid du Colombier };
96*6b6b9ac8SDavid du Colombier 
97*6b6b9ac8SDavid du Colombier static long  s7p[] = {
98*6b6b9ac8SDavid du Colombier 0x04100010,0x04104000,0x00004010,0x00000000,0x04004000,0x00100010,0x04100000,0x04104010,
99*6b6b9ac8SDavid du Colombier 0x00000010,0x04000000,0x00104000,0x00004010,0x00104010,0x04004010,0x04000010,0x04100000,
100*6b6b9ac8SDavid du Colombier 0x00004000,0x00104010,0x00100010,0x04004000,0x04104010,0x04000010,0x00000000,0x00104000,
101*6b6b9ac8SDavid du Colombier 0x04000000,0x00100000,0x04004010,0x04100010,0x00100000,0x00004000,0x04104000,0x00000010,
102*6b6b9ac8SDavid du Colombier 0x00100000,0x00004000,0x04000010,0x04104010,0x00004010,0x04000000,0x00000000,0x00104000,
103*6b6b9ac8SDavid du Colombier 0x04100010,0x04004010,0x04004000,0x00100010,0x04104000,0x00000010,0x00100010,0x04004000,
104*6b6b9ac8SDavid du Colombier 0x04104010,0x00100000,0x04100000,0x04000010,0x00104000,0x00004010,0x04004010,0x04100000,
105*6b6b9ac8SDavid du Colombier 0x00000010,0x04104000,0x00104010,0x00000000,0x04000000,0x04100010,0x00004000,0x00104010,
106*6b6b9ac8SDavid du Colombier };
107*6b6b9ac8SDavid du Colombier 
108*6b6b9ac8SDavid du Colombier /*
109*6b6b9ac8SDavid du Colombier  *	DES electronic codebook encryption of one block
110*6b6b9ac8SDavid du Colombier  */
111*6b6b9ac8SDavid du Colombier static void
112*6b6b9ac8SDavid du Colombier block_cipher(char expanded_key[128], char text[8], int decrypting)
113*6b6b9ac8SDavid du Colombier {
114*6b6b9ac8SDavid du Colombier 	char *key;
115*6b6b9ac8SDavid du Colombier 	long crypto, temp, right, left;
116*6b6b9ac8SDavid du Colombier 	int i, key_offset;
117*6b6b9ac8SDavid du Colombier 
118*6b6b9ac8SDavid du Colombier 	key = expanded_key;
119*6b6b9ac8SDavid du Colombier 	left = ip_low(text);
120*6b6b9ac8SDavid du Colombier 	right = ip_high(text);
121*6b6b9ac8SDavid du Colombier 	if (decrypting) {
122*6b6b9ac8SDavid du Colombier 		key_offset = 16;
123*6b6b9ac8SDavid du Colombier 		key = key + 128 - 8;
124*6b6b9ac8SDavid du Colombier 	} else
125*6b6b9ac8SDavid du Colombier 		key_offset = 0;
126*6b6b9ac8SDavid du Colombier 	for (i = 0; i < 16; i++) {
127*6b6b9ac8SDavid du Colombier 		temp = (right << 1) | ((right >> 31) & 1);
128*6b6b9ac8SDavid du Colombier 		crypto  = s0p[(temp         & 0x3f) ^ *key++];
129*6b6b9ac8SDavid du Colombier 		crypto |= s1p[((temp >>  4) & 0x3f) ^ *key++];
130*6b6b9ac8SDavid du Colombier 		crypto |= s2p[((temp >>  8) & 0x3f) ^ *key++];
131*6b6b9ac8SDavid du Colombier 		crypto |= s3p[((temp >> 12) & 0x3f) ^ *key++];
132*6b6b9ac8SDavid du Colombier 		crypto |= s4p[((temp >> 16) & 0x3f) ^ *key++];
133*6b6b9ac8SDavid du Colombier 		crypto |= s5p[((temp >> 20) & 0x3f) ^ *key++];
134*6b6b9ac8SDavid du Colombier 		crypto |= s6p[((temp >> 24) & 0x3f) ^ *key++];
135*6b6b9ac8SDavid du Colombier 		temp = ((right & 1) << 5) | ((right >> 27) & 0x1f);
136*6b6b9ac8SDavid du Colombier 		crypto |= s7p[temp ^ *key++];
137*6b6b9ac8SDavid du Colombier 		temp = left;
138*6b6b9ac8SDavid du Colombier 		left = right;
139*6b6b9ac8SDavid du Colombier 		right = temp ^ crypto;
140*6b6b9ac8SDavid du Colombier 		key -= key_offset;
141*6b6b9ac8SDavid du Colombier 	}
142*6b6b9ac8SDavid du Colombier 	/*
143*6b6b9ac8SDavid du Colombier 	 *	standard final permutation (IPI)
144*6b6b9ac8SDavid du Colombier 	 *	left and right are reversed here
145*6b6b9ac8SDavid du Colombier 	 */
146*6b6b9ac8SDavid du Colombier 	fp(right, left, text);
147*6b6b9ac8SDavid du Colombier }
148*6b6b9ac8SDavid du Colombier 
149*6b6b9ac8SDavid du Colombier /*
150*6b6b9ac8SDavid du Colombier  *	Initial Permutation
151*6b6b9ac8SDavid du Colombier  */
152*6b6b9ac8SDavid du Colombier static long iptab[] = {
153*6b6b9ac8SDavid du Colombier 	0x00000000, 0x00008000, 0x00000000, 0x00008000,
154*6b6b9ac8SDavid du Colombier 	0x00000080, 0x00008080, 0x00000080, 0x00008080
155*6b6b9ac8SDavid du Colombier };
156*6b6b9ac8SDavid du Colombier 
157*6b6b9ac8SDavid du Colombier static long
158*6b6b9ac8SDavid du Colombier ip_low(char block[8])
159*6b6b9ac8SDavid du Colombier {
160*6b6b9ac8SDavid du Colombier 	int i;
161*6b6b9ac8SDavid du Colombier 	long l;
162*6b6b9ac8SDavid du Colombier 
163*6b6b9ac8SDavid du Colombier 	l = 0;
164*6b6b9ac8SDavid du Colombier 	for(i = 0; i < 8; i++){
165*6b6b9ac8SDavid du Colombier 		l |= iptab[(block[i] >> 4) & 7] >> i;
166*6b6b9ac8SDavid du Colombier 		l |= iptab[block[i] & 7] << (16 - i);
167*6b6b9ac8SDavid du Colombier 	}
168*6b6b9ac8SDavid du Colombier 	return l;
169*6b6b9ac8SDavid du Colombier }
170*6b6b9ac8SDavid du Colombier 
171*6b6b9ac8SDavid du Colombier static long
172*6b6b9ac8SDavid du Colombier ip_high(char block[8])
173*6b6b9ac8SDavid du Colombier {
174*6b6b9ac8SDavid du Colombier 	int i;
175*6b6b9ac8SDavid du Colombier 	long l;
176*6b6b9ac8SDavid du Colombier 
177*6b6b9ac8SDavid du Colombier 	l = 0;
178*6b6b9ac8SDavid du Colombier 	for(i = 0; i < 8; i++){
179*6b6b9ac8SDavid du Colombier 		l |= iptab[(block[i] >> 5) & 7] >> i;
180*6b6b9ac8SDavid du Colombier 		l |= iptab[(block[i] >> 1) & 7] << (16 - i);
181*6b6b9ac8SDavid du Colombier 	}
182*6b6b9ac8SDavid du Colombier 	return l;
183*6b6b9ac8SDavid du Colombier }
184*6b6b9ac8SDavid du Colombier 
185*6b6b9ac8SDavid du Colombier /*
186*6b6b9ac8SDavid du Colombier  *	Final Permutation
187*6b6b9ac8SDavid du Colombier  */
188*6b6b9ac8SDavid du Colombier static unsigned long	fptab[] = {
189*6b6b9ac8SDavid du Colombier 0x00000000,0x80000000,0x00800000,0x80800000,0x00008000,0x80008000,0x00808000,0x80808000,
190*6b6b9ac8SDavid du Colombier 0x00000080,0x80000080,0x00800080,0x80800080,0x00008080,0x80008080,0x00808080,0x80808080,
191*6b6b9ac8SDavid du Colombier };
192*6b6b9ac8SDavid du Colombier 
193*6b6b9ac8SDavid du Colombier static void
194*6b6b9ac8SDavid du Colombier fp(long left, long right, char text[8])
195*6b6b9ac8SDavid du Colombier {
196*6b6b9ac8SDavid du Colombier 	unsigned long ta[2], t, v[2];
197*6b6b9ac8SDavid du Colombier 	int i, j, sh;
198*6b6b9ac8SDavid du Colombier 
199*6b6b9ac8SDavid du Colombier 	ta[0] = right;
200*6b6b9ac8SDavid du Colombier 	ta[1] = left;
201*6b6b9ac8SDavid du Colombier 	v[0] = v[1] = 0;
202*6b6b9ac8SDavid du Colombier 	for(i = 0; i < 2; i++){
203*6b6b9ac8SDavid du Colombier 		t = ta[i];
204*6b6b9ac8SDavid du Colombier 		sh = i;
205*6b6b9ac8SDavid du Colombier 		for(j = 0; j < 4; j++){
206*6b6b9ac8SDavid du Colombier 			v[1] |= fptab[t & 0xf] >> sh;
207*6b6b9ac8SDavid du Colombier 			t >>= 4;
208*6b6b9ac8SDavid du Colombier 			v[0] |= fptab[t & 0xf] >> sh;
209*6b6b9ac8SDavid du Colombier 			t >>= 4;
210*6b6b9ac8SDavid du Colombier 			sh += 2;
211*6b6b9ac8SDavid du Colombier 		}
212*6b6b9ac8SDavid du Colombier 	}
213*6b6b9ac8SDavid du Colombier 	for(i = 0; i < 2; i++)
214*6b6b9ac8SDavid du Colombier 		for(j = 0; j < 4; j++){
215*6b6b9ac8SDavid du Colombier 			*text++ = v[i];
216*6b6b9ac8SDavid du Colombier 			v[i] >>= 8;
217*6b6b9ac8SDavid du Colombier 		}
218*6b6b9ac8SDavid du Colombier }
219*6b6b9ac8SDavid du Colombier 
220*6b6b9ac8SDavid du Colombier /*
221*6b6b9ac8SDavid du Colombier  *	Key set-up
222*6b6b9ac8SDavid du Colombier  */
223*6b6b9ac8SDavid du Colombier static uchar keyexpand[][15][2] = {
224*6b6b9ac8SDavid du Colombier 	{   3,  2,   9,  8,  18,  8,  27, 32,  33,  2,  42, 16,  48,  8,  65, 16,
225*6b6b9ac8SDavid du Colombier 	   74,  2,  80,  2,  89,  4,  99, 16, 104,  4, 122, 32,   0,  0, },
226*6b6b9ac8SDavid du Colombier 	{   1,  4,   8,  1,  18,  4,  25, 32,  34, 32,  41,  8,  50,  8,  59, 32,
227*6b6b9ac8SDavid du Colombier 	   64, 16,  75,  4,  90,  1,  97, 16, 106,  2, 112,  2, 123,  1, },
228*6b6b9ac8SDavid du Colombier 	{   2,  1,  19,  8,  35,  1,  40,  1,  50,  4,  57, 32,  75,  2,  80, 32,
229*6b6b9ac8SDavid du Colombier 	   89,  1,  96, 16, 107,  4, 120,  8,   0,  0,   0,  0,   0,  0, },
230*6b6b9ac8SDavid du Colombier 	{   4, 32,  20,  2,  31,  4,  37, 32,  47,  1,  54,  1,  63,  2,  68,  1,
231*6b6b9ac8SDavid du Colombier 	   78,  4,  84,  8, 101, 16, 108,  4, 119, 16, 126,  8,   0,  0, },
232*6b6b9ac8SDavid du Colombier 	{   5,  4,  15,  4,  21, 32,  31,  1,  38,  1,  47,  2,  53,  2,  68,  8,
233*6b6b9ac8SDavid du Colombier 	   85, 16,  92,  4, 103, 16, 108, 32, 118, 32, 124,  2,   0,  0, },
234*6b6b9ac8SDavid du Colombier 	{  15,  2,  21,  2,  39,  8,  46, 16,  55, 32,  61,  1,  71, 16,  76, 32,
235*6b6b9ac8SDavid du Colombier 	   86, 32,  93,  4, 102,  2, 108, 16, 117,  8, 126,  1,   0,  0, },
236*6b6b9ac8SDavid du Colombier 	{  14, 16,  23, 32,  29,  1,  38,  8,  52,  2,  63,  4,  70,  2,  76, 16,
237*6b6b9ac8SDavid du Colombier 	   85,  8, 100,  1, 110,  4, 116,  8, 127,  8,   0,  0,   0,  0, },
238*6b6b9ac8SDavid du Colombier 	{   1,  8,   8, 32,  17,  1,  24, 16,  35,  4,  50,  1,  57, 16,  67,  8,
239*6b6b9ac8SDavid du Colombier 	   83,  1,  88,  1,  98,  4, 105, 32, 114, 32, 123,  2,   0,  0, },
240*6b6b9ac8SDavid du Colombier 	{   0,  1,  11, 16,  16,  4,  35,  2,  40, 32,  49,  1,  56, 16,  65,  2,
241*6b6b9ac8SDavid du Colombier 	   74, 16,  80,  8,  99,  8, 115,  1, 121,  4,   0,  0,   0,  0, },
242*6b6b9ac8SDavid du Colombier 	{   9, 16,  18,  2,  24,  2,  33,  4,  43, 16,  48,  4,  66, 32,  73,  8,
243*6b6b9ac8SDavid du Colombier 	   82,  8,  91, 32,  97,  2, 106, 16, 112,  8, 122,  1,   0,  0, },
244*6b6b9ac8SDavid du Colombier 	{  14, 32,  21,  4,  30,  2,  36, 16,  45,  8,  60,  1,  69,  2,  87,  8,
245*6b6b9ac8SDavid du Colombier 	   94, 16, 103, 32, 109,  1, 118,  8, 124, 32,   0,  0,   0,  0, },
246*6b6b9ac8SDavid du Colombier 	{   7,  4,  14,  2,  20, 16,  29,  8,  44,  1,  54,  4,  60,  8,  71,  8,
247*6b6b9ac8SDavid du Colombier 	   78, 16,  87, 32,  93,  1, 102,  8, 116,  2, 125,  4,   0,  0, },
248*6b6b9ac8SDavid du Colombier 	{   7,  2,  12,  1,  22,  4,  28,  8,  45, 16,  52,  4,  63, 16,  70,  8,
249*6b6b9ac8SDavid du Colombier 	   84,  2,  95,  4, 101, 32, 111,  1, 118,  1,   0,  0,   0,  0, },
250*6b6b9ac8SDavid du Colombier 	{   6, 16,  13, 16,  20,  4,  31, 16,  36, 32,  46, 32,  53,  4,  62,  2,
251*6b6b9ac8SDavid du Colombier 	   69, 32,  79,  1,  86,  1,  95,  2, 101,  2, 119,  8,   0,  0, },
252*6b6b9ac8SDavid du Colombier 	{   0, 32,  10,  8,  19, 32,  25,  2,  34, 16,  40,  8,  59,  8,  66,  2,
253*6b6b9ac8SDavid du Colombier 	   72,  2,  81,  4,  91, 16,  96,  4, 115,  2, 121,  8,   0,  0, },
254*6b6b9ac8SDavid du Colombier 	{   3, 16,  10,  4,  17, 32,  26, 32,  33,  8,  42,  8,  51, 32,  57,  2,
255*6b6b9ac8SDavid du Colombier 	   67,  4,  82,  1,  89, 16,  98,  2, 104,  2, 113,  4, 120,  1, },
256*6b6b9ac8SDavid du Colombier 	{   1, 16,  11,  8,  27,  1,  32,  1,  42,  4,  49, 32,  58, 32,  67,  2,
257*6b6b9ac8SDavid du Colombier 	   72, 32,  81,  1,  88, 16,  99,  4, 114,  1,   0,  0,   0,  0, },
258*6b6b9ac8SDavid du Colombier 	{   6, 32,  12,  2,  23,  4,  29, 32,  39,  1,  46,  1,  55,  2,  61,  2,
259*6b6b9ac8SDavid du Colombier 	   70,  4,  76,  8,  93, 16, 100,  4, 111, 16, 116, 32,   0,  0, },
260*6b6b9ac8SDavid du Colombier 	{   6,  2,  13, 32,  23,  1,  30,  1,  39,  2,  45,  2,  63,  8,  77, 16,
261*6b6b9ac8SDavid du Colombier 	   84,  4,  95, 16, 100, 32, 110, 32, 117,  4, 127,  4,   0,  0, },
262*6b6b9ac8SDavid du Colombier 	{   4,  1,  13,  2,  31,  8,  38, 16,  47, 32,  53,  1,  62,  8,  68, 32,
263*6b6b9ac8SDavid du Colombier 	   78, 32,  85,  4,  94,  2, 100, 16, 109,  8, 127,  2,   0,  0, },
264*6b6b9ac8SDavid du Colombier 	{   5, 16,  15, 32,  21,  1,  30,  8,  44,  2,  55,  4,  61, 32,  68, 16,
265*6b6b9ac8SDavid du Colombier 	   77,  8,  92,  1, 102,  4, 108,  8, 126, 16,   0,  0,   0,  0, },
266*6b6b9ac8SDavid du Colombier 	{   2,  8,   9,  1,  16, 16,  27,  4,  42,  1,  49, 16,  58,  2,  75,  1,
267*6b6b9ac8SDavid du Colombier 	   80,  1,  90,  4,  97, 32, 106, 32, 113,  8, 120, 32,   0,  0, },
268*6b6b9ac8SDavid du Colombier 	{   2,  4,   8,  4,  27,  2,  32, 32,  41,  1,  48, 16,  59,  4,  66, 16,
269*6b6b9ac8SDavid du Colombier 	   72,  8,  91,  8, 107,  1, 112,  1, 123, 16,   0,  0,   0,  0, },
270*6b6b9ac8SDavid du Colombier 	{   3,  8,  10,  2,  16,  2,  25,  4,  35, 16,  40,  4,  59,  2,  65,  8,
271*6b6b9ac8SDavid du Colombier 	   74,  8,  83, 32,  89,  2,  98, 16, 104,  8, 121, 16,   0,  0, },
272*6b6b9ac8SDavid du Colombier 	{   4,  2,  13,  4,  22,  2,  28, 16,  37,  8,  52,  1,  62,  4,  79,  8,
273*6b6b9ac8SDavid du Colombier 	   86, 16,  95, 32, 101,  1, 110,  8, 126, 32,   0,  0,   0,  0, },
274*6b6b9ac8SDavid du Colombier 	{   5, 32,  12, 16,  21,  8,  36,  1,  46,  4,  52,  8,  70, 16,  79, 32,
275*6b6b9ac8SDavid du Colombier 	   85,  1,  94,  8, 108,  2, 119,  4, 126,  2,   0,  0,   0,  0, },
276*6b6b9ac8SDavid du Colombier 	{   5,  2,  14,  4,  20,  8,  37, 16,  44,  4,  55, 16,  60, 32,  76,  2,
277*6b6b9ac8SDavid du Colombier 	   87,  4,  93, 32, 103,  1, 110,  1, 119,  2, 124,  1,   0,  0, },
278*6b6b9ac8SDavid du Colombier 	{   7, 32,  12,  4,  23, 16,  28, 32,  38, 32,  45,  4,  54,  2,  60, 16,
279*6b6b9ac8SDavid du Colombier 	   71,  1,  78,  1,  87,  2,  93,  2, 111,  8, 118, 16, 125, 16, },
280*6b6b9ac8SDavid du Colombier 	{   1,  1,  11, 32,  17,  2,  26, 16,  32,  8,  51,  8,  64,  2,  73,  4,
281*6b6b9ac8SDavid du Colombier 	   83, 16,  88,  4, 107,  2, 112, 32, 122,  8,   0,  0,   0,  0, },
282*6b6b9ac8SDavid du Colombier 	{   0,  4,   9, 32,  18, 32,  25,  8,  34,  8,  43, 32,  49,  2,  58, 16,
283*6b6b9ac8SDavid du Colombier 	   74,  1,  81, 16,  90,  2,  96,  2, 105,  4, 115, 16, 122,  4, },
284*6b6b9ac8SDavid du Colombier 	{   2,  2,  19,  1,  24,  1,  34,  4,  41, 32,  50, 32,  57,  8,  64, 32,
285*6b6b9ac8SDavid du Colombier 	   73,  1,  80, 16,  91,  4, 106,  1, 113, 16, 123,  8,   0,  0, },
286*6b6b9ac8SDavid du Colombier 	{   3,  4,  10, 16,  16,  8,  35,  8,  51,  1,  56,  1,  67, 16,  72,  4,
287*6b6b9ac8SDavid du Colombier 	   91,  2,  96, 32, 105,  1, 112, 16, 121,  2,   0,  0,   0,  0, },
288*6b6b9ac8SDavid du Colombier 	{   4, 16,  15,  1,  22,  1,  31,  2,  37,  2,  55,  8,  62, 16,  69, 16,
289*6b6b9ac8SDavid du Colombier 	   76,  4,  87, 16,  92, 32, 102, 32, 109,  4, 118,  2, 125, 32, },
290*6b6b9ac8SDavid du Colombier 	{   6,  4,  23,  8,  30, 16,  39, 32,  45,  1,  54,  8,  70, 32,  77,  4,
291*6b6b9ac8SDavid du Colombier 	   86,  2,  92, 16, 101,  8, 116,  1, 125,  2,   0,  0,   0,  0, },
292*6b6b9ac8SDavid du Colombier 	{   4,  4,  13,  1,  22,  8,  36,  2,  47,  4,  53, 32,  63,  1,  69,  8,
293*6b6b9ac8SDavid du Colombier 	   84,  1,  94,  4, 100,  8, 117, 16, 127, 32,   0,  0,   0,  0, },
294*6b6b9ac8SDavid du Colombier 	{   3, 32,   8, 16,  19,  4,  34,  1,  41, 16,  50,  2,  56,  2,  67,  1,
295*6b6b9ac8SDavid du Colombier 	   72,  1,  82,  4,  89, 32,  98, 32, 105,  8, 114,  8, 121,  1, },
296*6b6b9ac8SDavid du Colombier 	{   1, 32,  19,  2,  24, 32,  33,  1,  40, 16,  51,  4,  64,  8,  83,  8,
297*6b6b9ac8SDavid du Colombier 	   99,  1, 104,  1, 114,  4, 120,  4,   0,  0,   0,  0,   0,  0, },
298*6b6b9ac8SDavid du Colombier 	{   8,  2,  17,  4,  27, 16,  32,  4,  51,  2,  56, 32,  66,  8,  75, 32,
299*6b6b9ac8SDavid du Colombier 	   81,  2,  90, 16,  96,  8, 115,  8, 122,  2,   0,  0,   0,  0, },
300*6b6b9ac8SDavid du Colombier 	{   2, 16,  18,  1,  25, 16,  34,  2,  40,  2,  49,  4,  59, 16,  66,  4,
301*6b6b9ac8SDavid du Colombier 	   73, 32,  82, 32,  89,  8,  98,  8, 107, 32, 113,  2, 123,  4, },
302*6b6b9ac8SDavid du Colombier 	{   7,  1,  13,  8,  28,  1,  38,  4,  44,  8,  61, 16,  71, 32,  77,  1,
303*6b6b9ac8SDavid du Colombier 	   86,  8, 100,  2, 111,  4, 117, 32, 124, 16,   0,  0,   0,  0, },
304*6b6b9ac8SDavid du Colombier 	{  12,  8,  29, 16,  36,  4,  47, 16,  52, 32,  62, 32,  68,  2,  79,  4,
305*6b6b9ac8SDavid du Colombier 	   85, 32,  95,  1, 102,  1, 111,  2, 117,  2, 126,  4,   0,  0, },
306*6b6b9ac8SDavid du Colombier 	{   5,  1,  15, 16,  20, 32,  30, 32,  37,  4,  46,  2,  52, 16,  61,  8,
307*6b6b9ac8SDavid du Colombier 	   70,  1,  79,  2,  85,  2, 103,  8, 110, 16, 119, 32, 124,  4, },
308*6b6b9ac8SDavid du Colombier 	{   0, 16,   9,  2,  18, 16,  24,  8,  43,  8,  59,  1,  65,  4,  75, 16,
309*6b6b9ac8SDavid du Colombier 	   80,  4,  99,  2, 104, 32, 113,  1, 123, 32,   0,  0,   0,  0, },
310*6b6b9ac8SDavid du Colombier 	{  10, 32,  17,  8,  26,  8,  35, 32,  41,  2,  50, 16,  56,  8,  66,  1,
311*6b6b9ac8SDavid du Colombier 	   73, 16,  82,  2,  88,  2,  97,  4, 107, 16, 112,  4, 121, 32, },
312*6b6b9ac8SDavid du Colombier 	{   0,  2,  11,  1,  16,  1,  26,  4,  33, 32,  42, 32,  49,  8,  58,  8,
313*6b6b9ac8SDavid du Colombier 	   65,  1,  72, 16,  83,  4,  98,  1, 105, 16, 114,  2,   0,  0, },
314*6b6b9ac8SDavid du Colombier 	{   8,  8,  27,  8,  43,  1,  48,  1,  58,  4,  64,  4,  83,  2,  88, 32,
315*6b6b9ac8SDavid du Colombier 	   97,  1, 104, 16, 115,  4, 122, 16,   0,  0,   0,  0,   0,  0, },
316*6b6b9ac8SDavid du Colombier 	{   5,  8,  14,  1,  23,  2,  29,  2,  47,  8,  54, 16,  63, 32,  68,  4,
317*6b6b9ac8SDavid du Colombier 	   79, 16,  84, 32,  94, 32, 101,  4, 110,  2, 116, 16, 127,  1, },
318*6b6b9ac8SDavid du Colombier 	{   4,  8,  15,  8,  22, 16,  31, 32,  37,  1,  46,  8,  60,  2,  69,  4,
319*6b6b9ac8SDavid du Colombier 	   78,  2,  84, 16,  93,  8, 108,  1, 118,  4,   0,  0,   0,  0, },
320*6b6b9ac8SDavid du Colombier 	{   7, 16,  14,  8,  28,  2,  39,  4,  45, 32,  55,  1,  62,  1,  76,  1,
321*6b6b9ac8SDavid du Colombier 	   86,  4,  92,  8, 109, 16, 116,  4, 125,  1,   0,  0,   0,  0, },
322*6b6b9ac8SDavid du Colombier 	{   1,  2,  11,  4,  26,  1,  33, 16,  42,  2,  48,  2,  57,  4,  64,  1,
323*6b6b9ac8SDavid du Colombier 	   74,  4,  81, 32,  90, 32,  97,  8, 106,  8, 115, 32, 120, 16, },
324*6b6b9ac8SDavid du Colombier 	{   2, 32,  11,  2,  16, 32,  25,  1,  32, 16,  43,  4,  58,  1,  75,  8,
325*6b6b9ac8SDavid du Colombier 	   91,  1,  96,  1, 106,  4, 113, 32,   0,  0,   0,  0,   0,  0, },
326*6b6b9ac8SDavid du Colombier 	{   3,  1,   9,  4,  19, 16,  24,  4,  43,  2,  48, 32,  57,  1,  67, 32,
327*6b6b9ac8SDavid du Colombier 	   73,  2,  82, 16,  88,  8, 107,  8, 120,  2,   0,  0,   0,  0, },
328*6b6b9ac8SDavid du Colombier 	{   0,  8,  10,  1,  17, 16,  26,  2,  32,  2,  41,  4,  51, 16,  56,  4,
329*6b6b9ac8SDavid du Colombier 	   65, 32,  74, 32,  81,  8,  90,  8,  99, 32, 105,  2, 114, 16, },
330*6b6b9ac8SDavid du Colombier 	{   6,  1,  20,  1,  30,  4,  36,  8,  53, 16,  60,  4,  69,  1,  78,  8,
331*6b6b9ac8SDavid du Colombier 	   92,  2, 103,  4, 109, 32, 119,  1, 125,  8,   0,  0,   0,  0, },
332*6b6b9ac8SDavid du Colombier 	{   7,  8,  21, 16,  28,  4,  39, 16,  44, 32,  54, 32,  61,  4,  71,  4,
333*6b6b9ac8SDavid du Colombier 	   77, 32,  87,  1,  94,  1, 103,  2, 109,  2, 124,  8,   0,  0, },
334*6b6b9ac8SDavid du Colombier 	{   6,  8,  12, 32,  22, 32,  29,  4,  38,  2,  44, 16,  53,  8,  71,  2,
335*6b6b9ac8SDavid du Colombier 	   77,  2,  95,  8, 102, 16, 111, 32, 117,  1, 127, 16,   0,  0, }
336*6b6b9ac8SDavid du Colombier };
337*6b6b9ac8SDavid du Colombier 
338*6b6b9ac8SDavid du Colombier static void
339*6b6b9ac8SDavid du Colombier key_setup(char key[DESKEYLEN], char *ek)
340*6b6b9ac8SDavid du Colombier {
341*6b6b9ac8SDavid du Colombier 	int i, j, k, mask;
342*6b6b9ac8SDavid du Colombier 	uchar (*x)[2];
343*6b6b9ac8SDavid du Colombier 
344*6b6b9ac8SDavid du Colombier 	memset(ek, 0, 128);
345*6b6b9ac8SDavid du Colombier 	x = keyexpand[0];
346*6b6b9ac8SDavid du Colombier 	for(i = 0; i < 7; i++){
347*6b6b9ac8SDavid du Colombier 		k = key[i];
348*6b6b9ac8SDavid du Colombier 		for(mask = 0x80; mask; mask >>= 1){
349*6b6b9ac8SDavid du Colombier 			if(k & mask)
350*6b6b9ac8SDavid du Colombier 				for(j = 0; j < 15; j++)
351*6b6b9ac8SDavid du Colombier 					ek[x[j][0]] |= x[j][1];
352*6b6b9ac8SDavid du Colombier 			x += 15;
353*6b6b9ac8SDavid du Colombier 		}
354*6b6b9ac8SDavid du Colombier 	}
355*6b6b9ac8SDavid du Colombier }
356