iostream-openssl.c revision 095481fee84040436ce2dccca472c9bb1df4d5bb
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncstatic void openssl_iostream_free(struct ssl_iostream *ssl_io);
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncopenssl_iostream_set_error(struct ssl_iostream *ssl_io, const char *str)
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync /* This error should normally be logged by lib-ssl-iostream's
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync caller. But if verbose=TRUE, log it here as well to make
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync sure that the error is always logged. */
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync i_debug("%sSSL error: %s", ssl_io->log_prefix, str);
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncstatic void openssl_info_callback(const SSL *ssl, int where, int ret)
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync ssl_io = SSL_get_ex_data(ssl, dovecot_ssl_extdata_index);
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync } else if (ret == 0) {
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync ssl_io->log_prefix, where, SSL_state_string_long(ssl));
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsyncopenssl_iostream_use_certificate(struct ssl_iostream *ssl_io, const char *cert,
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync const char **error_r)
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync in = BIO_new_mem_buf(t_strdup_noconst(cert), strlen(cert));
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync *error_r = t_strdup_printf("BIO_new_mem_buf() failed: %s",
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync if (x != NULL) {
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync if (ret == 0) {
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync *error_r = t_strdup_printf("Can't load ssl_cert: %s",
1eda04de692c4c416332941e87bab4cc8fc45a18vboxsync openssl_iostream_use_certificate_error(cert, NULL));
const char **error_r)
int ret = 0;
return ret;
if (preverify_ok == 0) {
if (preverify_ok == 0) {
const char **error_r)
int verify_flags;
const char **error_r)
#ifdef HAVE_SSL_GET_SERVERNAME
int ret;
if (max_bytes == 0) {
TRUE);
if (sent < 0) {
return bytes_sent;
static ssize_t
if (*size_r > 0)
const unsigned char *data;
int ret;
return FALSE;
if (size == 0) {
return FALSE;
return FALSE;
if (bytes_read) {
return bytes_read;
bool ret;
return ret;
int ret;
return ret;
int err;
switch (err) {
case SSL_ERROR_WANT_WRITE:
if (!write_error)
case SSL_ERROR_WANT_READ:
case SSL_ERROR_SYSCALL:
if (ERR_peek_error() != 0) {
} else if (ret != 0) {
case SSL_ERROR_ZERO_RETURN:
case SSL_ERROR_SSL:
const char *func_name)
const char *func_name)
const char *verify_name)
int ret;
if (ret <= 0)
return ret;
if (ret <= 0)
return ret;
void *context)
const char *prefix)
char *name;
int len;
return NULL;
if (len < 0)
const char *comp_str;