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