1*0cbf10f5SDavid du Colombier #include <stdlib.h>
2*0cbf10f5SDavid du Colombier #include <string.h>
3*0cbf10f5SDavid du Colombier #include <stdio.h>
4*0cbf10f5SDavid du Colombier
5*0cbf10f5SDavid du Colombier extern long read(int, void*, long);
6*0cbf10f5SDavid du Colombier typedef unsigned char uchar;
7*0cbf10f5SDavid du Colombier typedef unsigned long ulong;
8*0cbf10f5SDavid du Colombier #define NAMELEN 28
9*0cbf10f5SDavid du Colombier
10*0cbf10f5SDavid du Colombier /*********** auth.h ************/
11*0cbf10f5SDavid du Colombier typedef struct Ticket Ticket;
12*0cbf10f5SDavid du Colombier typedef struct Ticketreq Ticketreq;
13*0cbf10f5SDavid du Colombier typedef struct Authenticator Authenticator;
14*0cbf10f5SDavid du Colombier typedef struct Nvrsafe Nvrsafe;
15*0cbf10f5SDavid du Colombier typedef struct Passwordreq Passwordreq;
16*0cbf10f5SDavid du Colombier typedef struct Chalstate Chalstate;
17*0cbf10f5SDavid du Colombier
18*0cbf10f5SDavid du Colombier enum
19*0cbf10f5SDavid du Colombier {
20*0cbf10f5SDavid du Colombier DOMLEN= 48, /* length of an authentication domain name */
21*0cbf10f5SDavid du Colombier DESKEYLEN= 7, /* length of a des key for encrypt/decrypt */
22*0cbf10f5SDavid du Colombier CHALLEN= 8, /* length of a challenge */
23*0cbf10f5SDavid du Colombier NETCHLEN= 16, /* max network challenge length */
24*0cbf10f5SDavid du Colombier CONFIGLEN= 14,
25*0cbf10f5SDavid du Colombier
26*0cbf10f5SDavid du Colombier KEYDBLEN= NAMELEN+DESKEYLEN+4+2
27*0cbf10f5SDavid du Colombier };
28*0cbf10f5SDavid du Colombier
29*0cbf10f5SDavid du Colombier /* encryption numberings (anti-replay) */
30*0cbf10f5SDavid du Colombier enum
31*0cbf10f5SDavid du Colombier {
32*0cbf10f5SDavid du Colombier AuthTreq=1, /* ticket request */
33*0cbf10f5SDavid du Colombier AuthChal=2, /* challenge box request */
34*0cbf10f5SDavid du Colombier AuthPass=3, /* change password */
35*0cbf10f5SDavid du Colombier
36*0cbf10f5SDavid du Colombier AuthOK=4, /* reply follows */
37*0cbf10f5SDavid du Colombier AuthErr=5, /* error follows */
38*0cbf10f5SDavid du Colombier
39*0cbf10f5SDavid du Colombier AuthTs=64, /* ticket encrypted with server's key */
40*0cbf10f5SDavid du Colombier AuthTc, /* ticket encrypted with client's key */
41*0cbf10f5SDavid du Colombier AuthAs, /* server generated authenticator */
42*0cbf10f5SDavid du Colombier AuthAc /* client generated authenticator */
43*0cbf10f5SDavid du Colombier };
44*0cbf10f5SDavid du Colombier
45*0cbf10f5SDavid du Colombier struct Ticketreq
46*0cbf10f5SDavid du Colombier {
47*0cbf10f5SDavid du Colombier char type;
48*0cbf10f5SDavid du Colombier char authid[NAMELEN]; /* server's encryption id */
49*0cbf10f5SDavid du Colombier char authdom[DOMLEN]; /* server's authentication domain */
50*0cbf10f5SDavid du Colombier char chal[CHALLEN]; /* challenge from server */
51*0cbf10f5SDavid du Colombier char hostid[NAMELEN]; /* host's encryption id */
52*0cbf10f5SDavid du Colombier char uid[NAMELEN]; /* uid of requesting user on host */
53*0cbf10f5SDavid du Colombier };
54*0cbf10f5SDavid du Colombier #define TICKREQLEN (3*NAMELEN+CHALLEN+DOMLEN+1)
55*0cbf10f5SDavid du Colombier
56*0cbf10f5SDavid du Colombier struct Ticket
57*0cbf10f5SDavid du Colombier {
58*0cbf10f5SDavid du Colombier char num; /* replay protection */
59*0cbf10f5SDavid du Colombier char chal[CHALLEN]; /* server challenge */
60*0cbf10f5SDavid du Colombier char cuid[NAMELEN]; /* uid on client */
61*0cbf10f5SDavid du Colombier char suid[NAMELEN]; /* uid on server */
62*0cbf10f5SDavid du Colombier char key[DESKEYLEN]; /* nonce DES key */
63*0cbf10f5SDavid du Colombier };
64*0cbf10f5SDavid du Colombier #define TICKETLEN (CHALLEN+2*NAMELEN+DESKEYLEN+1)
65*0cbf10f5SDavid du Colombier
66*0cbf10f5SDavid du Colombier struct Authenticator
67*0cbf10f5SDavid du Colombier {
68*0cbf10f5SDavid du Colombier char num; /* replay protection */
69*0cbf10f5SDavid du Colombier char chal[CHALLEN];
70*0cbf10f5SDavid du Colombier ulong id; /* authenticator id, ++'d with each auth */
71*0cbf10f5SDavid du Colombier };
72*0cbf10f5SDavid du Colombier #define AUTHENTLEN (CHALLEN+4+1)
73*0cbf10f5SDavid du Colombier
74*0cbf10f5SDavid du Colombier struct Passwordreq
75*0cbf10f5SDavid du Colombier {
76*0cbf10f5SDavid du Colombier char num;
77*0cbf10f5SDavid du Colombier char old[NAMELEN];
78*0cbf10f5SDavid du Colombier char new[NAMELEN];
79*0cbf10f5SDavid du Colombier };
80*0cbf10f5SDavid du Colombier #define PASSREQLEN (2*NAMELEN+1)
81*0cbf10f5SDavid du Colombier
82*0cbf10f5SDavid du Colombier struct Nvrsafe
83*0cbf10f5SDavid du Colombier {
84*0cbf10f5SDavid du Colombier char machkey[DESKEYLEN];
85*0cbf10f5SDavid du Colombier uchar machsum;
86*0cbf10f5SDavid du Colombier char authkey[DESKEYLEN];
87*0cbf10f5SDavid du Colombier uchar authsum;
88*0cbf10f5SDavid du Colombier char config[CONFIGLEN];
89*0cbf10f5SDavid du Colombier uchar configsum;
90*0cbf10f5SDavid du Colombier char authid[NAMELEN];
91*0cbf10f5SDavid du Colombier uchar authidsum;
92*0cbf10f5SDavid du Colombier char authdom[DOMLEN];
93*0cbf10f5SDavid du Colombier uchar authdomsum;
94*0cbf10f5SDavid du Colombier };
95*0cbf10f5SDavid du Colombier
96*0cbf10f5SDavid du Colombier struct Chalstate
97*0cbf10f5SDavid du Colombier {
98*0cbf10f5SDavid du Colombier int afd; /* /dev/authenticate */
99*0cbf10f5SDavid du Colombier int asfd; /* authdial() */
100*0cbf10f5SDavid du Colombier char chal[NETCHLEN]; /* challenge/response */
101*0cbf10f5SDavid du Colombier };
102*0cbf10f5SDavid du Colombier
103*0cbf10f5SDavid du Colombier
104*0cbf10f5SDavid du Colombier /************ crypt.c *************/
105*0cbf10f5SDavid du Colombier /*
106*0cbf10f5SDavid du Colombier * Data Encryption Standard
107*0cbf10f5SDavid du Colombier * D.P.Mitchell 83/06/08.
108*0cbf10f5SDavid du Colombier *
109*0cbf10f5SDavid du Colombier * block_cipher(key, block, decrypting)
110*0cbf10f5SDavid du Colombier */
111*0cbf10f5SDavid du Colombier static long ip_low(char [8]);
112*0cbf10f5SDavid du Colombier static long ip_high(char [8]);
113*0cbf10f5SDavid du Colombier static void fp(long, long, char[8]);
114*0cbf10f5SDavid du Colombier static void key_setup(char[DESKEYLEN], char[128]);
115*0cbf10f5SDavid du Colombier static void block_cipher(char[128], char[8], int);
116*0cbf10f5SDavid du Colombier
117*0cbf10f5SDavid du Colombier /*
118*0cbf10f5SDavid du Colombier * destructively encrypt the buffer, which
119*0cbf10f5SDavid du Colombier * must be at least 8 characters long.
120*0cbf10f5SDavid du Colombier */
121*0cbf10f5SDavid du Colombier int
encrypt9(void * key,void * vbuf,int n)122*0cbf10f5SDavid du Colombier encrypt9(void *key, void *vbuf, int n)
123*0cbf10f5SDavid du Colombier {
124*0cbf10f5SDavid du Colombier char ekey[128], *buf;
125*0cbf10f5SDavid du Colombier int i, r;
126*0cbf10f5SDavid du Colombier
127*0cbf10f5SDavid du Colombier if(n < 8)
128*0cbf10f5SDavid du Colombier return 0;
129*0cbf10f5SDavid du Colombier key_setup(key, ekey);
130*0cbf10f5SDavid du Colombier buf = vbuf;
131*0cbf10f5SDavid du Colombier n--;
132*0cbf10f5SDavid du Colombier r = n % 7;
133*0cbf10f5SDavid du Colombier n /= 7;
134*0cbf10f5SDavid du Colombier for(i = 0; i < n; i++){
135*0cbf10f5SDavid du Colombier block_cipher(ekey, buf, 0);
136*0cbf10f5SDavid du Colombier buf += 7;
137*0cbf10f5SDavid du Colombier }
138*0cbf10f5SDavid du Colombier if(r)
139*0cbf10f5SDavid du Colombier block_cipher(ekey, buf - 7 + r, 0);
140*0cbf10f5SDavid du Colombier return 1;
141*0cbf10f5SDavid du Colombier }
142*0cbf10f5SDavid du Colombier
143*0cbf10f5SDavid du Colombier /*
144*0cbf10f5SDavid du Colombier * destructively decrypt the buffer, which
145*0cbf10f5SDavid du Colombier * must be at least 8 characters long.
146*0cbf10f5SDavid du Colombier */
147*0cbf10f5SDavid du Colombier int
decrypt(void * key,void * vbuf,int n)148*0cbf10f5SDavid du Colombier decrypt(void *key, void *vbuf, int n)
149*0cbf10f5SDavid du Colombier {
150*0cbf10f5SDavid du Colombier char ekey[128], *buf;
151*0cbf10f5SDavid du Colombier int i, r;
152*0cbf10f5SDavid du Colombier
153*0cbf10f5SDavid du Colombier if(n < 8)
154*0cbf10f5SDavid du Colombier return 0;
155*0cbf10f5SDavid du Colombier key_setup(key, ekey);
156*0cbf10f5SDavid du Colombier buf = vbuf;
157*0cbf10f5SDavid du Colombier n--;
158*0cbf10f5SDavid du Colombier r = n % 7;
159*0cbf10f5SDavid du Colombier n /= 7;
160*0cbf10f5SDavid du Colombier buf += n * 7;
161*0cbf10f5SDavid du Colombier if(r)
162*0cbf10f5SDavid du Colombier block_cipher(ekey, buf - 7 + r, 1);
163*0cbf10f5SDavid du Colombier for(i = 0; i < n; i++){
164*0cbf10f5SDavid du Colombier buf -= 7;
165*0cbf10f5SDavid du Colombier block_cipher(ekey, buf, 1);
166*0cbf10f5SDavid du Colombier }
167*0cbf10f5SDavid du Colombier return 1;
168*0cbf10f5SDavid du Colombier }
169*0cbf10f5SDavid du Colombier
170*0cbf10f5SDavid du Colombier /*
171*0cbf10f5SDavid du Colombier * Tables for Combined S and P Boxes
172*0cbf10f5SDavid du Colombier */
173*0cbf10f5SDavid du Colombier
174*0cbf10f5SDavid du Colombier static long s0p[] = {
175*0cbf10f5SDavid du Colombier 0x00410100,0x00010000,0x40400000,0x40410100,0x00400000,0x40010100,0x40010000,0x40400000,
176*0cbf10f5SDavid du Colombier 0x40010100,0x00410100,0x00410000,0x40000100,0x40400100,0x00400000,0x00000000,0x40010000,
177*0cbf10f5SDavid du Colombier 0x00010000,0x40000000,0x00400100,0x00010100,0x40410100,0x00410000,0x40000100,0x00400100,
178*0cbf10f5SDavid du Colombier 0x40000000,0x00000100,0x00010100,0x40410000,0x00000100,0x40400100,0x40410000,0x00000000,
179*0cbf10f5SDavid du Colombier 0x00000000,0x40410100,0x00400100,0x40010000,0x00410100,0x00010000,0x40000100,0x00400100,
180*0cbf10f5SDavid du Colombier 0x40410000,0x00000100,0x00010100,0x40400000,0x40010100,0x40000000,0x40400000,0x00410000,
181*0cbf10f5SDavid du Colombier 0x40410100,0x00010100,0x00410000,0x40400100,0x00400000,0x40000100,0x40010000,0x00000000,
182*0cbf10f5SDavid du Colombier 0x00010000,0x00400000,0x40400100,0x00410100,0x40000000,0x40410000,0x00000100,0x40010100,
183*0cbf10f5SDavid du Colombier };
184*0cbf10f5SDavid du Colombier
185*0cbf10f5SDavid du Colombier static long s1p[] = {
186*0cbf10f5SDavid du Colombier 0x08021002,0x00000000,0x00021000,0x08020000,0x08000002,0x00001002,0x08001000,0x00021000,
187*0cbf10f5SDavid du Colombier 0x00001000,0x08020002,0x00000002,0x08001000,0x00020002,0x08021000,0x08020000,0x00000002,
188*0cbf10f5SDavid du Colombier 0x00020000,0x08001002,0x08020002,0x00001000,0x00021002,0x08000000,0x00000000,0x00020002,
189*0cbf10f5SDavid du Colombier 0x08001002,0x00021002,0x08021000,0x08000002,0x08000000,0x00020000,0x00001002,0x08021002,
190*0cbf10f5SDavid du Colombier 0x00020002,0x08021000,0x08001000,0x00021002,0x08021002,0x00020002,0x08000002,0x00000000,
191*0cbf10f5SDavid du Colombier 0x08000000,0x00001002,0x00020000,0x08020002,0x00001000,0x08000000,0x00021002,0x08001002,
192*0cbf10f5SDavid du Colombier 0x08021000,0x00001000,0x00000000,0x08000002,0x00000002,0x08021002,0x00021000,0x08020000,
193*0cbf10f5SDavid du Colombier 0x08020002,0x00020000,0x00001002,0x08001000,0x08001002,0x00000002,0x08020000,0x00021000,
194*0cbf10f5SDavid du Colombier };
195*0cbf10f5SDavid du Colombier
196*0cbf10f5SDavid du Colombier static long s2p[] = {
197*0cbf10f5SDavid du Colombier 0x20800000,0x00808020,0x00000020,0x20800020,0x20008000,0x00800000,0x20800020,0x00008020,
198*0cbf10f5SDavid du Colombier 0x00800020,0x00008000,0x00808000,0x20000000,0x20808020,0x20000020,0x20000000,0x20808000,
199*0cbf10f5SDavid du Colombier 0x00000000,0x20008000,0x00808020,0x00000020,0x20000020,0x20808020,0x00008000,0x20800000,
200*0cbf10f5SDavid du Colombier 0x20808000,0x00800020,0x20008020,0x00808000,0x00008020,0x00000000,0x00800000,0x20008020,
201*0cbf10f5SDavid du Colombier 0x00808020,0x00000020,0x20000000,0x00008000,0x20000020,0x20008000,0x00808000,0x20800020,
202*0cbf10f5SDavid du Colombier 0x00000000,0x00808020,0x00008020,0x20808000,0x20008000,0x00800000,0x20808020,0x20000000,
203*0cbf10f5SDavid du Colombier 0x20008020,0x20800000,0x00800000,0x20808020,0x00008000,0x00800020,0x20800020,0x00008020,
204*0cbf10f5SDavid du Colombier 0x00800020,0x00000000,0x20808000,0x20000020,0x20800000,0x20008020,0x00000020,0x00808000,
205*0cbf10f5SDavid du Colombier };
206*0cbf10f5SDavid du Colombier
207*0cbf10f5SDavid du Colombier static long s3p[] = {
208*0cbf10f5SDavid du Colombier 0x00080201,0x02000200,0x00000001,0x02080201,0x00000000,0x02080000,0x02000201,0x00080001,
209*0cbf10f5SDavid du Colombier 0x02080200,0x02000001,0x02000000,0x00000201,0x02000001,0x00080201,0x00080000,0x02000000,
210*0cbf10f5SDavid du Colombier 0x02080001,0x00080200,0x00000200,0x00000001,0x00080200,0x02000201,0x02080000,0x00000200,
211*0cbf10f5SDavid du Colombier 0x00000201,0x00000000,0x00080001,0x02080200,0x02000200,0x02080001,0x02080201,0x00080000,
212*0cbf10f5SDavid du Colombier 0x02080001,0x00000201,0x00080000,0x02000001,0x00080200,0x02000200,0x00000001,0x02080000,
213*0cbf10f5SDavid du Colombier 0x02000201,0x00000000,0x00000200,0x00080001,0x00000000,0x02080001,0x02080200,0x00000200,
214*0cbf10f5SDavid du Colombier 0x02000000,0x02080201,0x00080201,0x00080000,0x02080201,0x00000001,0x02000200,0x00080201,
215*0cbf10f5SDavid du Colombier 0x00080001,0x00080200,0x02080000,0x02000201,0x00000201,0x02000000,0x02000001,0x02080200,
216*0cbf10f5SDavid du Colombier };
217*0cbf10f5SDavid du Colombier
218*0cbf10f5SDavid du Colombier static long s4p[] = {
219*0cbf10f5SDavid du Colombier 0x01000000,0x00002000,0x00000080,0x01002084,0x01002004,0x01000080,0x00002084,0x01002000,
220*0cbf10f5SDavid du Colombier 0x00002000,0x00000004,0x01000004,0x00002080,0x01000084,0x01002004,0x01002080,0x00000000,
221*0cbf10f5SDavid du Colombier 0x00002080,0x01000000,0x00002004,0x00000084,0x01000080,0x00002084,0x00000000,0x01000004,
222*0cbf10f5SDavid du Colombier 0x00000004,0x01000084,0x01002084,0x00002004,0x01002000,0x00000080,0x00000084,0x01002080,
223*0cbf10f5SDavid du Colombier 0x01002080,0x01000084,0x00002004,0x01002000,0x00002000,0x00000004,0x01000004,0x01000080,
224*0cbf10f5SDavid du Colombier 0x01000000,0x00002080,0x01002084,0x00000000,0x00002084,0x01000000,0x00000080,0x00002004,
225*0cbf10f5SDavid du Colombier 0x01000084,0x00000080,0x00000000,0x01002084,0x01002004,0x01002080,0x00000084,0x00002000,
226*0cbf10f5SDavid du Colombier 0x00002080,0x01002004,0x01000080,0x00000084,0x00000004,0x00002084,0x01002000,0x01000004,
227*0cbf10f5SDavid du Colombier };
228*0cbf10f5SDavid du Colombier
229*0cbf10f5SDavid du Colombier static long s5p[] = {
230*0cbf10f5SDavid du Colombier 0x10000008,0x00040008,0x00000000,0x10040400,0x00040008,0x00000400,0x10000408,0x00040000,
231*0cbf10f5SDavid du Colombier 0x00000408,0x10040408,0x00040400,0x10000000,0x10000400,0x10000008,0x10040000,0x00040408,
232*0cbf10f5SDavid du Colombier 0x00040000,0x10000408,0x10040008,0x00000000,0x00000400,0x00000008,0x10040400,0x10040008,
233*0cbf10f5SDavid du Colombier 0x10040408,0x10040000,0x10000000,0x00000408,0x00000008,0x00040400,0x00040408,0x10000400,
234*0cbf10f5SDavid du Colombier 0x00000408,0x10000000,0x10000400,0x00040408,0x10040400,0x00040008,0x00000000,0x10000400,
235*0cbf10f5SDavid du Colombier 0x10000000,0x00000400,0x10040008,0x00040000,0x00040008,0x10040408,0x00040400,0x00000008,
236*0cbf10f5SDavid du Colombier 0x10040408,0x00040400,0x00040000,0x10000408,0x10000008,0x10040000,0x00040408,0x00000000,
237*0cbf10f5SDavid du Colombier 0x00000400,0x10000008,0x10000408,0x10040400,0x10040000,0x00000408,0x00000008,0x10040008,
238*0cbf10f5SDavid du Colombier };
239*0cbf10f5SDavid du Colombier
240*0cbf10f5SDavid du Colombier static long s6p[] = {
241*0cbf10f5SDavid du Colombier 0x00000800,0x00000040,0x00200040,0x80200000,0x80200840,0x80000800,0x00000840,0x00000000,
242*0cbf10f5SDavid du Colombier 0x00200000,0x80200040,0x80000040,0x00200800,0x80000000,0x00200840,0x00200800,0x80000040,
243*0cbf10f5SDavid du Colombier 0x80200040,0x00000800,0x80000800,0x80200840,0x00000000,0x00200040,0x80200000,0x00000840,
244*0cbf10f5SDavid du Colombier 0x80200800,0x80000840,0x00200840,0x80000000,0x80000840,0x80200800,0x00000040,0x00200000,
245*0cbf10f5SDavid du Colombier 0x80000840,0x00200800,0x80200800,0x80000040,0x00000800,0x00000040,0x00200000,0x80200800,
246*0cbf10f5SDavid du Colombier 0x80200040,0x80000840,0x00000840,0x00000000,0x00000040,0x80200000,0x80000000,0x00200040,
247*0cbf10f5SDavid du Colombier 0x00000000,0x80200040,0x00200040,0x00000840,0x80000040,0x00000800,0x80200840,0x00200000,
248*0cbf10f5SDavid du Colombier 0x00200840,0x80000000,0x80000800,0x80200840,0x80200000,0x00200840,0x00200800,0x80000800,
249*0cbf10f5SDavid du Colombier };
250*0cbf10f5SDavid du Colombier
251*0cbf10f5SDavid du Colombier static long s7p[] = {
252*0cbf10f5SDavid du Colombier 0x04100010,0x04104000,0x00004010,0x00000000,0x04004000,0x00100010,0x04100000,0x04104010,
253*0cbf10f5SDavid du Colombier 0x00000010,0x04000000,0x00104000,0x00004010,0x00104010,0x04004010,0x04000010,0x04100000,
254*0cbf10f5SDavid du Colombier 0x00004000,0x00104010,0x00100010,0x04004000,0x04104010,0x04000010,0x00000000,0x00104000,
255*0cbf10f5SDavid du Colombier 0x04000000,0x00100000,0x04004010,0x04100010,0x00100000,0x00004000,0x04104000,0x00000010,
256*0cbf10f5SDavid du Colombier 0x00100000,0x00004000,0x04000010,0x04104010,0x00004010,0x04000000,0x00000000,0x00104000,
257*0cbf10f5SDavid du Colombier 0x04100010,0x04004010,0x04004000,0x00100010,0x04104000,0x00000010,0x00100010,0x04004000,
258*0cbf10f5SDavid du Colombier 0x04104010,0x00100000,0x04100000,0x04000010,0x00104000,0x00004010,0x04004010,0x04100000,
259*0cbf10f5SDavid du Colombier 0x00000010,0x04104000,0x00104010,0x00000000,0x04000000,0x04100010,0x00004000,0x00104010,
260*0cbf10f5SDavid du Colombier };
261*0cbf10f5SDavid du Colombier
262*0cbf10f5SDavid du Colombier /*
263*0cbf10f5SDavid du Colombier * DES electronic codebook encryption of one block
264*0cbf10f5SDavid du Colombier */
265*0cbf10f5SDavid du Colombier static void
block_cipher(char expanded_key[128],char text[8],int decrypting)266*0cbf10f5SDavid du Colombier block_cipher(char expanded_key[128], char text[8], int decrypting)
267*0cbf10f5SDavid du Colombier {
268*0cbf10f5SDavid du Colombier char *key;
269*0cbf10f5SDavid du Colombier long crypto, temp, right, left;
270*0cbf10f5SDavid du Colombier int i, key_offset;
271*0cbf10f5SDavid du Colombier
272*0cbf10f5SDavid du Colombier key = expanded_key;
273*0cbf10f5SDavid du Colombier left = ip_low(text);
274*0cbf10f5SDavid du Colombier right = ip_high(text);
275*0cbf10f5SDavid du Colombier if (decrypting) {
276*0cbf10f5SDavid du Colombier key_offset = 16;
277*0cbf10f5SDavid du Colombier key = key + 128 - 8;
278*0cbf10f5SDavid du Colombier } else
279*0cbf10f5SDavid du Colombier key_offset = 0;
280*0cbf10f5SDavid du Colombier for (i = 0; i < 16; i++) {
281*0cbf10f5SDavid du Colombier temp = (right << 1) | ((right >> 31) & 1);
282*0cbf10f5SDavid du Colombier crypto = s0p[(temp & 0x3f) ^ *key++];
283*0cbf10f5SDavid du Colombier crypto |= s1p[((temp >> 4) & 0x3f) ^ *key++];
284*0cbf10f5SDavid du Colombier crypto |= s2p[((temp >> 8) & 0x3f) ^ *key++];
285*0cbf10f5SDavid du Colombier crypto |= s3p[((temp >> 12) & 0x3f) ^ *key++];
286*0cbf10f5SDavid du Colombier crypto |= s4p[((temp >> 16) & 0x3f) ^ *key++];
287*0cbf10f5SDavid du Colombier crypto |= s5p[((temp >> 20) & 0x3f) ^ *key++];
288*0cbf10f5SDavid du Colombier crypto |= s6p[((temp >> 24) & 0x3f) ^ *key++];
289*0cbf10f5SDavid du Colombier temp = ((right & 1) << 5) | ((right >> 27) & 0x1f);
290*0cbf10f5SDavid du Colombier crypto |= s7p[temp ^ *key++];
291*0cbf10f5SDavid du Colombier temp = left;
292*0cbf10f5SDavid du Colombier left = right;
293*0cbf10f5SDavid du Colombier right = temp ^ crypto;
294*0cbf10f5SDavid du Colombier key -= key_offset;
295*0cbf10f5SDavid du Colombier }
296*0cbf10f5SDavid du Colombier /*
297*0cbf10f5SDavid du Colombier * standard final permutation (IPI)
298*0cbf10f5SDavid du Colombier * left and right are reversed here
299*0cbf10f5SDavid du Colombier */
300*0cbf10f5SDavid du Colombier fp(right, left, text);
301*0cbf10f5SDavid du Colombier }
302*0cbf10f5SDavid du Colombier
303*0cbf10f5SDavid du Colombier /*
304*0cbf10f5SDavid du Colombier * Initial Permutation
305*0cbf10f5SDavid du Colombier */
306*0cbf10f5SDavid du Colombier static long iptab[] = {
307*0cbf10f5SDavid du Colombier 0x00000000, 0x00008000, 0x00000000, 0x00008000,
308*0cbf10f5SDavid du Colombier 0x00000080, 0x00008080, 0x00000080, 0x00008080
309*0cbf10f5SDavid du Colombier };
310*0cbf10f5SDavid du Colombier
311*0cbf10f5SDavid du Colombier static long
ip_low(char block[8])312*0cbf10f5SDavid du Colombier ip_low(char block[8])
313*0cbf10f5SDavid du Colombier {
314*0cbf10f5SDavid du Colombier int i;
315*0cbf10f5SDavid du Colombier long l;
316*0cbf10f5SDavid du Colombier
317*0cbf10f5SDavid du Colombier l = 0;
318*0cbf10f5SDavid du Colombier for(i = 0; i < 8; i++){
319*0cbf10f5SDavid du Colombier l |= iptab[(block[i] >> 4) & 7] >> i;
320*0cbf10f5SDavid du Colombier l |= iptab[block[i] & 7] << (16 - i);
321*0cbf10f5SDavid du Colombier }
322*0cbf10f5SDavid du Colombier return l;
323*0cbf10f5SDavid du Colombier }
324*0cbf10f5SDavid du Colombier
325*0cbf10f5SDavid du Colombier static long
ip_high(char block[8])326*0cbf10f5SDavid du Colombier ip_high(char block[8])
327*0cbf10f5SDavid du Colombier {
328*0cbf10f5SDavid du Colombier int i;
329*0cbf10f5SDavid du Colombier long l;
330*0cbf10f5SDavid du Colombier
331*0cbf10f5SDavid du Colombier l = 0;
332*0cbf10f5SDavid du Colombier for(i = 0; i < 8; i++){
333*0cbf10f5SDavid du Colombier l |= iptab[(block[i] >> 5) & 7] >> i;
334*0cbf10f5SDavid du Colombier l |= iptab[(block[i] >> 1) & 7] << (16 - i);
335*0cbf10f5SDavid du Colombier }
336*0cbf10f5SDavid du Colombier return l;
337*0cbf10f5SDavid du Colombier }
338*0cbf10f5SDavid du Colombier
339*0cbf10f5SDavid du Colombier /*
340*0cbf10f5SDavid du Colombier * Final Permutation
341*0cbf10f5SDavid du Colombier */
342*0cbf10f5SDavid du Colombier static unsigned long fptab[] = {
343*0cbf10f5SDavid du Colombier 0x00000000,0x80000000,0x00800000,0x80800000,0x00008000,0x80008000,0x00808000,0x80808000,
344*0cbf10f5SDavid du Colombier 0x00000080,0x80000080,0x00800080,0x80800080,0x00008080,0x80008080,0x00808080,0x80808080,
345*0cbf10f5SDavid du Colombier };
346*0cbf10f5SDavid du Colombier
347*0cbf10f5SDavid du Colombier static void
fp(long left,long right,char text[8])348*0cbf10f5SDavid du Colombier fp(long left, long right, char text[8])
349*0cbf10f5SDavid du Colombier {
350*0cbf10f5SDavid du Colombier unsigned long ta[2], t, v[2];
351*0cbf10f5SDavid du Colombier int i, j, sh;
352*0cbf10f5SDavid du Colombier
353*0cbf10f5SDavid du Colombier ta[0] = right;
354*0cbf10f5SDavid du Colombier ta[1] = left;
355*0cbf10f5SDavid du Colombier v[0] = v[1] = 0;
356*0cbf10f5SDavid du Colombier for(i = 0; i < 2; i++){
357*0cbf10f5SDavid du Colombier t = ta[i];
358*0cbf10f5SDavid du Colombier sh = i;
359*0cbf10f5SDavid du Colombier for(j = 0; j < 4; j++){
360*0cbf10f5SDavid du Colombier v[1] |= fptab[t & 0xf] >> sh;
361*0cbf10f5SDavid du Colombier t >>= 4;
362*0cbf10f5SDavid du Colombier v[0] |= fptab[t & 0xf] >> sh;
363*0cbf10f5SDavid du Colombier t >>= 4;
364*0cbf10f5SDavid du Colombier sh += 2;
365*0cbf10f5SDavid du Colombier }
366*0cbf10f5SDavid du Colombier }
367*0cbf10f5SDavid du Colombier for(i = 0; i < 2; i++)
368*0cbf10f5SDavid du Colombier for(j = 0; j < 4; j++){
369*0cbf10f5SDavid du Colombier *text++ = (char)(v[i]&0xff);
370*0cbf10f5SDavid du Colombier v[i] >>= 8;
371*0cbf10f5SDavid du Colombier }
372*0cbf10f5SDavid du Colombier }
373*0cbf10f5SDavid du Colombier
374*0cbf10f5SDavid du Colombier /*
375*0cbf10f5SDavid du Colombier * Key set-up
376*0cbf10f5SDavid du Colombier */
377*0cbf10f5SDavid du Colombier static uchar keyexpand[][15][2] = {
378*0cbf10f5SDavid du Colombier { 3, 2, 9, 8, 18, 8, 27, 32, 33, 2, 42, 16, 48, 8, 65, 16,
379*0cbf10f5SDavid du Colombier 74, 2, 80, 2, 89, 4, 99, 16, 104, 4, 122, 32, 0, 0, },
380*0cbf10f5SDavid du Colombier { 1, 4, 8, 1, 18, 4, 25, 32, 34, 32, 41, 8, 50, 8, 59, 32,
381*0cbf10f5SDavid du Colombier 64, 16, 75, 4, 90, 1, 97, 16, 106, 2, 112, 2, 123, 1, },
382*0cbf10f5SDavid du Colombier { 2, 1, 19, 8, 35, 1, 40, 1, 50, 4, 57, 32, 75, 2, 80, 32,
383*0cbf10f5SDavid du Colombier 89, 1, 96, 16, 107, 4, 120, 8, 0, 0, 0, 0, 0, 0, },
384*0cbf10f5SDavid du Colombier { 4, 32, 20, 2, 31, 4, 37, 32, 47, 1, 54, 1, 63, 2, 68, 1,
385*0cbf10f5SDavid du Colombier 78, 4, 84, 8, 101, 16, 108, 4, 119, 16, 126, 8, 0, 0, },
386*0cbf10f5SDavid du Colombier { 5, 4, 15, 4, 21, 32, 31, 1, 38, 1, 47, 2, 53, 2, 68, 8,
387*0cbf10f5SDavid du Colombier 85, 16, 92, 4, 103, 16, 108, 32, 118, 32, 124, 2, 0, 0, },
388*0cbf10f5SDavid du Colombier { 15, 2, 21, 2, 39, 8, 46, 16, 55, 32, 61, 1, 71, 16, 76, 32,
389*0cbf10f5SDavid du Colombier 86, 32, 93, 4, 102, 2, 108, 16, 117, 8, 126, 1, 0, 0, },
390*0cbf10f5SDavid du Colombier { 14, 16, 23, 32, 29, 1, 38, 8, 52, 2, 63, 4, 70, 2, 76, 16,
391*0cbf10f5SDavid du Colombier 85, 8, 100, 1, 110, 4, 116, 8, 127, 8, 0, 0, 0, 0, },
392*0cbf10f5SDavid du Colombier { 1, 8, 8, 32, 17, 1, 24, 16, 35, 4, 50, 1, 57, 16, 67, 8,
393*0cbf10f5SDavid du Colombier 83, 1, 88, 1, 98, 4, 105, 32, 114, 32, 123, 2, 0, 0, },
394*0cbf10f5SDavid du Colombier { 0, 1, 11, 16, 16, 4, 35, 2, 40, 32, 49, 1, 56, 16, 65, 2,
395*0cbf10f5SDavid du Colombier 74, 16, 80, 8, 99, 8, 115, 1, 121, 4, 0, 0, 0, 0, },
396*0cbf10f5SDavid du Colombier { 9, 16, 18, 2, 24, 2, 33, 4, 43, 16, 48, 4, 66, 32, 73, 8,
397*0cbf10f5SDavid du Colombier 82, 8, 91, 32, 97, 2, 106, 16, 112, 8, 122, 1, 0, 0, },
398*0cbf10f5SDavid du Colombier { 14, 32, 21, 4, 30, 2, 36, 16, 45, 8, 60, 1, 69, 2, 87, 8,
399*0cbf10f5SDavid du Colombier 94, 16, 103, 32, 109, 1, 118, 8, 124, 32, 0, 0, 0, 0, },
400*0cbf10f5SDavid du Colombier { 7, 4, 14, 2, 20, 16, 29, 8, 44, 1, 54, 4, 60, 8, 71, 8,
401*0cbf10f5SDavid du Colombier 78, 16, 87, 32, 93, 1, 102, 8, 116, 2, 125, 4, 0, 0, },
402*0cbf10f5SDavid du Colombier { 7, 2, 12, 1, 22, 4, 28, 8, 45, 16, 52, 4, 63, 16, 70, 8,
403*0cbf10f5SDavid du Colombier 84, 2, 95, 4, 101, 32, 111, 1, 118, 1, 0, 0, 0, 0, },
404*0cbf10f5SDavid du Colombier { 6, 16, 13, 16, 20, 4, 31, 16, 36, 32, 46, 32, 53, 4, 62, 2,
405*0cbf10f5SDavid du Colombier 69, 32, 79, 1, 86, 1, 95, 2, 101, 2, 119, 8, 0, 0, },
406*0cbf10f5SDavid du Colombier { 0, 32, 10, 8, 19, 32, 25, 2, 34, 16, 40, 8, 59, 8, 66, 2,
407*0cbf10f5SDavid du Colombier 72, 2, 81, 4, 91, 16, 96, 4, 115, 2, 121, 8, 0, 0, },
408*0cbf10f5SDavid du Colombier { 3, 16, 10, 4, 17, 32, 26, 32, 33, 8, 42, 8, 51, 32, 57, 2,
409*0cbf10f5SDavid du Colombier 67, 4, 82, 1, 89, 16, 98, 2, 104, 2, 113, 4, 120, 1, },
410*0cbf10f5SDavid du Colombier { 1, 16, 11, 8, 27, 1, 32, 1, 42, 4, 49, 32, 58, 32, 67, 2,
411*0cbf10f5SDavid du Colombier 72, 32, 81, 1, 88, 16, 99, 4, 114, 1, 0, 0, 0, 0, },
412*0cbf10f5SDavid du Colombier { 6, 32, 12, 2, 23, 4, 29, 32, 39, 1, 46, 1, 55, 2, 61, 2,
413*0cbf10f5SDavid du Colombier 70, 4, 76, 8, 93, 16, 100, 4, 111, 16, 116, 32, 0, 0, },
414*0cbf10f5SDavid du Colombier { 6, 2, 13, 32, 23, 1, 30, 1, 39, 2, 45, 2, 63, 8, 77, 16,
415*0cbf10f5SDavid du Colombier 84, 4, 95, 16, 100, 32, 110, 32, 117, 4, 127, 4, 0, 0, },
416*0cbf10f5SDavid du Colombier { 4, 1, 13, 2, 31, 8, 38, 16, 47, 32, 53, 1, 62, 8, 68, 32,
417*0cbf10f5SDavid du Colombier 78, 32, 85, 4, 94, 2, 100, 16, 109, 8, 127, 2, 0, 0, },
418*0cbf10f5SDavid du Colombier { 5, 16, 15, 32, 21, 1, 30, 8, 44, 2, 55, 4, 61, 32, 68, 16,
419*0cbf10f5SDavid du Colombier 77, 8, 92, 1, 102, 4, 108, 8, 126, 16, 0, 0, 0, 0, },
420*0cbf10f5SDavid du Colombier { 2, 8, 9, 1, 16, 16, 27, 4, 42, 1, 49, 16, 58, 2, 75, 1,
421*0cbf10f5SDavid du Colombier 80, 1, 90, 4, 97, 32, 106, 32, 113, 8, 120, 32, 0, 0, },
422*0cbf10f5SDavid du Colombier { 2, 4, 8, 4, 27, 2, 32, 32, 41, 1, 48, 16, 59, 4, 66, 16,
423*0cbf10f5SDavid du Colombier 72, 8, 91, 8, 107, 1, 112, 1, 123, 16, 0, 0, 0, 0, },
424*0cbf10f5SDavid du Colombier { 3, 8, 10, 2, 16, 2, 25, 4, 35, 16, 40, 4, 59, 2, 65, 8,
425*0cbf10f5SDavid du Colombier 74, 8, 83, 32, 89, 2, 98, 16, 104, 8, 121, 16, 0, 0, },
426*0cbf10f5SDavid du Colombier { 4, 2, 13, 4, 22, 2, 28, 16, 37, 8, 52, 1, 62, 4, 79, 8,
427*0cbf10f5SDavid du Colombier 86, 16, 95, 32, 101, 1, 110, 8, 126, 32, 0, 0, 0, 0, },
428*0cbf10f5SDavid du Colombier { 5, 32, 12, 16, 21, 8, 36, 1, 46, 4, 52, 8, 70, 16, 79, 32,
429*0cbf10f5SDavid du Colombier 85, 1, 94, 8, 108, 2, 119, 4, 126, 2, 0, 0, 0, 0, },
430*0cbf10f5SDavid du Colombier { 5, 2, 14, 4, 20, 8, 37, 16, 44, 4, 55, 16, 60, 32, 76, 2,
431*0cbf10f5SDavid du Colombier 87, 4, 93, 32, 103, 1, 110, 1, 119, 2, 124, 1, 0, 0, },
432*0cbf10f5SDavid du Colombier { 7, 32, 12, 4, 23, 16, 28, 32, 38, 32, 45, 4, 54, 2, 60, 16,
433*0cbf10f5SDavid du Colombier 71, 1, 78, 1, 87, 2, 93, 2, 111, 8, 118, 16, 125, 16, },
434*0cbf10f5SDavid du Colombier { 1, 1, 11, 32, 17, 2, 26, 16, 32, 8, 51, 8, 64, 2, 73, 4,
435*0cbf10f5SDavid du Colombier 83, 16, 88, 4, 107, 2, 112, 32, 122, 8, 0, 0, 0, 0, },
436*0cbf10f5SDavid du Colombier { 0, 4, 9, 32, 18, 32, 25, 8, 34, 8, 43, 32, 49, 2, 58, 16,
437*0cbf10f5SDavid du Colombier 74, 1, 81, 16, 90, 2, 96, 2, 105, 4, 115, 16, 122, 4, },
438*0cbf10f5SDavid du Colombier { 2, 2, 19, 1, 24, 1, 34, 4, 41, 32, 50, 32, 57, 8, 64, 32,
439*0cbf10f5SDavid du Colombier 73, 1, 80, 16, 91, 4, 106, 1, 113, 16, 123, 8, 0, 0, },
440*0cbf10f5SDavid du Colombier { 3, 4, 10, 16, 16, 8, 35, 8, 51, 1, 56, 1, 67, 16, 72, 4,
441*0cbf10f5SDavid du Colombier 91, 2, 96, 32, 105, 1, 112, 16, 121, 2, 0, 0, 0, 0, },
442*0cbf10f5SDavid du Colombier { 4, 16, 15, 1, 22, 1, 31, 2, 37, 2, 55, 8, 62, 16, 69, 16,
443*0cbf10f5SDavid du Colombier 76, 4, 87, 16, 92, 32, 102, 32, 109, 4, 118, 2, 125, 32, },
444*0cbf10f5SDavid du Colombier { 6, 4, 23, 8, 30, 16, 39, 32, 45, 1, 54, 8, 70, 32, 77, 4,
445*0cbf10f5SDavid du Colombier 86, 2, 92, 16, 101, 8, 116, 1, 125, 2, 0, 0, 0, 0, },
446*0cbf10f5SDavid du Colombier { 4, 4, 13, 1, 22, 8, 36, 2, 47, 4, 53, 32, 63, 1, 69, 8,
447*0cbf10f5SDavid du Colombier 84, 1, 94, 4, 100, 8, 117, 16, 127, 32, 0, 0, 0, 0, },
448*0cbf10f5SDavid du Colombier { 3, 32, 8, 16, 19, 4, 34, 1, 41, 16, 50, 2, 56, 2, 67, 1,
449*0cbf10f5SDavid du Colombier 72, 1, 82, 4, 89, 32, 98, 32, 105, 8, 114, 8, 121, 1, },
450*0cbf10f5SDavid du Colombier { 1, 32, 19, 2, 24, 32, 33, 1, 40, 16, 51, 4, 64, 8, 83, 8,
451*0cbf10f5SDavid du Colombier 99, 1, 104, 1, 114, 4, 120, 4, 0, 0, 0, 0, 0, 0, },
452*0cbf10f5SDavid du Colombier { 8, 2, 17, 4, 27, 16, 32, 4, 51, 2, 56, 32, 66, 8, 75, 32,
453*0cbf10f5SDavid du Colombier 81, 2, 90, 16, 96, 8, 115, 8, 122, 2, 0, 0, 0, 0, },
454*0cbf10f5SDavid du Colombier { 2, 16, 18, 1, 25, 16, 34, 2, 40, 2, 49, 4, 59, 16, 66, 4,
455*0cbf10f5SDavid du Colombier 73, 32, 82, 32, 89, 8, 98, 8, 107, 32, 113, 2, 123, 4, },
456*0cbf10f5SDavid du Colombier { 7, 1, 13, 8, 28, 1, 38, 4, 44, 8, 61, 16, 71, 32, 77, 1,
457*0cbf10f5SDavid du Colombier 86, 8, 100, 2, 111, 4, 117, 32, 124, 16, 0, 0, 0, 0, },
458*0cbf10f5SDavid du Colombier { 12, 8, 29, 16, 36, 4, 47, 16, 52, 32, 62, 32, 68, 2, 79, 4,
459*0cbf10f5SDavid du Colombier 85, 32, 95, 1, 102, 1, 111, 2, 117, 2, 126, 4, 0, 0, },
460*0cbf10f5SDavid du Colombier { 5, 1, 15, 16, 20, 32, 30, 32, 37, 4, 46, 2, 52, 16, 61, 8,
461*0cbf10f5SDavid du Colombier 70, 1, 79, 2, 85, 2, 103, 8, 110, 16, 119, 32, 124, 4, },
462*0cbf10f5SDavid du Colombier { 0, 16, 9, 2, 18, 16, 24, 8, 43, 8, 59, 1, 65, 4, 75, 16,
463*0cbf10f5SDavid du Colombier 80, 4, 99, 2, 104, 32, 113, 1, 123, 32, 0, 0, 0, 0, },
464*0cbf10f5SDavid du Colombier { 10, 32, 17, 8, 26, 8, 35, 32, 41, 2, 50, 16, 56, 8, 66, 1,
465*0cbf10f5SDavid du Colombier 73, 16, 82, 2, 88, 2, 97, 4, 107, 16, 112, 4, 121, 32, },
466*0cbf10f5SDavid du Colombier { 0, 2, 11, 1, 16, 1, 26, 4, 33, 32, 42, 32, 49, 8, 58, 8,
467*0cbf10f5SDavid du Colombier 65, 1, 72, 16, 83, 4, 98, 1, 105, 16, 114, 2, 0, 0, },
468*0cbf10f5SDavid du Colombier { 8, 8, 27, 8, 43, 1, 48, 1, 58, 4, 64, 4, 83, 2, 88, 32,
469*0cbf10f5SDavid du Colombier 97, 1, 104, 16, 115, 4, 122, 16, 0, 0, 0, 0, 0, 0, },
470*0cbf10f5SDavid du Colombier { 5, 8, 14, 1, 23, 2, 29, 2, 47, 8, 54, 16, 63, 32, 68, 4,
471*0cbf10f5SDavid du Colombier 79, 16, 84, 32, 94, 32, 101, 4, 110, 2, 116, 16, 127, 1, },
472*0cbf10f5SDavid du Colombier { 4, 8, 15, 8, 22, 16, 31, 32, 37, 1, 46, 8, 60, 2, 69, 4,
473*0cbf10f5SDavid du Colombier 78, 2, 84, 16, 93, 8, 108, 1, 118, 4, 0, 0, 0, 0, },
474*0cbf10f5SDavid du Colombier { 7, 16, 14, 8, 28, 2, 39, 4, 45, 32, 55, 1, 62, 1, 76, 1,
475*0cbf10f5SDavid du Colombier 86, 4, 92, 8, 109, 16, 116, 4, 125, 1, 0, 0, 0, 0, },
476*0cbf10f5SDavid du Colombier { 1, 2, 11, 4, 26, 1, 33, 16, 42, 2, 48, 2, 57, 4, 64, 1,
477*0cbf10f5SDavid du Colombier 74, 4, 81, 32, 90, 32, 97, 8, 106, 8, 115, 32, 120, 16, },
478*0cbf10f5SDavid du Colombier { 2, 32, 11, 2, 16, 32, 25, 1, 32, 16, 43, 4, 58, 1, 75, 8,
479*0cbf10f5SDavid du Colombier 91, 1, 96, 1, 106, 4, 113, 32, 0, 0, 0, 0, 0, 0, },
480*0cbf10f5SDavid du Colombier { 3, 1, 9, 4, 19, 16, 24, 4, 43, 2, 48, 32, 57, 1, 67, 32,
481*0cbf10f5SDavid du Colombier 73, 2, 82, 16, 88, 8, 107, 8, 120, 2, 0, 0, 0, 0, },
482*0cbf10f5SDavid du Colombier { 0, 8, 10, 1, 17, 16, 26, 2, 32, 2, 41, 4, 51, 16, 56, 4,
483*0cbf10f5SDavid du Colombier 65, 32, 74, 32, 81, 8, 90, 8, 99, 32, 105, 2, 114, 16, },
484*0cbf10f5SDavid du Colombier { 6, 1, 20, 1, 30, 4, 36, 8, 53, 16, 60, 4, 69, 1, 78, 8,
485*0cbf10f5SDavid du Colombier 92, 2, 103, 4, 109, 32, 119, 1, 125, 8, 0, 0, 0, 0, },
486*0cbf10f5SDavid du Colombier { 7, 8, 21, 16, 28, 4, 39, 16, 44, 32, 54, 32, 61, 4, 71, 4,
487*0cbf10f5SDavid du Colombier 77, 32, 87, 1, 94, 1, 103, 2, 109, 2, 124, 8, 0, 0, },
488*0cbf10f5SDavid du Colombier { 6, 8, 12, 32, 22, 32, 29, 4, 38, 2, 44, 16, 53, 8, 71, 2,
489*0cbf10f5SDavid du Colombier 77, 2, 95, 8, 102, 16, 111, 32, 117, 1, 127, 16, 0, 0, }
490*0cbf10f5SDavid du Colombier };
491*0cbf10f5SDavid du Colombier
492*0cbf10f5SDavid du Colombier static void
key_setup(char key[DESKEYLEN],char * ek)493*0cbf10f5SDavid du Colombier key_setup(char key[DESKEYLEN], char *ek)
494*0cbf10f5SDavid du Colombier {
495*0cbf10f5SDavid du Colombier int i, j, k, mask;
496*0cbf10f5SDavid du Colombier uchar (*x)[2];
497*0cbf10f5SDavid du Colombier
498*0cbf10f5SDavid du Colombier memset(ek, 0, 128);
499*0cbf10f5SDavid du Colombier x = keyexpand[0];
500*0cbf10f5SDavid du Colombier for(i = 0; i < 7; i++){
501*0cbf10f5SDavid du Colombier k = key[i];
502*0cbf10f5SDavid du Colombier for(mask = 0x80; mask; mask >>= 1){
503*0cbf10f5SDavid du Colombier if(k & mask)
504*0cbf10f5SDavid du Colombier for(j = 0; j < 15; j++)
505*0cbf10f5SDavid du Colombier ek[x[j][0]] |= x[j][1];
506*0cbf10f5SDavid du Colombier x += 15;
507*0cbf10f5SDavid du Colombier }
508*0cbf10f5SDavid du Colombier }
509*0cbf10f5SDavid du Colombier }
510*0cbf10f5SDavid du Colombier
511*0cbf10f5SDavid du Colombier
512*0cbf10f5SDavid du Colombier /************ netkey main.c *************/
513*0cbf10f5SDavid du Colombier int
passtokey(char * key,char * p)514*0cbf10f5SDavid du Colombier passtokey(char *key, char *p)
515*0cbf10f5SDavid du Colombier {
516*0cbf10f5SDavid du Colombier uchar buf[NAMELEN], *t;
517*0cbf10f5SDavid du Colombier int i, n;
518*0cbf10f5SDavid du Colombier
519*0cbf10f5SDavid du Colombier n = strlen(p);
520*0cbf10f5SDavid du Colombier if(n >= NAMELEN)
521*0cbf10f5SDavid du Colombier n = NAMELEN-1;
522*0cbf10f5SDavid du Colombier memset(buf, ' ', 8);
523*0cbf10f5SDavid du Colombier t = buf;
524*0cbf10f5SDavid du Colombier strncpy((char*)t, p, n);
525*0cbf10f5SDavid du Colombier t[n] = '\0';
526*0cbf10f5SDavid du Colombier memset(key, 0, DESKEYLEN);
527*0cbf10f5SDavid du Colombier for(;;){
528*0cbf10f5SDavid du Colombier for(i = 0; i < DESKEYLEN; i++)
529*0cbf10f5SDavid du Colombier key[i] = (t[i] >> i) + (t[i+1] << (8 - (i+1)));
530*0cbf10f5SDavid du Colombier if(n <= 8)
531*0cbf10f5SDavid du Colombier return 1;
532*0cbf10f5SDavid du Colombier n -= 8;
533*0cbf10f5SDavid du Colombier t += 8;
534*0cbf10f5SDavid du Colombier if(n < 8){
535*0cbf10f5SDavid du Colombier t -= 8 - n;
536*0cbf10f5SDavid du Colombier n = 8;
537*0cbf10f5SDavid du Colombier }
538*0cbf10f5SDavid du Colombier encrypt9(key, t, 8);
539*0cbf10f5SDavid du Colombier }
540*0cbf10f5SDavid du Colombier }
541*0cbf10f5SDavid du Colombier
542*0cbf10f5SDavid du Colombier int
netcrypt(void * key,void * chal)543*0cbf10f5SDavid du Colombier netcrypt(void *key, void *chal)
544*0cbf10f5SDavid du Colombier {
545*0cbf10f5SDavid du Colombier uchar buf[8], *p;
546*0cbf10f5SDavid du Colombier
547*0cbf10f5SDavid du Colombier strncpy((char*)buf, chal, 7);
548*0cbf10f5SDavid du Colombier buf[7] = '\0';
549*0cbf10f5SDavid du Colombier for(p = buf; *p && *p != '\n'; p++)
550*0cbf10f5SDavid du Colombier ;
551*0cbf10f5SDavid du Colombier *p = '\0';
552*0cbf10f5SDavid du Colombier encrypt9(key, buf, 8);
553*0cbf10f5SDavid du Colombier sprintf(chal, "%.2x%.2x%.2x%.2x", buf[0], buf[1], buf[2], buf[3]);
554*0cbf10f5SDavid du Colombier return 1;
555*0cbf10f5SDavid du Colombier }
556*0cbf10f5SDavid du Colombier
557*0cbf10f5SDavid du Colombier void
main(int argc,char * argv[])558*0cbf10f5SDavid du Colombier main(int argc, char *argv[])
559*0cbf10f5SDavid du Colombier {
560*0cbf10f5SDavid du Colombier char buf[32], pass[32], key[DESKEYLEN];
561*0cbf10f5SDavid du Colombier int n;
562*0cbf10f5SDavid du Colombier
563*0cbf10f5SDavid du Colombier printf("Run this directly on the local processor, NOT in a\n");
564*0cbf10f5SDavid du Colombier printf(" window to a computer across the network.\n");
565*0cbf10f5SDavid du Colombier printf("Type when no one else is looking.\n\n");
566*0cbf10f5SDavid du Colombier printf("password: ");
567*0cbf10f5SDavid du Colombier fflush(stdout);
568*0cbf10f5SDavid du Colombier n = read(0, pass, sizeof pass - 1);
569*0cbf10f5SDavid du Colombier if(n <= 0)
570*0cbf10f5SDavid du Colombier exit(0);
571*0cbf10f5SDavid du Colombier pass[n] = 0;
572*0cbf10f5SDavid du Colombier if(pass[n-1]=='\n')
573*0cbf10f5SDavid du Colombier pass[--n] = 0;
574*0cbf10f5SDavid du Colombier if(pass[n-1]=='\r')
575*0cbf10f5SDavid du Colombier pass[--n] = 0;
576*0cbf10f5SDavid du Colombier passtokey(key,pass);
577*0cbf10f5SDavid du Colombier for(;;){
578*0cbf10f5SDavid du Colombier printf("challenge: ");
579*0cbf10f5SDavid du Colombier fflush(stdout);
580*0cbf10f5SDavid du Colombier n = read(0, buf, sizeof buf - 1);
581*0cbf10f5SDavid du Colombier if(n <= 0)
582*0cbf10f5SDavid du Colombier exit(0);
583*0cbf10f5SDavid du Colombier buf[n] = '\0';
584*0cbf10f5SDavid du Colombier netcrypt(key, buf);
585*0cbf10f5SDavid du Colombier printf("response: %s\n", buf);
586*0cbf10f5SDavid du Colombier }
587*0cbf10f5SDavid du Colombier }
588