diff options
| author | jsing <> | 2017-08-10 18:18:30 +0000 |
|---|---|---|
| committer | jsing <> | 2017-08-10 18:18:30 +0000 |
| commit | 52c5bafe628bfaf1072a7e4cd721523f818d1bcf (patch) | |
| tree | aa634cd28684f262545acd66044eaf7fc4201389 | |
| parent | 00ac139b1155c95174a19ac02f30c3efc411ab1b (diff) | |
| download | openbsd-52c5bafe628bfaf1072a7e4cd721523f818d1bcf.tar.gz openbsd-52c5bafe628bfaf1072a7e4cd721523f818d1bcf.tar.bz2 openbsd-52c5bafe628bfaf1072a7e4cd721523f818d1bcf.zip | |
Add a tls_config_set_ecdhecurves() function to libtls, which allows the
names of the elliptic curves that may be used during client and server
key exchange to be specified.
This deprecates tls_config_set_ecdhecurve(), which could only be used to
specify a single supported curve.
ok beck@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libtls/Symbols.list | 1 | ||||
| -rw-r--r-- | src/lib/libtls/man/tls_config_set_protocols.3 | 19 | ||||
| -rw-r--r-- | src/lib/libtls/tls.h | 5 | ||||
| -rw-r--r-- | src/lib/libtls/tls_client.c | 10 | ||||
| -rw-r--r-- | src/lib/libtls/tls_config.c | 84 | ||||
| -rw-r--r-- | src/lib/libtls/tls_internal.h | 7 | ||||
| -rw-r--r-- | src/lib/libtls/tls_server.c | 16 |
7 files changed, 108 insertions, 34 deletions
diff --git a/src/lib/libtls/Symbols.list b/src/lib/libtls/Symbols.list index 6d174bc83a..1e7538cfd4 100644 --- a/src/lib/libtls/Symbols.list +++ b/src/lib/libtls/Symbols.list | |||
| @@ -30,6 +30,7 @@ tls_config_set_crl_file | |||
| 30 | tls_config_set_crl_mem | 30 | tls_config_set_crl_mem |
| 31 | tls_config_set_dheparams | 31 | tls_config_set_dheparams |
| 32 | tls_config_set_ecdhecurve | 32 | tls_config_set_ecdhecurve |
| 33 | tls_config_set_ecdhecurves | ||
| 33 | tls_config_set_key_file | 34 | tls_config_set_key_file |
| 34 | tls_config_set_key_mem | 35 | tls_config_set_key_mem |
| 35 | tls_config_set_keypair_file | 36 | tls_config_set_keypair_file |
diff --git a/src/lib/libtls/man/tls_config_set_protocols.3 b/src/lib/libtls/man/tls_config_set_protocols.3 index b2f31eabd5..e16abe44d5 100644 --- a/src/lib/libtls/man/tls_config_set_protocols.3 +++ b/src/lib/libtls/man/tls_config_set_protocols.3 | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | .\" $OpenBSD: tls_config_set_protocols.3,v 1.3 2017/01/28 00:59:36 schwarze Exp $ | 1 | .\" $OpenBSD: tls_config_set_protocols.3,v 1.4 2017/08/10 18:18:30 jsing Exp $ |
| 2 | .\" | 2 | .\" |
| 3 | .\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> | 3 | .\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> |
| 4 | .\" Copyright (c) 2015, 2016 Joel Sing <jsing@openbsd.org> | 4 | .\" Copyright (c) 2015, 2016 Joel Sing <jsing@openbsd.org> |
| @@ -16,7 +16,7 @@ | |||
| 16 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 16 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 17 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 17 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 18 | .\" | 18 | .\" |
| 19 | .Dd $Mdocdate: January 28 2017 $ | 19 | .Dd $Mdocdate: August 10 2017 $ |
| 20 | .Dt TLS_CONFIG_SET_PROTOCOLS 3 | 20 | .Dt TLS_CONFIG_SET_PROTOCOLS 3 |
| 21 | .Os | 21 | .Os |
| 22 | .Sh NAME | 22 | .Sh NAME |
| @@ -25,7 +25,7 @@ | |||
| 25 | .Nm tls_config_set_alpn , | 25 | .Nm tls_config_set_alpn , |
| 26 | .Nm tls_config_set_ciphers , | 26 | .Nm tls_config_set_ciphers , |
| 27 | .Nm tls_config_set_dheparams , | 27 | .Nm tls_config_set_dheparams , |
| 28 | .Nm tls_config_set_ecdhecurve , | 28 | .Nm tls_config_set_ecdhecurves , |
| 29 | .Nm tls_config_prefer_ciphers_client , | 29 | .Nm tls_config_prefer_ciphers_client , |
| 30 | .Nm tls_config_prefer_ciphers_server | 30 | .Nm tls_config_prefer_ciphers_server |
| 31 | .Nd TLS protocol and cipher selection | 31 | .Nd TLS protocol and cipher selection |
| @@ -57,9 +57,9 @@ | |||
| 57 | .Fa "const char *params" | 57 | .Fa "const char *params" |
| 58 | .Fc | 58 | .Fc |
| 59 | .Ft int | 59 | .Ft int |
| 60 | .Fo tls_config_set_ecdhecurve | 60 | .Fo tls_config_set_ecdhecurves |
| 61 | .Fa "struct tls_config *config" | 61 | .Fa "struct tls_config *config" |
| 62 | .Fa "const char *name" | 62 | .Fa "const char *curves" |
| 63 | .Fc | 63 | .Fc |
| 64 | .Ft void | 64 | .Ft void |
| 65 | .Fn tls_config_prefer_ciphers_client "struct tls_config *config" | 65 | .Fn tls_config_prefer_ciphers_client "struct tls_config *config" |
| @@ -126,7 +126,14 @@ See the CIPHERS section of | |||
| 126 | .Xr openssl 1 | 126 | .Xr openssl 1 |
| 127 | for further information. | 127 | for further information. |
| 128 | .\" XXX tls_config_set_dheparams does what? | 128 | .\" XXX tls_config_set_dheparams does what? |
| 129 | .\" XXX tls_config_set_ecdhecurve does what? | 129 | .Pp |
| 130 | .Fn tls_config_set_ecdhecurves | ||
| 131 | specifies the names of the elliptic curves that may be used during key exchange. | ||
| 132 | This is a comma separated list, given in order of preference. | ||
| 133 | The special value of "default" will use the default curves (currently X25519, | ||
| 134 | P-256 and P-384). This function replaces | ||
| 135 | .Fn tls_config_set_ecdhecurve , | ||
| 136 | which is deprecated. | ||
| 130 | .Pp | 137 | .Pp |
| 131 | .Fn tls_config_prefer_ciphers_client | 138 | .Fn tls_config_prefer_ciphers_client |
| 132 | prefers ciphers in the client's cipher list when selecting a cipher suite | 139 | prefers ciphers in the client's cipher list when selecting a cipher suite |
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h index 1a6701b581..cc8627f2af 100644 --- a/src/lib/libtls/tls.h +++ b/src/lib/libtls/tls.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.h,v 1.50 2017/07/06 17:12:22 jsing Exp $ */ | 1 | /* $OpenBSD: tls.h,v 1.51 2017/08/10 18:18:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -109,7 +109,8 @@ int tls_config_set_crl_file(struct tls_config *_config, const char *_crl_file); | |||
| 109 | int tls_config_set_crl_mem(struct tls_config *_config, const uint8_t *_crl, | 109 | int tls_config_set_crl_mem(struct tls_config *_config, const uint8_t *_crl, |
| 110 | size_t _len); | 110 | size_t _len); |
| 111 | int tls_config_set_dheparams(struct tls_config *_config, const char *_params); | 111 | int tls_config_set_dheparams(struct tls_config *_config, const char *_params); |
| 112 | int tls_config_set_ecdhecurve(struct tls_config *_config, const char *_name); | 112 | int tls_config_set_ecdhecurve(struct tls_config *_config, const char *_curve); |
| 113 | int tls_config_set_ecdhecurves(struct tls_config *_config, const char *_curves); | ||
| 113 | int tls_config_set_key_file(struct tls_config *_config, const char *_key_file); | 114 | int tls_config_set_key_file(struct tls_config *_config, const char *_key_file); |
| 114 | int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key, | 115 | int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key, |
| 115 | size_t _len); | 116 | size_t _len); |
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c index b92490f25d..c79f462a3a 100644 --- a/src/lib/libtls/tls_client.c +++ b/src/lib/libtls/tls_client.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_client.c,v 1.42 2017/05/07 03:27:06 jsing Exp $ */ | 1 | /* $OpenBSD: tls_client.c,v 1.43 2017/08/10 18:18:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -198,6 +198,14 @@ tls_connect_common(struct tls *ctx, const char *servername) | |||
| 198 | if (tls_configure_ssl_verify(ctx, ctx->ssl_ctx, SSL_VERIFY_PEER) == -1) | 198 | if (tls_configure_ssl_verify(ctx, ctx->ssl_ctx, SSL_VERIFY_PEER) == -1) |
| 199 | goto err; | 199 | goto err; |
| 200 | 200 | ||
| 201 | if (ctx->config->ecdhecurves != NULL) { | ||
| 202 | if (SSL_CTX_set1_groups(ctx->ssl_ctx, ctx->config->ecdhecurves, | ||
| 203 | ctx->config->ecdhecurves_len) != 1) { | ||
| 204 | tls_set_errorx(ctx, "failed to set ecdhe curves"); | ||
| 205 | goto err; | ||
| 206 | } | ||
| 207 | } | ||
| 208 | |||
| 201 | if (SSL_CTX_set_tlsext_status_cb(ctx->ssl_ctx, tls_ocsp_verify_cb) != 1) { | 209 | if (SSL_CTX_set_tlsext_status_cb(ctx->ssl_ctx, tls_ocsp_verify_cb) != 1) { |
| 202 | tls_set_errorx(ctx, "ssl OCSP verification setup failure"); | 210 | tls_set_errorx(ctx, "ssl OCSP verification setup failure"); |
| 203 | goto err; | 211 | goto err; |
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 40374ea220..581c493a55 100644 --- a/src/lib/libtls/tls_config.c +++ b/src/lib/libtls/tls_config.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_config.c,v 1.42 2017/08/09 21:27:24 claudio Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.43 2017/08/10 18:18:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -214,7 +214,7 @@ tls_config_new(void) | |||
| 214 | */ | 214 | */ |
| 215 | if (tls_config_set_dheparams(config, "none") != 0) | 215 | if (tls_config_set_dheparams(config, "none") != 0) |
| 216 | goto err; | 216 | goto err; |
| 217 | if (tls_config_set_ecdhecurve(config, "auto") != 0) | 217 | if (tls_config_set_ecdhecurves(config, "default") != 0) |
| 218 | goto err; | 218 | goto err; |
| 219 | if (tls_config_set_ciphers(config, "secure") != 0) | 219 | if (tls_config_set_ciphers(config, "secure") != 0) |
| 220 | goto err; | 220 | goto err; |
| @@ -269,6 +269,7 @@ tls_config_free(struct tls_config *config) | |||
| 269 | free((char *)config->ca_path); | 269 | free((char *)config->ca_path); |
| 270 | free((char *)config->ciphers); | 270 | free((char *)config->ciphers); |
| 271 | free((char *)config->crl_mem); | 271 | free((char *)config->crl_mem); |
| 272 | free(config->ecdhecurves); | ||
| 272 | 273 | ||
| 273 | free(config); | 274 | free(config); |
| 274 | } | 275 | } |
| @@ -616,22 +617,81 @@ tls_config_set_dheparams(struct tls_config *config, const char *params) | |||
| 616 | } | 617 | } |
| 617 | 618 | ||
| 618 | int | 619 | int |
| 619 | tls_config_set_ecdhecurve(struct tls_config *config, const char *name) | 620 | tls_config_set_ecdhecurve(struct tls_config *config, const char *curve) |
| 620 | { | 621 | { |
| 622 | if (strchr(curve, ',') != NULL || strchr(curve, ':') != NULL) { | ||
| 623 | tls_config_set_errorx(config, "invalid ecdhe curve '%s'", | ||
| 624 | curve); | ||
| 625 | return (-1); | ||
| 626 | } | ||
| 627 | |||
| 628 | if (curve == NULL || | ||
| 629 | strcasecmp(curve, "none") == 0 || | ||
| 630 | strcasecmp(curve, "auto") == 0) | ||
| 631 | curve = TLS_ECDHE_CURVES; | ||
| 632 | |||
| 633 | return tls_config_set_ecdhecurves(config, curve); | ||
| 634 | } | ||
| 635 | |||
| 636 | int | ||
| 637 | tls_config_set_ecdhecurves(struct tls_config *config, const char *curves) | ||
| 638 | { | ||
| 639 | int *curves_list = NULL, *curves_new; | ||
| 640 | size_t curves_num = 0; | ||
| 641 | char *cs = NULL; | ||
| 642 | char *p, *q; | ||
| 643 | int rv = -1; | ||
| 621 | int nid; | 644 | int nid; |
| 622 | 645 | ||
| 623 | if (name == NULL || strcasecmp(name, "none") == 0) | 646 | free(config->ecdhecurves); |
| 624 | nid = NID_undef; | 647 | config->ecdhecurves = NULL; |
| 625 | else if (strcasecmp(name, "auto") == 0) | 648 | config->ecdhecurves_len = 0; |
| 626 | nid = -1; | 649 | |
| 627 | else if ((nid = OBJ_txt2nid(name)) == NID_undef) { | 650 | if (curves == NULL || strcasecmp(curves, "default") == 0) |
| 628 | tls_config_set_errorx(config, "invalid ecdhe curve '%s'", name); | 651 | curves = TLS_ECDHE_CURVES; |
| 629 | return (-1); | 652 | |
| 653 | if ((cs = strdup(curves)) == NULL) { | ||
| 654 | tls_config_set_errorx(config, "out of memory"); | ||
| 655 | goto err; | ||
| 656 | } | ||
| 657 | |||
| 658 | q = cs; | ||
| 659 | while ((p = strsep(&q, ",:")) != NULL) { | ||
| 660 | while (*p == ' ' || *p == '\t') | ||
| 661 | p++; | ||
| 662 | |||
| 663 | nid = OBJ_sn2nid(p); | ||
| 664 | if (nid == NID_undef) | ||
| 665 | nid = OBJ_ln2nid(p); | ||
| 666 | if (nid == NID_undef) | ||
| 667 | nid = EC_curve_nist2nid(p); | ||
| 668 | if (nid == NID_undef) { | ||
| 669 | tls_config_set_errorx(config, | ||
| 670 | "invalid ecdhe curve '%s'", p); | ||
| 671 | goto err; | ||
| 672 | } | ||
| 673 | |||
| 674 | if ((curves_new = reallocarray(curves_list, curves_num + 1, | ||
| 675 | sizeof(int))) == NULL) { | ||
| 676 | tls_config_set_errorx(config, "out of memory"); | ||
| 677 | goto err; | ||
| 678 | } | ||
| 679 | curves_list = curves_new; | ||
| 680 | curves_list[curves_num] = nid; | ||
| 681 | curves_num++; | ||
| 630 | } | 682 | } |
| 631 | 683 | ||
| 632 | config->ecdhecurve = nid; | 684 | config->ecdhecurves = curves_list; |
| 685 | config->ecdhecurves_len = curves_num; | ||
| 686 | curves_list = NULL; | ||
| 633 | 687 | ||
| 634 | return (0); | 688 | rv = 0; |
| 689 | |||
| 690 | err: | ||
| 691 | free(cs); | ||
| 692 | free(curves_list); | ||
| 693 | |||
| 694 | return (rv); | ||
| 635 | } | 695 | } |
| 636 | 696 | ||
| 637 | int | 697 | int |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 6079babccf..9e9443dbaf 100644 --- a/src/lib/libtls/tls_internal.h +++ b/src/lib/libtls/tls_internal.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_internal.h,v 1.63 2017/08/09 21:27:24 claudio Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.64 2017/08/10 18:18:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> | 3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> |
| 4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| @@ -33,6 +33,8 @@ __BEGIN_HIDDEN_DECLS | |||
| 33 | #define TLS_CIPHERS_LEGACY "HIGH:MEDIUM:!aNULL" | 33 | #define TLS_CIPHERS_LEGACY "HIGH:MEDIUM:!aNULL" |
| 34 | #define TLS_CIPHERS_ALL "ALL:!aNULL:!eNULL" | 34 | #define TLS_CIPHERS_ALL "ALL:!aNULL:!eNULL" |
| 35 | 35 | ||
| 36 | #define TLS_ECDHE_CURVES "X25519,P-256,P-384" | ||
| 37 | |||
| 36 | union tls_addr { | 38 | union tls_addr { |
| 37 | struct in_addr ip4; | 39 | struct in_addr ip4; |
| 38 | struct in6_addr ip6; | 40 | struct in6_addr ip6; |
| @@ -87,7 +89,8 @@ struct tls_config { | |||
| 87 | char *crl_mem; | 89 | char *crl_mem; |
| 88 | size_t crl_len; | 90 | size_t crl_len; |
| 89 | int dheparams; | 91 | int dheparams; |
| 90 | int ecdhecurve; | 92 | int *ecdhecurves; |
| 93 | size_t ecdhecurves_len; | ||
| 91 | struct tls_keypair *keypair; | 94 | struct tls_keypair *keypair; |
| 92 | int ocsp_require_stapling; | 95 | int ocsp_require_stapling; |
| 93 | uint32_t protocols; | 96 | uint32_t protocols; |
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index 394cea1e8d..2622e4464f 100644 --- a/src/lib/libtls/tls_server.c +++ b/src/lib/libtls/tls_server.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_server.c,v 1.40 2017/07/05 15:38:35 jsing Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.41 2017/08/10 18:18:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -241,8 +241,6 @@ static int | |||
| 241 | tls_configure_server_ssl(struct tls *ctx, SSL_CTX **ssl_ctx, | 241 | tls_configure_server_ssl(struct tls *ctx, SSL_CTX **ssl_ctx, |
| 242 | struct tls_keypair *keypair) | 242 | struct tls_keypair *keypair) |
| 243 | { | 243 | { |
| 244 | EC_KEY *ecdh_key; | ||
| 245 | |||
| 246 | SSL_CTX_free(*ssl_ctx); | 244 | SSL_CTX_free(*ssl_ctx); |
| 247 | 245 | ||
| 248 | if ((*ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { | 246 | if ((*ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { |
| @@ -283,17 +281,13 @@ tls_configure_server_ssl(struct tls *ctx, SSL_CTX **ssl_ctx, | |||
| 283 | else if (ctx->config->dheparams == 1024) | 281 | else if (ctx->config->dheparams == 1024) |
| 284 | SSL_CTX_set_dh_auto(*ssl_ctx, 2); | 282 | SSL_CTX_set_dh_auto(*ssl_ctx, 2); |
| 285 | 283 | ||
| 286 | if (ctx->config->ecdhecurve == -1) { | 284 | if (ctx->config->ecdhecurves != NULL) { |
| 287 | SSL_CTX_set_ecdh_auto(*ssl_ctx, 1); | 285 | SSL_CTX_set_ecdh_auto(*ssl_ctx, 1); |
| 288 | } else if (ctx->config->ecdhecurve != NID_undef) { | 286 | if (SSL_CTX_set1_groups(*ssl_ctx, ctx->config->ecdhecurves, |
| 289 | if ((ecdh_key = EC_KEY_new_by_curve_name( | 287 | ctx->config->ecdhecurves_len) != 1) { |
| 290 | ctx->config->ecdhecurve)) == NULL) { | 288 | tls_set_errorx(ctx, "failed to set ecdhe curves"); |
| 291 | tls_set_errorx(ctx, "failed to set ECDHE curve"); | ||
| 292 | goto err; | 289 | goto err; |
| 293 | } | 290 | } |
| 294 | SSL_CTX_set_options(*ssl_ctx, SSL_OP_SINGLE_ECDH_USE); | ||
| 295 | SSL_CTX_set_tmp_ecdh(*ssl_ctx, ecdh_key); | ||
| 296 | EC_KEY_free(ecdh_key); | ||
| 297 | } | 291 | } |
| 298 | 292 | ||
| 299 | if (ctx->config->ciphers_server == 1) | 293 | if (ctx->config->ciphers_server == 1) |
