src/ssl.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 181 b12a6081fc85
permissions -rw-r--r--
nexus.c 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
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
/*
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 * Global shared anonymous client credentials
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 */
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
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
     9
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
// XXX: GnuTLS log func
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
void _log (int level, const char *msg)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    printf("gnutls: %d: %s", level, msg);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
}
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
err_t ssl_global_init (error_t *err)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    // global init
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    if ((ERROR_EXTRA(err) = gnutls_global_init()) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        return SET_ERROR(err, ERR_GNUTLS_GLOBAL_INIT);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    // initialize the anon client credentials
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    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
    25
        return SET_ERROR(err, ERR_GNUTLS_CERT_ALLOC_CRED);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    // XXX: debug
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
//    gnutls_global_set_log_function(&_log);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
//    gnutls_global_set_log_level(11);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    // done
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    return SUCCESS;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
}
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
static void ssl_client_cred_destroy (struct ssl_client_cred *cred)
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
    // simple
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    gnutls_certificate_free_credentials(cred->x509);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    free(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
}
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
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
    44
        const char *cafile_path, bool verify,
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        const char *cert_path, const char *pkey_path,
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        error_t *err
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    struct ssl_client_cred *cred;
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
    // alloc it
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    if ((cred = calloc(1, sizeof(*cred))) == NULL)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        return SET_ERROR(err, ERR_CALLOC);
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
    // create the cert
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    if ((ERROR_EXTRA(err) = gnutls_certificate_allocate_credentials(&cred->x509)) < 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_ALLOC_CRED);
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
    // load the trusted ca certs?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    if (cafile_path) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        // load them
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        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
    62
            JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_SET_X509_TRUST_FILE);
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
    }
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    // set the verify flags?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    cred->verify = verify;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    gnutls_certificate_set_verify_flags(cred->x509, 0);
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
    // load the client cert?
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    if (cert_path || pkey_path) {
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        // need both...
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        assert(cert_path && pkey_path);
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
        // load
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        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
    77
            JUMP_SET_ERROR(err, ERR_GNUTLS_CERT_SET_X509_KEY_FILE);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    }
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    // ok
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    cred->refcount = 1;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    *ctx_cred = cred;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    return SUCCESS;
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
error:
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    // release
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    ssl_client_cred_destroy(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    return ERROR_CODE(err);
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
void ssl_client_cred_get (struct ssl_client_cred *cred)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    cred->refcount++;
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
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
void ssl_client_cred_put (struct ssl_client_cred *cred)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
{
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    if (--cred->refcount == 0)
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        ssl_client_cred_destroy(cred);
b12a6081fc85 add missing ssl.c
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
}