Blame doc/examples/ex-cxx.cpp

Packit aea12f
#include <config.h>
Packit aea12f
#include <iostream>
Packit aea12f
#include <stdexcept>
Packit aea12f
#include <gnutls/gnutls.h>
Packit aea12f
#include <gnutls/gnutlsxx.h>
Packit aea12f
#include <cstring> /* for strlen */
Packit aea12f
Packit aea12f
/* A very basic TLS client, with anonymous authentication.
Packit aea12f
 * written by Eduardo Villanueva Che.
Packit aea12f
 */
Packit aea12f
Packit aea12f
#define MAX_BUF 1024
Packit aea12f
#define SA struct sockaddr
Packit aea12f
Packit aea12f
#define CAFILE "ca.pem"
Packit aea12f
#define MSG "GET / HTTP/1.0\r\n\r\n"
Packit aea12f
Packit aea12f
extern "C"
Packit aea12f
{
Packit aea12f
    int tcp_connect(void);
Packit aea12f
    void tcp_close(int sd);
Packit aea12f
}
Packit aea12f
Packit aea12f
Packit aea12f
int main(void)
Packit aea12f
{
Packit aea12f
    int sd = -1;
Packit aea12f
    gnutls_global_init();
Packit aea12f
Packit aea12f
    try
Packit aea12f
    {
Packit aea12f
Packit aea12f
        /* Allow connections to servers that have OpenPGP keys as well.
Packit aea12f
         */
Packit aea12f
        gnutls::client_session session;
Packit aea12f
Packit aea12f
        /* X509 stuff */
Packit aea12f
        gnutls::certificate_credentials credentials;
Packit aea12f
Packit aea12f
Packit aea12f
        /* sets the trusted cas file
Packit aea12f
         */
Packit aea12f
        credentials.set_x509_trust_file(CAFILE, GNUTLS_X509_FMT_PEM);
Packit aea12f
        /* put the x509 credentials to the current session
Packit aea12f
         */
Packit aea12f
        session.set_credentials(credentials);
Packit aea12f
Packit aea12f
        /* Use default priorities */
Packit aea12f
        session.set_priority ("NORMAL", NULL);
Packit aea12f
Packit aea12f
        /* connect to the peer
Packit aea12f
         */
Packit aea12f
        sd = tcp_connect();
Packit aea12f
        session.set_transport_ptr((gnutls_transport_ptr_t) (ptrdiff_t)sd);
Packit aea12f
Packit aea12f
        /* Perform the TLS handshake
Packit aea12f
         */
Packit aea12f
        int ret = session.handshake();
Packit aea12f
        if (ret < 0)
Packit aea12f
        {
Packit aea12f
            throw std::runtime_error("Handshake failed");
Packit aea12f
        }
Packit aea12f
        else
Packit aea12f
        {
Packit aea12f
            std::cout << "- Handshake was completed" << std::endl;
Packit aea12f
        }
Packit aea12f
Packit aea12f
        session.send(MSG, strlen(MSG));
Packit aea12f
        char buffer[MAX_BUF + 1];
Packit aea12f
        ret = session.recv(buffer, MAX_BUF);
Packit aea12f
        if (ret == 0)
Packit aea12f
        {
Packit aea12f
            throw std::runtime_error("Peer has closed the TLS connection");
Packit aea12f
        }
Packit aea12f
        else if (ret < 0)
Packit aea12f
        {
Packit aea12f
            throw std::runtime_error(gnutls_strerror(ret));
Packit aea12f
        }
Packit aea12f
Packit aea12f
        std::cout << "- Received " << ret << " bytes:" << std::endl;
Packit aea12f
        std::cout.write(buffer, ret);
Packit aea12f
        std::cout << std::endl;
Packit aea12f
Packit aea12f
        session.bye(GNUTLS_SHUT_RDWR);
Packit aea12f
    }
Packit aea12f
    catch (std::exception &ex)
Packit aea12f
    {
Packit aea12f
        std::cerr << "Exception caught: " << ex.what() << std::endl;
Packit aea12f
    }
Packit aea12f
Packit aea12f
    if (sd != -1)
Packit aea12f
        tcp_close(sd);
Packit aea12f
Packit aea12f
    gnutls_global_deinit();
Packit aea12f
Packit aea12f
    return 0;
Packit aea12f
}