iostream-openssl-common.c revision bbafd34da224c399700956db6819643e1d3b3ce7
/* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "net.h"
#include "str.h"
#include "iostream-openssl.h"
enum {
DOVECOT_SSL_PROTO_SSLv2 = 0x01,
DOVECOT_SSL_PROTO_SSLv3 = 0x02,
DOVECOT_SSL_PROTO_TLSv1 = 0x04,
DOVECOT_SSL_PROTO_TLSv1_1 = 0x08,
DOVECOT_SSL_PROTO_TLSv1_2 = 0x10,
DOVECOT_SSL_PROTO_ALL = 0x1f
};
int openssl_get_protocol_options(const char *protocols)
{
const char *const *tmp;
bool neg;
if (*name != '!')
else {
name++;
}
#ifdef SSL_TXT_SSLV2
else
#endif
#ifdef SSL_TXT_SSLV3
else
#endif
#ifdef SSL_TXT_TLSV1_1
#endif
#ifdef SSL_TXT_TLSV1_2
#endif
else {
i_fatal("Invalid ssl_protocols setting: "
"Unknown protocol '%s'", name);
}
if (neg)
else
include |= proto;
}
if (include != 0) {
/* exclude everything, except those that are included
(and let excludes still override those) */
exclude |= DOVECOT_SSL_PROTO_ALL & ~include;
}
#ifdef SSL_OP_NO_TLSv1_1
#endif
#ifdef SSL_OP_NO_TLSv1_2
#endif
return op;
}
{
const char *cstr;
unsigned int len;
/* NULs in the name - could be some MITM attack.
never allow. */
return "";
}
return cstr;
}
{
return "";
}
{
return 0;
} else
return -1;
return 0;
}
{
int cn_idx;
return "";
if (cn_idx == -1)
return "";
return asn1_string_to_c(str);
}
{
const char *p;
return TRUE;
/* check for *.example.com wildcard */
return FALSE;
}
const char **reason_r)
{
const GENERAL_NAME *gn;
const char *dnsname;
unsigned int i, count;
bool ret;
/* verify against SubjectAltNames */
/* try to convert verify_name to IP */
else
for (i = 0; i < count; i++) {
"Matches DNS name in SubjectAltNames: %s", dnsname);
break;
}
break;
}
}
}
/* verify against CommonName only when there wasn't any DNS
SubjectAltNames */
if (dns_names) {
} else {
"Matches to CommonName: %s", cname);
} else {
"No match to CommonName=%s or %u SubjectAltNames",
}
}
return ret;
}
{
const char *ret;
char *buf;
if ((flags & ERR_TXT_STRING) != 0)
return ret;
}
const char *openssl_iostream_error(void)
{
unsigned long err;
const char *data, *final_error;
int flags;
if (ERR_peek_error() == 0)
break;
else
}
if (err == 0) {
if (errno != 0)
else
final_error = "Unknown error";
} else {
}
return final_error;
else {
}
}
const char *openssl_iostream_key_load_error(void)
{
unsigned long err = ERR_peek_error();
return "Key is for a different cert than ssl_cert";
else
return openssl_iostream_error();
}
static bool is_pem_key(const char *cert)
{
}
const char *
{
unsigned long err;
err = ERR_peek_error();
return openssl_iostream_error();
else if (is_pem_key(cert)) {
return "The file contains a private key "
"(you've mixed ssl_cert and ssl_key settings)";
return t_strdup_printf("There is no valid PEM certificate. "
} else {
return "There is no valid PEM certificate.";
}
}
void openssl_iostream_clear_errors(void)
{
while (ERR_get_error() != 0)
;
}