#include #include #include #include #include #include #include #include #include /* A very basic TLS client, with X.509 authentication. */ #define MAX_BUF 1024 #define CAFILE \ "/etc/ssl/certs/Verisign_Class_3_Public_Primary_Certification_Authority.pem" #define MSG1 "GET / HTTP/1.1 \r\n Accept:*/* \r\n Host: mail.google.com \r\n Connection: Keep-Alive\r\n\r\n" extern int tcp_connect (void); extern void tcp_close (int sd); void mylogfn( int level, const char*ptr) { printf ("Got Logs: "); if (ptr) printf ("%s", ptr); } int main (void) { int ret, sd, ii; gnutls_session_t session; char buffer[MAX_BUF + 1]; const char *err; gnutls_certificate_credentials_t xcred; gnutls_global_init (); /* X509 stuff */ gnutls_certificate_allocate_credentials (&xcred); /* Initialize TLS session */ gnutls_init (&session, GNUTLS_CLIENT); /* Use default priorities */ ret = gnutls_priority_set_direct (session, NULL, &err); if (ret < 0) { if (ret == GNUTLS_E_INVALID_REQUEST) { fprintf(stderr, "Syntax error at: %s\n", err); } exit(1); } gnutls_handshake_set_private_extensions (session, 1); /* put the x509 credentials to the current session */ gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, xcred); /* connect to the peer */ sd = tcp_connect (); gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); /* Perform the TLS handshake */ ret = gnutls_handshake (session); if (ret < 0) { fprintf (stderr, "*** Handshake failed\n"); gnutls_perror (ret); goto end; } gnutls_record_send (session, MSG1, strlen (MSG1)); 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; } for (ii = 0; ii < ret; ii++) { /* fputc (buffer[ii], stdout); */ } fputs ("Finished\n", stdout); gnutls_bye (session, GNUTLS_SHUT_RDWR); end: tcp_close (sd); gnutls_deinit (session); gnutls_global_deinit (); return 0; }