src/sock_gnutls.h
author Tero Marttila <terom@fixme.fi>
Sun, 19 Apr 2009 04:04:42 +0300
changeset 140 aa390e52eda8
parent 139 55b9dcc2b73a
child 155 c59d3eaff0fb
permissions -rw-r--r--
implement ssl_cafile/verify/cert/pkey for x509 credentials
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef SOCK_GNUTLS_H
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define SOCK_GNUTLS_H
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
30
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
     4
/**
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
     5
 * @file
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
     6
 *
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
     7
 * A sock_stream implementation using GnuTLS for SSL
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include "sock_internal.h"
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include "sock_tcp.h"
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
#include <gnutls/gnutls.h>
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
30
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    15
/**
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    16
 * GnuTLS library error codes
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    17
 */
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    18
enum sock_gnutls_error_code {
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    19
    _ERR_GNUTLS_BEGIN = _ERR_GNUTLS,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    20
    
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    21
    ERR_GNUTLS_CERT_ALLOC_CRED,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    22
    ERR_GNUTLS_GLOBAL_INIT,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    23
    ERR_GNUTLS_INIT,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    24
    ERR_GNUTLS_SET_DEFAULT_PRIORITY,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    25
    ERR_GNUTLS_CRED_SET,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    26
    ERR_GNUTLS_HANDSHAKE,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    27
    ERR_GNUTLS_RECORD_SEND,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    28
    ERR_GNUTLS_RECORD_RECV,
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    29
    ERR_GNUTLS_RECORD_GET_DIRECTION,   
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    30
    ERR_GNUTLS_CERT_VERIFY_PEERS2,
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    31
    ERR_GNUTLS_CERT_VERIFY,
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    32
    ERR_GNUTLS_CERT_SET_X509_TRUST_FILE,
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    33
    ERR_GNUTLS_CERT_SET_X509_KEY_FILE,
30
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    34
};
7f8dd120933f rework error to use a struct error_desc, and move ERR_SOCK/ERR_GNUTLS definitions to sock.h/sock_gnutls.h. error_desc definitions are still in error.c, though :(
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    35
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    36
/**
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    37
 * GnuTLS credentials for client sockets.
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
 */
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    39
struct sock_ssl_client_cred {
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    40
    /** Our client certificate */
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    41
    gnutls_certificate_credentials_t x509;
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    42
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    43
    /** Should we verify? */
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    44
    bool verify;
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    45
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    46
    /** Refcount from sock_gnutls */
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    47
    int refcount;
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
};
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    50
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    51
 * An SSL-encrypted TCP connection, using libgnutls
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
 */
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
struct sock_gnutls {
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    54
    /** The underlying TCP connection */
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    struct sock_tcp base_tcp;
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    56
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    57
    /** The hostname we connected to, for verification */
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    58
    char *hostname;
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    59
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    60
    /** The credentials we are using, unless anon */
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    61
    struct sock_ssl_client_cred *cred;
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    63
    /** The GnuTLS session for this connection */
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    gnutls_session_t session;
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    65
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    66
    /** The current event_enable mask */
12
4147fae232d9 update sock_stream_read/write semantics for EOF/EAGAIN, tentative event-based gnutls code
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    67
    int ev_mask;
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 117
diff changeset
    68
140
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    69
    /** Should we verify the peer cert? */
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    70
    bool verify;
aa390e52eda8 implement ssl_cafile/verify/cert/pkey for x509 credentials
Tero Marttila <terom@fixme.fi>
parents: 139
diff changeset
    71
139
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 117
diff changeset
    72
    /** Are we running a handshake? */
55b9dcc2b73a implement sock_ssl_connect_async (the old sock_ssl_connect exists no more)
Tero Marttila <terom@fixme.fi>
parents: 117
diff changeset
    73
    bool handshake;
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
};
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    76
/**
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    77
 * Cast a sock_gnutls to a sock_tcp.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    78
 */
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
#define SOCK_GNUTLS_TCP(sock_ptr) (&(sock_ptr)->base_tcp)
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    80
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    81
/**
117
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    82
 * Cast a sock_gnutls to a sock_fd.
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    83
 */
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    84
#define SOCK_GNUTLS_FD(sock_ptr) SOCK_TCP_FD(SOCK_GNUTLS_TCP(sock_ptr))
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    85
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    86
/**
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    87
 * Cast a sock_gnutls to a sock_stream.
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    88
 */
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    89
#define SOCK_GNUTLS_BASE(sock_ptr) SOCK_TCP_BASE(SOCK_GNUTLS_TCP(sock_ptr))
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    90
9cb405164250 move irc_log.c to modules/irc_log.c, and restructure sock_* to split the basic fd-level stuff out of sock_tcp and into sock_fd
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
    91
/**
85
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    92
 * Get a pointer to the sock_gnutls's error_info.
75bc8b164ef8 async TCP connects,
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    93
 */
3
cc94ae754e2a error handling magic
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    94
#define SOCK_GNUTLS_ERR(sock_ptr) SOCK_ERR(SOCK_GNUTLS_BASE(sock_ptr))
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
28
9c1050bc8709 add sock_stream_release/line_proto_release/irc_conn_release functions, and add proper cleanup to irc_net_create
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    96
/**
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
 * Initialize the global gnutls state
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
 */
5
a09a0797f6f0 ERROR-ify sock_gnutls
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    99
err_t sock_gnutls_global_init (struct error_info *err);
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
29
3f0f2898fea3 add sock_gnutls_destroy, and error cleanup for sock_ssl_connect. Fix various XXX's
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   101
/**
3f0f2898fea3 add sock_gnutls_destroy, and error cleanup for sock_ssl_connect. Fix various XXX's
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   102
 * Release the connection destructively, i.e. do not close it cleanly, just abort.
3f0f2898fea3 add sock_gnutls_destroy, and error cleanup for sock_ssl_connect. Fix various XXX's
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   103
 */
3f0f2898fea3 add sock_gnutls_destroy, and error cleanup for sock_ssl_connect. Fix various XXX's
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   104
void sock_gnutls_destroy (struct sock_gnutls *sock);
3f0f2898fea3 add sock_gnutls_destroy, and error cleanup for sock_ssl_connect. Fix various XXX's
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
   105
2
a834f0559939 working SSL using gnutls - a bit of a painful process
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
#endif /* SOCK_GNUTLS_H */