interface

Nikos Mavroyanopoulos nmav@hellug.gr
Fri, 25 Feb 2000 10:30:33 +0200


What do you think on this api? I think it is high level enough.

GNUTLS_STATE *state=malloc(SIZEOF_GNUTLS_STATE);

[in case we support session resuming:
GNUTLS_SESSIONS *sessions=malloc(20*SIZEOF_SESSION);
/* keep a buffer of the last 20 sessions. A single session should
 * have a timestamp, so it will expire in a few hours 
 *
 * in case of client:
GNUTLS_SESSIONS *session=malloc(1*SIZEOF_SESSION);
]

gnutls_init(state, GNUTLS_SERVER);
/* or in case of a client: gnutls_init(state, GNUTLS_CLIENT); */


/* This file should have the certificate of the client/server */
gnutls_set_certificate(state, "/home/nmav/certificate");
/* or NULL in case of client */

/* This file should have the public keys of the trusted CAs */
gnutls_set_certificate_authorities(state, "/home/nmav/cas");

[connect to a tls host using a descriptor (cd), or receive a
connection(server)]

/* This changes the state which was initialized to null 
 * eg. 3des is now used instead of plaintext
 * This actually handles all the dirty job (handshake and certification
 * verify)
 */
error=gnutls_handshake(cd, state, NULL);
[or error=gnutls_handshake(cd, state, sessions);
/* gnutls_handshake should add the current session into sessions, or
 * resume from a previous session if the client requests so (and the
 * session is not expired)
 */

 /* in case of a client who wants to resume a previous session later: */
error=gnutls_handshake(cd, state, session);

/* if the client wants to keep the current session identifier: */
gnutls_save_current_session(state, session);
]
/* that way the client/server application needs to know nothing
 * about certification. I do not know if this is good or not.
 */

if (gnutls_is_fatal(error)!=0) return 2);
if (error==GNUTLS_NULL_CERTIFICATE) return 3; /* a client may send a null
certificate, but a server should send a valid one */

ret=gnutls_send(cd, state, data, sizeofdata);
if (gnutls_is_fatal(ret)!=0) return 4;
if (ret==GNUTLS_END_SESSION) End_session(); /* session was closed by peer */

ret=gnutls_receive(cd, state, input, sizeofinput);
if (gnutls_is_fatal(ret)!=0) return 4;
if (ret==GNUTLS_END_SESSION) End_session();

gnutls_finish(cd, state);
free(state);

<--------------------------------------------------->
gnutl_send/receive() will process messages of all types (alert,
change_cipher_spec, handshake, application_data). So gnutls_handshake
will be able to use these functions internally.

-- 
Nikos Mavroyanopoulos
mailto:nmav@hellug.gr