src/lib/ssl.c
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 01:17:36 +0300
branchnew-lib-errors
changeset 219 cefec18b8268
parent 181 src/ssl.c@b12a6081fc85
permissions -rw-r--r--
some of the lib/transport stuff compiles
181
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "ssl_internal.h"
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
219
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
     5
static const char* _gnutls_error_msg (const struct error_extra_type *type, const union error_extra *extra)
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
     6
{
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
     7
    (void) type;
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
     8
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
     9
    return gnutls_strerror(extra->int_);
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    10
}
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    11
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    12
static const struct error_extra_type _gnutls_error_type = {
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    13
    .name       = "gnutls",
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    14
    .msg_func   = _gnutls_error_msg
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    15
};
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    16
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    17
const struct error_list ssl_errors = ERROR_LIST("gnutls",
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    18
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_CERT_ALLOC_CRED,         "gnutls_certificate_allocate_credentials",  &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    19
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_GLOBAL_INIT,             "gnutls_global_init",                       &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    20
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_SET_DEFAULT_PRIORITY,    "gnutls_set_default_priority",              &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    21
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_CRED_SET,                "gnutls_credentials_set",                   &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    22
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_HANDSHAKE,               "gnutls_handshake",                         &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    23
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_RECORD_SEND,             "gnutls_record_send",                       &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    24
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_RECORD_RECV,             "gnutls_record_recv",                       &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    25
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_RECORD_GET_DIRECTION,    "gnutls_record_get_direction",              &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    26
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_CERT_VERIFY_PEERS2,      "gnutls_certificate_verify_peers2",         &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    27
    ERROR_TYPE_STRING(  ERR_GNUTLS_CERT_VERIFY,             "X.509 Certificate verification failed"                            ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    28
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_CERT_SET_X509_TRUST_FILE,"gnutls_certificate_set_x509_trust_file",   &_gnutls_error_type    ),
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    29
    ERROR_TYPE_EXTRA(   ERR_GNUTLS_CERT_SET_X509_KEY_FILE,  "gnutls_certificate_set_x509_key_file",     &_gnutls_error_type    )
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    30
);
cefec18b8268 some of the lib/transport stuff compiles
Tero Marttila <terom@fixme.fi>
parents: 181
diff changeset
    31
181
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
/*
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
 * Global shared anonymous client credentials
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
 */
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
struct ssl_client_cred ssl_client_cred_anon = { .x509 = NULL, .verify = false, .refcount = 0 };
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
// XXX: GnuTLS log func
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
void _log (int level, const char *msg)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    printf("gnutls: %d: %s", level, msg);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
err_t ssl_global_init (error_t *err)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    // global init
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    if ((ERROR_EXTRA(err) = gnutls_global_init()) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        return SET_ERROR(err, ERR_GNUTLS_GLOBAL_INIT);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    // initialize the anon client credentials
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    if ((ERROR_EXTRA(err) = gnutls_certificate_allocate_credentials(&ssl_client_cred_anon.x509)) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        return SET_ERROR(err, ERR_GNUTLS_CERT_ALLOC_CRED);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    // XXX: debug
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
//    gnutls_global_set_log_function(&_log);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
//    gnutls_global_set_log_level(11);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    // done
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    return SUCCESS;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
static void ssl_client_cred_destroy (struct ssl_client_cred *cred)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    // simple
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    gnutls_certificate_free_credentials(cred->x509);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    free(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
err_t ssl_client_cred_create (struct ssl_client_cred **ctx_cred,
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        const char *cafile_path, bool verify,
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        const char *cert_path, const char *pkey_path,
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        error_t *err
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    struct ssl_client_cred *cred;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    // alloc it
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    if ((cred = calloc(1, sizeof(*cred))) == NULL)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        return SET_ERROR(err, ERR_CALLOC);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    // create the cert
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    if ((ERROR_EXTRA(err) = gnutls_certificate_allocate_credentials(&cred->x509)) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_ALLOC_CRED);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // load the trusted ca certs?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    if (cafile_path) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        // load them
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        if ((ERROR_EXTRA(err) = gnutls_certificate_set_x509_trust_file(cred->x509, cafile_path, GNUTLS_X509_FMT_PEM)) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_SET_X509_TRUST_FILE);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    }
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    // set the verify flags?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    cred->verify = verify;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    gnutls_certificate_set_verify_flags(cred->x509, 0);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    // load the client cert?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    if (cert_path || pkey_path) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        // need both...
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        assert(cert_path && pkey_path);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        // load
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        if ((ERROR_EXTRA(err) = gnutls_certificate_set_x509_key_file(cred->x509, cert_path, pkey_path, GNUTLS_X509_FMT_PEM)))
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
            JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_SET_X509_KEY_FILE);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    }
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    // ok
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    cred->refcount = 1;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    *ctx_cred = cred;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    return SUCCESS;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
error:
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    // release
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    ssl_client_cred_destroy(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    return ERROR_CODE(err);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
void ssl_client_cred_get (struct ssl_client_cred *cred)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    cred->refcount++;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
void ssl_client_cred_put (struct ssl_client_cred *cred)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    if (--cred->refcount == 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        ssl_client_cred_destroy(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
}