diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-12-28 10:49:56 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-12-28 16:08:55 +0200 |
commit | 87ed97f3046dcc7f80d4ae70b40045f3a82112ed (patch) | |
tree | e76c1b95c806f62894049937cc6bdf7aa1deafb2 /doc/examples/ex-client-anon.c | |
parent | c279f32d5ffc41ab41a1441687dcb9daea5e6475 (diff) | |
download | gnutls-87ed97f3046dcc7f80d4ae70b40045f3a82112ed.tar.gz |
updated examples and added new "handling alerts" section.
Diffstat (limited to 'doc/examples/ex-client-anon.c')
-rw-r--r-- | doc/examples/ex-client-anon.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/doc/examples/ex-client-anon.c b/doc/examples/ex-client-anon.c new file mode 100644 index 0000000000..8c06bda900 --- /dev/null +++ b/doc/examples/ex-client-anon.c @@ -0,0 +1,109 @@ +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <unistd.h> +#include <gnutls/gnutls.h> + +/* A very basic TLS client, with anonymous authentication. + */ + +#define MAX_BUF 1024 +#define MSG "GET / HTTP/1.0\r\n\r\n" + +extern int tcp_connect (void); +extern void tcp_close (int sd); + +int +main (void) +{ + int ret, sd, ii; + gnutls_session_t session; + char buffer[MAX_BUF + 1]; + gnutls_anon_client_credentials_t anoncred; + /* Need to enable anonymous KX specifically. */ + + gnutls_global_init (); + + gnutls_anon_allocate_client_credentials (&anoncred); + + /* Initialize TLS session + */ + gnutls_init (&session, GNUTLS_CLIENT); + + /* Use default priorities */ + gnutls_priority_set_direct (session, "PERFORMANCE:+ANON-ECDH:+ANON-DH", + NULL); + + /* put the anonymous credentials to the current session + */ + gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); + + /* connect to the peer + */ + sd = tcp_connect (); + + gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); + + /* Perform the TLS handshake + */ + do + { + ret = gnutls_handshake (session); + } + while (gnutls_error_is_fatal (ret) == 0); + + if (ret < 0) + { + fprintf (stderr, "*** Handshake failed\n"); + gnutls_perror (ret); + goto end; + } + else + { + printf ("- Handshake was completed\n"); + } + + gnutls_record_send (session, MSG, strlen (MSG)); + + ret = gnutls_record_recv (session, buffer, MAX_BUF); + if (ret == 0) + { + printf ("- Peer has closed the TLS connection\n"); + goto end; + } + else if (ret < 0) + { + fprintf (stderr, "*** Error: %s\n", gnutls_strerror (ret)); + goto end; + } + + printf ("- Received %d bytes: ", ret); + for (ii = 0; ii < ret; ii++) + { + fputc (buffer[ii], stdout); + } + fputs ("\n", stdout); + + gnutls_bye (session, GNUTLS_SHUT_RDWR); + +end: + + tcp_close (sd); + + gnutls_deinit (session); + + gnutls_anon_free_client_credentials (anoncred); + + gnutls_global_deinit (); + + return 0; +} |