Tizen 2.0 Release
[external/libgnutls26.git] / doc / examples / ex-client-srp.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 <gnutls/gnutls.h>
11 #include <gnutls/extra.h>
12
13 /* Those functions are defined in other examples.
14  */
15 extern void check_alert (gnutls_session_t session, int ret);
16 extern int tcp_connect (void);
17 extern void tcp_close (int sd);
18
19 #define MAX_BUF 1024
20 #define USERNAME "user"
21 #define PASSWORD "pass"
22 #define CAFILE "ca.pem"
23 #define MSG "GET / HTTP/1.0\r\n\r\n"
24
25 int
26 main (void)
27 {
28   int ret;
29   int sd, ii;
30   gnutls_session_t session;
31   char buffer[MAX_BUF + 1];
32   gnutls_srp_client_credentials_t srp_cred;
33   gnutls_certificate_credentials_t cert_cred;
34
35   gnutls_global_init ();
36
37   /* now enable the gnutls-extra library which contains the
38    * SRP stuff.
39    */
40   gnutls_global_init_extra ();
41
42   gnutls_srp_allocate_client_credentials (&srp_cred);
43   gnutls_certificate_allocate_credentials (&cert_cred);
44
45   gnutls_certificate_set_x509_trust_file (cert_cred, CAFILE,
46                                           GNUTLS_X509_FMT_PEM);
47   gnutls_srp_set_client_credentials (srp_cred, USERNAME, PASSWORD);
48
49   /* connects to server
50    */
51   sd = tcp_connect ();
52
53   /* Initialize TLS session
54    */
55   gnutls_init (&session, GNUTLS_CLIENT);
56
57
58   /* Set the priorities.
59    */
60   gnutls_priority_set_direct (session, "NORMAL:+SRP:+SRP-RSA:+SRP-DSS", NULL);
61
62   /* put the SRP credentials to the current session
63    */
64   gnutls_credentials_set (session, GNUTLS_CRD_SRP, srp_cred);
65   gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, cert_cred);
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 (gnutls_error_is_fatal (ret) == 1 || ret == 0)
88     {
89       if (ret == 0)
90         {
91           printf ("- Peer has closed the GnuTLS connection\n");
92           goto end;
93         }
94       else
95         {
96           fprintf (stderr, "*** Error: %s\n", gnutls_strerror (ret));
97           goto end;
98         }
99     }
100   else
101     check_alert (session, ret);
102
103   if (ret > 0)
104     {
105       printf ("- Received %d bytes: ", ret);
106       for (ii = 0; ii < ret; ii++)
107         {
108           fputc (buffer[ii], stdout);
109         }
110       fputs ("\n", stdout);
111     }
112   gnutls_bye (session, GNUTLS_SHUT_RDWR);
113
114 end:
115
116   tcp_close (sd);
117
118   gnutls_deinit (session);
119
120   gnutls_srp_free_client_credentials (srp_cred);
121   gnutls_certificate_free_credentials (cert_cred);
122
123   gnutls_global_deinit ();
124
125   return 0;
126 }