#ifndef __CSINKSSL_H__
#define __CSINKSSL_H__

/* csinkssl.h
 * This module depends on: 
 * Author(s): Jim Meier
 *
 * This file and csinkssl.c are covered under the license as specified in
 * the top level LICENSE file.
 */

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/poll.h>
#include <sys/time.h>

/* SSL headers. */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/err.h>

/* CSink headers. */
#include "csinkinet.h"

/* Casting macro. */
#define CSINK_SSL(sink) ((CSinkSSL*)sink)
#define CSINK_SSL_TYPE	0xaefdc

typedef struct _CSinkSSL CSinkSSL;
typedef gint (*CSinkSSLOnCertCheckFunc) (CSinkSSL * sink, X509 * server_cert);

typedef enum {
    SSS_CONNECTED, 	/* Inet socket connected.       */
    SSS_NOTCONNECTED,	/* Disconnected from server.    */
    SSS_WAITING,	/* Asked for a connection.      */
    SSS_SSL_WAITING,	/* Asked for SSL connection.    */
    SSS_SSL_CONNECTED,	/* SSL connection complete.	*/
    SSS_SSL_CONNECTING,	/* SSL connection in progrss.	*/
    SSS_SSL_ACCEPTING	/* The sink is accepting.	*/
} CSinkSSLStatus;

struct _CSinkSSL {
    CSinkInet inet;		/* The sink, must be first. */

    /* SSL information. */
    SSL_CTX *ctx;
    SSL *ssl;
    X509 *cert;			/* Used for verifying the peer, which I don't 
				 * do yet. */
    char *certf;
    char *keyf;
    SSL_METHOD *meth;		/* Crypt method to use. Kinda fuzzy on this. */
    /* Example: SSLv3_client_method.  I think that we really don't
     * need the meth because it looks like the methos is global. */

    CSinkSSLOnCertCheckFunc on_cert_check;
    CSinkSSLStatus status;
    int must_write;
    int must_read;

    /* Something that ssl needs to send into SSL_CTX_set_session_id_context() */
    int session_id_context;

    int verify_depth;

    /* The locations of the certs and keys. */
    char * cert_file;
    char * cert_dir;
};


CSinkSSL * csink_ssl_create (CSinkSSL * old_sink);
void csink_ssl_init (CSinkSSL * sink);



/* Constructor. */
/* CSinkSSL *  */
/* csink_ssl_new (); */

void csink_ssl_set_certcheck_func (CSinkSSL *sink, 
				   CSinkSSLOnCertCheckFunc func);

/* Set the file containing the SSL key. */
void csink_ssl_set_certfile (CSinkSSL *sink, char * cert_file);
void csink_ssl_set_certdir (CSinkSSL * sink, char * cert_dir);

/* Verify that SSL is setup for the sink. */
int csink_ssl_cert_info (CSinkSSL * sink);


/* Set file containing cert. */
void csink_ssl_set_certfile (CSinkSSL * sink, gchar * filename);

/* Set the SSL method.  Again, I don't know the differences. FIXME */
void csink_ssl_set_meth (CSinkSSL * sink, SSL_METHOD * meth);

#endif /* __CSINKSSL_H__ */



syntax highlighted by Code2HTML, v. 0.9.1