diff options
-rw-r--r-- | lib/libssl/s3_lib.c | 6 | ||||
-rw-r--r-- | lib/libssl/ssl_locl.h | 16 | ||||
-rw-r--r-- | lib/libssl/ssl_tlsext.c | 77 | ||||
-rw-r--r-- | lib/libssl/ssl_tlsext.h | 14 | ||||
-rw-r--r-- | lib/libssl/t1_lib.c | 58 | ||||
-rw-r--r-- | lib/libssl/tls1.h | 9 |
6 files changed, 92 insertions, 88 deletions
diff --git a/lib/libssl/s3_lib.c b/lib/libssl/s3_lib.c index e1bad1ba1ad..1c605613e8a 100644 --- a/lib/libssl/s3_lib.c +++ b/lib/libssl/s3_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s3_lib.c,v 1.172 2018/11/05 06:55:37 jsing Exp $ */ +/* $OpenBSD: s3_lib.c,v 1.173 2018/11/05 20:41:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1820,7 +1820,7 @@ SSL_set1_groups(SSL *s, const int *groups, size_t groups_len) int SSL_set1_groups_list(SSL *s, const char *groups) { - return tls1_set_groups_list(&s->internal->tlsext_supportedgroups, + return tls1_set_group_list(&s->internal->tlsext_supportedgroups, &s->internal->tlsext_supportedgroups_length, groups); } @@ -2107,7 +2107,7 @@ SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len) int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups) { - return tls1_set_groups_list(&ctx->internal->tlsext_supportedgroups, + return tls1_set_group_list(&ctx->internal->tlsext_supportedgroups, &ctx->internal->tlsext_supportedgroups_length, groups); } diff --git a/lib/libssl/ssl_locl.h b/lib/libssl/ssl_locl.h index b11bb4ac616..95858339ea5 100644 --- a/lib/libssl/ssl_locl.h +++ b/lib/libssl/ssl_locl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_locl.h,v 1.218 2018/11/05 06:55:37 jsing Exp $ */ +/* $OpenBSD: ssl_locl.h,v 1.219 2018/11/05 20:41:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1257,14 +1257,19 @@ int ssl_ok(SSL *s); int ssl_using_ecc_cipher(SSL *s); int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); +void tls1_get_formatlist(SSL *s, int client_formats, const uint8_t **pformats, + size_t *pformatslen); +void tls1_get_group_list(SSL *s, int client_groups, const uint16_t **pgroups, + size_t *pgroupslen); + int tls1_set_groups(uint16_t **out_group_ids, size_t *out_group_ids_len, const int *groups, size_t ngroups); -int tls1_set_groups_list(uint16_t **out_group_ids, size_t *out_group_ids_len, +int tls1_set_group_list(uint16_t **out_group_ids, size_t *out_group_ids_len, const char *groups); int tls1_ec_curve_id2nid(const uint16_t curve_id); uint16_t tls1_ec_nid2curve_id(const int nid); -int tls1_check_curve(SSL *s, const uint16_t curve_id); +int tls1_check_curve(SSL *s, const uint16_t group_id); int tls1_get_shared_curve(SSL *s); int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data, @@ -1314,11 +1319,6 @@ int SSL_state_func_code(int _state); #define SSLerrorx(r) ERR_PUT_error(ERR_LIB_SSL,(0xfff),(r),__FILE__,__LINE__) void SSL_error_internal(const SSL *s, int r, char *f, int l); -void tls1_get_formatlist(SSL *s, int client_formats, const uint8_t **pformats, - size_t *pformatslen); -void tls1_get_curvelist(SSL *s, int client_curves, const uint16_t **pcurves, - size_t *pcurveslen); - #ifndef OPENSSL_NO_SRTP int srtp_find_profile_by_name(char *profile_name, diff --git a/lib/libssl/ssl_tlsext.c b/lib/libssl/ssl_tlsext.c index 1509c7d7799..f64d215799b 100644 --- a/lib/libssl/ssl_tlsext.c +++ b/lib/libssl/ssl_tlsext.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_tlsext.c,v 1.23 2018/11/05 20:29:52 jsing Exp $ */ +/* $OpenBSD: ssl_tlsext.c,v 1.24 2018/11/05 20:41:30 jsing Exp $ */ /* * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> @@ -163,34 +163,33 @@ tlsext_alpn_serverhello_parse(SSL *s, CBS *cbs, int *alert) } /* - * Supported Elliptic Curves - RFC 4492 section 5.1.1 + * Supported Groups - RFC 7919 section 2 */ int -tlsext_ec_clienthello_needs(SSL *s) +tlsext_supportedgroups_clienthello_needs(SSL *s) { return ssl_has_ecc_ciphers(s); } int -tlsext_ec_clienthello_build(SSL *s, CBB *cbb) +tlsext_supportedgroups_clienthello_build(SSL *s, CBB *cbb) { - CBB curvelist; - size_t curves_len; + const uint16_t *groups; + size_t groups_len; + CBB grouplist; int i; - const uint16_t *curves; - tls1_get_curvelist(s, 0, &curves, &curves_len); - - if (curves_len == 0) { + tls1_get_group_list(s, 0, &groups, &groups_len); + if (groups_len == 0) { SSLerror(s, ERR_R_INTERNAL_ERROR); return 0; } - if (!CBB_add_u16_length_prefixed(cbb, &curvelist)) + if (!CBB_add_u16_length_prefixed(cbb, &grouplist)) return 0; - for (i = 0; i < curves_len; i++) { - if (!CBB_add_u16(&curvelist, curves[i])) + for (i = 0; i < groups_len; i++) { + if (!CBB_add_u16(&grouplist, groups[i])) return 0; } @@ -201,48 +200,48 @@ tlsext_ec_clienthello_build(SSL *s, CBB *cbb) } int -tlsext_ec_clienthello_parse(SSL *s, CBS *cbs, int *alert) +tlsext_supportedgroups_clienthello_parse(SSL *s, CBS *cbs, int *alert) { - CBS curvelist; - size_t curves_len; + CBS grouplist; + size_t groups_len; - if (!CBS_get_u16_length_prefixed(cbs, &curvelist)) + if (!CBS_get_u16_length_prefixed(cbs, &grouplist)) goto err; if (CBS_len(cbs) != 0) goto err; - curves_len = CBS_len(&curvelist); - if (curves_len == 0 || curves_len % 2 != 0) + groups_len = CBS_len(&grouplist); + if (groups_len == 0 || groups_len % 2 != 0) goto err; - curves_len /= 2; + groups_len /= 2; if (!s->internal->hit) { + uint16_t *groups; int i; - uint16_t *curves; if (SSI(s)->tlsext_supportedgroups != NULL) goto err; - if ((curves = reallocarray(NULL, curves_len, + if ((groups = reallocarray(NULL, groups_len, sizeof(uint16_t))) == NULL) { *alert = TLS1_AD_INTERNAL_ERROR; return 0; } - for (i = 0; i < curves_len; i++) { - if (!CBS_get_u16(&curvelist, &curves[i])) { - free(curves); + for (i = 0; i < groups_len; i++) { + if (!CBS_get_u16(&grouplist, &groups[i])) { + free(groups); goto err; } } - if (CBS_len(&curvelist) != 0) { - free(curves); + if (CBS_len(&grouplist) != 0) { + free(groups); goto err; } - SSI(s)->tlsext_supportedgroups = curves; - SSI(s)->tlsext_supportedgroups_length = curves_len; + SSI(s)->tlsext_supportedgroups = groups; + SSI(s)->tlsext_supportedgroups_length = groups_len; } return 1; @@ -254,19 +253,19 @@ tlsext_ec_clienthello_parse(SSL *s, CBS *cbs, int *alert) /* This extension is never used by the server. */ int -tlsext_ec_serverhello_needs(SSL *s) +tlsext_supportedgroups_serverhello_needs(SSL *s) { return 0; } int -tlsext_ec_serverhello_build(SSL *s, CBB *cbb) +tlsext_supportedgroups_serverhello_build(SSL *s, CBB *cbb) { return 0; } int -tlsext_ec_serverhello_parse(SSL *s, CBS *cbs, int *alert) +tlsext_supportedgroups_serverhello_parse(SSL *s, CBS *cbs, int *alert) { /* * Servers should not send this extension per the RFC. @@ -1262,16 +1261,16 @@ static struct tls_extension tls_extensions[] = { }, }, { - .type = TLSEXT_TYPE_elliptic_curves, + .type = TLSEXT_TYPE_supported_groups, .clienthello = { - .needs = tlsext_ec_clienthello_needs, - .build = tlsext_ec_clienthello_build, - .parse = tlsext_ec_clienthello_parse, + .needs = tlsext_supportedgroups_clienthello_needs, + .build = tlsext_supportedgroups_clienthello_build, + .parse = tlsext_supportedgroups_clienthello_parse, }, .serverhello = { - .needs = tlsext_ec_serverhello_needs, - .build = tlsext_ec_serverhello_build, - .parse = tlsext_ec_serverhello_parse, + .needs = tlsext_supportedgroups_serverhello_needs, + .build = tlsext_supportedgroups_serverhello_build, + .parse = tlsext_supportedgroups_serverhello_parse, }, }, { diff --git a/lib/libssl/ssl_tlsext.h b/lib/libssl/ssl_tlsext.h index 4248932fb26..974ab929ec7 100644 --- a/lib/libssl/ssl_tlsext.h +++ b/lib/libssl/ssl_tlsext.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_tlsext.h,v 1.12 2018/02/08 11:30:30 jsing Exp $ */ +/* $OpenBSD: ssl_tlsext.h,v 1.13 2018/11/05 20:41:30 jsing Exp $ */ /* * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> @@ -44,12 +44,12 @@ int tlsext_sni_serverhello_needs(SSL *s); int tlsext_sni_serverhello_build(SSL *s, CBB *cbb); int tlsext_sni_serverhello_parse(SSL *s, CBS *cbs, int *alert); -int tlsext_ec_clienthello_needs(SSL *s); -int tlsext_ec_clienthello_build(SSL *s, CBB *cbb); -int tlsext_ec_clienthello_parse(SSL *s, CBS *cbs, int *alert); -int tlsext_ec_serverhello_needs(SSL *s); -int tlsext_ec_serverhello_build(SSL *s, CBB *cbb); -int tlsext_ec_serverhello_parse(SSL *s, CBS *cbs, int *alert); +int tlsext_supportedgroups_clienthello_needs(SSL *s); +int tlsext_supportedgroups_clienthello_build(SSL *s, CBB *cbb); +int tlsext_supportedgroups_clienthello_parse(SSL *s, CBS *cbs, int *alert); +int tlsext_supportedgroups_serverhello_needs(SSL *s); +int tlsext_supportedgroups_serverhello_build(SSL *s, CBB *cbb); +int tlsext_supportedgroups_serverhello_parse(SSL *s, CBS *cbs, int *alert); int tlsext_ecpf_clienthello_needs(SSL *s); int tlsext_ecpf_clienthello_build(SSL *s, CBB *cbb); diff --git a/lib/libssl/t1_lib.c b/lib/libssl/t1_lib.c index b06004e88a9..758f7b1e113 100644 --- a/lib/libssl/t1_lib.c +++ b/lib/libssl/t1_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: t1_lib.c,v 1.146 2018/11/05 06:55:37 jsing Exp $ */ +/* $OpenBSD: t1_lib.c,v 1.147 2018/11/05 20:41:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -361,25 +361,25 @@ tls1_get_formatlist(SSL *s, int client_formats, const uint8_t **pformats, } /* - * Return the appropriate curve list. If client_curves is non-zero, return - * the client/session curves. Otherwise return the custom curve list if one - * exists, or the default curves if a custom list has not been specified. + * Return the appropriate group list. If client_groups is non-zero, return + * the client/session groups. Otherwise return the custom group list if one + * exists, or the default groups if a custom list has not been specified. */ void -tls1_get_curvelist(SSL *s, int client_curves, const uint16_t **pcurves, - size_t *pcurveslen) +tls1_get_group_list(SSL *s, int client_groups, const uint16_t **pgroups, + size_t *pgroupslen) { - if (client_curves != 0) { - *pcurves = SSI(s)->tlsext_supportedgroups; - *pcurveslen = SSI(s)->tlsext_supportedgroups_length; + if (client_groups != 0) { + *pgroups = SSI(s)->tlsext_supportedgroups; + *pgroupslen = SSI(s)->tlsext_supportedgroups_length; return; } - *pcurves = s->internal->tlsext_supportedgroups; - *pcurveslen = s->internal->tlsext_supportedgroups_length; - if (*pcurves == NULL) { - *pcurves = eccurves_default; - *pcurveslen = sizeof(eccurves_default) / 2; + *pgroups = s->internal->tlsext_supportedgroups; + *pgroupslen = s->internal->tlsext_supportedgroups_length; + if (*pgroups == NULL) { + *pgroups = eccurves_default; + *pgroupslen = sizeof(eccurves_default) / 2; } } @@ -410,7 +410,7 @@ tls1_set_groups(uint16_t **out_group_ids, size_t *out_group_ids_len, } int -tls1_set_groups_list(uint16_t **out_group_ids, size_t *out_group_ids_len, +tls1_set_group_list(uint16_t **out_group_ids, size_t *out_group_ids_len, const char *groups) { uint16_t *new_group_ids, *group_ids = NULL; @@ -461,13 +461,13 @@ tls1_set_groups_list(uint16_t **out_group_ids, size_t *out_group_ids_len, int tls1_check_curve(SSL *s, const uint16_t curve_id) { - const uint16_t *curves; - size_t curveslen, i; + const uint16_t *groups; + size_t groupslen, i; - tls1_get_curvelist(s, 0, &curves, &curveslen); + tls1_get_group_list(s, 0, &groups, &groupslen); - for (i = 0; i < curveslen; i++) { - if (curves[i] == curve_id) + for (i = 0; i < groupslen; i++) { + if (groups[i] == curve_id) return (1); } return (0); @@ -486,8 +486,8 @@ tls1_get_shared_curve(SSL *s) /* Return first preference shared curve. */ server_pref = (s->internal->options & SSL_OP_CIPHER_SERVER_PREFERENCE); - tls1_get_curvelist(s, (server_pref == 0), &pref, &preflen); - tls1_get_curvelist(s, (server_pref != 0), &supp, &supplen); + tls1_get_group_list(s, (server_pref == 0), &pref, &preflen); + tls1_get_group_list(s, (server_pref != 0), &supp, &supplen); for (i = 0; i < preflen; i++) { for (j = 0; j < supplen; j++) { @@ -548,8 +548,8 @@ tls1_set_ec_id(uint16_t *curve_id, uint8_t *comp_id, EC_KEY *ec) static int tls1_check_ec_key(SSL *s, const uint16_t *curve_id, const uint8_t *comp_id) { - size_t curveslen, formatslen, i; - const uint16_t *curves; + size_t groupslen, formatslen, i; + const uint16_t *groups; const uint8_t *formats; /* @@ -569,13 +569,13 @@ tls1_check_ec_key(SSL *s, const uint16_t *curve_id, const uint8_t *comp_id) /* * Check curve list if present, otherwise everything is supported. */ - tls1_get_curvelist(s, 1, &curves, &curveslen); - if (curve_id != NULL && curves != NULL) { - for (i = 0; i < curveslen; i++) { - if (curves[i] == *curve_id) + tls1_get_group_list(s, 1, &groups, &groupslen); + if (curve_id != NULL && groups != NULL) { + for (i = 0; i < groupslen; i++) { + if (groups[i] == *curve_id) break; } - if (i == curveslen) + if (i == groupslen) return (0); } diff --git a/lib/libssl/tls1.h b/lib/libssl/tls1.h index 0474bb73ae3..7ad9a387c93 100644 --- a/lib/libssl/tls1.h +++ b/lib/libssl/tls1.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls1.h,v 1.32 2018/02/17 15:08:21 jsing Exp $ */ +/* $OpenBSD: tls1.h,v 1.33 2018/11/05 20:41:30 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -230,8 +230,13 @@ extern "C" { /* ExtensionType values from RFC 6091. */ #define TLSEXT_TYPE_cert_type 9 +/* ExtensionType values from RFC 7919. */ +#define TLSEXT_TYPE_supported_groups 10 + /* ExtensionType values from RFC 4492. */ -#define TLSEXT_TYPE_elliptic_curves 10 +#ifndef LIBRESSL_INTERNAL +#define TLSEXT_TYPE_elliptic_curves TLSEXT_TYPE_supported_groups +#endif #define TLSEXT_TYPE_ec_point_formats 11 /* ExtensionType value from RFC 5054. */ |