206 #ifdef STRCASECMP_IN_STRINGS_H
309 static TLS_APPL_STATE *tlsp_server_ctx;
310 static int ask_client_cert;
315 #define STR(x) vstring_str(x)
348 static void tlsp_ciphertext_event(
int,
void *);
350 #define TLSP_INIT_TIMEOUT 100
354 static void tlsp_drain(
char *unused_service,
char **unused_argv)
367 for (count = 0; ; count++) {
382 static int tlsp_eval_tls_error(
TLSP_STATE *state,
int err)
415 case SSL_ERROR_WANT_WRITE:
431 case SSL_ERROR_WANT_READ:
462 NBBIO *plaintext_buf;
474 ssl_stat = SSL_accept(tls_context->con);
476 handshake_err = SSL_get_error(tls_context->con, ssl_stat);
477 tlsp_eval_tls_error(state, handshake_err);
481 if ((state->
tls_context = tls_server_post_accept(tls_context)) == 0) {
491 msg_warn(
"cannot send TLS context: %m");
508 ssl_stat = SSL_shutdown(tls_context->con);
511 handshake_err = SSL_get_error(tls_context->con, ssl_stat);
512 tlsp_eval_tls_error(state, handshake_err);
533 ssl_write_err = SSL_ERROR_NONE;
535 ssl_stat = SSL_write(tls_context->con,
NBBIO_READ_BUF(plaintext_buf),
537 ssl_write_err = SSL_get_error(tls_context->con, ssl_stat);
538 if (ssl_write_err != SSL_ERROR_NONE)
563 ssl_read_err = SSL_ERROR_NONE;
565 ssl_stat = SSL_read(tls_context->con,
570 ssl_read_err = SSL_get_error(tls_context->con, ssl_stat);
571 if (ssl_read_err != SSL_ERROR_NONE)
582 if (tlsp_eval_tls_error(state, ssl_write_err != SSL_ERROR_NONE ?
583 ssl_write_err : ssl_read_err) < 0)
618 static void tlsp_plaintext_event(
int event,
void *context)
636 tlsp_strategy(state);
641 static void tlsp_ciphertext_event(
int event,
void *context)
651 tlsp_strategy(state);
654 msg_warn(
"deadlock on plaintext stream for %s",
657 msg_warn(
"ciphertext read/write %s for %s",
668 TLS_SERVER_START_PROPS props;
669 static char *cipher_grade;
670 static VSTRING *cipher_exclusions;
686 #define ADD_EXCLUDE(vstr, str) \
689 vstring_sprintf_append((vstr), "%s%s", \
690 VSTRING_LEN(vstr) ? " " : "", (str)); \
693 if (cipher_grade == 0) {
701 ADD_EXCLUDE(cipher_exclusions,
"aNULL");
704 TLS_SERVER_START(&props,
705 ctx = tlsp_server_ctx,
713 cipher_grade = cipher_grade,
714 cipher_exclusions =
STR(cipher_exclusions),
737 static void tlsp_get_fd_event(
int event,
void *context)
739 const char *myname =
"tlsp_get_fd_event";
765 msg_warn(
"%s: receive SMTP client file descriptor: %m", myname);
773 tlsp_plaintext_event,
780 if (tlsp_start_tls(state) < 0)
786 tlsp_strategy(state);
791 static void tlsp_get_request_event(
int event,
void *context)
793 const char *myname =
"tlsp_get_request_event";
806 if (remote_endpt == 0) {
833 msg_warn(
"%s: receive request attributes: %m", myname);
844 && tlsp_server_ctx != 0);
850 read_wait(plaintext_fd, TLSP_INIT_TIMEOUT);
880 static void tlsp_service(
VSTREAM *plaintext_stream,
891 msg_fatal(
"unexpected command-line argument: %s", argv[0]);
916 static void pre_jail_init(
char *unused_name,
char **unused_argv)
918 TLS_SERVER_INIT_PROPS props;
919 const char *cert_file;
920 int have_server_cert;
921 int no_server_cert_ok;
922 int require_server_cert;
938 msg_warn(
"%s: unsupported TLS level \"%s\", using \"encrypt\"",
955 msg_warn(
"TLS service is requested, but disabled with %s or %s",
966 ask_client_cert = require_server_cert =
970 no_server_cert_ok = 1;
973 no_server_cert_ok = 0;
980 if (!have_server_cert && require_server_cert)
981 msg_warn(
"Need a server cert to request client certs");
983 msg_warn(
"Can't require client certs unless TLS is required");
985 if (have_server_cert || (no_server_cert_ok && !require_server_cert))
992 TLS_SERVER_INIT(&props,
996 cache_type = TLS_MGR_SCACHE_SMTPD,
998 cert_file = cert_file,
1014 ask_ccert = ask_client_cert,
1017 msg_warn(
"No server certs available. TLS can't be enabled");
1026 if (tlsp_server_ctx)
1027 SSL_CTX_set_mode(tlsp_server_ctx->ssl_ctx,
1028 SSL_MODE_ENABLE_PARTIAL_WRITE
1029 | SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
1034 static void post_jail_init(
char *unused_name,
char **unused_argv)
1043 int main(
int argc,
char **argv)
1143 static void tlsp_service(
VSTREAM *stream,
char *unused_service,
1146 msg_info(
"TLS support is not compiled in -- exiting");
#define DEF_SMTPD_ENFORCE_TLS
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
char * var_smtpd_tls_fpt_dgst
#define VAR_TLSP_TLS_SET_SESSID
#define VAR_SMTPD_TLS_MAND_PROTO
#define CA_MAIL_SERVER_WATCHDOG(v)
#define DEF_TLSP_TLS_CIPH
#define CA_VSTREAM_CTL_TIMEOUT(v)
#define MAIL_VERSION_STAMP_DECLARE
#define CA_MAIL_SERVER_BOOL_TABLE(v)
#define NBBIO_WRITE_BUF(np)
#define VAR_SMTPD_TLS_MAND_EXCL
#define DEF_SMTPD_TLS_CERT_FILE
#define TLS_PROXY_FLAG_SEND_CONTEXT
#define DEF_TLSP_TLS_512_FILE
char * var_smtpd_tls_dh1024_param_file
#define VAR_SMTPD_TLS_ECCERT_FILE
char * mystrdup(const char *str)
char * var_smtpd_tls_eccert_file
char * var_smtpd_tls_key_file
char * var_smtpd_tls_dkey_file
char * var_tlsp_tls_eckey_file
#define CA_MAIL_SERVER_STR_TABLE(v)
char * var_smtpd_tls_proto
#define DEF_TLSP_TLS_1024_FILE
#define VAR_SMTPD_TLS_EXCL_CIPH
#define VAR_TLSP_TLS_RCERT
#define VAR_TLSP_TLS_MAND_PROTO
#define DEF_SMTPD_TLS_CCERT_VD
char * var_smtpd_tls_ciph
#define VAR_TLSP_TLS_ACERT
bool var_smtpd_tls_req_ccert
#define VAR_SMTPD_TLS_CERT_FILE
#define VAR_TLSP_TLS_CA_PATH
char * var_tlsp_tls_cert_file
#define DEF_SMTPD_TLS_ECCERT_FILE
#define DEF_SMTPD_TLS_RCERT
#define DEF_SMTPD_TLS_LOGLEVEL
#define CA_MAIL_SERVER_SLOW_EXIT(v)
#define VAR_TLSP_TLS_DKEY_FILE
#define DEF_TLSP_TLS_DCERT_FILE
#define NBBIO_READ_BUF(np)
#define DEF_TLSP_TLS_CERT_FILE
char * var_tlsp_tls_dh512_param_file
void nbbio_slumber(NBBIO *np, int timeout)
#define RECV_ATTR_INT(name, val)
#define DEF_SMTPD_USE_TLS
#define DEF_TLSP_TLS_FPT_DGST
#define NBBIO_FLAG_TIMEOUT
#define VAR_TLSP_TLS_512_FILE
#define DEF_SMTPD_TLS_LEVEL
#define DEF_SMTPD_TLS_MAND_CIPH
#define DEF_TLSP_TLS_MAND_PROTO
void event_enable_write(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
char * var_tlsp_tls_mand_ciph
#define VAR_TLSP_TLS_DCERT_FILE
char * var_smtpd_tls_CApath
#define DEF_TLSP_TLS_CA_PATH
char * var_smtpd_tls_eecdh
#define VAR_SMTPD_TLS_CA_PATH
#define VAR_SMTPD_TLS_512_FILE
void nbbio_enable_read(NBBIO *np, int timeout)
bool var_smtpd_tls_ask_ccert
char * var_tlsp_tls_excl_ciph
#define VAR_TLSP_TLS_MAND_CIPH
#define VAR_SMTPD_TLS_RCERT
#define DEF_SMTPD_TLS_CIPH
#define DEF_SMTPD_TLS_PROTO
char * var_tlsp_tls_loglevel
char * var_tlsp_tls_CApath
VSTREAM * plaintext_stream
#define VAR_TLSP_TLS_CERT_FILE
#define DEF_SMTPD_TLS_ACERT
#define VAR_SMTPD_TLS_CCERT_VD
int var_tlsp_tls_ccert_vd
char * var_smtpd_tls_mand_ciph
int event_server_drain(void)
#define CA_MAIL_SERVER_POST_INIT(v)
#define CA_MAIL_SERVER_INT_TABLE(v)
#define DEF_TLSP_TLS_KEY_FILE
#define VAR_TLSP_TLS_FPT_DGST
#define VAR_SMTPD_TLS_1024_FILE
char * var_tlsp_tls_dh1024_param_file
#define DEF_TLSP_TLS_ECKEY_FILE
#define VAR_SMTPD_TLS_PROTO
#define VAR_SMTPD_TLS_LOGLEVEL
#define MAIL_ATTR_TIMEOUT
#define VAR_SMTPD_TLS_CA_FILE
char * var_smtpd_tls_mand_proto
int var_smtpd_tls_ccert_vd
#define DEF_TLSP_TLS_RCERT
#define VAR_SMTPD_USE_TLS
#define DEF_SMTPD_TLS_EXCL_CIPH
TLSP_STATE * tlsp_state_create(const char *, VSTREAM *)
#define DEF_SMTPD_TLS_MAND_PROTO
#define VAR_SMTPD_TLS_FPT_DGST
#define DEF_TLSP_TLS_EECDH
#define VAR_SMTPD_TLS_EECDH
bool var_tlsp_tls_req_ccert
char * var_tlsp_tls_key_file
bool var_smtpd_tls_set_sessid
#define TLS_PROXY_FLAG_ROLE_CLIENT
bool var_smtpd_enforce_tls
char * var_smtpd_tls_dh512_param_file
char * var_tlsp_tls_mand_proto
#define NBBIO_ACTIVE_FLAGS(np)
#define read_wait(fd, timeout)
void msg_warn(const char *fmt,...)
#define VAR_SMTPD_TLS_KEY_FILE
VSTRING * vstring_alloc(ssize_t len)
#define DEF_SMTPD_TLS_CA_FILE
#define VAR_TLSP_TLS_PROTO
bool var_tlsp_tls_set_sessid
#define CA_MAIL_SERVER_NBOOL_TABLE(v)
#define DEF_SMTPD_TLS_512_FILE
#define MAIL_VERSION_STAMP_ALLOCATE
NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
#define VAR_TLSP_TLS_LOGLEVEL
#define VAR_SMTPD_TLS_DKEY_FILE
#define MAIL_ATTR_REMOTE_ENDPT
char * var_smtpd_tls_eckey_file
#define DEF_TLSP_TLS_LEVEL
int main(int argc, char **argv)
#define CA_MAIL_SERVER_TIME_TABLE(v)
void event_server_disconnect(VSTREAM *stream)
#define SEND_ATTR_INT(name, val)
char * var_tlsp_tls_level
char * var_smtpd_tls_level
#define VAR_TLSP_TLS_CCERT_VD
NORETURN msg_fatal(const char *fmt,...)
#define DEF_TLSP_TLS_ECCERT_FILE
#define MAIL_ATTR_SERVER_ID
char * var_smtpd_relay_ccerts
#define VAR_TLSP_TLS_LEVEL
#define DEF_SMTPD_TLS_KEY_FILE
char * var_smtpd_tls_loglevel
int vstream_fflush(VSTREAM *stream)
#define VAR_TLSP_TLS_MAND_EXCL
#define DEF_TLSP_TLS_CCERT_VD
#define DEF_TLSP_TLS_MAND_CIPH
#define DEF_SMTPD_TLS_ECKEY_FILE
void nbbio_enable_write(NBBIO *np, int timeout)
char * var_tlsp_tls_proto
int tls_level_lookup(const char *)
#define NBBIO_READ_PEND(np)
#define CA_MAIL_SERVER_NINT_TABLE(v)
char * var_smtpd_tls_excl_ciph
char * var_tlsp_tls_eccert_file
char * var_smtpd_tls_mand_excl
#define TLS_PROXY_FLAG_ROLE_SERVER
#define DEF_TLSP_TLS_ACERT
#define SEND_ATTR_FUNC(func, val)
#define VAR_SMTPD_TLS_LEVEL
char * var_tlsp_tls_fpt_dgst
#define NBBIO_ERROR_FLAGS(np)
#define VAR_SMTPD_TLS_CIPH
bool var_tlsp_enforce_tls
#define DEF_TLSP_TLS_LOGLEVEL
int strcasecmp(const char *s1, const char *s2)
#define VAR_SMTPD_TLS_ACERT
#define DEF_TLSP_ENFORCE_TLS
char * var_tlsp_tls_dkey_file
int non_blocking(int, int)
#define DEF_TLSP_WATCHDOG
#define NBBIO_BUFSIZE(np)
TLS_SESS_STATE * tls_context
#define VAR_TLSP_TLS_KEY_FILE
#define VAR_TLSP_TLS_CA_FILE
#define VAR_TLSP_ENFORCE_TLS
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
#define DEF_TLSP_TLS_CA_FILE
NBBIO * nbbio_create(int fd, ssize_t bufsize, const char *label, NBBIO_ACTION action, void *context)
char * var_smtpd_tls_cert_file
#define VAR_TLSP_TLS_CIPH
#define DEF_TLSP_TLS_DKEY_FILE
#define vstream_fileno(vp)
#define VAR_TLSP_WATCHDOG
#define DEF_SMTPD_TLS_1024_FILE
#define VAR_TLSP_TLS_ECCERT_FILE
#define CA_VSTREAM_CTL_END
#define DEF_SMTPD_TLS_DKEY_FILE
#define CA_VSTREAM_CTL_PATH(v)
#define DEF_SMTPD_TLS_SET_SESSID
void tlsp_state_free(TLSP_STATE *)
#define TLSP_FLAG_DO_HANDSHAKE
#define VAR_SMTPD_TLS_DCERT_FILE
EVENT_NOTIFY_FN ciphertext_timer
char * var_tlsp_tls_mand_excl
#define VAR_SMTPD_TLS_MAND_CIPH
#define VAR_SMTPD_TLS_SET_SESSID
char * var_tlsp_tls_dcert_file
void vstream_control(VSTREAM *stream, int name,...)
void event_disable_readwrite(int fd)
bool var_tlsp_tls_ask_ccert
#define DEF_TLSP_TLS_PROTO
char * var_smtpd_tls_CAfile
#define DEF_TLSP_TLS_EXCL_CIPH
#define NBBIO_WRITE_PEND(np)
#define VAR_SMTPD_ENFORCE_TLS
#define DEF_SMTPD_TLS_CA_PATH
#define DEF_TLSP_TLS_MAND_EXCL
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
#define DEF_SMTPD_TLS_FPT_DGST
void nbbio_disable_readwrite(NBBIO *np)
#define VAR_TLSP_TLS_1024_FILE
#define DEF_SMTPD_TLS_MAND_EXCL
#define VAR_TLSP_TLS_ECKEY_FILE
#define DEF_TLSP_TLS_SET_SESSID
#define VAR_SMTPD_TLS_ECKEY_FILE
#define VAR_TLSP_TLS_EECDH
#define DEF_SMTPD_TLS_EECDH
#define VAR_TLSP_TLS_EXCL_CIPH
char * var_tlsp_tls_eecdh
char * var_tlsp_tls_CAfile
#define CA_MAIL_SERVER_PRE_INIT(v)
#define RECV_ATTR_STR(name, val)
char * var_smtpd_tls_dcert_file
#define DEF_SMTPD_TLS_DCERT_FILE
void msg_info(const char *fmt,...)