1 /* This example code is placed in the public domain. */
10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <arpa/inet.h>
14 #include <gnutls/gnutls.h>
16 /* A very basic TLS client, with PSK authentication.
20 #define MSG "GET / HTTP/1.0\r\n\r\n"
22 extern int tcp_connect (void);
23 extern void tcp_close (int sd
);
29 gnutls_session_t session
;
30 char buffer
[MAX_BUF
+ 1];
32 gnutls_psk_client_credentials_t pskcred
;
33 const gnutls_datum_t key
= { (void *) "DEADBEEF", 8 };
35 gnutls_global_init ();
37 gnutls_psk_allocate_client_credentials (&pskcred
);
38 gnutls_psk_set_client_credentials (pskcred
, "test", &key
,
41 /* Initialize TLS session
43 gnutls_init (&session
, GNUTLS_CLIENT
);
45 /* Use default priorities */
46 ret
= gnutls_priority_set_direct (session
, "PERFORMANCE:+ECDHE-PSK:+DHE-PSK:+PSK", &err
);
49 if (ret
== GNUTLS_E_INVALID_REQUEST
)
51 fprintf (stderr
, "Syntax error at: %s\n", err
);
56 /* put the x509 credentials to the current session
58 gnutls_credentials_set (session
, GNUTLS_CRD_PSK
, pskcred
);
60 /* connect to the peer
64 gnutls_transport_set_ptr (session
, (gnutls_transport_ptr_t
) sd
);
66 /* Perform the TLS handshake
70 ret
= gnutls_handshake (session
);
72 while (ret
< 0 && gnutls_error_is_fatal (ret
) == 0);
76 fprintf (stderr
, "*** Handshake failed\n");
82 printf ("- Handshake was completed\n");
85 gnutls_record_send (session
, MSG
, strlen (MSG
));
87 ret
= gnutls_record_recv (session
, buffer
, MAX_BUF
);
90 printf ("- Peer has closed the TLS connection\n");
95 fprintf (stderr
, "*** Error: %s\n", gnutls_strerror (ret
));
99 printf ("- Received %d bytes: ", ret
);
100 for (ii
= 0; ii
< ret
; ii
++)
102 fputc (buffer
[ii
], stdout
);
104 fputs ("\n", stdout
);
106 gnutls_bye (session
, GNUTLS_SHUT_RDWR
);
112 gnutls_deinit (session
);
114 gnutls_psk_free_client_credentials (pskcred
);
116 gnutls_global_deinit ();