loudmouth/lm-ssl.c
author hallski <hallski>
Sun, 10 Sep 2006 22:09:45 +0000
changeset 175 5e665ffe3e9c
parent 160 3360bb7f4bfd
permissions -rw-r--r--
2006-09-11 Mikael Hallendal <micke@imendio.com> * Release 1.0.5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 96
diff changeset
     3
 * Copyright (C) 2003-2004 Imendio AB
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     4
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
     9
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    14
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    19
 */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    20
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    21
#include <config.h>
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    22
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    23
#include "lm-internals.h"
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    24
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    25
#include <string.h>
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    26
#include <glib.h>
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    27
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    28
#include "lm-error.h"
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    29
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    30
#ifdef HAVE_GNUTLS
77
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
    31
#include <gnutls/x509.h>
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    32
#endif
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    33
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    34
struct _LmSSL {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    35
	LmSSLFunction   func;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    36
	gpointer        func_data;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    37
	GDestroyNotify  data_notify;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    38
	gchar          *expected_fingerprint;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    39
	char            fingerprint[20];
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    40
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    41
	gint            ref_count;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    42
#ifdef HAVE_GNUTLS
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    43
	gnutls_session  gnutls_session;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    44
	gnutls_certificate_client_credentials gnutls_xcred;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    45
#endif
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    46
};
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    47
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
    48
static void           ssl_free                  (LmSSL       *ssl);
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    49
135
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
    50
static LmSSLResponse  ssl_func_always_continue  (LmSSL       *ssl,
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
    51
						 LmSSLStatus  status,
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
    52
						 gpointer     user_data);
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
    53
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    54
#ifdef HAVE_GNUTLS
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
    55
