Blame doc/examples/ex-cxx.cpp

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