Tizen 2.0 Release
[external/libgnutls26.git] / tests / openpgpself.c
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
3  * Foundation, Inc.
4  *
5  * Author: Simon Josefsson
6  *
7  * This file is part of GnuTLS.
8  *
9  * GnuTLS is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * GnuTLS is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with GnuTLS; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 /* Parts copied from GnuTLS example programs. */
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <sys/types.h>
34 #if !defined(_WIN32)
35 #include <netinet/in.h>
36 #include <sys/socket.h>
37 #include <sys/wait.h>
38 #include <arpa/inet.h>
39 #endif
40 #include <unistd.h>
41 #include <gnutls/gnutls.h>
42 #include <gnutls/openpgp.h>
43
44 #include "utils.h"
45
46 #include "ex-session-info.c"
47 #include "ex-x509-info.c"
48 #include "tcp.c"
49
50 pid_t child;
51
52 static void
53 tls_log_func (int level, const char *str)
54 {
55   fprintf (stderr, "%s |<%d>| %s", child ? "server" : "client", level, str);
56 }
57
58 /* A very basic TLS client, with anonymous authentication.
59  */
60
61 #define MAX_BUF 1024
62 #define MSG "Hello TLS"
63
64 static unsigned char cert_txt[] =
65 "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
66 "Version: GnuPG v1.4.10 (GNU/Linux)\n"
67 "Comment: Test key for GnuTLS\n"
68 "\n"
69 "mI0ETYD2OQEEAMHmDBtJii82NbWuYcvEWCYnwa7GTcz2PYikYCcq/t5nkyb5Bfmx\n"
70 "mh2hpto7Lr5d1L/shvab1gXCcrWEAREgNNk9LiowtLuTHBdeOFlJ1u1P1rvdFVKq\n"
71 "2a6ft77Q5VltUDKPgTqz4NWH2KUlLfTvwJDnq2DxYsbwVpBDURuUocXhABEBAAG0\n"
72 "CVRlc3QgdXNlcoi4BBMBAgAiBQJNgPY5AhsvBgsJCAcDAgYVCAIJCgsEFgIDAQIe\n"
73 "AQIXgAAKCRAMTrFUBnAKMOVDA/9GEw7AokwJSGvHREriXcvMMKp6c6SYqa0TVsTg\n"
74 "Gh3ENu/KTfGJIM5p+zR6xy+5u5DfP5qLrRdCnoczncR5w9fn3RsP8ju/Ga5z23Q+\n"
75 "6XxRKRkXjE/E0ZFulbuaBom/nhrOmmfqKe7Mor9Y4QwzL2wL3sf6jWLglwdFYS/X\n"
76 "W3wqjLkBogRNgPY5EQQApafdUhCAHj8LLXYCqOXRSPZbKzvB55NwWrdvnod0seUW\n"
77 "aiTSWBlKnSvIomdcII/E3bjdngK4fTJ+Xr5pEJuzBnW3w787r6jBJSq2Lp0T9SP4\n"
78 "CBzd0gXcOQkILvX1VzxAsYVULJA0mhAR3IHFcywjX6ENKuvs7ApniBNoXqi6d3cA\n"
79 "oIAzYKrjyZ+guM4IUlRRrB8abx5vBACJPV+d15GYgzt1d8zLvOl/mzs85Twj2SB1\n"
80 "ZqzK6H/6QxQkEZpP/UVFpXaUGUly3nGEqg1yw4cgqW4SSxgLFz6B23Si+cTsssE6\n"
81 "CYziN1UI6NjxkoG/npMm0wRp7Z+KylEolAdbFBAAprORkt58CrGgpYe8O/35+PWc\n"
82 "J9rjhwxxkQP/VCpbZLugkL4XHWGWFGG35S6k9F3xPPTPoX9Zoud+0bOeoOK5RQHo\n"
83 "e99sVNN4hxxPTM/rJXfTTZUoB6o84yulTSxb6C9ueHotDV0eB9QX1ov/ltmwy3XS\n"
84 "fXEyWtI0CDBuZgEww26Up0pzg4XTBYMkmXrxx3J9ihcCIYyAHoE13EWI5wQYAQIA\n"
85 "CQUCTYD2OQIbIgBSCRAMTrFUBnAKMEcgBBkRAgAGBQJNgPY5AAoJEPMP1CPBQ+e6\n"
86 "3fQAnR7HWLnQTbxCIhlBTZiuJv2HC6cbAJwJ6VsSU6ADCkMuGT3LLNo+UnckK+4i\n"
87 "BACcivWsW40ddtEQ0wno1uP65TmKq3aJrdODXTAnqkmNQKL7X7Fz+nmEWiS+LBH8\n"
88 "lRvAaeRPX2LV+DCJDbAPrYd7LkOHyuM0I+ZApto5cjem/EnO7op2QwkCCa6oUp0l\n"
89 "YA6i6aGF2KGx7WQwi2URIMPhihpOvAbkjfszYpFL4VP5wQ==\n"
90 "=ydIq\n"
91 "-----END PGP PUBLIC KEY BLOCK-----\n";
92
93 const gnutls_datum_t cert = { cert_txt, sizeof (cert_txt) };
94
95 static unsigned char key_txt[] =
96 "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
97 "Version: GnuPG v1.4.10 (GNU/Linux)\n"
98 "Comment: Test key for GnuTLS\n"
99 "\n"
100 "lQHYBE2A9jkBBADB5gwbSYovNjW1rmHLxFgmJ8Guxk3M9j2IpGAnKv7eZ5Mm+QX5\n"
101 "sZodoabaOy6+XdS/7Ib2m9YFwnK1hAERIDTZPS4qMLS7kxwXXjhZSdbtT9a73RVS\n"
102 "qtmun7e+0OVZbVAyj4E6s+DVh9ilJS3078CQ56tg8WLG8FaQQ1EblKHF4QARAQAB\n"
103 "AAP9HJePsXZmqg+UW/Ya9bE+TmIObXdQgajN6hhTFXOBocokKNsPxoIp97Sepg+U\n"
104 "FP5BIQv/2t2f8bl6sMmGXsAhCqVzRxGuA+9USx8OfTHSdgIKT5T2VFSGJaU4df3Q\n"
105 "rstUY3dcvl6VKpDDZic1T7u2ANzaWM2u+pwooKC4cc/k9AECAMNDvrKF3FC7R9sd\n"
106 "TagVrrfde0RZuwhbGW9ghslkY893EelXQL/lbBI20crPdrsdDpMe370KO2bQLqwO\n"
107 "HGAxIYUCAP41iC7KReYvysLZ34tM55ZFE7BPsMcXUeu6hkYOMDZYvE+x4KV6Umo+\n"
108 "Civd4qD9dESR3WOcI9MwALUdNTxQU60B/21MrWjajY1m1vv7l2slJon5eSrH6BkH\n"
109 "Aj173uZca8HbgqSF1xOQW8ZGa6KInN3wHe+vPOXAgzlku/4XHgEYVVGeq7QJVGVz\n"
110 "dCB1c2VyiLgEEwECACIFAk2A9jkCGy8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA\n"
111 "AAoJEAxOsVQGcAow5UMD/0YTDsCiTAlIa8dESuJdy8wwqnpzpJiprRNWxOAaHcQ2\n"
112 "78pN8Ykgzmn7NHrHL7m7kN8/moutF0KehzOdxHnD1+fdGw/yO78ZrnPbdD7pfFEp\n"
113 "GReMT8TRkW6Vu5oGib+eGs6aZ+op7syiv1jhDDMvbAvex/qNYuCXB0VhL9dbfCqM\n"
114 "nQG7BE2A9jkRBAClp91SEIAePwstdgKo5dFI9lsrO8Hnk3Bat2+eh3Sx5RZqJNJY\n"
115 "GUqdK8iiZ1wgj8TduN2eArh9Mn5evmkQm7MGdbfDvzuvqMElKrYunRP1I/gIHN3S\n"
116 "Bdw5CQgu9fVXPECxhVQskDSaEBHcgcVzLCNfoQ0q6+zsCmeIE2heqLp3dwCggDNg\n"
117 "quPJn6C4zghSVFGsHxpvHm8EAIk9X53XkZiDO3V3zMu86X+bOzzlPCPZIHVmrMro\n"
118 "f/pDFCQRmk/9RUWldpQZSXLecYSqDXLDhyCpbhJLGAsXPoHbdKL5xOyywToJjOI3\n"
119 "VQjo2PGSgb+ekybTBGntn4rKUSiUB1sUEACms5GS3nwKsaClh7w7/fn49Zwn2uOH\n"
120 "DHGRA/9UKltku6CQvhcdYZYUYbflLqT0XfE89M+hf1mi537Rs56g4rlFAeh732xU\n"
121 "03iHHE9Mz+sld9NNlSgHqjzjK6VNLFvoL254ei0NXR4H1BfWi/+W2bDLddJ9cTJa\n"
122 "0jQIMG5mATDDbpSnSnODhdMFgySZevHHcn2KFwIhjIAegTXcRQAAn2PK9kOqhjOJ\n"
123 "KU5iaagnF176FwhdCO2I5wQYAQIACQUCTYD2OQIbIgBSCRAMTrFUBnAKMEcgBBkR\n"
124 "AgAGBQJNgPY5AAoJEPMP1CPBQ+e63fQAniK5kU+dwIbkD+OHJHkC73V6v4D8AJ0Z\n"
125 "+GBYj4nhKEX21QXfj55F3Zpg1e4iBACcivWsW40ddtEQ0wno1uP65TmKq3aJrdOD\n"
126 "XTAnqkmNQKL7X7Fz+nmEWiS+LBH8lRvAaeRPX2LV+DCJDbAPrYd7LkOHyuM0I+ZA\n"
127 "pto5cjem/EnO7op2QwkCCa6oUp0lYA6i6aGF2KGx7WQwi2URIMPhihpOvAbkjfsz\n"
128 "YpFL4VP5wQ==\n"
129 "=zzoN\n"
130 "-----END PGP PRIVATE KEY BLOCK-----\n";
131
132 const gnutls_datum_t key = { key_txt, sizeof (key_txt) };
133
134
135 static void
136 client (void)
137 {
138   int ret, sd, ii, j;
139   gnutls_session_t session;
140   char buffer[MAX_BUF + 1];
141   gnutls_certificate_credentials_t xcred;
142
143   gnutls_global_init ();
144
145   gnutls_global_set_log_function (tls_log_func);
146   if (debug)
147     gnutls_global_set_log_level (5);
148
149   gnutls_certificate_allocate_credentials (&xcred);
150
151   /* sets the trusted cas file
152    */
153   if (debug)
154     success ("Setting key files...\n");
155
156   ret = gnutls_certificate_set_openpgp_key_mem (xcred, &cert, &key,
157                                                       GNUTLS_OPENPGP_FMT_BASE64);
158   if (ret < 0)
159     {
160       fail ("Could not set key files...\n");
161       return;
162     }
163
164   for (j = 0; j < 2; j++)
165     {
166
167
168       /* Initialize TLS session
169        */
170       gnutls_init (&session, GNUTLS_CLIENT);
171
172       /* Use default priorities */
173       gnutls_priority_set_direct (session, "NORMAL:+CTYPE-OPENPGP", NULL);
174
175       /* put the x509 credentials to the current session
176        */
177       gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, xcred);
178
179       /* connect to the peer
180        */
181       if (debug)
182         success ("Connecting...\n");
183       sd = tcp_connect ();
184
185       gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd);
186
187       /* Perform the TLS handshake
188        */
189       ret = gnutls_handshake (session);
190
191       if (ret < 0)
192         {
193           fail ("client: Handshake %d failed\n", j);
194           gnutls_perror (ret);
195           goto end;
196         }
197       else if (debug)
198         {
199           success ("client: Handshake %d was completed\n", j);
200         }
201
202       if (debug)
203         success ("client: TLS version is: %s\n",
204                  gnutls_protocol_get_name (gnutls_protocol_get_version
205                                            (session)));
206
207       /* see the Getting peer's information example */
208       if (debug)
209         print_info (session);
210
211       gnutls_record_send (session, MSG, strlen (MSG));
212
213       ret = gnutls_record_recv (session, buffer, MAX_BUF);
214       if (ret == 0)
215         {
216           if (debug)
217             success ("client: Peer has closed the TLS connection\n");
218           goto end;
219         }
220       else if (ret < 0)
221         {
222           fail ("client: Error: %s\n", gnutls_strerror (ret));
223           goto end;
224         }
225
226       if (debug)
227         {
228           printf ("- Received %d bytes: ", ret);
229           for (ii = 0; ii < ret; ii++)
230             {
231               fputc (buffer[ii], stdout);
232             }
233           fputs ("\n", stdout);
234         }
235
236       gnutls_bye (session, GNUTLS_SHUT_RDWR);
237
238
239       tcp_close (sd);
240
241       gnutls_deinit (session);
242
243     }
244
245 end:
246
247   gnutls_certificate_free_credentials (xcred);
248
249   gnutls_global_deinit ();
250 }
251
252 /* This is a sample TLS 1.0 echo server, using X.509 authentication.
253  */
254
255 #define SA struct sockaddr
256 #define MAX_BUF 1024
257 #define PORT 5556               /* listen to 5556 port */
258 #define DH_BITS 1024
259
260 /* These are global */
261 gnutls_certificate_credentials_t pgp_cred;
262
263 static gnutls_session_t
264 initialize_tls_session (void)
265 {
266   gnutls_session_t session;
267
268   gnutls_init (&session, GNUTLS_SERVER);
269
270   /* avoid calling all the priority functions, since the defaults
271    * are adequate.
272    */
273   gnutls_priority_set_direct (session, "NORMAL:+CTYPE-OPENPGP", NULL);
274
275   gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, pgp_cred);
276
277   /* request client certificate if any.
278    */
279   gnutls_certificate_server_set_request (session, GNUTLS_CERT_REQUEST);
280
281   gnutls_dh_set_prime_bits (session, DH_BITS);
282
283   return session;
284 }
285
286 static gnutls_dh_params_t dh_params;
287
288 static int
289 generate_dh_params (void)
290 {
291   const gnutls_datum_t p3 = { (char *) pkcs3, strlen (pkcs3) };
292   /* Generate Diffie-Hellman parameters - for use with DHE
293    * kx algorithms. These should be discarded and regenerated
294    * once a day, once a week or once a month. Depending on the
295    * security requirements.
296    */
297   gnutls_dh_params_init (&dh_params);
298   return gnutls_dh_params_import_pkcs3 (dh_params, &p3, GNUTLS_X509_FMT_PEM);
299 }
300
301 int err, listen_sd, i;
302 int sd, ret;
303 struct sockaddr_in sa_serv;
304 struct sockaddr_in sa_cli;
305 int client_len;
306 char topbuf[512];
307 gnutls_session_t session;
308 char buffer[MAX_BUF + 1];
309 int optval = 1;
310
311 static unsigned char server_crt_txt[] =
312   "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
313   "Version: GnuPG v1.4.6 (GNU/Linux)\n"
314   "\n"
315   "mNEER2PogwEGINdIR4u5PR4SwADWwj/ztgtoi7XVbmlfbQTHpBYFxTSC88pISSNy\n"
316   "V/rgnlqunYP77F7aHL4KUReN3v9sKw01xSGEfox/JmlqUUg6CVvTjdeLfkuVIBnH\n"
317   "j+2KMlaxezp7IxtPaTXpXcSf8iOuVq7UX7p6tKbppKXO5GgmfA88VUVvGBs1/PQp\n"
318   "WKQdGrj+6I3RRmDN/hna1jGU/N23230Hbx+bu7g9cviiSh10ri7rdDhVJ67tRkRG\n"
319   "Usy3XO6dWC7EmzZlEO8AEQEAAbQQdGVzdDMuZ251dGxzLm9yZ4kBAAQTAQIAJgUC\n"
320   "R2PogwIbAwUJCWYBgAYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEKAh4/gImZBR\n"
321   "96QGH3E3zynETuQS3++hGMvMXq2mDJeT2e8964y/ifIOBpr2K2isuLYnrtGKyxi+\n"
322   "ZptyHv6ymR3bDvio50cjnoT/WK1onosOJvtijGBS+U/ooq3im7ExpeQYXc/zpYsX\n"
323   "OmB5m6BvdomUp2PMqdxsmOPoaRkSYx5R2Rlo/z3csodl6sp3k465Y/jg7L4gkxDz\n"
324   "XJM+CS1xMhcOF0gBhppqLnG67x0ow847Pydstzkw0sOqedkLPuScaHNnlAWQ7QH6\n"
325   "mbbpqHJwekS4jQRHiKV8AQQA0iZ81WXypLI4ZE2+hYfBCnfMVfQF/vPgvASxhwri\n"
326   "GDa9Zc2f/VfakfNiwZgHH6iCeppHBiP2jljnbuOsL6f1R+0FsnyTVwHbuEU7IU2y\n"
327   "+J0/s0z3wcx9sx8T7brP5z5F2hdagBsD9YFGCifHDAEew4mmAisY0i2QHVIuXJFj\n"
328   "4RMAEQEAAYkBhwQYAQIADwUCR4ilfAIbAgUJEOrPgACoCRCgIeP4CJmQUZ0gBBkB\n"
329   "AgAGBQJHiKV8AAoJEIN7b7QuD+F2AEcEAKAjhO9kSOE8UuwEOKlwsWL9LUUSkHJj\n"
330   "c/ca0asLAerzrHsldRAcwCbWkVxBBHySw2CLFjzpgdXhwRtsytMgHaapfAPbinAW\n"
331   "jCPIEJx2gDZeZnTgi4DVbZn5E3UzHGyL69MEoXr5t+vpiemQFd/nGD+h/Q2A76od\n"
332   "gvAryRvS1Soj8bcGHjUflayXGOSvaD8P2V5Vz0hS82QZcqWxD8qUBqbcB8atokmO\n"
333   "IYxhKyRmO58T5Ma+iaxBTUIwee+pBYDgdH6E2dh9xLlwwzZKaCcIRCQcObkLsMVo\n"
334   "fZJo+m0Xf8zI57NeQF+hXJhW7lIrWgQVr8IVp/lgo76acLHfL/t1n0Nhg4r2srz2\n"
335   "fpP2w5laQ0qImYLnZhGFHU+rJUyFaHfhD8/svN2LuZkO570pjV/K68EaHnEfk5b8\n"
336   "jWu/euohwcCwf20M1kTo3Bg=\n"
337   "=Xjon\n" "-----END PGP PUBLIC KEY BLOCK-----\n";
338 const gnutls_datum_t server_crt = { server_crt_txt, sizeof (server_crt_txt) };
339
340 static unsigned char server_key_txt[] =
341   "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
342   "Version: GnuPG v1.4.6 (GNU/Linux)\n"
343   "\n"
344   "lQLGBEdj6IMBBiDXSEeLuT0eEsAA1sI/87YLaIu11W5pX20Ex6QWBcU0gvPKSEkj\n"
345   "clf64J5arp2D++xe2hy+ClEXjd7/bCsNNcUhhH6MfyZpalFIOglb043Xi35LlSAZ\n"
346   "x4/tijJWsXs6eyMbT2k16V3En/Ijrlau1F+6erSm6aSlzuRoJnwPPFVFbxgbNfz0\n"
347   "KVikHRq4/uiN0UZgzf4Z2tYxlPzdt9t9B28fm7u4PXL4okoddK4u63Q4VSeu7UZE\n"
348   "RlLMt1zunVguxJs2ZRDvABEBAAEABhwMx6crpb75ko5gXl9gsYSMj9O/YyCvU7Fi\n"
349   "l8FnZ0dKMz3qs7jXyFlttLjh1DzYkXN6PAN5yp3+wnbK/e5eVeNSdo2WpJOwrVWO\n"
350   "7pcQovHoKklAjmU98olaRhpv6BBTK+0tGUFaRrmrrYuz2xnwf3+kIpt4ahYW2dr9\n"
351   "B+/pvBSVC/sv2+3PEQSsXlWCYVgkQ7WBN4GQdyjjxhQpcWdf8Z6unx4zuS3s7GGM\n"
352   "4WaDxmDNCFlTGdrKPQeogtS3LVF9OiRCOvIlAxDmDvnC3zAwO/IvDUHFED9x9hmK\n"
353   "MeVwCg8rwDMptVYN2hm+bjNzjV4pimUVd+w7edjEky0Jd/6tTH01CBUWxs9Pfup2\n"
354   "cQ9zkYcVz1bwcoqeyRzFCJgi6PiVT38QFEvyusoVkwMQ747D6p7y+R52MEcIvcLb\n"
355   "lBXhRviz3rW+Sch4+ohUPvBU41saM5B6UcOmhdPfdvPriI4qXwFxusGWt98NN3aW\n"
356   "Ns2/L9kMX/SWnN6Elfj5hrrExDZ2CE60uuvfj+O/uXfO8LUDENE4vQrC399KLbJw\n"
357   "uCaqjqLysYA9EY/Nv8RFGkk1UM4ViW8v1/95D95F9WqochSYH8Phr3br0chDxofb\n"
358   "rnm6dUPE8uiriNaKWdoiUNSuvumh9lVixmRI923+4imu3scq+rlJAZ20EHRlc3Qz\n"
359   "LmdudXRscy5vcmeJAQAEEwECACYFAkdj6IMCGwMFCQlmAYAGCwkIBwMCBBUCCAME\n"
360   "FgIDAQIeAQIXgAAKCRCgIeP4CJmQUfekBh9xN88pxE7kEt/voRjLzF6tpgyXk9nv\n"
361   "PeuMv4nyDgaa9itorLi2J67RissYvmabch7+spkd2w74qOdHI56E/1itaJ6LDib7\n"
362   "YoxgUvlP6KKt4puxMaXkGF3P86WLFzpgeZugb3aJlKdjzKncbJjj6GkZEmMeUdkZ\n"
363   "aP893LKHZerKd5OOuWP44Oy+IJMQ81yTPgktcTIXDhdIAYaaai5xuu8dKMPOOz8n\n"
364   "bLc5MNLDqnnZCz7knGhzZ5QFkO0B+pm26ahycHpEnQHXBEeIpXwBBADSJnzVZfKk\n"
365   "sjhkTb6Fh8EKd8xV9AX+8+C8BLGHCuIYNr1lzZ/9V9qR82LBmAcfqIJ6mkcGI/aO\n"
366   "WOdu46wvp/VH7QWyfJNXAdu4RTshTbL4nT+zTPfBzH2zHxPtus/nPkXaF1qAGwP1\n"
367   "gUYKJ8cMAR7DiaYCKxjSLZAdUi5ckWPhEwARAQABAAP3QKGVoNi52HXEN3ttUCyB\n"
368   "Q1CDurh0MLDQoHomY3MGfI4VByk2YKMb2el4IJqyHrUbBYjTpHY31W2CSIdWfoTU\n"
369   "DIik49CQaUpR13dJXEiG4d+nyETFutEalTQI4hMjABD9l1XvZP7Ll3YWmqN8Cam5\n"
370   "JY23YAy2Noqbc3AcEut4+QIA1zcv8EU1QVqOwjSybRdm6HKK/A2bMqnITeUR/ikm\n"
371   "IuU4lhijm/d1qS6ZBehRvvYa9MY4V7BGEQLWSlyc5aYJ/wIA+fmRv0lHSs78QSUg\n"
372   "uRbNv6Aa6CXEOXmG+TpIaf/RWrPmBpdG8AROBVo1wmwG8oQaIjeX3RjKXfL3HTDD\n"
373   "CxNg7QIA06tApdo2j1gr3IrroUwQ7yvi56ELB1Lv+W3WLN8lzCfQ6Fs+7IJRrC2R\n"
374   "0uzLMGOsSORGAFIbAuLIMpc6rHCeS50hiQGHBBgBAgAPBQJHiKV8AhsCBQkQ6s+A\n"
375   "AKgJEKAh4/gImZBRnSAEGQECAAYFAkeIpXwACgkQg3tvtC4P4XYARwQAoCOE72RI\n"
376   "4TxS7AQ4qXCxYv0tRRKQcmNz9xrRqwsB6vOseyV1EBzAJtaRXEEEfJLDYIsWPOmB\n"
377   "1eHBG2zK0yAdpql8A9uKcBaMI8gQnHaANl5mdOCLgNVtmfkTdTMcbIvr0wShevm3\n"
378   "6+mJ6ZAV3+cYP6H9DYDvqh2C8CvJG9LVKiPxtwYeNR+VrJcY5K9oPw/ZXlXPSFLz\n"
379   "ZBlypbEPypQGptwHxq2iSY4hjGErJGY7nxPkxr6JrEFNQjB576kFgOB0foTZ2H3E\n"
380   "uXDDNkpoJwhEJBw5uQuwxWh9kmj6bRd/zMjns15AX6FcmFbuUitaBBWvwhWn+WCj\n"
381   "vppwsd8v+3WfQ2GDivayvPZ+k/bDmVpDSoiZgudmEYUdT6slTIVod+EPz+y83Yu5\n"
382   "mQ7nvSmNX8rrwRoecR+TlvyNa7966iHBwLB/bQzWROjcGA==\n"
383   "=mZnW\n" "-----END PGP PRIVATE KEY BLOCK-----\n";
384 const gnutls_datum_t server_key = { server_key_txt, sizeof (server_key_txt) };
385
386 static unsigned char cert2048_txt[] =
387 "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
388 "Version: GnuPG v1.4.10 (GNU/Linux)\n"
389 "Comment: Test key for GnuTLS\n"
390 "\n"
391 "mQMuBE1/6bQRCAD8TQlwbkkX3bLJvemSA/BqT/z0OrJsuXKFQqK5Pp0BRTwC4iCg\n"
392 "wnUFrr012up66YTzaA0aQpkf48gqxZ1XTGZtZ13+aAArChqKiffR7OS+BnROd+D3\n"
393 "NkPF0tWDAqRFsybIej1GcdSyPw+neExSfoeYzNpUW9oX2iLh5QZC/xt++kE8tOr8\n"
394 "BXiDW/+rudjf8Rc0ZI10vi12rb64eYd7szE49crS2YsjqarnncN+J7RX3jSifKrZ\n"
395 "XqP/F5s/0a1Nfd4xQU2fsnbQwiIuKTQjU6BHD/2ILnhZImEUn4KqZvbEt6yIJiLy\n"
396 "u+KerhTiuAhl+sx2DQf3EVxD8EpCwzFqXtF3AQD9Nf9OFJ2Cchwuz8Q5VDBoRFhP\n"
397 "4p/hGWqAsmRSZlxdQQf/Q5R15CMDtCrZnuSeptfgdZUfB0gi0aYeKE2TWto5JEVP\n"
398 "i24IXSF2l1qF9IM2i9Fv7FBwZuLQj6s+vOsq0TSATvaTGdCpvqKOCHKBZtfqD/rv\n"
399 "XJ5o3oEOtDzXdxrW1f8yVbSeWRGT2iNDPNYCnz4d+njAK1q21Qs1TRC/MKPP2EqB\n"
400 "fjy7VE0k4mFCOCLqfEnEh5hmBzegNo6+pq/i7VHuDG/w6oMUILsf+IM+JlRqeTtJ\n"
401 "iDDj6yVxBdW/0jSn8Wb2CeJ+S9Jf8zLeOaxtNuD9MbRG4KjnGzmh256FpA3S8E6x\n"
402 "ffx7LdqHGkIPEf9wFY5+7C70fbfLvIbYcFf6UdGofAf+I/NtpVMVm1ZbINIcky24\n"
403 "T0Y8NtYY4UsGaq5Lv+YQZc8DzGvjTCUMVcfPTn0g2C2l/nv3H+Po5QOjXgCGmq2U\n"
404 "NtoJ/GYr/lrN0j7GCLXWyJCWpAv0VqkzFX5HtiuC1/3R8ONpb0wtGcKaVPYm3jZM\n"
405 "fZLKlqG+yZABldKgVOoTmvWEsGQhP+OKho8grmiaAqOVHSfd9qofMH/V53wH03JB\n"
406 "E5BqdQR6mP2Jq/q8OLlg8VrlSWLi+0dFP1QrNN0u87UBQ9FtpYnRnF0k/3tFdTQL\n"
407 "GfjE9BdBO3vwSPg8EEQKUDxgeL5RoQT1ANi/iXBxfYoULVNQysTPwXIg9YauTU0f\n"
408 "V7QJbG9jYWxob3N0iHoEExEIACIFAk1/6bQCGyMGCwkIBwMCBhUIAgkKCwQWAgMB\n"
409 "Ah4BAheAAAoJEHv/KcoLO9+4imwA/3z+QK0W9yffh/yFKRYYyfyLyF+q/ECKhXn8\n"
410 "fb4TUc9CAP9fGN3pHujv2Upk9d3igY2w7jIuO78PA8dRfIKs5QEXFrkDLgRNf+m0\n"
411 "EQgAqJc+Kyx+F5Ol4nTQlddVhw0sLUeM+bOWvxIiZUSjkwFQ4Qu32a1JelJ8ne12\n"
412 "pBIwvXA9/oa/JyDh14iFoxO4u1aBJUheVo0yeRupjo92gU6bwbLTZHJlTqRo0vne\n"
413 "dYpPCnVez5CNSJB9TMugZLygG4/WO3zcBjLgkR/wrebb3tKAmS/RMUuBpFxGjNnL\n"
414 "MZOzCqB4LPFQECErOWpg6ddwLXwtP4VjaBE9RYP1uVP1Bhyc28LMQjQW1l5vzVcN\n"
415 "0DQmyBA6WX2QBeiVrALrxGq1CdcACIyYw6zzch6J2pB5IumH+IOHQMc4r67dZjIS\n"
416 "ISS8T9Xit251J0ssilw4m3rZzwEApK4jhYn2R1KS2ihLlb+7h01YVcUA1sG6Kj4s\n"
417 "Oxk3zlEH/RWZurelE5gMT6M3GGe6WTkE1PEBtlnvZvMQu+rllxe/rIQkp5JkHOjP\n"
418 "tEX/Wi68ET7yMKDjIQq9joFnRI70scPf3a2MHwc0OL7PGdf13PUmUwOwlqcP4Rme\n"
419 "kA2MpDDl9Qn9pT40fUZLoR0lVusJNbrC8fW9MIcg/JAFp7U/zxnbZUESTF0+k486\n"
420 "bF6q5QK4kaHjoUOvzX0encs+0xY7tAY+cSgQkn37z2G/K5OUMQXUQ7hQ+LRvQNM/\n"
421 "qXRjwsBuW+4D+4bglGLJxT9PINiZ8cgbfCF6E9B+QmsY7KSVYYB955LsCi+8G/tq\n"
422 "wdmHDYAKV9OXZfb54UKqLh3R0JkdMpEH/0rPbsxhwFXLE+ixAs5HTu0ILXwj6uCR\n"
423 "9PGBR6skB8ONfaXAtq+92O/4aegCxbC9SNWuTvYBKkBdMGSGcO7LwvwjUA2kujEV\n"
424 "66In56DCQJS+K19AR+fRYPro8+MavAQlirEK1uOjidoKykVziqO7B6Z4DAaZZBDP\n"
425 "h8HwYANauwlfapGuZ5/rLPNCFi5VEJjX/9t0ECCgPOOEK8qWA5ljw35K6W/3CVX7\n"
426 "hKNflAx1BGBr0GfrJo/EsneeBEsKPk/hge5uPr+wkDqdXq/7qxCSHhT3OQpiOW65\n"
427 "dyBX/44XAVQaWtf6DJc84nWDYsCgscEZzGAUyBY8Fw9S7We5OFLNcYWIwQQYEQgA\n"
428 "CQUCTX/ptAIbIgBqCRB7/ynKCzvfuF8gBBkRCAAGBQJNf+m0AAoJEEPv0WrPxcc9\n"
429 "aJwA/0zWQ0RfRhlC1nbf7ISEOF36WQjslGKXjf6z6rSNgphoAP4119FDX9jaW0B8\n"
430 "HL9p+XRZTOTSo5GMLUTH5zo+zpTbB2cxAP9moc/i1z2D8AXTnUk7YfSm+o7rFThu\n"
431 "2Cx0oO7h1g0MjQD6A/6e68DhK9altb/xqtHeG0jbLmvFRtkC0zu7WZjvSbc=\n"
432 "=v3gg\n"
433 "-----END PGP PUBLIC KEY BLOCK-----\n";
434
435 const gnutls_datum_t cert2048 = { cert2048_txt, sizeof (cert2048_txt) };
436
437 static unsigned char key2048_txt[] =
438 "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
439 "Version: GnuPG v1.4.10 (GNU/Linux)\n"
440 "Comment: Test key for GnuTLS\n"
441 "\n"
442 "lQNTBE1/6bQRCAD8TQlwbkkX3bLJvemSA/BqT/z0OrJsuXKFQqK5Pp0BRTwC4iCg\n"
443 "wnUFrr012up66YTzaA0aQpkf48gqxZ1XTGZtZ13+aAArChqKiffR7OS+BnROd+D3\n"
444 "NkPF0tWDAqRFsybIej1GcdSyPw+neExSfoeYzNpUW9oX2iLh5QZC/xt++kE8tOr8\n"
445 "BXiDW/+rudjf8Rc0ZI10vi12rb64eYd7szE49crS2YsjqarnncN+J7RX3jSifKrZ\n"
446 "XqP/F5s/0a1Nfd4xQU2fsnbQwiIuKTQjU6BHD/2ILnhZImEUn4KqZvbEt6yIJiLy\n"
447 "u+KerhTiuAhl+sx2DQf3EVxD8EpCwzFqXtF3AQD9Nf9OFJ2Cchwuz8Q5VDBoRFhP\n"
448 "4p/hGWqAsmRSZlxdQQf/Q5R15CMDtCrZnuSeptfgdZUfB0gi0aYeKE2TWto5JEVP\n"
449 "i24IXSF2l1qF9IM2i9Fv7FBwZuLQj6s+vOsq0TSATvaTGdCpvqKOCHKBZtfqD/rv\n"
450 "XJ5o3oEOtDzXdxrW1f8yVbSeWRGT2iNDPNYCnz4d+njAK1q21Qs1TRC/MKPP2EqB\n"
451 "fjy7VE0k4mFCOCLqfEnEh5hmBzegNo6+pq/i7VHuDG/w6oMUILsf+IM+JlRqeTtJ\n"
452 "iDDj6yVxBdW/0jSn8Wb2CeJ+S9Jf8zLeOaxtNuD9MbRG4KjnGzmh256FpA3S8E6x\n"
453 "ffx7LdqHGkIPEf9wFY5+7C70fbfLvIbYcFf6UdGofAf+I/NtpVMVm1ZbINIcky24\n"
454 "T0Y8NtYY4UsGaq5Lv+YQZc8DzGvjTCUMVcfPTn0g2C2l/nv3H+Po5QOjXgCGmq2U\n"
455 "NtoJ/GYr/lrN0j7GCLXWyJCWpAv0VqkzFX5HtiuC1/3R8ONpb0wtGcKaVPYm3jZM\n"
456 "fZLKlqG+yZABldKgVOoTmvWEsGQhP+OKho8grmiaAqOVHSfd9qofMH/V53wH03JB\n"
457 "E5BqdQR6mP2Jq/q8OLlg8VrlSWLi+0dFP1QrNN0u87UBQ9FtpYnRnF0k/3tFdTQL\n"
458 "GfjE9BdBO3vwSPg8EEQKUDxgeL5RoQT1ANi/iXBxfYoULVNQysTPwXIg9YauTU0f\n"
459 "VwAA/RnOgKKKmJo6d4E+mAa0Pl1QKayWKgSsDoww0kUoUTgHDU20CWxvY2FsaG9z\n"
460 "dIh6BBMRCAAiBQJNf+m0AhsjBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRB7\n"
461 "/ynKCzvfuIpsAP98/kCtFvcn34f8hSkWGMn8i8hfqvxAioV5/H2+E1HPQgD/Xxjd\n"
462 "6R7o79lKZPXd4oGNsO4yLju/DwPHUXyCrOUBFxadA1METX/ptBEIAKiXPissfheT\n"
463 "peJ00JXXVYcNLC1HjPmzlr8SImVEo5MBUOELt9mtSXpSfJ3tdqQSML1wPf6Gvycg\n"
464 "4deIhaMTuLtWgSVIXlaNMnkbqY6PdoFOm8Gy02RyZU6kaNL53nWKTwp1Xs+QjUiQ\n"
465 "fUzLoGS8oBuP1jt83AYy4JEf8K3m297SgJkv0TFLgaRcRozZyzGTswqgeCzxUBAh\n"
466 "KzlqYOnXcC18LT+FY2gRPUWD9blT9QYcnNvCzEI0FtZeb81XDdA0JsgQOll9kAXo\n"
467 "lawC68RqtQnXAAiMmMOs83IeidqQeSLph/iDh0DHOK+u3WYyEiEkvE/V4rdudSdL\n"
468 "LIpcOJt62c8BAKSuI4WJ9kdSktooS5W/u4dNWFXFANbBuio+LDsZN85RB/0Vmbq3\n"
469 "pROYDE+jNxhnulk5BNTxAbZZ72bzELvq5ZcXv6yEJKeSZBzoz7RF/1ouvBE+8jCg\n"
470 "4yEKvY6BZ0SO9LHD392tjB8HNDi+zxnX9dz1JlMDsJanD+EZnpANjKQw5fUJ/aU+\n"
471 "NH1GS6EdJVbrCTW6wvH1vTCHIPyQBae1P88Z22VBEkxdPpOPOmxequUCuJGh46FD\n"
472 "r819Hp3LPtMWO7QGPnEoEJJ9+89hvyuTlDEF1EO4UPi0b0DTP6l0Y8LAblvuA/uG\n"
473 "4JRiycU/TyDYmfHIG3whehPQfkJrGOyklWGAfeeS7AovvBv7asHZhw2AClfTl2X2\n"
474 "+eFCqi4d0dCZHTKRB/9Kz27MYcBVyxPosQLOR07tCC18I+rgkfTxgUerJAfDjX2l\n"
475 "wLavvdjv+GnoAsWwvUjVrk72ASpAXTBkhnDuy8L8I1ANpLoxFeuiJ+egwkCUvitf\n"
476 "QEfn0WD66PPjGrwEJYqxCtbjo4naCspFc4qjuwemeAwGmWQQz4fB8GADWrsJX2qR\n"
477 "rmef6yzzQhYuVRCY1//bdBAgoDzjhCvKlgOZY8N+Sulv9wlV+4SjX5QMdQRga9Bn\n"
478 "6yaPxLJ3ngRLCj5P4YHubj6/sJA6nV6v+6sQkh4U9zkKYjluuXcgV/+OFwFUGlrX\n"
479 "+gyXPOJ1g2LAoLHBGcxgFMgWPBcPUu1nuThSzXGFAAEAgj6e0tgxENBORrJkBCl6\n"
480 "xfV6iTNXa3HDArTNTyURRzEN0YjBBBgRCAAJBQJNf+m0AhsiAGoJEHv/KcoLO9+4\n"
481 "XyAEGREIAAYFAk1/6bQACgkQQ+/Ras/Fxz1onAD/W3lWDopZrH9R66tiyjYOX4sV\n"
482 "b1SoPlKRJngsHouxc4oA/RYoFGrhoY+nL22eza/Ku/SUnVrufZ/jIvQakhpmrLD/\n"
483 "ZzEBAJ1w0ez3wUJbsfGlWBkb16pYpIh68/qvTTj84v5N0picAQC1p8JjouN88BJw\n"
484 "9UquUquXdK1TY965biHIQ70uaOU4Hw==\n"
485 "=Rrkw\n"
486 "-----END PGP PRIVATE KEY BLOCK-----\n";
487
488 const gnutls_datum_t key2048 = { key2048_txt, sizeof (key2048_txt) };
489
490
491 static void
492 server_start (void)
493 {
494   /* Socket operations
495    */
496   listen_sd = socket (AF_INET, SOCK_STREAM, 0);
497   if (err == -1)
498     {
499       perror ("socket");
500       fail ("server: socket failed\n");
501       return;
502     }
503
504   memset (&sa_serv, '\0', sizeof (sa_serv));
505   sa_serv.sin_family = AF_INET;
506   sa_serv.sin_addr.s_addr = INADDR_ANY;
507   sa_serv.sin_port = htons (PORT);      /* Server Port number */
508
509   setsockopt (listen_sd, SOL_SOCKET, SO_REUSEADDR, (void *) &optval,
510               sizeof (int));
511
512   err = bind (listen_sd, (SA *) & sa_serv, sizeof (sa_serv));
513   if (err == -1)
514     {
515       perror ("bind");
516       fail ("server: bind failed\n");
517       return;
518     }
519
520   err = listen (listen_sd, 1024);
521   if (err == -1)
522     {
523       perror ("listen");
524       fail ("server: listen failed\n");
525       return;
526     }
527
528   if (debug)
529     success ("server: ready. Listening to port '%d'.\n", PORT);
530 }
531
532 static void
533 server (void)
534 {
535   int j;
536   /* this must be called once in the program
537    */
538   gnutls_global_init ();
539
540   gnutls_global_set_log_function (tls_log_func);
541   if (debug)
542     gnutls_global_set_log_level (5);
543
544   if (debug)
545     success ("Launched, setting DH parameters...\n");
546
547   generate_dh_params ();
548
549   client_len = sizeof (sa_cli);
550
551   for (j = 0; j < 2; j++)
552     {
553      if (j==0)
554        {
555          gnutls_certificate_allocate_credentials (&pgp_cred);
556          ret = gnutls_certificate_set_openpgp_key_mem2 (pgp_cred, &server_crt,
557                                                  &server_key, "auto",
558                                                  GNUTLS_OPENPGP_FMT_BASE64);
559       }
560      else
561        {
562          gnutls_certificate_free_credentials (pgp_cred);
563          gnutls_certificate_allocate_credentials (&pgp_cred);
564          ret =
565            gnutls_certificate_set_openpgp_key_mem2 (pgp_cred, &cert2048, &key2048,
566              "auto", GNUTLS_OPENPGP_FMT_BASE64);
567        }
568
569       if (ret < 0)
570         {
571           fail ("Could not set server key files...\n");
572           goto end;
573         }
574
575       gnutls_certificate_set_dh_params (pgp_cred, dh_params);
576
577       session = initialize_tls_session ();
578
579       sd = accept (listen_sd, (SA *) & sa_cli, &client_len);
580
581       if (debug)
582         success ("server: connection from %s, port %d\n",
583                  inet_ntop (AF_INET, &sa_cli.sin_addr, topbuf,
584                             sizeof (topbuf)), ntohs (sa_cli.sin_port));
585
586       gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd);
587       ret = gnutls_handshake (session);
588       if (ret < 0)
589         {
590           close (sd);
591           gnutls_deinit (session);
592           fail ("server: Handshake %d has failed (%s)\n\n",
593                 j, gnutls_strerror (ret));
594           goto end;
595         }
596       if (debug)
597         success ("server: Handshake %d was completed\n", j);
598
599       if (debug)
600         success ("server: TLS version is: %s\n",
601                  gnutls_protocol_get_name (gnutls_protocol_get_version
602                                            (session)));
603
604       /* see the Getting peer's information example */
605       if (debug)
606         print_info (session);
607
608       i = 0;
609       for (;;)
610         {
611           memset (buffer, 0, MAX_BUF + 1);
612           ret = gnutls_record_recv (session, buffer, MAX_BUF);
613
614           if (ret == 0)
615             {
616               if (debug)
617                 success ("server: Peer has closed the GnuTLS connection\n");
618               break;
619             }
620           else if (ret < 0)
621             {
622               fail ("server: Received corrupted data(%d). Closing...\n", ret);
623               goto end;
624             }
625           else if (ret > 0)
626             {
627               /* echo data back to the client
628                */
629               gnutls_record_send (session, buffer, strlen (buffer));
630             }
631         }
632       /* do not wait for the peer to close the connection.
633        */
634       gnutls_bye (session, GNUTLS_SHUT_WR);
635
636       close (sd);
637       gnutls_deinit (session);
638     }
639
640 end:
641   close (listen_sd);
642
643   gnutls_certificate_free_credentials (pgp_cred);
644
645   gnutls_dh_params_deinit (dh_params);
646
647   gnutls_global_deinit ();
648
649   if (debug)
650     success ("server: finished\n");
651 }
652
653
654 void
655 doit (void)
656 {
657   server_start ();
658   if (error_count)
659     return;
660
661   child = fork ();
662   if (child < 0)
663     {
664       perror ("fork");
665       fail ("fork");
666       return;
667     }
668
669   if (child)
670     {
671       int status;
672       /* parent */
673       server ();
674       wait (&status);
675     }
676   else
677     client ();
678 }