static gboolean       ssl_verify_certificate    (LmSSL       *ssl,
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
    56
						 const gchar *server);
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    57
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    58
static gboolean
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    59
ssl_verify_certificate (LmSSL *ssl, const gchar *server)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    60
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    61
	int           status;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    62
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    63
	/* This verification function uses the trusted CAs in the credentials
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    64
	 * structure. So you must have installed one or more CA certificates.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    65
	 */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    66
	status = gnutls_certificate_verify_peers (ssl->gnutls_session);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    67
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    68
	if (status == GNUTLS_E_NO_CERTIFICATE_FOUND) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    69
		if (ssl->func (ssl,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    70
			       LM_SSL_STATUS_NO_CERT_FOUND,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    71
			       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    72
			return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    73
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    74
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    75
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    76
	if (status & GNUTLS_CERT_INVALID
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    77
	    || status & GNUTLS_CERT_REVOKED) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    78
		if (ssl->func (ssl, LM_SSL_STATUS_UNTRUSTED_CERT,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    79
			       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    80
			return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    81
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    82
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    83
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    84
	if (gnutls_certificate_expiration_time_peers (ssl->gnutls_session) < time (0)) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    85
		if (ssl->func (ssl, LM_SSL_STATUS_CERT_EXPIRED,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    86
			       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    87
			return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    88
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    89
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    90
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    91
	if (gnutls_certificate_activation_time_peers (ssl->gnutls_session) > time (0)) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    92
		if (ssl->func (ssl, LM_SSL_STATUS_CERT_NOT_ACTIVATED,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    93
			       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    94
			return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    95
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    96
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    97
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    98
	if (gnutls_certificate_type_get (ssl->gnutls_session) == GNUTLS_CRT_X509) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
    99
		const gnutls_datum* cert_list;
121
612603ba6d90 2005-05-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 120
diff changeset
   100
		guint cert_list_size;
612603ba6d90 2005-05-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 120
diff changeset
   101
		size_t digest_size;
77
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   102
		gnutls_x509_crt cert;
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   103
		
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   104
		cert_list = gnutls_certificate_get_peers (ssl->gnutls_session, &cert_list_size);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   105
		if (cert_list == NULL) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   106
			if (ssl->func (ssl, LM_SSL_STATUS_NO_CERT_FOUND,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   107
				       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   108
				return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   109
			}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   110
		}
77
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   111
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   112
		gnutls_x509_crt_init (&cert);
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   113
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   114
		if (!gnutls_x509_crt_import (cert, &cert_list[0],
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   115
					     GNUTLS_X509_FMT_DER)) {
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   116
			if (ssl->func (ssl, LM_SSL_STATUS_NO_CERT_FOUND, 
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   117
				       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   118
				return FALSE;
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   119
			}
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   120
		}
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   121
		
77
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   122
		if (!gnutls_x509_crt_check_hostname (cert, server)) {
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   123
			if (ssl->func (ssl, LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   124
				       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   125
				return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   126
			}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   127
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   128
77
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   129
		gnutls_x509_crt_deinit (cert);
444ef677160f * configure.in:
fcrozat <fcrozat>
parents: 72
diff changeset
   130
145
ee777a1f5c62 2006-05-27 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 135
diff changeset
   131
		digest_size = sizeof (ssl->fingerprint);
109
c8ce6eaa3a4b 2005-03-31 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 105
diff changeset
   132
		if (gnutls_fingerprint (GNUTLS_DIG_MD5, &cert_list[0],
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   133
					     ssl->fingerprint,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   134
					     &digest_size) >= 0) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   135
			if (ssl->expected_fingerprint &&
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   136
			    memcmp (ssl->expected_fingerprint, ssl->fingerprint,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   137
				    digest_size) &&
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   138
			    ssl->func (ssl,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   139
				       LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   140
				       ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   141
				return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   142
			}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   143
		} 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   144
		else if (ssl->func (ssl, LM_SSL_STATUS_GENERIC_ERROR,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   145
				    ssl->func_data) != LM_SSL_RESPONSE_CONTINUE) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   146
			return FALSE; 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   147
		} 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   148
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   149
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   150
	return TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   151
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   152
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   153
void
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   154
_lm_ssl_initialize (LmSSL *ssl) 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   155
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   156
	gnutls_global_init ();
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   157
	gnutls_certificate_allocate_credentials (&ssl->gnutls_xcred);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   158
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   159
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   160
gboolean
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   161
_lm_ssl_begin (LmSSL *ssl, gint fd, const gchar *server, GError **error)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   162
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   163
	int ret;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   164
	gboolean auth_ok = TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   165
	const int cert_type_priority[2] =
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   166
	{ GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP };
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   167
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   168
	gnutls_init (&ssl->gnutls_session, GNUTLS_CLIENT);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   169
	gnutls_set_default_priority (ssl->gnutls_session);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   170
	gnutls_certificate_type_set_priority (ssl->gnutls_session,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   171
					      cert_type_priority);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   172
	gnutls_credentials_set (ssl->gnutls_session,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   173
				GNUTLS_CRD_CERTIFICATE,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   174
				ssl->gnutls_xcred);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   175
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   176
	gnutls_transport_set_ptr (ssl->gnutls_session,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   177
				  (gnutls_transport_ptr) fd);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   178
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   179
	ret = gnutls_handshake (ssl->gnutls_session);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   180
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   181
	if (ret >= 0) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   182
		auth_ok = ssl_verify_certificate (ssl, server);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   183
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   184
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   185
	if (ret < 0 || !auth_ok) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   186
		char *errmsg;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   187
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   188
		gnutls_perror (ret);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   189
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   190
		if (!auth_ok) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   191
			errmsg = "*** GNUTLS authentication error";
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   192
		} else {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   193
			errmsg = "*** GNUTLS handshake failed";
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   194
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   195
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   196
		g_set_error (error, 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   197
			     LM_ERROR, LM_ERROR_CONNECTION_OPEN,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   198
			     errmsg);			
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   199
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   200
		return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   201
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   202
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   203
	return TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   204
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   205
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   206
GIOStatus
96
f3abfc08f3ff 2004-09-20 Tollef Fog Heen <tfheen@raw.no>
hallski <hallski>
parents: 77
diff changeset
   207
_lm_ssl_read (LmSSL *ssl, gchar *buf, gint len, gsize *bytes_read)
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   208
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   209
	GIOStatus status;
117
5f6f1f273d6a 2005-05-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 111
diff changeset
   210
	gint      b_read;
5f6f1f273d6a 2005-05-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 111
diff changeset
   211
5f6f1f273d6a 2005-05-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 111
diff changeset
   212
	*bytes_read = 0;
5f6f1f273d6a 2005-05-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 111
diff changeset
   213
	b_read = gnutls_record_recv (ssl->gnutls_session, buf, len);
105
9eafd0e8c702 2005-01-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   214
120
9a8a42f15db1 2005-05-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 117
diff changeset
   215
	if (b_read == GNUTLS_E_AGAIN) {
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   216
		status = G_IO_STATUS_AGAIN;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   217
	}
160
3360bb7f4bfd 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 145
diff changeset
   218
	else if (b_read == 0) {
105
9eafd0e8c702 2005-01-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   219
		status = G_IO_STATUS_EOF;
9eafd0e8c702 2005-01-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   220
	}
120
9a8a42f15db1 2005-05-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 117
diff changeset
   221
	else if (b_read < 0) {
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   222
		status = G_IO_STATUS_ERROR;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   223
	} else {
117
5f6f1f273d6a 2005-05-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 111
diff changeset
   224
		*bytes_read = (guint) b_read;
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   225
		status = G_IO_STATUS_NORMAL;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   226
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   227
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   228
	return status;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   229
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   230
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   231
gint
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   232
_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   233
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   234
	gint bytes_written;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   235
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   236
	bytes_written = gnutls_record_send (ssl->gnutls_session, str, len);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   237
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   238
	while (bytes_written < 0) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   239
		if (bytes_written != GNUTLS_E_INTERRUPTED &&
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   240
		    bytes_written != GNUTLS_E_AGAIN) {
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   241
			return -1;
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   242
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   243
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   244
		bytes_written = gnutls_record_send (ssl->gnutls_session, 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   245
						    str, len);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   246
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   247
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   248
	return bytes_written;
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   249
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   250
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   251
void 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   252
_lm_ssl_close (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   253
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   254
	gnutls_deinit (ssl->gnutls_session);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   255
	gnutls_certificate_free_credentials (ssl->gnutls_xcred);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   256
	gnutls_global_deinit ();
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   257
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   258
#endif 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   259
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   260
static void
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   261
ssl_free (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   262
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   263
	g_free (ssl->expected_fingerprint);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   264
	g_free (ssl);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   265
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   266
135
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   267
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   268
static LmSSLResponse  
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   269
ssl_func_always_continue (LmSSL       *ssl,
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   270
			  LmSSLStatus  status,
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   271
			  gpointer     user_data)
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   272
{
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   273
	return LM_SSL_RESPONSE_CONTINUE;;
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   274
}
6bb0aad132e0 2006-04-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 133
diff changeset
   275
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   276
/**
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   277
 * lm_ssl_is_supported:
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   278
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   279
 * Checks whether Loudmouth supports SSL or not.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   280
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   281
 * Return value: #TRUE if this installation of Loudmouth supports SSL, otherwise returns #FALSE.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   282
 **/
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   283
gboolean
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   284
lm_ssl_is_supported (void)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   285
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   286
#ifdef HAVE_GNUTLS
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   287
	return TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   288
#else
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   289
	return FALSE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   290
#endif
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   291
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   292
72
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   293
/**
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   294
 * lm_ssl_new:
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   295
 * @expected_fingerprint: The expected fingerprint. @ssl_function will be called if there is a mismatch. %NULL if you are not interested in this check.
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   296
 * @ssl_function: Callback called to inform the user of a problem during setting up the SSL connection and how to proceed. If %NULL is passed the default function that always continues will be used.
72
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   297
 * @user_data: Data sent with the callback.
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   298
 * @notify: Function to free @user_dataa when the connection is finished. %NULL if @user_data should not be freed.
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   299
 *
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   300
 * Creates a new SSL struct, call #lm_connection_set_ssl to use it. 
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   301
 *
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   302
 * Return value: A new #LmSSL struct.
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   303
 **/
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   304
LmSSL *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   305
lm_ssl_new (const gchar    *expected_fingerprint,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   306
	    LmSSLFunction   ssl_function,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   307
	    gpointer        user_data,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   308
	    GDestroyNotify  notify)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   309
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   310
	LmSSL *ssl;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   311
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   312
	ssl = g_new0 (LmSSL, 1);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   313
	
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   314
	ssl->ref_count      = 1;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   315
	ssl->func           = ssl_function;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   316
	ssl->func_data      = user_data;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   317
	ssl->data_notify    = notify;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   318
	ssl->fingerprint[0] = '\0';
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   319
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   320
	if (expected_fingerprint) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   321
		ssl->expected_fingerprint = g_strdup (expected_fingerprint);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   322
	} else {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   323
		ssl->expected_fingerprint = NULL;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   324
	}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   325
133
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   326
	if (!ssl->func) {
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   327
		/* If user didn't provide an SSL func the default will be used
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   328
		 * this function will always tell the connection to continue.
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   329
		 */
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   330
		ssl->func = ssl_func_always_continue;
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   331
	}
f7522d7ed6dc 2006-04-03 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 122
diff changeset
   332
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   333
	return ssl;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   334
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   335
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   336
/**
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   337
 * lm_ssl_get_fingerprint: 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   338
 * @ssl: an #LmSSL
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   339
 *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   340
 * Returns the MD5 fingerprint of the remote server's certificate.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   341
 * 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   342
 * Return value: A 16-byte array representing the fingerprint or %NULL if unknown.
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   343
 **/
121
612603ba6d90 2005-05-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 120
diff changeset
   344
const gchar *
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   345
lm_ssl_get_fingerprint (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   346
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   347
	g_return_val_if_fail (ssl != NULL, NULL);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   348
	
121
612603ba6d90 2005-05-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 120
diff changeset
   349
	return ssl->fingerprint;
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   350
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   351
72
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   352
/**
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   353
 * lm_ssl_ref:
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   354
 * @ssl: an #LmSSL
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   355
 * 
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   356
 * Adds a reference to @ssl.
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   357
 * 
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   358
 * Return value: the ssl
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   359
 **/
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   360
LmSSL *
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   361
lm_ssl_ref (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   362
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   363
	g_return_val_if_fail (ssl != NULL, NULL);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   364
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   365
	ssl->ref_count++;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   366
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   367
	return ssl;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   368
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   369
72
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   370
/**
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   371
 * lm_ssl_unref
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   372
 * @ssl: an #LmSSL
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   373
 * 
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   374
 * Removes a reference from @ssl. When no more references are present
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   375
 * @ssl is freed.
95d0e86982c5 2004-01-21 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 68
diff changeset
   376
 **/
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   377
void 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   378
lm_ssl_unref (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   379
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   380
	g_return_if_fail (ssl != NULL);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   381
        
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   382
        ssl->ref_count --;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   383
        
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   384
        if (ssl->ref_count == 0) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   385
		if (ssl->data_notify) {
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   386
			(* ssl->data_notify) (ssl->func_data);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   387
		}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   388
               
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   389
		ssl_free (ssl);
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   390
        }
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   391
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   392
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   393
/* Define the GnuTLS functions as noops if we compile without support */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   394
#ifndef HAVE_GNUTLS
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   395
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   396
void
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   397
_lm_ssl_initialize (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   398
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   399
	/* NOOP */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   400
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   401
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   402
gboolean
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   403
_lm_ssl_begin (LmSSL        *ssl,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   404
	       gint          fd,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   405
	       const gchar  *server,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   406
	       GError      **error)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   407
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   408
	return TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   409
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   410
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   411
GIOStatus
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   412
_lm_ssl_read (LmSSL *ssl,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   413
	      gchar *buf,
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   414
	      gint   len,
96
f3abfc08f3ff 2004-09-20 Tollef Fog Heen <tfheen@raw.no>
hallski <hallski>
parents: 77
diff changeset
   415
	      gsize  *bytes_read)
68
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   416
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   417
	/* NOOP */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   418
	*bytes_read = 0;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   419
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   420
	return G_IO_STATUS_EOF;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   421
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   422
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   423
gboolean 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   424
_lm_ssl_send (LmSSL *ssl, const gchar *str, gint len)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   425
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   426
	/* NOOP */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   427
	return TRUE;
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   428
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   429
void 
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   430
_lm_ssl_close (LmSSL *ssl)
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   431
{
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   432
	/* NOOP */
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   433
}
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   434
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   435
#endif
28203e15de0e 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents:
diff changeset
   436