ssl-proxy-openssl.c revision 0dffa25d211be541ee3c953b23566a1a990789df
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* Copyright (c) 2002-2016 Dovecot authors, see the included COPYING file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#if !defined(OPENSSL_NO_ECDH) && OPENSSL_VERSION_NUMBER >= 0x10000000L
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* Check every 30 minutes if parameters file has been updated */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#ifndef SSL_CTRL_SET_TLSEXT_HOSTNAME /* FIXME: this may be unnecessary.. */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct master_service_ssl_settings *ssl_set;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct io *io_ssl_read, *io_ssl_write, *io_plain_read, *io_plain_write;
int fd;
struct ssl_server_context {
const char *cert;
const char *key;
const char *ca;
const char *cipher_list;
const char *protocols;
bool verify_client_cert;
bool prefer_server_ciphers;
bool compression;
bool tickets;
static int extdata_index;
static unsigned int ssl_proxy_count;
static int ssl_username_nid;
static struct ssl_server_context *
int ret;
if (ret == 0)
unsigned char *buf;
const unsigned char *cbuf;
unsigned int len;
int bits;
if (bits == 0)
return FALSE;
switch (bits) {
return TRUE;
int ret;
else if (ret != 0) {
switch (action) {
case SSL_ADD_INPUT:
case SSL_REMOVE_INPUT:
case SSL_ADD_OUTPUT:
case SSL_REMOVE_OUTPUT:
if (block) {
if (ret <= 0) {
if (ret < 0)
if (!corked) {
if (corked)
if (ret < 0)
const char *func_name)
int err;
switch (err) {
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
case SSL_ERROR_SYSCALL:
if (ERR_peek_error() != 0)
else if (ret != 0)
case SSL_ERROR_ZERO_RETURN:
case SSL_ERROR_SSL:
int ret;
int ret;
if (ret <= 0) {
int ret;
if (ret <= 0)
if (!ssl_initialized) {
static struct ssl_server_context *
return ctx;
int ret;
if (ret < 0)
return ret;
char *name;
int len;
return NULL;
if (len < 0)
const char *comp_str;
return NULL;
case SSL_AD_CLOSE_NOTIFY:
} else if (ret == 0) {
if (!preverify_ok)
if (preverify_ok) {
void *userdata)
unsigned int ssl_proxy_get_count(void)
return ssl_proxy_count;
bool load_xnames)
#ifdef SSL_OP_NO_COMPRESSION
#ifdef SSL_OP_NO_TICKET
#ifdef SSL_MODE_RELEASE_BUFFERS
return xnames;
int nid;
const char *curve_name;
#ifdef HAVE_ECDH
#ifdef SSL_CTRL_SET_ECDH_AUTO
char *dup_password;
return pkey;
const char *password;
int nid = 0;
const char *password;
return nid;
X509 *x;
int ret = 0;
if (x == NULL)
goto end;
if (ERR_peek_error() != 0)
ret = 0;
if (ret != 0) {
unsigned long err;
ret = 0;
goto end;
end:
return ret;
#ifdef HAVE_SSL_GET_SERVERNAME
const char *host;
void **other_sets;
&other_sets);
static struct ssl_server_context *
#ifdef HAVE_SSL_GET_SERVERNAME
return ctx;
void ssl_proxy_init(void)
unsigned char buf;
ssl_proxy_count = 0;
void ssl_proxy_deinit(void)
if (!ssl_initialized)
EVP_cleanup();