Change __signed to signed.
[dragonfly.git] / crypto / kerberosIV / appl / sample / simple_server.c
1 /*
2  *
3  * Copyright 1989 by the Massachusetts Institute of Technology.
4  *
5  * For copying and distribution information, please see the file
6  * <mit-copyright.h>.
7  *
8  * Simple UDP-based server application.  For demonstration.
9  * This program performs no useful function.
10  */
11
12 #include "sample.h"
13
14 RCSID("$Id: simple_server.c,v 1.11 1999/11/13 06:29:24 assar Exp $");
15
16 static void
17 usage (void)
18 {
19     fprintf (stderr, "Usage: %s [-p port] [-s service] [-t srvtab]\n",
20              __progname);
21     exit (1);
22 }
23
24 int
25 main(int argc, char **argv)
26 {
27     char service[SNAME_SZ];
28     char instance[INST_SZ];
29     int port;
30     char srvtab[MaxPathLen];
31     struct sockaddr_in addr, otheraddr;
32     int c;
33     int sock;
34     int i;
35     int len;
36     KTEXT_ST k;
37     KTEXT ktxt = &k;
38     AUTH_DAT ad;
39     MSG_DAT msg_data;
40     des_key_schedule sched;
41
42     set_progname (argv[0]);
43     strlcpy (service, SAMPLE_SERVICE, sizeof(service));
44     strlcpy (instance, "*", sizeof(instance));
45     *srvtab = '\0';
46     port = 0;
47
48     while ((c = getopt (argc, argv, "p:s:t:")) != -1)
49         switch (c) {
50         case 'p' : {
51             struct servent *sp;
52
53             sp = getservbyname (optarg, "udp");
54             if (sp)
55                 port = sp->s_port;
56             else
57                 port = htons(atoi(optarg));
58             break;
59         }
60         case 's' :
61             strlcpy (service, optarg, sizeof(service));
62             break;
63         case 't' :
64             strlcpy (srvtab, optarg, sizeof(srvtab));
65             break;
66         case '?' :
67         default :
68             usage ();
69         }
70
71     if(port == 0)
72         port = k_getportbyname (SAMPLE_SERVICE, "udp", htons(SAMPLE_PORT));
73
74     memset (&addr, 0, sizeof(addr));
75     addr.sin_family = AF_INET;
76     addr.sin_port = port;
77
78     sock = socket (AF_INET, SOCK_DGRAM, 0);
79     if (sock < 0)
80         err (1, "socket");
81
82     if (bind (sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
83         err (1, "bind");
84
85     /* GET KRB_MK_REQ MESSAGE */
86
87     i = read(sock, ktxt->dat, MAX_KTXT_LEN);
88     if (i < 0)
89         err (1, "read");
90
91     printf("Received %d bytes\n", i);
92     ktxt->length = i;
93
94     /* Check authentication info */
95     i = krb_rd_req(ktxt, service, instance, 0, &ad, "");
96     if (i != KSUCCESS)
97         errx (1, "krb_rd_req: %s", krb_get_err_text(i));
98     printf("Got authentication info from %s%s%s@%s\n", ad.pname,
99            *ad.pinst ? "." : "", ad.pinst, ad.prealm);
100         
101     /* GET KRB_MK_SAFE MESSAGE */
102
103     /* use "recvfrom" so we know client's address */
104     len = sizeof(otheraddr);
105     i = recvfrom(sock, ktxt->dat, MAX_KTXT_LEN, 0,
106                  (struct sockaddr *)&otheraddr, &len);
107     if (i < 0)
108         err (1, "recvfrom");
109     printf("Received %d bytes\n", i);
110
111     /* Verify the checksummed message */
112     i = krb_rd_safe(ktxt->dat, i, &ad.session, &otheraddr,
113                     &addr, &msg_data);
114     if (i != KSUCCESS)
115         errx (1, "krb_rd_safe: %s", krb_get_err_text(i));
116     printf("Safe message is: %s\n", msg_data.app_data);
117         
118     /* NOW GET ENCRYPTED MESSAGE */
119
120 #ifdef NOENCRYPTION
121     memset(sched, 0, sizeof(sched));
122 #else
123     /* need key schedule for session key */
124     des_key_sched(&ad.session, sched);
125 #endif
126
127     /* use "recvfrom" so we know client's address */
128     len = sizeof(otheraddr);
129     i = recvfrom(sock, ktxt->dat, MAX_KTXT_LEN, 0,
130                  (struct sockaddr *)&otheraddr, &len);
131     if (i < 0)
132         err (1, "recvfrom");
133     printf("Received %d bytes\n", i);
134     i = krb_rd_priv(ktxt->dat, i, sched, &ad.session, &otheraddr,
135                     &addr, &msg_data);
136     if (i != KSUCCESS)
137         errx (1, "krb_rd_priv: %s", krb_get_err_text(i));
138     printf("Decrypted message is: %s\n", msg_data.app_data);
139     return(0);
140 }