260 char *var_openssl_path;
262 #ifdef VAR_TLS_PREEMPT_CLIST
271 int TLScontext_index = -1;
276 static const NAME_CODE protocol_table[] = {
277 SSL_TXT_SSLV2, TLS_PROTOCOL_SSLv2,
278 SSL_TXT_SSLV3, TLS_PROTOCOL_SSLv3,
279 SSL_TXT_TLSV1, TLS_PROTOCOL_TLSv1,
280 SSL_TXT_TLSV1_1, TLS_PROTOCOL_TLSv1_1,
281 SSL_TXT_TLSV1_2, TLS_PROTOCOL_TLSv1_2,
282 SSL_TXT_TLSV1_3, TLS_PROTOCOL_TLSv1_3,
283 0, TLS_PROTOCOL_INVALID,
289 #define NAMEBUG(x) #x, SSL_OP_##x
292 #ifndef SSL_OP_MICROSOFT_SESS_ID_BUG
293 #define SSL_OP_MICROSOFT_SESS_ID_BUG 0
295 NAMEBUG(MICROSOFT_SESS_ID_BUG),
297 #ifndef SSL_OP_NETSCAPE_CHALLENGE_BUG
298 #define SSL_OP_NETSCAPE_CHALLENGE_BUG 0
300 NAMEBUG(NETSCAPE_CHALLENGE_BUG),
302 #ifndef SSL_OP_LEGACY_SERVER_CONNECT
303 #define SSL_OP_LEGACY_SERVER_CONNECT 0
305 NAMEBUG(LEGACY_SERVER_CONNECT),
307 #ifndef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
308 #define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0
310 NAMEBUG(NETSCAPE_REUSE_CIPHER_CHANGE_BUG),
311 "CVE-2010-4180", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG,
313 #ifndef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
314 #define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0
316 NAMEBUG(SSLREF2_REUSE_CERT_TYPE_BUG),
318 #ifndef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
319 #define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0
321 NAMEBUG(MICROSOFT_BIG_SSLV3_BUFFER),
323 #ifndef SSL_OP_MSIE_SSLV2_RSA_PADDING
324 #define SSL_OP_MSIE_SSLV2_RSA_PADDING 0
326 NAMEBUG(MSIE_SSLV2_RSA_PADDING),
327 "CVE-2005-2969", SSL_OP_MSIE_SSLV2_RSA_PADDING,
329 #ifndef SSL_OP_SSLEAY_080_CLIENT_DH_BUG
330 #define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0
332 NAMEBUG(SSLEAY_080_CLIENT_DH_BUG),
334 #ifndef SSL_OP_TLS_D5_BUG
335 #define SSL_OP_TLS_D5_BUG 0
339 #ifndef SSL_OP_TLS_BLOCK_PADDING_BUG
340 #define SSL_OP_TLS_BLOCK_PADDING_BUG 0
342 NAMEBUG(TLS_BLOCK_PADDING_BUG),
344 #ifndef SSL_OP_TLS_ROLLBACK_BUG
345 #define SSL_OP_TLS_ROLLBACK_BUG 0
347 NAMEBUG(TLS_ROLLBACK_BUG),
349 #ifndef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
350 #define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS 0
352 NAMEBUG(DONT_INSERT_EMPTY_FRAGMENTS),
354 #ifndef SSL_OP_CRYPTOPRO_TLSEXT_BUG
355 #define SSL_OP_CRYPTOPRO_TLSEXT_BUG 0
357 NAMEBUG(CRYPTOPRO_TLSEXT_BUG),
366 #define NAME_SSL_OP(x) #x, SSL_OP_##x
369 #ifndef SSL_OP_LEGACY_SERVER_CONNECT
370 #define SSL_OP_LEGACY_SERVER_CONNECT 0
372 NAME_SSL_OP(LEGACY_SERVER_CONNECT),
374 #ifndef SSL_OP_NO_TICKET
375 #define SSL_OP_NO_TICKET 0
377 NAME_SSL_OP(NO_TICKET),
379 #ifndef SSL_OP_NO_COMPRESSION
380 #define SSL_OP_NO_COMPRESSION 0
382 NAME_SSL_OP(NO_COMPRESSION),
391 #ifndef SSL_OP_SINGLE_DH_USE
392 #define SSL_OP_SINGLE_DH_USE 0
394 #ifndef SSL_OP_SINGLE_ECDH_USE
395 #define SSL_OP_SINGLE_ECDH_USE 0
401 const NAME_CODE tls_cipher_grade_table[] = {
402 "high", TLS_CIPHER_HIGH,
403 "medium", TLS_CIPHER_MEDIUM,
404 "low", TLS_CIPHER_LOW,
405 "export", TLS_CIPHER_EXPORT,
406 "null", TLS_CIPHER_NULL,
407 "invalid", TLS_CIPHER_NONE,
414 #define TLS_LOG_0 TLS_LOG_NONE
415 #define TLS_LOG_1 TLS_LOG_SUMMARY
416 #define TLS_LOG_2 (TLS_LOG_1 | TLS_LOG_VERBOSE | TLS_LOG_CACHE | TLS_LOG_DEBUG)
417 #define TLS_LOG_3 (TLS_LOG_2 | TLS_LOG_TLSPKTS)
418 #define TLS_LOG_4 (TLS_LOG_3 | TLS_LOG_ALLPKTS)
420 static const NAME_MASK tls_log_table[] = {
422 "none", TLS_LOG_NONE,
424 "routine", TLS_LOG_1,
428 "ssl-expert", TLS_LOG_3,
430 "ssl-developer", TLS_LOG_4,
436 "summary", TLS_LOG_SUMMARY,
437 "untrusted", TLS_LOG_UNTRUSTED,
438 "peercert", TLS_LOG_PEERCERT,
439 "certmatch", TLS_LOG_CERTMATCH,
440 "verbose", TLS_LOG_VERBOSE,
441 "cache", TLS_LOG_CACHE,
442 "ssl-debug", TLS_LOG_DEBUG,
443 "ssl-handshake-packet-dump", TLS_LOG_TLSPKTS,
444 "ssl-session-packet-dump", TLS_LOG_TLSPKTS | TLS_LOG_ALLPKTS,
464 const char *ssl_name;
466 const char *evp_name;
469 static const cipher_probe_t cipher_probes[] = {
470 "AES", 256,
"AES-256-CBC",
471 "CAMELLIA", 256,
"CAMELLIA-256-CBC",
477 int tls_log_mask(
const char *log_param,
const char *log_level)
488 void tls_update_app_logmask(TLS_APPL_STATE *app_ctx,
int log_mask)
490 app_ctx->log_mask = log_mask;
495 static const char *tls_exclude_missing(SSL_CTX *ctx,
VSTRING *buf)
497 const char *myname =
"tls_exclude_missing";
498 static ARGV *exclude;
500 ssl_cipher_stack_t *ciphers;
502 const cipher_probe_t *probe;
533 for (probe = cipher_probes; probe->ssl_name; ++probe) {
535 if (EVP_get_cipherbyname(probe->evp_name))
544 if (s == 0 && (s = SSL_new(ctx)) == 0) {
546 msg_fatal(
"%s: error allocating SSL object", myname);
562 if (SSL_set_cipher_list(s, probe->ssl_name) == 0
563 || (ciphers = SSL_get_ciphers(s)) == 0
564 || (num = sk_SSL_CIPHER_num(ciphers)) == 0) {
568 for (i = 0; i < num; ++i) {
569 c = sk_SSL_CIPHER_value(ciphers, i);
570 (void) SSL_CIPHER_get_bits(c, &alg_bits);
571 if (alg_bits == probe->alg_bits)
578 for (i = 0; i < exclude->
argc; ++i)
585 static const char *tls_apply_cipher_list(TLS_APPL_STATE *app_ctx,
586 const char *context,
VSTRING *spec)
588 const char *
new = tls_exclude_missing(app_ctx->ssl_ctx, spec);
591 if (SSL_CTX_set_cipher_list(app_ctx->ssl_ctx,
new) == 0) {
602 int tls_protocol_mask(
const char *plist)
611 #define FREE_AND_RETURN(ptr, res) do { \
624 if (code == TLS_PROTOCOL_INVALID)
625 FREE_AND_RETURN(save, TLS_PROTOCOL_INVALID);
635 FREE_AND_RETURN(save,
636 (include ? (exclude | (TLS_KNOWN_PROTOCOLS & ~include)) : exclude));
641 void tls_param_init(
void)
673 static int init_done;
686 const char *tls_set_ciphers(TLS_APPL_STATE *app_ctx,
const char *context,
687 const char *grade,
const char *exclusions)
689 const char *myname =
"tls_set_ciphers";
695 const char *new_list;
697 new_grade = tls_cipher_grade(grade);
698 if (new_grade == TLS_CIPHER_NONE) {
710 if (app_ctx->cipher_list) {
711 if (new_grade == app_ctx->cipher_grade
712 && strcmp(app_ctx->cipher_exclusions, exclusions) == 0)
713 return (app_ctx->cipher_list);
716 app_ctx->cipher_grade = TLS_CIPHER_NONE;
718 myfree(app_ctx->cipher_exclusions);
719 app_ctx->cipher_exclusions = 0;
721 myfree(app_ctx->cipher_list);
722 app_ctx->cipher_list = 0;
725 case TLS_CIPHER_HIGH:
728 case TLS_CIPHER_MEDIUM:
734 case TLS_CIPHER_EXPORT:
737 case TLS_CIPHER_NULL:
745 msg_panic(
"invalid %s cipher grade: %d", context, new_grade);
752 msg_panic(
"%s: empty \"%s\" cipherlist", myname, grade);
757 #define CIPHER_SEP CHARS_COMMA_SP ":"
758 if (exclusions != 0) {
760 while ((tok =
mystrtok(&cp, CIPHER_SEP)) != 0) {
765 if (strchr(
"!+-@", *tok)) {
767 "invalid unary '!+-@' in %s cipher "
768 "exclusion: \"%s\"", context, tok);
775 if ((new_list = tls_apply_cipher_list(app_ctx, context, buf)) == 0)
779 app_ctx->cipher_grade = new_grade;
780 app_ctx->cipher_exclusions =
mystrdup(exclusions);
782 return (app_ctx->cipher_list =
mystrdup(new_list));
787 TLS_APPL_STATE *tls_alloc_app_context(SSL_CTX *ssl_ctx,
int log_mask)
789 TLS_APPL_STATE *app_ctx;
791 app_ctx = (TLS_APPL_STATE *)
mymalloc(
sizeof(*app_ctx));
794 memset((
void *) app_ctx, 0,
sizeof(*app_ctx));
795 app_ctx->ssl_ctx = ssl_ctx;
796 app_ctx->log_mask = log_mask;
799 app_ctx->cipher_grade = TLS_CIPHER_NONE;
800 app_ctx->cipher_exclusions = 0;
801 app_ctx->cipher_list = 0;
802 app_ctx->cache_type = 0;
810 void tls_free_app_context(TLS_APPL_STATE *app_ctx)
812 if (app_ctx->ssl_ctx)
813 SSL_CTX_free(app_ctx->ssl_ctx);
814 if (app_ctx->cache_type)
815 myfree(app_ctx->cache_type);
817 if (app_ctx->cipher_exclusions)
818 myfree(app_ctx->cipher_exclusions);
819 if (app_ctx->cipher_list)
820 myfree(app_ctx->cipher_list);
828 TLS_SESS_STATE *tls_alloc_sess_context(
int log_mask,
const char *namaddr)
830 TLS_SESS_STATE *TLScontext;
841 TLScontext = (TLS_SESS_STATE *)
mymalloc(
sizeof(TLS_SESS_STATE));
842 memset((
void *) TLScontext, 0,
sizeof(*TLScontext));
844 TLScontext->cache_type = 0;
845 TLScontext->serverid = 0;
846 TLScontext->peer_CN = 0;
847 TLScontext->issuer_CN = 0;
848 TLScontext->peer_cert_fprint = 0;
849 TLScontext->peer_pkey_fprint = 0;
850 TLScontext->protocol = 0;
851 TLScontext->cipher_name = 0;
852 TLScontext->log_mask = log_mask;
854 TLScontext->mdalg = 0;
855 TLScontext->dane = 0;
856 TLScontext->errordepth = -1;
857 TLScontext->tadepth = -1;
858 TLScontext->errorcode = X509_V_OK;
859 TLScontext->errorcert = 0;
860 TLScontext->untrusted = 0;
861 TLScontext->trusted = 0;
868 void tls_free_context(TLS_SESS_STATE *TLScontext)
876 if (TLScontext->con != 0)
877 SSL_free(TLScontext->con);
879 if (TLScontext->namaddr)
880 myfree(TLScontext->namaddr);
881 if (TLScontext->serverid)
882 myfree(TLScontext->serverid);
884 if (TLScontext->peer_CN)
885 myfree(TLScontext->peer_CN);
886 if (TLScontext->issuer_CN)
887 myfree(TLScontext->issuer_CN);
888 if (TLScontext->peer_cert_fprint)
889 myfree(TLScontext->peer_cert_fprint);
890 if (TLScontext->peer_pkey_fprint)
891 myfree(TLScontext->peer_pkey_fprint);
892 if (TLScontext->errorcert)
893 X509_free(TLScontext->errorcert);
894 if (TLScontext->untrusted)
895 sk_X509_pop_free(TLScontext->untrusted, X509_free);
896 if (TLScontext->trusted)
897 sk_X509_pop_free(TLScontext->trusted, X509_free);
899 myfree((
void *) TLScontext);
904 static void tls_version_split(
unsigned long version, TLS_VINFO *info)
935 if (version < 0x0930) {
937 info->patch = version & 0x0f;
939 info->micro = version & 0x0f;
941 info->minor = version & 0x0f;
943 info->major = version & 0x0f;
944 }
else if (version < 0x00905800L) {
945 info->patch = version & 0xff;
947 info->status = version & 0xf;
949 info->micro = version & 0xff;
951 info->minor = version & 0xff;
953 info->major = version & 0xff;
955 info->status = version & 0xf;
957 info->patch = version & 0xff;
959 info->micro = version & 0xff;
961 info->minor = version & 0xff;
963 info->major = version & 0xff;
964 if (version < 0x00906000L)
965 info->patch &= ~0x80;
971 void tls_check_version(
void)
976 tls_version_split(OPENSSL_VERSION_NUMBER, &hdr_info);
977 tls_version_split(OpenSSL_version_num(), &lib_info);
979 if (lib_info.major != hdr_info.major
980 || lib_info.minor != hdr_info.minor
981 || lib_info.micro != hdr_info.micro)
982 msg_warn(
"run-time library vs. compile-time header version mismatch: "
983 "OpenSSL %d.%d.%d may not be compatible with OpenSSL %d.%d.%d",
984 lib_info.major, lib_info.minor, lib_info.micro,
985 hdr_info.major, hdr_info.minor, hdr_info.micro);
990 const char *tls_compile_version(
void)
992 return (OPENSSL_VERSION_TEXT);
997 const char *tls_run_version(
void)
999 return (OpenSSL_version(OPENSSL_VERSION));
1002 const char **tls_pkey_algorithms(
void)
1009 static const char *algs[] = {
1010 #ifndef OPENSSL_NO_DSA
1013 #if OPENSSL_VERSION_NUMBER >= 0x10000000L && !defined(OPENSSL_NO_ECDSA)
1016 #ifndef OPENSSL_NO_RSA
1027 long tls_bug_bits(
void)
1029 long bits = SSL_OP_ALL;
1031 #if OPENSSL_VERSION_NUMBER >= 0x00908000L && \
1032 OPENSSL_VERSION_NUMBER < 0x10000000L
1033 long lib_version = OpenSSL_version_num();
1041 if (lib_version >= 0x00908000L && lib_version <= 0x0090802fL) {
1042 ssl_comp_stack_t *comp_methods = SSL_COMP_get_compression_methods();
1044 comp_methods = SSL_COMP_get_compression_methods();
1045 if (comp_methods != 0 && sk_SSL_COMP_num(comp_methods) > 0)
1046 bits &= ~SSL_OP_TLS_BLOCK_PADDING_BUG;
1058 #ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG
1060 bits &= ~SSL_OP_SAFARI_ECDHE_ECDSA_BUG;
1074 enable &= ~(SSL_OP_ALL | TLS_SSL_OP_MANAGED_BITS);
1084 bits |= SSL_OP_SINGLE_ECDH_USE | SSL_OP_SINGLE_DH_USE;
1090 void tls_print_errors(
void)
1099 while ((err = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0) {
1100 ERR_error_string_n(err, buffer,
sizeof(buffer));
1101 if (flags & ERR_TXT_STRING)
1102 msg_warn(
"TLS library problem: %s:%s:%d:%s:",
1103 buffer, file, line, data);
1105 msg_warn(
"TLS library problem: %s:%s:%d:", buffer, file, line);
1111 void tls_info_callback(
const SSL *s,
int where,
int ret)
1118 w = where & ~SSL_ST_MASK;
1120 if (w & SSL_ST_CONNECT)
1121 str =
"SSL_connect";
1122 else if (w & SSL_ST_ACCEPT)
1127 if (where & SSL_CB_LOOP) {
1128 msg_info(
"%s:%s", str, SSL_state_string_long((SSL *) s));
1129 }
else if (where & SSL_CB_ALERT) {
1130 str = (where & SSL_CB_READ) ?
"read" :
"write";
1131 if ((ret & 0xff) != SSL3_AD_CLOSE_NOTIFY)
1132 msg_info(
"SSL3 alert %s:%s:%s", str,
1133 SSL_alert_type_string_long(ret),
1134 SSL_alert_desc_string_long(ret));
1135 }
else if (where & SSL_CB_EXIT) {
1138 str, SSL_state_string_long((SSL *) s));
1140 #ifndef LOG_NON_ERROR_STATES
1141 switch (SSL_get_error((SSL *) s, ret)) {
1142 case SSL_ERROR_WANT_READ:
1143 case SSL_ERROR_WANT_WRITE:
1149 str, SSL_state_string_long((SSL *) s));
1150 #ifndef LOG_NON_ERROR_STATES
1170 #define TRUNCATE_SPACE_NULL
1171 #define DUMP_WIDTH 16
1172 #define VERT_SPLIT 7
1174 static void tls_dump_buffer(
const unsigned char *start,
int len)
1177 const unsigned char *last = start + len - 1;
1178 const unsigned char *row;
1179 const unsigned char *col;
1182 #ifdef TRUNCATE_SPACE_NULL
1183 while (last >= start && (*last ==
' ' || *last == 0))
1187 for (row = start; row <= last; row += DUMP_WIDTH) {
1190 for (col = row; col < row + DUMP_WIDTH; col++) {
1196 ch, col - row == VERT_SPLIT ?
'|' :
' ');
1200 for (col = row; col < row + DUMP_WIDTH; col++) {
1207 if (col - row == VERT_SPLIT)
1213 #ifdef TRUNCATE_SPACE_NULL
1214 if ((last + 1) - start < len)
1216 (
unsigned long) ((last + 1) - start));
1223 long tls_bio_dump_cb(BIO *bio,
int cmd,
const char *argp,
int argi,
1224 long unused_argl,
long ret)
1226 if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) {
1227 msg_info(
"read from %08lX [%08lX] (%d bytes => %ld (0x%lX))",
1228 (
unsigned long) bio, (
unsigned long) argp, argi,
1229 ret, (
unsigned long) ret);
1230 tls_dump_buffer((
unsigned char *) argp, (
int) ret);
1231 }
else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) {
1232 msg_info(
"write to %08lX [%08lX] (%d bytes => %ld (0x%lX))",
1233 (
unsigned long) bio, (
unsigned long) argp, argi,
1234 ret, (
unsigned long) ret);
1235 tls_dump_buffer((
unsigned char *) argp, (
int) ret);
1240 int tls_validate_digest(
const char *dgst)
1242 const EVP_MD *md_alg;
1243 unsigned int md_len;
1250 #if defined(LN_sha256) && defined(NID_sha256) && !defined(OPENSSL_NO_SHA256)
1251 if (!EVP_get_digestbyname(LN_sha224))
1252 EVP_add_digest(EVP_sha224());
1253 if (!EVP_get_digestbyname(LN_sha256))
1254 EVP_add_digest(EVP_sha256());
1256 #if defined(LN_sha512) && defined(NID_sha512) && !defined(OPENSSL_NO_SHA512)
1257 if (!EVP_get_digestbyname(LN_sha384))
1258 EVP_add_digest(EVP_sha384());
1259 if (!EVP_get_digestbyname(LN_sha512))
1260 EVP_add_digest(EVP_sha512());
1267 if ((md_alg = EVP_get_digestbyname(dgst)) == 0) {
1268 msg_warn(
"Digest algorithm \"%s\" not found", dgst);
1275 if ((md_len = EVP_MD_size(md_alg)) > EVP_MAX_MD_SIZE) {
1276 msg_warn(
"Digest algorithm \"%s\" output size %u too large",
#define DEF_TLS_DANE_DIGESTS
char * var_tls_eecdh_auto
#define DEF_TLS_MEDIUM_CLIST
char * var_tls_bug_tweaks
#define DEF_TLS_NULL_CLIST
#define DEF_TLS_APPEND_DEF_CA
#define VAR_TLS_EXPORT_CLIST
#define DEF_TLS_SSL_OPTIONS
char * var_tls_eecdh_ultra
char * mystrdup(const char *str)
#define DEF_TLS_LOW_CLIST
char * var_tls_tkt_cipher
NORETURN msg_panic(const char *fmt,...)
#define DEF_TLS_HIGH_CLIST
#define DEF_TLS_BC_PKEY_FPRINT
char * var_tls_medium_clist
#define VAR_TLS_DANE_AGILITY
#define VAR_TLS_EECDH_AUTO
#define DEF_TLS_BUG_TWEAKS
int tls_dummy_for_broken_linkers
bool var_tls_dane_taa_dgst
char * var_tls_ssl_options
#define VAR_TLS_MGR_SERVICE
void argv_add(ARGV *argvp,...)
#define VAR_TLS_HIGH_CLIST
char * var_tls_export_clist
char * mystrtok(char **src, const char *sep)
#define DEF_TLS_DAEMON_RAND_BYTES
ARGV * argv_alloc(ssize_t len)
#define VAR_TLS_PREEMPT_CLIST
#define DEF_TLS_EECDH_AUTO
#define VAR_TLS_MEDIUM_CLIST
#define VAR_TLS_EECDH_STRONG
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
#define VSTRING_TERMINATE(vp)
char * var_tls_mgr_service
#define VAR_TLS_DANE_DIGESTS
#define VSTRING_ADDCH(vp, ch)
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
#define VAR_TLS_BUG_TWEAKS
#define DEF_TLS_EECDH_STRONG
#define DEF_TLS_PREEMPT_CLIST
bool var_tls_bc_pkey_fprint
#define VAR_TLS_NULL_CLIST
#define DEF_TLS_EECDH_ULTRA
#define DEF_TLS_MGR_SERVICE
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
#define VAR_TLS_LOW_CLIST
VSTRING * vstring_alloc(ssize_t len)
#define VAR_TLS_MULTI_WILDCARD
#define NAME_CODE_FLAG_NONE
#define DEF_TLS_DANE_TAA_DGST
int var_tls_daemon_rand_bytes
#define DEF_TLS_DANE_AGILITY
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define DEF_TLS_MULTI_WILDCARD
char * lowercase(char *string)
void get_mail_conf_str_table(const CONFIG_STR_TABLE *)
int name_code(const NAME_CODE *table, int flags, const char *name)
#define VAR_TLS_BC_PKEY_FPRINT
#define VAR_TLS_TKT_CIPHER
NORETURN msg_fatal(const char *fmt,...)
void get_mail_conf_bool_table(const CONFIG_BOOL_TABLE *)
#define VAR_TLS_APPEND_DEF_CA
bool var_tls_preempt_clist
#define VAR_TLS_SSL_OPTIONS
char * var_tls_dane_digests
#define DEF_TLS_EXPORT_CLIST
#define VAR_TLS_EECDH_ULTRA
char * var_tls_high_clist
VSTRING * vstring_free(VSTRING *vp)
#define long_name_mask_opt(tag, table, str, flags)
#define DEF_TLS_TKT_CIPHER
char * var_tls_eecdh_strong
#define VAR_TLS_DAEMON_RAND_BYTES
void get_mail_conf_int_table(const CONFIG_INT_TABLE *)
#define NAME_MASK_ANY_CASE
bool var_tls_multi_wildcard
char * var_tls_dane_agility
#define VAR_TLS_DANE_TAA_DGST
char * var_tls_null_clist
#define name_mask_opt(tag, table, str, flags)
bool var_tls_append_def_CA
VSTRING * vstring_strcat(VSTRING *vp, const char *src)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)