diff options
Diffstat (limited to 'src/lib/libssl/ssl_tlsext.c')
| -rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index 1509c7d779..f64d215799 100644 --- a/src/lib/libssl/ssl_tlsext.c +++ b/src/lib/libssl/ssl_tlsext.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_tlsext.c,v 1.23 2018/11/05 20:29:52 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.24 2018/11/05 20:41:30 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
| @@ -163,34 +163,33 @@ tlsext_alpn_serverhello_parse(SSL *s, CBS *cbs, int *alert) | |||
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | /* | 165 | /* |
| 166 | * Supported Elliptic Curves - RFC 4492 section 5.1.1 | 166 | * Supported Groups - RFC 7919 section 2 |
| 167 | */ | 167 | */ |
| 168 | int | 168 | int |
| 169 | tlsext_ec_clienthello_needs(SSL *s) | 169 | tlsext_supportedgroups_clienthello_needs(SSL *s) |
| 170 | { | 170 | { |
| 171 | return ssl_has_ecc_ciphers(s); | 171 | return ssl_has_ecc_ciphers(s); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | int | 174 | int |
| 175 | tlsext_ec_clienthello_build(SSL *s, CBB *cbb) | 175 | tlsext_supportedgroups_clienthello_build(SSL *s, CBB *cbb) |
| 176 | { | 176 | { |
| 177 | CBB curvelist; | 177 | const uint16_t *groups; |
| 178 | size_t curves_len; | 178 | size_t groups_len; |
| 179 | CBB grouplist; | ||
| 179 | int i; | 180 | int i; |
| 180 | const uint16_t *curves; | ||
| 181 | 181 | ||
| 182 | tls1_get_curvelist(s, 0, &curves, &curves_len); | 182 | tls1_get_group_list(s, 0, &groups, &groups_len); |
| 183 | 183 | if (groups_len == 0) { | |
| 184 | if (curves_len == 0) { | ||
| 185 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 184 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 186 | return 0; | 185 | return 0; |
| 187 | } | 186 | } |
| 188 | 187 | ||
| 189 | if (!CBB_add_u16_length_prefixed(cbb, &curvelist)) | 188 | if (!CBB_add_u16_length_prefixed(cbb, &grouplist)) |
| 190 | return 0; | 189 | return 0; |
| 191 | 190 | ||
| 192 | for (i = 0; i < curves_len; i++) { | 191 | for (i = 0; i < groups_len; i++) { |
| 193 | if (!CBB_add_u16(&curvelist, curves[i])) | 192 | if (!CBB_add_u16(&grouplist, groups[i])) |
| 194 | return 0; | 193 | return 0; |
| 195 | } | 194 | } |
| 196 | 195 | ||
| @@ -201,48 +200,48 @@ tlsext_ec_clienthello_build(SSL *s, CBB *cbb) | |||
| 201 | } | 200 | } |
| 202 | 201 | ||
| 203 | int | 202 | int |
| 204 | tlsext_ec_clienthello_parse(SSL *s, CBS *cbs, int *alert) | 203 | tlsext_supportedgroups_clienthello_parse(SSL *s, CBS *cbs, int *alert) |
| 205 | { | 204 | { |
| 206 | CBS curvelist; | 205 | CBS grouplist; |
| 207 | size_t curves_len; | 206 | size_t groups_len; |
| 208 | 207 | ||
| 209 | if (!CBS_get_u16_length_prefixed(cbs, &curvelist)) | 208 | if (!CBS_get_u16_length_prefixed(cbs, &grouplist)) |
| 210 | goto err; | 209 | goto err; |
| 211 | if (CBS_len(cbs) != 0) | 210 | if (CBS_len(cbs) != 0) |
| 212 | goto err; | 211 | goto err; |
| 213 | 212 | ||
| 214 | curves_len = CBS_len(&curvelist); | 213 | groups_len = CBS_len(&grouplist); |
| 215 | if (curves_len == 0 || curves_len % 2 != 0) | 214 | if (groups_len == 0 || groups_len % 2 != 0) |
| 216 | goto err; | 215 | goto err; |
| 217 | curves_len /= 2; | 216 | groups_len /= 2; |
| 218 | 217 | ||
| 219 | if (!s->internal->hit) { | 218 | if (!s->internal->hit) { |
| 219 | uint16_t *groups; | ||
| 220 | int i; | 220 | int i; |
| 221 | uint16_t *curves; | ||
| 222 | 221 | ||
| 223 | if (SSI(s)->tlsext_supportedgroups != NULL) | 222 | if (SSI(s)->tlsext_supportedgroups != NULL) |
| 224 | goto err; | 223 | goto err; |
| 225 | 224 | ||
| 226 | if ((curves = reallocarray(NULL, curves_len, | 225 | if ((groups = reallocarray(NULL, groups_len, |
| 227 | sizeof(uint16_t))) == NULL) { | 226 | sizeof(uint16_t))) == NULL) { |
| 228 | *alert = TLS1_AD_INTERNAL_ERROR; | 227 | *alert = TLS1_AD_INTERNAL_ERROR; |
| 229 | return 0; | 228 | return 0; |
| 230 | } | 229 | } |
| 231 | 230 | ||
| 232 | for (i = 0; i < curves_len; i++) { | 231 | for (i = 0; i < groups_len; i++) { |
| 233 | if (!CBS_get_u16(&curvelist, &curves[i])) { | 232 | if (!CBS_get_u16(&grouplist, &groups[i])) { |
| 234 | free(curves); | 233 | free(groups); |
| 235 | goto err; | 234 | goto err; |
| 236 | } | 235 | } |
| 237 | } | 236 | } |
| 238 | 237 | ||
| 239 | if (CBS_len(&curvelist) != 0) { | 238 | if (CBS_len(&grouplist) != 0) { |
| 240 | free(curves); | 239 | free(groups); |
| 241 | goto err; | 240 | goto err; |
| 242 | } | 241 | } |
| 243 | 242 | ||
| 244 | SSI(s)->tlsext_supportedgroups = curves; | 243 | SSI(s)->tlsext_supportedgroups = groups; |
| 245 | SSI(s)->tlsext_supportedgroups_length = curves_len; | 244 | SSI(s)->tlsext_supportedgroups_length = groups_len; |
| 246 | } | 245 | } |
| 247 | 246 | ||
| 248 | return 1; | 247 | return 1; |
| @@ -254,19 +253,19 @@ tlsext_ec_clienthello_parse(SSL *s, CBS *cbs, int *alert) | |||
| 254 | 253 | ||
| 255 | /* This extension is never used by the server. */ | 254 | /* This extension is never used by the server. */ |
| 256 | int | 255 | int |
| 257 | tlsext_ec_serverhello_needs(SSL *s) | 256 | tlsext_supportedgroups_serverhello_needs(SSL *s) |
| 258 | { | 257 | { |
| 259 | return 0; | 258 | return 0; |
| 260 | } | 259 | } |
| 261 | 260 | ||
| 262 | int | 261 | int |
| 263 | tlsext_ec_serverhello_build(SSL *s, CBB *cbb) | 262 | tlsext_supportedgroups_serverhello_build(SSL *s, CBB *cbb) |
| 264 | { | 263 | { |
| 265 | return 0; | 264 | return 0; |
| 266 | } | 265 | } |
| 267 | 266 | ||
| 268 | int | 267 | int |
| 269 | tlsext_ec_serverhello_parse(SSL *s, CBS *cbs, int *alert) | 268 | tlsext_supportedgroups_serverhello_parse(SSL *s, CBS *cbs, int *alert) |
| 270 | { | 269 | { |
| 271 | /* | 270 | /* |
| 272 | * Servers should not send this extension per the RFC. | 271 | * Servers should not send this extension per the RFC. |
| @@ -1262,16 +1261,16 @@ static struct tls_extension tls_extensions[] = { | |||
| 1262 | }, | 1261 | }, |
| 1263 | }, | 1262 | }, |
| 1264 | { | 1263 | { |
| 1265 | .type = TLSEXT_TYPE_elliptic_curves, | 1264 | .type = TLSEXT_TYPE_supported_groups, |
| 1266 | .clienthello = { | 1265 | .clienthello = { |
| 1267 | .needs = tlsext_ec_clienthello_needs, | 1266 | .needs = tlsext_supportedgroups_clienthello_needs, |
| 1268 | .build = tlsext_ec_clienthello_build, | 1267 | .build = tlsext_supportedgroups_clienthello_build, |
| 1269 | .parse = tlsext_ec_clienthello_parse, | 1268 | .parse = tlsext_supportedgroups_clienthello_parse, |
| 1270 | }, | 1269 | }, |
| 1271 | .serverhello = { | 1270 | .serverhello = { |
| 1272 | .needs = tlsext_ec_serverhello_needs, | 1271 | .needs = tlsext_supportedgroups_serverhello_needs, |
| 1273 | .build = tlsext_ec_serverhello_build, | 1272 | .build = tlsext_supportedgroups_serverhello_build, |
| 1274 | .parse = tlsext_ec_serverhello_parse, | 1273 | .parse = tlsext_supportedgroups_serverhello_parse, |
| 1275 | }, | 1274 | }, |
| 1276 | }, | 1275 | }, |
| 1277 | { | 1276 | { |
