]>
Commit | Line | Data |
---|---|---|
1 | ||
2 | typedef long unsigned int size_t; | |
3 | typedef unsigned char __u_char; | |
4 | typedef unsigned short int __u_short; | |
5 | typedef unsigned int __u_int; | |
6 | typedef unsigned long int __u_long; | |
7 | typedef signed char __int8_t; | |
8 | typedef unsigned char __uint8_t; | |
9 | typedef signed short int __int16_t; | |
10 | typedef unsigned short int __uint16_t; | |
11 | typedef signed int __int32_t; | |
12 | typedef unsigned int __uint32_t; | |
13 | typedef signed long int __int64_t; | |
14 | typedef unsigned long int __uint64_t; | |
15 | typedef long int __quad_t; | |
16 | typedef unsigned long int __u_quad_t; | |
17 | typedef unsigned long int __dev_t; | |
18 | typedef unsigned int __uid_t; | |
19 | typedef unsigned int __gid_t; | |
20 | typedef unsigned long int __ino_t; | |
21 | typedef unsigned long int __ino64_t; | |
22 | typedef unsigned int __mode_t; | |
23 | typedef unsigned long int __nlink_t; | |
24 | typedef long int __off_t; | |
25 | typedef long int __off64_t; | |
26 | typedef int __pid_t; | |
27 | typedef struct { int __val[2]; } __fsid_t; | |
28 | typedef long int __clock_t; | |
29 | typedef unsigned long int __rlim_t; | |
30 | typedef unsigned long int __rlim64_t; | |
31 | typedef unsigned int __id_t; | |
32 | typedef long int __time_t; | |
33 | typedef unsigned int __useconds_t; | |
34 | typedef long int __suseconds_t; | |
35 | typedef int __daddr_t; | |
36 | typedef long int __swblk_t; | |
37 | typedef int __key_t; | |
38 | typedef int __clockid_t; | |
39 | typedef void * __timer_t; | |
40 | typedef long int __blksize_t; | |
41 | typedef long int __blkcnt_t; | |
42 | typedef long int __blkcnt64_t; | |
43 | typedef unsigned long int __fsblkcnt_t; | |
44 | typedef unsigned long int __fsblkcnt64_t; | |
45 | typedef unsigned long int __fsfilcnt_t; | |
46 | typedef unsigned long int __fsfilcnt64_t; | |
47 | typedef long int __ssize_t; | |
48 | typedef __off64_t __loff_t; | |
49 | typedef __quad_t *__qaddr_t; | |
50 | typedef char *__caddr_t; | |
51 | typedef long int __intptr_t; | |
52 | typedef unsigned int __socklen_t; | |
53 | typedef __u_char u_char; | |
54 | typedef __u_short u_short; | |
55 | typedef __u_int u_int; | |
56 | typedef __u_long u_long; | |
57 | typedef __quad_t quad_t; | |
58 | typedef __u_quad_t u_quad_t; | |
59 | typedef __fsid_t fsid_t; | |
60 | typedef __loff_t loff_t; | |
61 | typedef __ino_t ino_t; | |
62 | ||
63 | ||
64 | typedef __dev_t dev_t; | |
65 | ||
66 | ||
67 | ||
68 | ||
69 | typedef __gid_t gid_t; | |
70 | ||
71 | ||
72 | ||
73 | ||
74 | typedef __mode_t mode_t; | |
75 | ||
76 | ||
77 | ||
78 | ||
79 | typedef __nlink_t nlink_t; | |
80 | ||
81 | ||
82 | ||
83 | ||
84 | typedef __uid_t uid_t; | |
85 | ||
86 | ||
87 | ||
88 | ||
89 | ||
90 | typedef __off_t off_t; | |
91 | typedef __pid_t pid_t; | |
92 | typedef __id_t id_t; | |
93 | typedef __ssize_t ssize_t; | |
94 | typedef __daddr_t daddr_t; | |
95 | typedef __caddr_t caddr_t; | |
96 | typedef __key_t key_t; | |
97 | ||
98 | typedef __time_t time_t; | |
99 | ||
100 | ||
101 | typedef __clockid_t clockid_t; | |
102 | ||
103 | ||
104 | ||
105 | ||
106 | ||
107 | typedef __timer_t timer_t; | |
108 | typedef unsigned long int ulong; | |
109 | typedef unsigned short int ushort; | |
110 | typedef unsigned int uint; | |
111 | typedef int int8_t __attribute__ ((__mode__ (__QI__))); | |
112 | typedef int int16_t __attribute__ ((__mode__ (__HI__))); | |
113 | typedef int int32_t __attribute__ ((__mode__ (__SI__))); | |
114 | typedef int int64_t __attribute__ ((__mode__ (__DI__))); | |
115 | typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__))); | |
116 | typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__))); | |
117 | typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__))); | |
118 | typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__))); | |
119 | typedef int register_t __attribute__ ((__mode__ (__word__))); | |
120 | typedef int __sig_atomic_t; | |
121 | typedef struct | |
122 | { | |
123 | unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; | |
124 | } __sigset_t; | |
125 | typedef __sigset_t sigset_t; | |
126 | struct timespec | |
127 | { | |
128 | __time_t tv_sec; | |
129 | long int tv_nsec; | |
130 | }; | |
131 | struct timeval | |
132 | { | |
133 | __time_t tv_sec; | |
134 | __suseconds_t tv_usec; | |
135 | }; | |
136 | typedef __suseconds_t suseconds_t; | |
137 | typedef long int __fd_mask; | |
138 | typedef struct | |
139 | { | |
140 | __fd_mask __fds_bits[1024 / (8 * sizeof (__fd_mask))]; | |
141 | } fd_set; | |
142 | typedef __fd_mask fd_mask; | |
143 | ||
144 | extern int select (int __nfds, fd_set *__restrict __readfds, | |
145 | fd_set *__restrict __writefds, | |
146 | fd_set *__restrict __exceptfds, | |
147 | struct timeval *__restrict __timeout); | |
148 | extern int pselect (int __nfds, fd_set *__restrict __readfds, | |
149 | fd_set *__restrict __writefds, | |
150 | fd_set *__restrict __exceptfds, | |
151 | const struct timespec *__restrict __timeout, | |
152 | const __sigset_t *__restrict __sigmask); | |
153 | ||
154 | __extension__ | |
155 | extern __inline unsigned int gnu_dev_major (unsigned long long int __dev) | |
156 | __attribute__ ((__nothrow__)); | |
157 | __extension__ | |
158 | extern __inline unsigned int gnu_dev_minor (unsigned long long int __dev) | |
159 | __attribute__ ((__nothrow__)); | |
160 | __extension__ | |
161 | extern __inline unsigned long long int gnu_dev_makedev (unsigned int __major, | |
162 | unsigned int __minor) | |
163 | __attribute__ ((__nothrow__)); | |
164 | __extension__ extern __inline unsigned int | |
165 | __attribute__ ((__nothrow__)) gnu_dev_major (unsigned long long int __dev) | |
166 | { | |
167 | return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff); | |
168 | } | |
169 | __extension__ extern __inline unsigned int | |
170 | __attribute__ ((__nothrow__)) gnu_dev_minor (unsigned long long int __dev) | |
171 | { | |
172 | return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff); | |
173 | } | |
174 | __extension__ extern __inline unsigned long long int | |
175 | __attribute__ ((__nothrow__)) gnu_dev_makedev (unsigned int __major, unsigned int __minor) | |
176 | { | |
177 | return ((__minor & 0xff) | ((__major & 0xfff) << 8) | |
178 | | (((unsigned long long int) (__minor & ~0xff)) << 12) | |
179 | | (((unsigned long long int) (__major & ~0xfff)) << 32)); | |
180 | } | |
181 | typedef __blkcnt_t blkcnt_t; | |
182 | typedef __fsblkcnt_t fsblkcnt_t; | |
183 | typedef __fsfilcnt_t fsfilcnt_t; | |
184 | typedef unsigned long int pthread_t; | |
185 | typedef union | |
186 | { | |
187 | char __size[56]; | |
188 | long int __align; | |
189 | } pthread_attr_t; | |
190 | typedef struct __pthread_internal_list | |
191 | { | |
192 | struct __pthread_internal_list *__prev; | |
193 | struct __pthread_internal_list *__next; | |
194 | } __pthread_list_t; | |
195 | typedef union | |
196 | { | |
197 | struct __pthread_mutex_s | |
198 | { | |
199 | int __lock; | |
200 | unsigned int __count; | |
201 | int __owner; | |
202 | unsigned int __nusers; | |
203 | int __kind; | |
204 | int __spins; | |
205 | __pthread_list_t __list; | |
206 | } __data; | |
207 | char __size[40]; | |
208 | long int __align; | |
209 | } pthread_mutex_t; | |
210 | typedef union | |
211 | { | |
212 | char __size[4]; | |
213 | int __align; | |
214 | } pthread_mutexattr_t; | |
215 | typedef union | |
216 | { | |
217 | struct | |
218 | { | |
219 | int __lock; | |
220 | unsigned int __futex; | |
221 | __extension__ unsigned long long int __total_seq; | |
222 | __extension__ unsigned long long int __wakeup_seq; | |
223 | __extension__ unsigned long long int __woken_seq; | |
224 | void *__mutex; | |
225 | unsigned int __nwaiters; | |
226 | unsigned int __broadcast_seq; | |
227 | } __data; | |
228 | char __size[48]; | |
229 | __extension__ long long int __align; | |
230 | } pthread_cond_t; | |
231 | typedef union | |
232 | { | |
233 | char __size[4]; | |
234 | int __align; | |
235 | } pthread_condattr_t; | |
236 | typedef unsigned int pthread_key_t; | |
237 | typedef int pthread_once_t; | |
238 | typedef union | |
239 | { | |
240 | struct | |
241 | { | |
242 | int __lock; | |
243 | unsigned int __nr_readers; | |
244 | unsigned int __readers_wakeup; | |
245 | unsigned int __writer_wakeup; | |
246 | unsigned int __nr_readers_queued; | |
247 | unsigned int __nr_writers_queued; | |
248 | int __writer; | |
249 | int __pad1; | |
250 | unsigned long int __pad2; | |
251 | unsigned long int __pad3; | |
252 | unsigned int __flags; | |
253 | } __data; | |
254 | char __size[56]; | |
255 | long int __align; | |
256 | } pthread_rwlock_t; | |
257 | typedef union | |
258 | { | |
259 | char __size[8]; | |
260 | long int __align; | |
261 | } pthread_rwlockattr_t; | |
262 | typedef volatile int pthread_spinlock_t; | |
263 | typedef union | |
264 | { | |
265 | char __size[32]; | |
266 | long int __align; | |
267 | } pthread_barrier_t; | |
268 | typedef union | |
269 | { | |
270 | char __size[4]; | |
271 | int __align; | |
272 | } pthread_barrierattr_t; | |
273 | ||
274 | ||
275 | ||
276 | typedef unsigned char uint8_t; | |
277 | typedef unsigned short int uint16_t; | |
278 | typedef unsigned int uint32_t; | |
279 | typedef unsigned long int uint64_t; | |
280 | typedef signed char int_least8_t; | |
281 | typedef short int int_least16_t; | |
282 | typedef int int_least32_t; | |
283 | typedef long int int_least64_t; | |
284 | typedef unsigned char uint_least8_t; | |
285 | typedef unsigned short int uint_least16_t; | |
286 | typedef unsigned int uint_least32_t; | |
287 | typedef unsigned long int uint_least64_t; | |
288 | typedef signed char int_fast8_t; | |
289 | typedef long int int_fast16_t; | |
290 | typedef long int int_fast32_t; | |
291 | typedef long int int_fast64_t; | |
292 | typedef unsigned char uint_fast8_t; | |
293 | typedef unsigned long int uint_fast16_t; | |
294 | typedef unsigned long int uint_fast32_t; | |
295 | typedef unsigned long int uint_fast64_t; | |
296 | typedef long int intptr_t; | |
297 | typedef unsigned long int uintptr_t; | |
298 | typedef long int intmax_t; | |
299 | typedef unsigned long int uintmax_t; | |
300 | ||
301 | ||
302 | struct iovec | |
303 | { | |
304 | void *iov_base; | |
305 | size_t iov_len; | |
306 | }; | |
307 | extern ssize_t readv (int __fd, __const struct iovec *__iovec, int __count); | |
308 | extern ssize_t writev (int __fd, __const struct iovec *__iovec, int __count); | |
309 | ||
310 | typedef __socklen_t socklen_t; | |
311 | enum __socket_type | |
312 | { | |
313 | SOCK_STREAM = 1, | |
314 | SOCK_DGRAM = 2, | |
315 | SOCK_RAW = 3, | |
316 | SOCK_RDM = 4, | |
317 | SOCK_SEQPACKET = 5, | |
318 | SOCK_PACKET = 10 | |
319 | }; | |
320 | typedef unsigned short int sa_family_t; | |
321 | struct sockaddr | |
322 | { | |
323 | sa_family_t sa_family; | |
324 | char sa_data[14]; | |
325 | }; | |
326 | struct sockaddr_storage | |
327 | { | |
328 | sa_family_t ss_family; | |
329 | __uint64_t __ss_align; | |
330 | char __ss_padding[(128 - (2 * sizeof (__uint64_t)))]; | |
331 | }; | |
332 | enum | |
333 | { | |
334 | MSG_OOB = 0x01, | |
335 | MSG_PEEK = 0x02, | |
336 | MSG_DONTROUTE = 0x04, | |
337 | MSG_CTRUNC = 0x08, | |
338 | MSG_PROXY = 0x10, | |
339 | MSG_TRUNC = 0x20, | |
340 | MSG_DONTWAIT = 0x40, | |
341 | MSG_EOR = 0x80, | |
342 | MSG_WAITALL = 0x100, | |
343 | MSG_FIN = 0x200, | |
344 | MSG_SYN = 0x400, | |
345 | MSG_CONFIRM = 0x800, | |
346 | MSG_RST = 0x1000, | |
347 | MSG_ERRQUEUE = 0x2000, | |
348 | MSG_NOSIGNAL = 0x4000, | |
349 | MSG_MORE = 0x8000 | |
350 | }; | |
351 | struct msghdr | |
352 | { | |
353 | void *msg_name; | |
354 | socklen_t msg_namelen; | |
355 | struct iovec *msg_iov; | |
356 | size_t msg_iovlen; | |
357 | void *msg_control; | |
358 | size_t msg_controllen; | |
359 | int msg_flags; | |
360 | }; | |
361 | struct cmsghdr | |
362 | { | |
363 | size_t cmsg_len; | |
364 | int cmsg_level; | |
365 | int cmsg_type; | |
366 | __extension__ unsigned char __cmsg_data []; | |
367 | }; | |
368 | extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr, | |
369 | struct cmsghdr *__cmsg) __attribute__ ((__nothrow__)); | |
370 | enum | |
371 | { | |
372 | SCM_RIGHTS = 0x01 | |
373 | , SCM_CREDENTIALS = 0x02 | |
374 | }; | |
375 | struct ucred | |
376 | { | |
377 | pid_t pid; | |
378 | uid_t uid; | |
379 | gid_t gid; | |
380 | }; | |
381 | struct linger | |
382 | { | |
383 | int l_onoff; | |
384 | int l_linger; | |
385 | }; | |
386 | struct osockaddr | |
387 | { | |
388 | unsigned short int sa_family; | |
389 | unsigned char sa_data[14]; | |
390 | }; | |
391 | enum | |
392 | { | |
393 | SHUT_RD = 0, | |
394 | SHUT_WR, | |
395 | SHUT_RDWR | |
396 | }; | |
397 | extern int socket (int __domain, int __type, int __protocol) __attribute__ ((__nothrow__)); | |
398 | extern int socketpair (int __domain, int __type, int __protocol, | |
399 | int __fds[2]) __attribute__ ((__nothrow__)); | |
400 | extern int bind (int __fd, __const struct sockaddr * __addr, socklen_t __len) | |
401 | __attribute__ ((__nothrow__)); | |
402 | extern int getsockname (int __fd, struct sockaddr *__restrict __addr, | |
403 | socklen_t *__restrict __len) __attribute__ ((__nothrow__)); | |
404 | extern int connect (int __fd, __const struct sockaddr * __addr, socklen_t __len); | |
405 | extern int getpeername (int __fd, struct sockaddr *__restrict __addr, | |
406 | socklen_t *__restrict __len) __attribute__ ((__nothrow__)); | |
407 | extern ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags); | |
408 | extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags); | |
409 | extern ssize_t sendto (int __fd, __const void *__buf, size_t __n, | |
410 | int __flags, __const struct sockaddr * __addr, | |
411 | socklen_t __addr_len); | |
412 | extern ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, | |
413 | int __flags, struct sockaddr *__restrict __addr, | |
414 | socklen_t *__restrict __addr_len); | |
415 | extern ssize_t sendmsg (int __fd, __const struct msghdr *__message, | |
416 | int __flags); | |
417 | extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags); | |
418 | extern int getsockopt (int __fd, int __level, int __optname, | |
419 | void *__restrict __optval, | |
420 | socklen_t *__restrict __optlen) __attribute__ ((__nothrow__)); | |
421 | extern int setsockopt (int __fd, int __level, int __optname, | |
422 | __const void *__optval, socklen_t __optlen) __attribute__ ((__nothrow__)); | |
423 | extern int listen (int __fd, int __n) __attribute__ ((__nothrow__)); | |
424 | extern int accept (int __fd, struct sockaddr *__restrict __addr, | |
425 | socklen_t *__restrict __addr_len); | |
426 | extern int shutdown (int __fd, int __how) __attribute__ ((__nothrow__)); | |
427 | extern int sockatmark (int __fd) __attribute__ ((__nothrow__)); | |
428 | extern int isfdtype (int __fd, int __fdtype) __attribute__ ((__nothrow__)); | |
429 | ||
430 | ||
431 | enum | |
432 | { | |
433 | IPPROTO_IP = 0, | |
434 | IPPROTO_HOPOPTS = 0, | |
435 | IPPROTO_ICMP = 1, | |
436 | IPPROTO_IGMP = 2, | |
437 | IPPROTO_IPIP = 4, | |
438 | IPPROTO_TCP = 6, | |
439 | IPPROTO_EGP = 8, | |
440 | IPPROTO_PUP = 12, | |
441 | IPPROTO_UDP = 17, | |
442 | IPPROTO_IDP = 22, | |
443 | IPPROTO_TP = 29, | |
444 | IPPROTO_IPV6 = 41, | |
445 | IPPROTO_ROUTING = 43, | |
446 | IPPROTO_FRAGMENT = 44, | |
447 | IPPROTO_RSVP = 46, | |
448 | IPPROTO_GRE = 47, | |
449 | IPPROTO_ESP = 50, | |
450 | IPPROTO_AH = 51, | |
451 | IPPROTO_ICMPV6 = 58, | |
452 | IPPROTO_NONE = 59, | |
453 | IPPROTO_DSTOPTS = 60, | |
454 | IPPROTO_MTP = 92, | |
455 | IPPROTO_ENCAP = 98, | |
456 | IPPROTO_PIM = 103, | |
457 | IPPROTO_COMP = 108, | |
458 | IPPROTO_SCTP = 132, | |
459 | IPPROTO_RAW = 255, | |
460 | IPPROTO_MAX | |
461 | }; | |
462 | typedef uint16_t in_port_t; | |
463 | enum | |
464 | { | |
465 | IPPORT_ECHO = 7, | |
466 | IPPORT_DISCARD = 9, | |
467 | IPPORT_SYSTAT = 11, | |
468 | IPPORT_DAYTIME = 13, | |
469 | IPPORT_NETSTAT = 15, | |
470 | IPPORT_FTP = 21, | |
471 | IPPORT_TELNET = 23, | |
472 | IPPORT_SMTP = 25, | |
473 | IPPORT_TIMESERVER = 37, | |
474 | IPPORT_NAMESERVER = 42, | |
475 | IPPORT_WHOIS = 43, | |
476 | IPPORT_MTP = 57, | |
477 | IPPORT_TFTP = 69, | |
478 | IPPORT_RJE = 77, | |
479 | IPPORT_FINGER = 79, | |
480 | IPPORT_TTYLINK = 87, | |
481 | IPPORT_SUPDUP = 95, | |
482 | IPPORT_EXECSERVER = 512, | |
483 | IPPORT_LOGINSERVER = 513, | |
484 | IPPORT_CMDSERVER = 514, | |
485 | IPPORT_EFSSERVER = 520, | |
486 | IPPORT_BIFFUDP = 512, | |
487 | IPPORT_WHOSERVER = 513, | |
488 | IPPORT_ROUTESERVER = 520, | |
489 | IPPORT_RESERVED = 1024, | |
490 | IPPORT_USERRESERVED = 5000 | |
491 | }; | |
492 | typedef uint32_t in_addr_t; | |
493 | struct in_addr | |
494 | { | |
495 | in_addr_t s_addr; | |
496 | }; | |
497 | struct in6_addr | |
498 | { | |
499 | union | |
500 | { | |
501 | uint8_t u6_addr8[16]; | |
502 | uint16_t u6_addr16[8]; | |
503 | uint32_t u6_addr32[4]; | |
504 | } in6_u; | |
505 | }; | |
506 | extern const struct in6_addr in6addr_any; | |
507 | extern const struct in6_addr in6addr_loopback; | |
508 | struct sockaddr_in | |
509 | { | |
510 | sa_family_t sin_family; | |
511 | in_port_t sin_port; | |
512 | struct in_addr sin_addr; | |
513 | unsigned char sin_zero[sizeof (struct sockaddr) - | |
514 | (sizeof (unsigned short int)) - | |
515 | sizeof (in_port_t) - | |
516 | sizeof (struct in_addr)]; | |
517 | }; | |
518 | struct sockaddr_in6 | |
519 | { | |
520 | sa_family_t sin6_family; | |
521 | in_port_t sin6_port; | |
522 | uint32_t sin6_flowinfo; | |
523 | struct in6_addr sin6_addr; | |
524 | uint32_t sin6_scope_id; | |
525 | }; | |
526 | struct ip_mreq | |
527 | { | |
528 | struct in_addr imr_multiaddr; | |
529 | struct in_addr imr_interface; | |
530 | }; | |
531 | struct ip_mreq_source | |
532 | { | |
533 | struct in_addr imr_multiaddr; | |
534 | struct in_addr imr_interface; | |
535 | struct in_addr imr_sourceaddr; | |
536 | }; | |
537 | struct ipv6_mreq | |
538 | { | |
539 | struct in6_addr ipv6mr_multiaddr; | |
540 | unsigned int ipv6mr_interface; | |
541 | }; | |
542 | struct group_req | |
543 | { | |
544 | uint32_t gr_interface; | |
545 | struct sockaddr_storage gr_group; | |
546 | }; | |
547 | struct group_source_req | |
548 | { | |
549 | uint32_t gsr_interface; | |
550 | struct sockaddr_storage gsr_group; | |
551 | struct sockaddr_storage gsr_source; | |
552 | }; | |
553 | struct ip_msfilter | |
554 | { | |
555 | struct in_addr imsf_multiaddr; | |
556 | struct in_addr imsf_interface; | |
557 | uint32_t imsf_fmode; | |
558 | uint32_t imsf_numsrc; | |
559 | struct in_addr imsf_slist[1]; | |
560 | }; | |
561 | struct group_filter | |
562 | { | |
563 | uint32_t gf_interface; | |
564 | struct sockaddr_storage gf_group; | |
565 | uint32_t gf_fmode; | |
566 | uint32_t gf_numsrc; | |
567 | struct sockaddr_storage gf_slist[1]; | |
568 | }; | |
569 | struct ip_opts | |
570 | { | |
571 | struct in_addr ip_dst; | |
572 | char ip_opts[40]; | |
573 | }; | |
574 | struct ip_mreqn | |
575 | { | |
576 | struct in_addr imr_multiaddr; | |
577 | struct in_addr imr_address; | |
578 | int imr_ifindex; | |
579 | }; | |
580 | struct in_pktinfo | |
581 | { | |
582 | int ipi_ifindex; | |
583 | struct in_addr ipi_spec_dst; | |
584 | struct in_addr ipi_addr; | |
585 | }; | |
586 | extern uint32_t ntohl (uint32_t __netlong) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); | |
587 | extern uint16_t ntohs (uint16_t __netshort) | |
588 | __attribute__ ((__nothrow__)) __attribute__ ((__const__)); | |
589 | extern uint32_t htonl (uint32_t __hostlong) | |
590 | __attribute__ ((__nothrow__)) __attribute__ ((__const__)); | |
591 | extern uint16_t htons (uint16_t __hostshort) | |
592 | __attribute__ ((__nothrow__)) __attribute__ ((__const__)); | |
593 | extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) __attribute__ ((__nothrow__)); | |
594 | extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in) | |
595 | __attribute__ ((__nothrow__)); | |
596 | struct in6_pktinfo | |
597 | { | |
598 | struct in6_addr ipi6_addr; | |
599 | unsigned int ipi6_ifindex; | |
600 | }; | |
601 | struct ip6_mtuinfo | |
602 | { | |
603 | struct sockaddr_in6 ip6m_addr; | |
604 | uint32_t ip6m_mtu; | |
605 | }; | |
606 | ||
607 | ||
608 | struct passwd | |
609 | { | |
610 | char *pw_name; | |
611 | char *pw_passwd; | |
612 | __uid_t pw_uid; | |
613 | __gid_t pw_gid; | |
614 | char *pw_gecos; | |
615 | char *pw_dir; | |
616 | char *pw_shell; | |
617 | }; | |
618 | ||
619 | typedef struct _IO_FILE FILE; | |
620 | ||
621 | ||
622 | extern void setpwent (void); | |
623 | extern void endpwent (void); | |
624 | extern struct passwd *getpwent (void); | |
625 | extern struct passwd *fgetpwent (FILE *__stream); | |
626 | extern int putpwent (__const struct passwd *__restrict __p, | |
627 | FILE *__restrict __f); | |
628 | extern struct passwd *getpwuid (__uid_t __uid); | |
629 | extern struct passwd *getpwnam (__const char *__name); | |
630 | extern int getpwent_r (struct passwd *__restrict __resultbuf, | |
631 | char *__restrict __buffer, size_t __buflen, | |
632 | struct passwd **__restrict __result); | |
633 | extern int getpwuid_r (__uid_t __uid, | |
634 | struct passwd *__restrict __resultbuf, | |
635 | char *__restrict __buffer, size_t __buflen, | |
636 | struct passwd **__restrict __result); | |
637 | extern int getpwnam_r (__const char *__restrict __name, | |
638 | struct passwd *__restrict __resultbuf, | |
639 | char *__restrict __buffer, size_t __buflen, | |
640 | struct passwd **__restrict __result); | |
641 | extern int fgetpwent_r (FILE *__restrict __stream, | |
642 | struct passwd *__restrict __resultbuf, | |
643 | char *__restrict __buffer, size_t __buflen, | |
644 | struct passwd **__restrict __result); | |
645 | ||
646 | ||
647 | ||
648 | extern void *memcpy (void *__restrict __dest, | |
649 | __const void *__restrict __src, size_t __n) | |
650 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
651 | extern void *memmove (void *__dest, __const void *__src, size_t __n) | |
652 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
653 | ||
654 | extern void *memccpy (void *__restrict __dest, __const void *__restrict __src, | |
655 | int __c, size_t __n) | |
656 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
657 | ||
658 | extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); | |
659 | extern int memcmp (__const void *__s1, __const void *__s2, size_t __n) | |
660 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
661 | extern void *memchr (__const void *__s, int __c, size_t __n) | |
662 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
663 | ||
664 | ||
665 | extern char *strcpy (char *__restrict __dest, __const char *__restrict __src) | |
666 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
667 | extern char *strncpy (char *__restrict __dest, | |
668 | __const char *__restrict __src, size_t __n) | |
669 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
670 | extern char *strcat (char *__restrict __dest, __const char *__restrict __src) | |
671 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
672 | extern char *strncat (char *__restrict __dest, __const char *__restrict __src, | |
673 | size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
674 | extern int strcmp (__const char *__s1, __const char *__s2) | |
675 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
676 | extern int strncmp (__const char *__s1, __const char *__s2, size_t __n) | |
677 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
678 | extern int strcoll (__const char *__s1, __const char *__s2) | |
679 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
680 | extern size_t strxfrm (char *__restrict __dest, | |
681 | __const char *__restrict __src, size_t __n) | |
682 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); | |
683 | ||
684 | extern char *strdup (__const char *__s) | |
685 | __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1))); | |
686 | ||
687 | extern char *strchr (__const char *__s, int __c) | |
688 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
689 | extern char *strrchr (__const char *__s, int __c) | |
690 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
691 | ||
692 | ||
693 | extern size_t strcspn (__const char *__s, __const char *__reject) | |
694 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
695 | extern size_t strspn (__const char *__s, __const char *__accept) | |
696 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
697 | extern char *strpbrk (__const char *__s, __const char *__accept) | |
698 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
699 | extern char *strstr (__const char *__haystack, __const char *__needle) | |
700 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
701 | extern char *strtok (char *__restrict __s, __const char *__restrict __delim) | |
702 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); | |
703 | ||
704 | extern char *__strtok_r (char *__restrict __s, | |
705 | __const char *__restrict __delim, | |
706 | char **__restrict __save_ptr) | |
707 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 3))); | |
708 | extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim, | |
709 | char **__restrict __save_ptr) | |
710 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 3))); | |
711 | ||
712 | extern size_t strlen (__const char *__s) | |
713 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
714 | ||
715 | ||
716 | extern char *strerror (int __errnum) __attribute__ ((__nothrow__)); | |
717 | ||
718 | extern int strerror_r (int __errnum, char *__buf, size_t __buflen) __asm__ ("" "__xpg_strerror_r") __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); | |
719 | extern void __bzero (void *__s, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); | |
720 | extern void bcopy (__const void *__src, void *__dest, size_t __n) | |
721 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
722 | extern void bzero (void *__s, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); | |
723 | extern int bcmp (__const void *__s1, __const void *__s2, size_t __n) | |
724 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
725 | extern char *index (__const char *__s, int __c) | |
726 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
727 | extern char *rindex (__const char *__s, int __c) | |
728 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); | |
729 | extern int ffs (int __i) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); | |
730 | extern int strcasecmp (__const char *__s1, __const char *__s2) | |
731 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
732 | extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n) | |
733 | __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); | |
734 | extern char *strsep (char **__restrict __stringp, | |
735 | __const char *__restrict __delim) | |
736 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
737 | ||
738 | ||
739 | extern char *crypt (__const char *__key, __const char *__salt) | |
740 | __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); | |
741 | extern void setkey (__const char *__key) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); | |
742 | extern void encrypt (char *__block, int __edflag) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); | |
743 | ||
744 | extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt); | |
745 | extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt); | |
746 | static u_char inv_key_perm[64]; | |
747 | static u_char inv_comp_perm[56]; | |
748 | static u_char u_sbox[8][64]; | |
749 | static u_char un_pbox[32]; | |
750 | static u_int32_t en_keysl[16], en_keysr[16]; | |
751 | static u_int32_t de_keysl[16], de_keysr[16]; | |
752 | static u_int32_t ip_maskl[8][256], ip_maskr[8][256]; | |
753 | static u_int32_t fp_maskl[8][256], fp_maskr[8][256]; | |
754 | static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128]; | |
755 | static u_int32_t comp_maskl[8][128], comp_maskr[8][128]; | |
756 | static u_int32_t saltbits; | |
757 | static u_int32_t old_salt; | |
758 | static u_int32_t old_rawkey0, old_rawkey1; | |
759 | static u_char init_perm[64], final_perm[64]; | |
760 | static u_char m_sbox[4][4096]; | |
761 | static u_int32_t psbox[4][256]; | |
762 | static const u_char ascii64[] = | |
763 | "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | |
764 | static const u_char IP[64] = { | |
765 | 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, | |
766 | 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, | |
767 | 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, | |
768 | 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 | |
769 | }; | |
770 | static const u_char key_perm[56] = { | |
771 | 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, | |
772 | 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, | |
773 | 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, | |
774 | 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 | |
775 | }; | |
776 | static const u_char key_shifts[16] = { | |
777 | 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 | |
778 | }; | |
779 | static const u_char comp_perm[48] = { | |
780 | 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, | |
781 | 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, | |
782 | 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, | |
783 | 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 | |
784 | }; | |
785 | static const u_char sbox[8][64] = { | |
786 | { | |
787 | 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, | |
788 | 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, | |
789 | 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, | |
790 | 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, | |
791 | { | |
792 | 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, | |
793 | 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, | |
794 | 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, | |
795 | 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, | |
796 | { | |
797 | 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, | |
798 | 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, | |
799 | 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, | |
800 | 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}, | |
801 | { | |
802 | 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, | |
803 | 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, | |
804 | 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, | |
805 | 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}, | |
806 | { | |
807 | 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, | |
808 | 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, | |
809 | 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, | |
810 | 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}, | |
811 | { | |
812 | 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, | |
813 | 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, | |
814 | 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, | |
815 | 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}, | |
816 | { | |
817 | 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, | |
818 | 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, | |
819 | 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, | |
820 | 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}, | |
821 | { | |
822 | 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, | |
823 | 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, | |
824 | 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, | |
825 | 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11} | |
826 | }; | |
827 | static const u_char pbox[32] = { | |
828 | 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, | |
829 | 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 | |
830 | }; | |
831 | static const u_int32_t bits32[32] = { | |
832 | 0x80000000, 0x40000000, 0x20000000, 0x10000000, | |
833 | 0x08000000, 0x04000000, 0x02000000, 0x01000000, | |
834 | 0x00800000, 0x00400000, 0x00200000, 0x00100000, | |
835 | 0x00080000, 0x00040000, 0x00020000, 0x00010000, | |
836 | 0x00008000, 0x00004000, 0x00002000, 0x00001000, | |
837 | 0x00000800, 0x00000400, 0x00000200, 0x00000100, | |
838 | 0x00000080, 0x00000040, 0x00000020, 0x00000010, | |
839 | 0x00000008, 0x00000004, 0x00000002, 0x00000001 | |
840 | }; | |
841 | static const u_char bits8[8] = | |
842 | { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; | |
843 | static const u_int32_t *bits28, *bits24; | |
844 | static int ascii_to_bin(char ch) | |
845 | { | |
846 | if (ch > 'z') | |
847 | return (0); | |
848 | if (ch >= 'a') | |
849 | return (ch - 'a' + 38); | |
850 | if (ch > 'Z') | |
851 | return (0); | |
852 | if (ch >= 'A') | |
853 | return (ch - 'A' + 12); | |
854 | if (ch > '9') | |
855 | return (0); | |
856 | if (ch >= '.') | |
857 | return (ch - '.'); | |
858 | return (0); | |
859 | } | |
860 | static void des_init(void) | |
861 | { | |
862 | int i, j, b, k, inbit, obit; | |
863 | u_int32_t *p, *il, *ir, *fl, *fr; | |
864 | static int des_initialised = 0; | |
865 | if (des_initialised == 1) | |
866 | return; | |
867 | old_rawkey0 = old_rawkey1 = 0L; | |
868 | saltbits = 0L; | |
869 | old_salt = 0L; | |
870 | bits24 = (bits28 = bits32 + 4) + 4; | |
871 | for (i = 0; i < 8; i++) | |
872 | for (j = 0; j < 64; j++) { | |
873 | b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf); | |
874 | u_sbox[i][j] = sbox[i][b]; | |
875 | } | |
876 | for (b = 0; b < 4; b++) | |
877 | for (i = 0; i < 64; i++) | |
878 | for (j = 0; j < 64; j++) | |
879 | m_sbox[b][(i << 6) | j] = | |
880 | (u_char) ((u_sbox[(b << 1)][i] << 4) | | |
881 | u_sbox[(b << 1) + 1][j]); | |
882 | for (i = 0; i < 64; i++) { | |
883 | init_perm[final_perm[i] = IP[i] - 1] = (u_char) i; | |
884 | inv_key_perm[i] = 255; | |
885 | } | |
886 | for (i = 0; i < 56; i++) { | |
887 | inv_key_perm[key_perm[i] - 1] = (u_char) i; | |
888 | inv_comp_perm[i] = 255; | |
889 | } | |
890 | for (i = 0; i < 48; i++) { | |
891 | inv_comp_perm[comp_perm[i] - 1] = (u_char) i; | |
892 | } | |
893 | for (k = 0; k < 8; k++) { | |
894 | for (i = 0; i < 256; i++) { | |
895 | *(il = &ip_maskl[k][i]) = 0L; | |
896 | *(ir = &ip_maskr[k][i]) = 0L; | |
897 | *(fl = &fp_maskl[k][i]) = 0L; | |
898 | *(fr = &fp_maskr[k][i]) = 0L; | |
899 | for (j = 0; j < 8; j++) { | |
900 | inbit = 8 * k + j; | |
901 | if (i & bits8[j]) { | |
902 | if ((obit = init_perm[inbit]) < 32) | |
903 | *il |= bits32[obit]; | |
904 | else | |
905 | *ir |= bits32[obit - 32]; | |
906 | if ((obit = final_perm[inbit]) < 32) | |
907 | *fl |= bits32[obit]; | |
908 | else | |
909 | *fr |= bits32[obit - 32]; | |
910 | } | |
911 | } | |
912 | } | |
913 | for (i = 0; i < 128; i++) { | |
914 | *(il = &key_perm_maskl[k][i]) = 0L; | |
915 | *(ir = &key_perm_maskr[k][i]) = 0L; | |
916 | for (j = 0; j < 7; j++) { | |
917 | inbit = 8 * k + j; | |
918 | if (i & bits8[j + 1]) { | |
919 | if ((obit = inv_key_perm[inbit]) == 255) | |
920 | continue; | |
921 | if (obit < 28) | |
922 | *il |= bits28[obit]; | |
923 | else | |
924 | *ir |= bits28[obit - 28]; | |
925 | } | |
926 | } | |
927 | *(il = &comp_maskl[k][i]) = 0L; | |
928 | *(ir = &comp_maskr[k][i]) = 0L; | |
929 | for (j = 0; j < 7; j++) { | |
930 | inbit = 7 * k + j; | |
931 | if (i & bits8[j + 1]) { | |
932 | if ((obit = | |
933 | inv_comp_perm[inbit]) == 255) | |
934 | continue; | |
935 | if (obit < 24) | |
936 | *il |= bits24[obit]; | |
937 | else | |
938 | *ir |= bits24[obit - 24]; | |
939 | } | |
940 | } | |
941 | } | |
942 | } | |
943 | for (i = 0; i < 32; i++) | |
944 | un_pbox[pbox[i] - 1] = (u_char) i; | |
945 | for (b = 0; b < 4; b++) | |
946 | for (i = 0; i < 256; i++) { | |
947 | *(p = &psbox[b][i]) = 0L; | |
948 | for (j = 0; j < 8; j++) { | |
949 | if (i & bits8[j]) | |
950 | *p |= bits32[un_pbox[8 * b + j]]; | |
951 | } | |
952 | } | |
953 | des_initialised = 1; | |
954 | } | |
955 | static void setup_salt(u_int32_t salt) | |
956 | { | |
957 | u_int32_t obit, saltbit; | |
958 | int i; | |
959 | if (salt == old_salt) | |
960 | return; | |
961 | old_salt = salt; | |
962 | saltbits = 0L; | |
963 | saltbit = 1; | |
964 | obit = 0x800000; | |
965 | for (i = 0; i < 24; i++) { | |
966 | if (salt & saltbit) | |
967 | saltbits |= obit; | |
968 | saltbit <<= 1; | |
969 | obit >>= 1; | |
970 | } | |
971 | } | |
972 | static int des_setkey(const char *key) | |
973 | { | |
974 | u_int32_t k0, k1, rawkey0, rawkey1; | |
975 | int shifts, round; | |
976 | des_init(); | |
977 | rawkey0 = ntohl(*(const u_int32_t *)key); | |
978 | rawkey1 = ntohl(*(const u_int32_t *)(key + 4)); | |
979 | if ((rawkey0 | rawkey1) | |
980 | && rawkey0 == old_rawkey0 && rawkey1 == old_rawkey1) { | |
981 | return (0); | |
982 | } | |
983 | old_rawkey0 = rawkey0; | |
984 | old_rawkey1 = rawkey1; | |
985 | k0 = key_perm_maskl[0][rawkey0 >> 25] | |
986 | | key_perm_maskl[1][(rawkey0 >> 17) & 0x7f] | |
987 | | key_perm_maskl[2][(rawkey0 >> 9) & 0x7f] | |
988 | | key_perm_maskl[3][(rawkey0 >> 1) & 0x7f] | |
989 | | key_perm_maskl[4][rawkey1 >> 25] | |
990 | | key_perm_maskl[5][(rawkey1 >> 17) & 0x7f] | |
991 | | key_perm_maskl[6][(rawkey1 >> 9) & 0x7f] | |
992 | | key_perm_maskl[7][(rawkey1 >> 1) & 0x7f]; | |
993 | k1 = key_perm_maskr[0][rawkey0 >> 25] | |
994 | | key_perm_maskr[1][(rawkey0 >> 17) & 0x7f] | |
995 | | key_perm_maskr[2][(rawkey0 >> 9) & 0x7f] | |
996 | | key_perm_maskr[3][(rawkey0 >> 1) & 0x7f] | |
997 | | key_perm_maskr[4][rawkey1 >> 25] | |
998 | | key_perm_maskr[5][(rawkey1 >> 17) & 0x7f] | |
999 | | key_perm_maskr[6][(rawkey1 >> 9) & 0x7f] | |
1000 | | key_perm_maskr[7][(rawkey1 >> 1) & 0x7f]; | |
1001 | shifts = 0; | |
1002 | for (round = 0; round < 16; round++) { | |
1003 | u_int32_t t0, t1; | |
1004 | shifts += key_shifts[round]; | |
1005 | t0 = (k0 << shifts) | (k0 >> (28 - shifts)); | |
1006 | t1 = (k1 << shifts) | (k1 >> (28 - shifts)); | |
1007 | de_keysl[15 - round] = | |
1008 | en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f] | |
1009 | | comp_maskl[1][(t0 >> 14) & 0x7f] | |
1010 | | comp_maskl[2][(t0 >> 7) & 0x7f] | |
1011 | | comp_maskl[3][t0 & 0x7f] | |
1012 | | comp_maskl[4][(t1 >> 21) & 0x7f] | |
1013 | | comp_maskl[5][(t1 >> 14) & 0x7f] | |
1014 | | comp_maskl[6][(t1 >> 7) & 0x7f] | |
1015 | | comp_maskl[7][t1 & 0x7f]; | |
1016 | de_keysr[15 - round] = | |
1017 | en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f] | |
1018 | | comp_maskr[1][(t0 >> 14) & 0x7f] | |
1019 | | comp_maskr[2][(t0 >> 7) & 0x7f] | |
1020 | | comp_maskr[3][t0 & 0x7f] | |
1021 | | comp_maskr[4][(t1 >> 21) & 0x7f] | |
1022 | | comp_maskr[5][(t1 >> 14) & 0x7f] | |
1023 | | comp_maskr[6][(t1 >> 7) & 0x7f] | |
1024 | | comp_maskr[7][t1 & 0x7f]; | |
1025 | } | |
1026 | return (0); | |
1027 | } | |
1028 | static int | |
1029 | do_des(u_int32_t l_in, u_int32_t r_in, u_int32_t * l_out, u_int32_t * r_out, | |
1030 | int count) | |
1031 | { | |
1032 | u_int32_t l, r, *kl, *kr, *kl1, *kr1; | |
1033 | u_int32_t f, r48l, r48r; | |
1034 | int round; | |
1035 | if (count == 0) { | |
1036 | return (1); | |
1037 | } else if (count > 0) { | |
1038 | kl1 = en_keysl; | |
1039 | kr1 = en_keysr; | |
1040 | } else { | |
1041 | count = -count; | |
1042 | kl1 = de_keysl; | |
1043 | kr1 = de_keysr; | |
1044 | } | |
1045 | l = ip_maskl[0][l_in >> 24] | |
1046 | | ip_maskl[1][(l_in >> 16) & 0xff] | |
1047 | | ip_maskl[2][(l_in >> 8) & 0xff] | |
1048 | | ip_maskl[3][l_in & 0xff] | |
1049 | | ip_maskl[4][r_in >> 24] | |
1050 | | ip_maskl[5][(r_in >> 16) & 0xff] | |
1051 | | ip_maskl[6][(r_in >> 8) & 0xff] | |
1052 | | ip_maskl[7][r_in & 0xff]; | |
1053 | r = ip_maskr[0][l_in >> 24] | |
1054 | | ip_maskr[1][(l_in >> 16) & 0xff] | |
1055 | | ip_maskr[2][(l_in >> 8) & 0xff] | |
1056 | | ip_maskr[3][l_in & 0xff] | |
1057 | | ip_maskr[4][r_in >> 24] | |
1058 | | ip_maskr[5][(r_in >> 16) & 0xff] | |
1059 | | ip_maskr[6][(r_in >> 8) & 0xff] | |
1060 | | ip_maskr[7][r_in & 0xff]; | |
1061 | while (count--) { | |
1062 | kl = kl1; | |
1063 | kr = kr1; | |
1064 | round = 16; | |
1065 | while (round--) { | |
1066 | r48l = ((r & 0x00000001) << 23) | |
1067 | | ((r & 0xf8000000) >> 9) | |
1068 | | ((r & 0x1f800000) >> 11) | |
1069 | | ((r & 0x01f80000) >> 13) | |
1070 | | ((r & 0x001f8000) >> 15); | |
1071 | r48r = ((r & 0x0001f800) << 7) | |
1072 | | ((r & 0x00001f80) << 5) | |
1073 | | ((r & 0x000001f8) << 3) | |
1074 | | ((r & 0x0000001f) << 1) | |
1075 | | ((r & 0x80000000) >> 31); | |
1076 | f = (r48l ^ r48r) & saltbits; | |
1077 | r48l ^= f ^ *kl++; | |
1078 | r48r ^= f ^ *kr++; | |
1079 | f = psbox[0][m_sbox[0][r48l >> 12]] | |
1080 | | psbox[1][m_sbox[1][r48l & 0xfff]] | |
1081 | | psbox[2][m_sbox[2][r48r >> 12]] | |
1082 | | psbox[3][m_sbox[3][r48r & 0xfff]]; | |
1083 | f ^= l; | |
1084 | l = r; | |
1085 | r = f; | |
1086 | } | |
1087 | r = l; | |
1088 | l = f; | |
1089 | } | |
1090 | *l_out = fp_maskl[0][l >> 24] | |
1091 | | fp_maskl[1][(l >> 16) & 0xff] | |
1092 | | fp_maskl[2][(l >> 8) & 0xff] | |
1093 | | fp_maskl[3][l & 0xff] | |
1094 | | fp_maskl[4][r >> 24] | |
1095 | | fp_maskl[5][(r >> 16) & 0xff] | |
1096 | | fp_maskl[6][(r >> 8) & 0xff] | |
1097 | | fp_maskl[7][r & 0xff]; | |
1098 | *r_out = fp_maskr[0][l >> 24] | |
1099 | | fp_maskr[1][(l >> 16) & 0xff] | |
1100 | | fp_maskr[2][(l >> 8) & 0xff] | |
1101 | | fp_maskr[3][l & 0xff] | |
1102 | | fp_maskr[4][r >> 24] | |
1103 | | fp_maskr[5][(r >> 16) & 0xff] | |
1104 | | fp_maskr[6][(r >> 8) & 0xff] | |
1105 | | fp_maskr[7][r & 0xff]; | |
1106 | return (0); | |
1107 | } | |
1108 | void setkey(const char *key) | |
1109 | { | |
1110 | int i, j; | |
1111 | u_int32_t packed_keys[2]; | |
1112 | u_char *p; | |
1113 | p = (u_char *) packed_keys; | |
1114 | for (i = 0; i < 8; i++) { | |
1115 | p[i] = 0; | |
1116 | for (j = 0; j < 8; j++) | |
1117 | if (*key++ & 1) | |
1118 | p[i] |= bits8[j]; | |
1119 | } | |
1120 | des_setkey((char *)p); | |
1121 | } | |
1122 | void encrypt(char *block, int flag) | |
1123 | { | |
1124 | u_int32_t io[2]; | |
1125 | u_char *p; | |
1126 | int i, j; | |
1127 | des_init(); | |
1128 | setup_salt(0L); | |
1129 | p = (u_char *) block; | |
1130 | for (i = 0; i < 2; i++) { | |
1131 | io[i] = 0L; | |
1132 | for (j = 0; j < 32; j++) | |
1133 | if (*p++ & 1) | |
1134 | io[i] |= bits32[j]; | |
1135 | } | |
1136 | do_des(io[0], io[1], io, io + 1, flag ? -1 : 1); | |
1137 | for (i = 0; i < 2; i++) | |
1138 | for (j = 0; j < 32; j++) | |
1139 | block[(i << 5) | j] = (io[i] & bits32[j]) ? 1 : 0; | |
1140 | } | |
1141 | char *__des_crypt(const unsigned char *key, const unsigned char *setting) | |
1142 | { | |
1143 | u_int32_t count, salt, l, r0, r1, keybuf[2]; | |
1144 | u_char *p, *q; | |
1145 | static char output[21]; | |
1146 | des_init(); | |
1147 | q = (u_char *) keybuf; | |
1148 | while (q - (u_char *) keybuf - 8) { | |
1149 | *q++ = *key << 1; | |
1150 | if (*(q - 1)) | |
1151 | key++; | |
1152 | } | |
1153 | if (des_setkey((char *)keybuf)) | |
1154 | return (((void *)0)); | |
1155 | { | |
1156 | count = 25; | |
1157 | salt = (ascii_to_bin(setting[1]) << 6) | |
1158 | | ascii_to_bin(setting[0]); | |
1159 | output[0] = setting[0]; | |
1160 | output[1] = setting[1] ? setting[1] : output[0]; | |
1161 | p = (u_char *) output + 2; | |
1162 | } | |
1163 | setup_salt(salt); | |
1164 | if (do_des(0L, 0L, &r0, &r1, (int)count)) | |
1165 | return (((void *)0)); | |
1166 | l = (r0 >> 8); | |
1167 | *p++ = ascii64[(l >> 18) & 0x3f]; | |
1168 | *p++ = ascii64[(l >> 12) & 0x3f]; | |
1169 | *p++ = ascii64[(l >> 6) & 0x3f]; | |
1170 | *p++ = ascii64[l & 0x3f]; | |
1171 | l = (r0 << 16) | ((r1 >> 16) & 0xffff); | |
1172 | *p++ = ascii64[(l >> 18) & 0x3f]; | |
1173 | *p++ = ascii64[(l >> 12) & 0x3f]; | |
1174 | *p++ = ascii64[(l >> 6) & 0x3f]; | |
1175 | *p++ = ascii64[l & 0x3f]; | |
1176 | l = r1 << 2; | |
1177 | *p++ = ascii64[(l >> 12) & 0x3f]; | |
1178 | *p++ = ascii64[(l >> 6) & 0x3f]; | |
1179 | *p++ = ascii64[l & 0x3f]; | |
1180 | *p = 0; | |
1181 | return (output); | |
1182 | } |