1 | |
2 | |
3 | #ifdef HAVE_CONFIG_H1 |
4 | #include <config.h> |
5 | #endif |
6 | |
7 | #include <stdio.h> |
8 | #include <stdlib.h> |
9 | #include <errno(*__errno_location ()).h> |
10 | #include <sys/types.h> |
11 | #include <sys/socket.h> |
12 | #include <arpa/inet.h> |
13 | #include <netinet/in.h> |
14 | #include <string.h> |
15 | #include <unistd.h> |
16 | #include <gnutls/gnutls.h> |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | #define SAstruct sockaddr struct sockaddr |
23 | #define SOCKET_ERR(err,s)if(err==-1) {perror(s);return(1);} if(err==-1) {perror(s);return(1);} |
24 | #define MAX_BUF1024 1024 |
25 | #define PORT5556 5556 /* listen to 5556 port */ |
26 | #define DH_BITS1024 1024 |
27 | |
28 | |
29 | gnutls_anon_server_credentials_t anoncred; |
30 | |
31 | static gnutls_session_t |
32 | initialize_tls_session (void) |
33 | { |
34 | gnutls_session_t session; |
35 | |
36 | gnutls_init (&session, GNUTLS_SERVER1); |
37 | |
38 | gnutls_priority_set_direct (session, "NORMAL:+ANON-ECDH:+ANON-DH", NULL((void*)0)); |
39 | |
40 | gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); |
41 | |
42 | gnutls_dh_set_prime_bits (session, DH_BITS1024); |
43 | |
44 | return session; |
45 | } |
46 | |
47 | static gnutls_dh_params_t dh_params; |
48 | |
49 | static int |
50 | generate_dh_params (void) |
51 | { |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | gnutls_dh_params_init (&dh_params); |
59 | gnutls_dh_params_generate2 (dh_params, DH_BITS1024); |
60 | |
61 | return 0; |
62 | } |
63 | |
64 | int |
65 | main (void) |
66 | { |
67 | int err, listen_sd; |
68 | int sd, ret; |
69 | struct sockaddr_in sa_serv; |
70 | struct sockaddr_in sa_cli; |
71 | int client_len; |
72 | char topbuf[512]; |
73 | gnutls_session_t session; |
74 | char buffer[MAX_BUF1024 + 1]; |
75 | int optval = 1; |
76 | |
77 | |
78 | |
79 | gnutls_global_init (); |
80 | |
81 | gnutls_anon_allocate_server_credentials (&anoncred); |
82 | |
83 | generate_dh_params (); |
84 | |
85 | gnutls_anon_set_server_dh_params (anoncred, dh_params); |
86 | |
87 | |
88 | |
89 | listen_sd = socket (AF_INET2, SOCK_STREAMSOCK_STREAM, 0); |
90 | SOCKET_ERR (listen_sd, "socket")if(listen_sd==-1) {perror("socket");return(1);}; |
91 | |
92 | memset (&sa_serv, '\0', sizeof (sa_serv)); |
93 | sa_serv.sin_family = AF_INET2; |
94 | sa_serv.sin_addr.s_addr = INADDR_ANY((in_addr_t) 0x00000000); |
95 | sa_serv.sin_port = htons (PORT5556); |
96 | |
97 | setsockopt (listen_sd, SOL_SOCKET1, SO_REUSEADDR2, (void *) &optval, |
98 | sizeof (int)); |
99 | |
100 | err = bind (listen_sd, (SAstruct sockaddr *) & sa_serv, sizeof (sa_serv)); |
101 | SOCKET_ERR (err, "bind")if(err==-1) {perror("bind");return(1);}; |
102 | err = listen (listen_sd, 1024); |
103 | SOCKET_ERR (err, "listen")if(err==-1) {perror("listen");return(1);}; |
104 | |
105 | printf ("Server ready. Listening to port '%d'.\n\n", PORT5556); |
106 | |
107 | client_len = sizeof (sa_cli); |
108 | for (;;) |
| 1 | Loop condition is true. Entering loop body |
|
109 | { |
110 | session = initialize_tls_session (); |
111 | |
112 | sd = accept (listen_sd, (SAstruct sockaddr *) & sa_cli, &client_len); |
113 | |
114 | printf ("- connection from %s, port %d\n", |
115 | inet_ntop (AF_INET2, &sa_cli.sin_addr, topbuf, |
116 | sizeof (topbuf)), ntohs (sa_cli.sin_port)); |
| 2 | Pass-by-value argument in function call is undefined |
|
117 | |
118 | gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); |
119 | |
120 | do |
121 | { |
122 | ret = gnutls_handshake (session); |
123 | } |
124 | while (gnutls_error_is_fatal (ret) == 0); |
125 | |
126 | if (ret < 0) |
127 | { |
128 | close (sd); |
129 | gnutls_deinit (session); |
130 | fprintf (stderrstderr, "*** Handshake has failed (%s)\n\n", |
131 | gnutls_strerror (ret)); |
132 | continue; |
133 | } |
134 | printf ("- Handshake was completed\n"); |
135 | |
136 | |
137 | |
138 | |
139 | for (;;) |
140 | { |
141 | memset (buffer, 0, MAX_BUF1024 + 1); |
142 | ret = gnutls_record_recv (session, buffer, MAX_BUF1024); |
143 | |
144 | if (ret == 0) |
145 | { |
146 | printf ("\n- Peer has closed the GnuTLS connection\n"); |
147 | break; |
148 | } |
149 | else if (ret < 0) |
150 | { |
151 | fprintf (stderrstderr, "\n*** Received corrupted " |
152 | "data(%d). Closing the connection.\n\n", ret); |
153 | break; |
154 | } |
155 | else if (ret > 0) |
156 | { |
157 | |
158 | |
159 | gnutls_record_send (session, buffer, strlen (buffer)); |
160 | } |
161 | } |
162 | printf ("\n"); |
163 | |
164 | |
165 | gnutls_bye (session, GNUTLS_SHUT_WR); |
166 | |
167 | close (sd); |
168 | gnutls_deinit (session); |
169 | |
170 | } |
171 | close (listen_sd); |
172 | |
173 | gnutls_anon_free_server_credentials (anoncred); |
174 | |
175 | gnutls_global_deinit (); |
176 | |
177 | return 0; |
178 | |
179 | } |