/* This example code is placed in the public domain. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include /* A very basic TLS client, with anonymous authentication. */ /* Added. LDF 2009.12.03. */ #if (SIZEOF_VOIDP == SIZEOF_INT) #define PTR_SIZE_INT #undef PTR_SIZE_LONG #undef PTR_SIZE_UNDEFINED #elif (SIZEOF_VOIDP == SIZEOF_LONG_INT) #define PTR_SIZE_LONG #undef PTR_SIZE_INT #undef PTR_SIZE_UNDEFINED #else #define PTR_SIZE_UNDEFINED #undef PTR_SIZE_INT #undef PTR_SIZE_LONG #endif /* End of added code. LDF 2009.12.03. */ #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-DH:!ARCFOUR-128", NULL); /* put the anonymous credentials to the current session */ gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); /* connect to the peer */ sd = tcp_connect (); /* Added conditionally compiled code. LDF 2009.12.03. */ #ifdef PTR_SIZE_LONG printf("PTR_SIZE_LONG is defined.\n"); gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) ((long) sd)); #else printf("PTR_SIZE_LONG is undefined.\n"); gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); #endif /* End of added conditionally compiled code. LDF 2009.12.03. */ /* Perform the TLS handshake */ ret = gnutls_handshake (session); 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; }