[gnutls-help] [gnutls-devel] higher level session API?
Tim Ruehsen
tim.ruehsen at gmx.de
Mon Jan 21 11:20:48 CET 2013
Am Thursday 17 January 2013 schrieb Nikos Mavrogiannopoulos:
> I've trying ways to simplify the gnutls_session_t by adding higher
> level functions. I plan to add function that allow buffering data into a
> session prior to sending, to avoid sending many small TLS records (and
> avoid the whole overhead). Something like:
>
> ssize_t gnutls_sbuf_queue (gnutls_sbuf_t sb, const void *data,
> size_t data_size);
> ssize_t gnutls_sbuf_flush (gnutls_sbuf_t sb);
>
>
> However I'm wondering whether a full higher level API over
> gnutls_session_t is needed, that for example does not require to handle
> non-fatal errors (e.g. GNUTLS_E_AGAIN, or
> GNUTLS_E_WARNING_ALERT_RECEIVED). That would be the equivalent of FILE*
> for a TLS session. Any thoughts?
For an application developer, a high level API that can be used 'quick and
dirty', would reduce the amounts of code and time ot use gnutls.
e.g. like this pseudo code
gnutls_session_t sess = gnutls_open(
hostname, port,
// here come *optional* key, value pairs, some examples
// GNUTLS_READ_TIMEOUT, 5000, // in milliseconds
// GNUTLS_PRIORITY, "NORMAL:-VERS-SSL3.0",
// GNUTLS_CHECK_CERTIFICATE, 0, // switch certificate checking on and off
/ ...
NULL); // gcc >= 4 is able to check this with attribute 'sentinel'
ssize_t nbytes = gnutls_write(sess, buf, buflen);
ssize_t nbytes = gnutls_printf(sess, "%d - %s\n", ival, str);
ssize_t nbytes = gnutls_read(sess, buf, bufsize);
ssize_t nbytes = gnutls_getline(sess, &buf, &bufsize);
// and why not gnutls_fgets(), though i personally don't like it
gnutls_close(sess);
The 'open' function should have reasonable default values to work 'right out
of the box'. It should also do gnutls_global_init() implicitely, if it hasn't
be done yet.
You still have access to the gnutls_session_t variable, if you need to
something fancy.
The key/value approach of course has no 'value type checking' (though it could
be done by a gcc plugin).
Right now I need ~ 300 lines of C code to implent the open/read/write/close
part.
And back to your idea with queue/flush:
- inspired from TCP_CORK, my idea would be something like
gnutls_cork()
do some writes
gnutls_uncork (or calling it gnutls_flush, if you like)
- or/and implementing something like the Nagle algorithm, kind of automatic
cork/uncork
Just my thoughts...
Regards,
Tim Rühsen
More information about the Gnutls-help
mailing list