Fix CVE-2017-6891 in minitasn1 code
[platform/upstream/gnutls.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
12 /* Those functions are defined in other examples.
13  */
14 extern void check_alert(gnutls_session_t session, int ret);
15 extern int tcp_connect(void);
16 extern void tcp_close(int sd);
17
18 #define MAX_BUF 1024
19 #define USERNAME "user"
20 #define PASSWORD "pass"
21 #define CAFILE "/etc/ssl/certs/ca-certificates.crt"
22 #define MSG "GET / HTTP/1.0\r\n\r\n"
23
24 int main(void)
25 {
26         int ret;
27         int sd, ii;
28         gnutls_session_t session;
29         char buffer[MAX_BUF + 1];
30         gnutls_srp_client_credentials_t srp_cred;
31         gnutls_certificate_credentials_t cert_cred;
32
33         if (gnutls_check_version("3.1.4") == NULL) {
34                 fprintf(stderr, "GnuTLS 3.1.4 or later is required for this example\n");
35                 exit(1);
36         }
37
38         /* for backwards compatibility with gnutls < 3.3.0 */
39         gnutls_global_init();
40
41         gnutls_srp_allocate_client_credentials(&srp_cred);
42         gnutls_certificate_allocate_credentials(&cert_cred);
43
44         gnutls_certificate_set_x509_trust_file(cert_cred, CAFILE,
45                                                GNUTLS_X509_FMT_PEM);
46         gnutls_srp_set_client_credentials(srp_cred, USERNAME, PASSWORD);
47
48         /* connects to server
49          */
50         sd = tcp_connect();
51
52         /* Initialize TLS session
53          */
54         gnutls_init(&session, GNUTLS_CLIENT);
55
56
57         /* Set the priorities.
58          */
59         gnutls_priority_set_direct(session,
60                                    "NORMAL:+SRP:+SRP-RSA:+SRP-DSS",
61                                    NULL);
62
63         /* put the SRP credentials to the current session
64          */
65         gnutls_credentials_set(session, GNUTLS_CRD_SRP, srp_cred);
66         gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, cert_cred);
67
68         gnutls_transport_set_int(session, sd);
69         gnutls_handshake_set_timeout(session,
70                                      GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT);
71
72         /* Perform the TLS handshake
73          */
74         do {
75                 ret = gnutls_handshake(session);
76         }
77         while (ret < 0 && gnutls_error_is_fatal(ret) == 0);
78
79         if (ret < 0) {
80                 fprintf(stderr, "*** Handshake failed\n");
81                 gnutls_perror(ret);
82                 goto end;
83         } else {
84                 char *desc;
85
86                 desc = gnutls_session_get_desc(session);
87                 printf("- Session info: %s\n", desc);
88                 gnutls_free(desc);
89         }
90
91         gnutls_record_send(session, MSG, strlen(MSG));
92
93         ret = gnutls_record_recv(session, buffer, MAX_BUF);
94         if (gnutls_error_is_fatal(ret) != 0 || ret == 0) {
95                 if (ret == 0) {
96                         printf
97                             ("- Peer has closed the GnuTLS connection\n");
98                         goto end;
99                 } else {
100                         fprintf(stderr, "*** Error: %s\n",
101                                 gnutls_strerror(ret));
102                         goto end;
103                 }
104         } else
105                 check_alert(session, ret);
106
107         if (ret > 0) {
108                 printf("- Received %d bytes: ", ret);
109                 for (ii = 0; ii < ret; ii++) {
110                         fputc(buffer[ii], stdout);
111                 }
112                 fputs("\n", stdout);
113         }
114         gnutls_bye(session, GNUTLS_SHUT_RDWR);
115
116       end:
117
118         tcp_close(sd);
119
120         gnutls_deinit(session);
121
122         gnutls_srp_free_client_credentials(srp_cred);
123         gnutls_certificate_free_credentials(cert_cred);
124
125         gnutls_global_deinit();
126
127         return 0;
128 }