Setting up a session

#include <x/gnutls/session.H>

x::fd filedesc=x::netaddr::create("www.example.com", "https",
                                 SOCK_STREAM)->connect();
x::gnutls::session sess(x::gnutls::session::create(GNUTLS_CLIENT, filedesc));

sess->credentials_set(clientCred);
sess->set_default_priority();
sess->handshake();
sess->verify_peer("www.example.com");

x::gnutls::session is a reference to a reference-counted object that represents a TLS session that's attached to an existing file descriptor. Its create() method takes a reference to an existing file descriptor object, and a parameter that specifies whether the file descriptor should be a TLS client or a server.

There are several additional formalities before the TLS session is ready. First, the authentication credentials must be specified by using credentials_set() to set the authentication credentials for the session. Then, the list of acceptable ciphers must be set. set_default_priority specifies the default cipher list. Finally, handshake() performs the initial TLS handshake with the peer, and establishes a TLS session.

An exception gets thrown if handshake() fails to establish a TLS session. TLS clients should also use verify_peer() to authenticate the server's certificate's identity. This is an important detail, see the section called “Certificate credentials” for a brief discussion on the purpose of certificate authentication.

Convenience functions

#include <x/gnutls/session.H>

x::gnutls::session sess(x::gnutls::session::base::client("imap.example.com", 993));

client() is a single function that creates a new file descriptor, creates a new socket and connects to a server, creates a new TLS session objects, and installs a default credentials objects loaded with the default authentication configuration and loads the default system list of trusted certificate authorities, invokes handshake() followed by verify_peer() to validate the server's certificate. The end result is a reference to a session object representing an established TLS session, ready to be used.

TLS session caching, server side

#include <x/gnutls/sessioncache.H>

auto cache=x::gnutls::sessioncache::create();

// ...

sess->session_cache(cache);
sess->handshake();

if (sess->session_resumed())
   // ...

A TLS client may reuse the same TLS session parameters with a TLS server for additional connections, in order to create the additional connections faster. This optional feature requires some support from the server. The server constructs a x::gnutls::sessioncache, then installs it before handshaking each established connection. The same session cache object should be installed in every client connection session. After a handshake, session_resumed() indicates whether the new connection uses cached session parameters.

The default x::gnutls::sessioncache caches TLS sessions in memory. The x::gnutls::session_cache::size application property sets the TLS session cache size. The most recent sessions, up to the value of this property are cached. It is possible to implement custom TLS session caching by subclassing x::gnutls::sessioncacheObj and implementing the store(), remove(), and retr() methods.

The x::gnutls::session_cache::expiration application property sets how long TLS sessions remain cacheable, and defaults to one hour. This is slightly different than x::gnutls::session_cache::size; this setting controls the maximum size of the default implementation of the TLS session cache. x::gnutls::session_cache::expiration specifies that TLS sessions can no longer be reused after an hour, by default, irrespective of the size of the TLS session cache.

TLS session caching, client side

sess->handshake();

x::gnutls::datum_t session_data=sess->get_session_data();

// ...

sess2->set_session_data(session_data);
sess->handshake();
if (sess->session_resumed())
   // ...

After a handshake, a TLS client obtains the session's parameters from get_session_data(), which returns an opaque blob representing the session parameters. For subsequent session, the TLS client uses set_session_data() before the handshake. After a handshake, session_resumed() indicates whether the new connection uses same, cached session parameters.