Hello, Someone asked about selectable curves in the OpenSMTPD portable tracker, and it turns out I had a diff for that among a few others.
The diff below adds support for the curves keyword in listener and relay directives, allowing to specify a curve string suitable for tls_config_set_ecdhecurves(3) in the same way ciphers were made selectable. I also have a couple other diffs which I'll clean and send. Index: mta.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/mta.c,v retrieving revision 1.245 diff -u -p -u -p -r1.245 mta.c --- mta.c 31 May 2023 16:51:46 -0000 1.245 +++ mta.c 12 Aug 2023 14:20:21 -0000 @@ -476,6 +476,7 @@ mta_setup_dispatcher(struct dispatcher * struct pki *pki; struct ca *ca; const char *ciphers; + const char *curves; uint32_t protos; if (dispatcher->type != DISPATCHER_REMOTE) @@ -490,6 +491,12 @@ mta_setup_dispatcher(struct dispatcher * if (remote->tls_ciphers) ciphers = remote->tls_ciphers; if (ciphers && tls_config_set_ciphers(config, ciphers) == -1) + fatalx("%s", tls_config_error(config)); + + curves = env->sc_tls_curves; + if (remote->tls_curves) + curves = remote->tls_curves; + if (curves && tls_config_set_ecdhecurves(config, curves) == -1) fatalx("%s", tls_config_error(config)); if (remote->tls_protocols) { Index: parse.y =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/parse.y,v retrieving revision 1.292 diff -u -p -u -p -r1.292 parse.y --- parse.y 10 May 2023 07:19:49 -0000 1.292 +++ parse.y 12 Aug 2023 14:20:21 -0000 @@ -125,6 +125,7 @@ static struct listen_opts { char *pki[PKI_MAX]; int pkicount; char *tls_ciphers; + char *tls_curves; char *tls_protocols; char *ca; uint16_t auth; @@ -166,7 +167,7 @@ typedef struct { %token ACTION ADMD ALIAS ANY ARROW AUTH AUTH_OPTIONAL %token BACKUP BOUNCE BYPASS -%token CA CERT CHAIN CHROOT CIPHERS COMMIT COMPRESSION CONNECT +%token CA CERT CHAIN CHROOT CIPHERS COMMIT COMPRESSION CONNECT CURVES %token DATA DATA_LINE DHE DISCONNECT DOMAIN %token EHLO ENABLE ENCRYPTION ERROR EXPAND_ONLY %token FCRDNS FILTER FOR FORWARD_ONLY FROM @@ -527,6 +528,9 @@ SMTP LIMIT limits_smtp | SMTP CIPHERS STRING { conf->sc_tls_ciphers = $3; } +| SMTP CURVES STRING { + conf->sc_tls_curves = $3; +} | SMTP MAX_MESSAGE_SIZE size { conf->sc_maxsize = $3; } @@ -765,6 +769,14 @@ HELO STRING { dsp->u.remote.tls_ciphers = $2; } +| CURVES STRING { + if (dsp->u.remote.tls_curves) { + yyerror("curves already specified for this dispatcher"); + YYERROR; + } + + dsp->u.remote.tls_curves = $2; +} | PROTOCOLS STRING { if (dsp->u.remote.tls_protocols) { yyerror("protocols already specified for this dispatcher"); @@ -2329,6 +2341,13 @@ opt_if_listen : INET4 { } listen_opts.tls_ciphers = $2; } + | CURVES STRING { + if (listen_opts.tls_curves) { + yyerror("curves already specified"); + YYERROR; + } + listen_opts.tls_curves = $2; + } | PROTOCOLS STRING { if (listen_opts.tls_protocols) { yyerror("protocols already specified"); @@ -2657,6 +2676,7 @@ lookup(char *s) { "commit", COMMIT }, { "compression", COMPRESSION }, { "connect", CONNECT }, + { "curves", CURVES }, { "data", DATA }, { "data-line", DATA_LINE }, { "dhe", DHE }, @@ -3251,6 +3271,11 @@ create_if_listener(struct listen_opts *l if (lo->pkicount == 0 && lo->ssl) fatalx("invalid listen option: pki required for tls/smtps"); + if (lo->tls_ciphers && !lo->ssl) + fatalx("invalid listen option: ciphers requires tls/smtps"); + if (lo->tls_curves && !lo->ssl) + fatalx("invalid listen option: curves requires tls/smtps"); + flags = lo->flags; if (lo->port) { @@ -3324,6 +3349,11 @@ config_listener(struct listener *h, str fatal("strdup"); } + if (lo->tls_curves != NULL && + (h->tls_curves = strdup(lo->tls_curves)) == NULL) { + fatal("strdup"); + } + if (lo->tls_protocols != NULL && (h->tls_protocols = strdup(lo->tls_protocols)) == NULL) { fatal("strdup"); @@ -3356,7 +3386,7 @@ config_listener(struct listener *h, str if (lo->ssl & F_STARTTLS_REQUIRE) h->flags |= F_STARTTLS_REQUIRE; - + if (h != conf->sc_sock_listener) TAILQ_INSERT_TAIL(conf->sc_listeners, h, entry); } Index: smtp.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/smtp.c,v retrieving revision 1.174 diff -u -p -u -p -r1.174 smtp.c --- smtp.c 16 May 2023 17:48:52 -0000 1.174 +++ smtp.c 12 Aug 2023 14:20:21 -0000 @@ -154,6 +154,7 @@ smtp_setup_listener_tls(struct listener static const char *dheparams[] = { "none", "auto", "legacy" }; struct tls_config *config; const char *ciphers; + const char *curves; uint32_t protos; struct pki *pki; struct ca *ca; @@ -166,6 +167,12 @@ smtp_setup_listener_tls(struct listener if (l->tls_ciphers) ciphers = l->tls_ciphers; if (ciphers && tls_config_set_ciphers(config, ciphers) == -1) + fatalx("%s", tls_config_error(config)); + + curves = env->sc_tls_curves; + if (l->tls_curves) + curves = l->tls_curves; + if (curves && tls_config_set_ecdhecurves(config, curves) == -1) fatalx("%s", tls_config_error(config)); if (l->tls_protocols) { Index: smtpd.conf.5 =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/smtpd.conf.5,v retrieving revision 1.265 diff -u -p -u -p -r1.265 smtpd.conf.5 --- smtpd.conf.5 19 May 2023 15:18:06 -0000 1.265 +++ smtpd.conf.5 12 Aug 2023 14:20:21 -0000 @@ -312,6 +312,12 @@ Refer to the .Xr tls_config_set_ciphers 3 manpage for the format of .Ar cipherstr . +.It Cm curves Ar curvestr +Define the list of curves that may be used for ECDHE key exchange. +Refer to the +.Xr tls_config_set_ecdhecurves 3 +manpage for the format of +.Ar curvestr . .It Cm auth Pf < Ar table Ns > Use the mapping .Ar table @@ -545,6 +551,12 @@ Refer to the .Xr tls_config_set_ciphers 3 manpage for the format of .Ar cipherstr . +.It Cm curves Ar curvestr +Define the list of curves that may be used for ECDHE key exchange. +Refer to the +.Xr tls_config_set_ecdhecurves 3 +manpage for the format of +.Ar curvestr . .El .It Ic listen on Cm socket Op Ar options Listen for incoming SMTP connections on the Unix domain socket Index: smtpd.h =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/smtpd.h,v retrieving revision 1.677 diff -u -p -u -p -r1.677 smtpd.h --- smtpd.h 17 Jun 2023 08:32:48 -0000 1.677 +++ smtpd.h 12 Aug 2023 14:20:21 -0000 @@ -538,6 +538,7 @@ struct listener { char *tls_protocols; char *tls_ciphers; + char *tls_curves; struct tls *tls; struct pki **pki; int pkicount; @@ -617,6 +618,7 @@ struct smtpd { struct dict *sc_limits_dict; char *sc_tls_ciphers; + char *sc_tls_curves; char *sc_subaddressing_delim; @@ -1189,6 +1191,7 @@ struct dispatcher_remote { int tls_verify; char *tls_protocols; char *tls_ciphers; + char *tls_curves; int backup; char *backupmx;