Tizen 2.0 Release
[external/libgnutls26.git] / doc / examples / ex-client2.c
1 /* This example code is placed in the public domain. */
2
3 #ifdef HAVE_CONFIG_H
4 #include <config.h>
5 #endif
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <arpa/inet.h>
13 #include <unistd.h>
14 #include <gnutls/gnutls.h>
15
16 /* A very basic TLS client, with X.509 authentication.
17  */
18
19 #define MAX_BUF 1024
20 #define CAFILE "ca.pem"
21 #define MSG "GET / HTTP/1.0\r\n\r\n"
22
23 extern int tcp_connect (void);
24 extern void tcp_close (int sd);
25
26 int
27 main (void)
28 {
29   int ret, sd, ii;
30   gnutls_session_t session;
31   char buffer[MAX_BUF + 1];
32   const char *err;
33   gnutls_certificate_credentials_t xcred;
34
35   gnutls_global_init ();
36
37   /* X509 stuff */
38   gnutls_certificate_allocate_credentials (&xcred);
39
40   /* sets the trusted cas file
41    */
42   gnutls_certificate_set_x509_trust_file (xcred, CAFILE, GNUTLS_X509_FMT_PEM);
43
44   /* Initialize TLS session 
45    */
46   gnutls_init (&session, GNUTLS_CLIENT);
47
48   /* Use default priorities */
49   ret = gnutls_priority_set_direct (session, "PERFORMANCE", &err);
50   if (ret < 0)
51     {
52       if (ret == GNUTLS_E_INVALID_REQUEST)
53         {
54           fprintf (stderr, "Syntax error at: %s\n", err);
55         }
56       exit (1);
57     }
58
59   /* put the x509 credentials to the current session
60    */
61   gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, xcred);
62
63   /* connect to the peer
64    */
65   sd = tcp_connect ();
66
67   gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd);
68
69   /* Perform the TLS handshake
70    */
71   ret = gnutls_handshake (session);
72
73   if (ret < 0)
74     {
75       fprintf (stderr, "*** Handshake failed\n");
76       gnutls_perror (ret);
77       goto end;
78     }
79   else
80     {
81       printf ("- Handshake was completed\n");
82     }
83
84   gnutls_record_send (session, MSG, strlen (MSG));
85
86   ret = gnutls_record_recv (session, buffer, MAX_BUF);
87   if (ret == 0)
88     {
89       printf ("- Peer has closed the TLS connection\n");
90       goto end;
91     }
92   else if (ret < 0)
93     {
94       fprintf (stderr, "*** Error: %s\n", gnutls_strerror (ret));
95       goto end;
96     }
97
98   printf ("- Received %d bytes: ", ret);
99   for (ii = 0; ii < ret; ii++)
100     {
101       fputc (buffer[ii], stdout);
102     }
103   fputs ("\n", stdout);
104
105   gnutls_bye (session, GNUTLS_SHUT_RDWR);
106
107 end:
108
109   tcp_close (sd);
110
111   gnutls_deinit (session);
112
113   gnutls_certificate_free_credentials (xcred);
114
115   gnutls_global_deinit ();
116
117   return 0;
118 }