diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index b8f4414365..da34a79f7d 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.27 2019/01/18 00:54:42 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.28 2019/01/18 03:39:27 beck 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> |
@@ -1201,6 +1201,7 @@ struct tls_extension_funcs { | |||
1201 | 1201 | ||
1202 | struct tls_extension { | 1202 | struct tls_extension { |
1203 | uint16_t type; | 1203 | uint16_t type; |
1204 | uint16_t messages; | ||
1204 | struct tls_extension_funcs client; | 1205 | struct tls_extension_funcs client; |
1205 | struct tls_extension_funcs server; | 1206 | struct tls_extension_funcs server; |
1206 | }; | 1207 | }; |
@@ -1208,6 +1209,7 @@ struct tls_extension { | |||
1208 | static struct tls_extension tls_extensions[] = { | 1209 | static struct tls_extension tls_extensions[] = { |
1209 | { | 1210 | { |
1210 | .type = TLSEXT_TYPE_server_name, | 1211 | .type = TLSEXT_TYPE_server_name, |
1212 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_EE, | ||
1211 | .client = { | 1213 | .client = { |
1212 | .needs = tlsext_sni_client_needs, | 1214 | .needs = tlsext_sni_client_needs, |
1213 | .build = tlsext_sni_client_build, | 1215 | .build = tlsext_sni_client_build, |
@@ -1221,6 +1223,7 @@ static struct tls_extension tls_extensions[] = { | |||
1221 | }, | 1223 | }, |
1222 | { | 1224 | { |
1223 | .type = TLSEXT_TYPE_renegotiate, | 1225 | .type = TLSEXT_TYPE_renegotiate, |
1226 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_SH, | ||
1224 | .client = { | 1227 | .client = { |
1225 | .needs = tlsext_ri_client_needs, | 1228 | .needs = tlsext_ri_client_needs, |
1226 | .build = tlsext_ri_client_build, | 1229 | .build = tlsext_ri_client_build, |
@@ -1234,6 +1237,8 @@ static struct tls_extension tls_extensions[] = { | |||
1234 | }, | 1237 | }, |
1235 | { | 1238 | { |
1236 | .type = TLSEXT_TYPE_status_request, | 1239 | .type = TLSEXT_TYPE_status_request, |
1240 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_CR | | ||
1241 | SSL_TLSEXT_MSG_CT, | ||
1237 | .client = { | 1242 | .client = { |
1238 | .needs = tlsext_ocsp_client_needs, | 1243 | .needs = tlsext_ocsp_client_needs, |
1239 | .build = tlsext_ocsp_client_build, | 1244 | .build = tlsext_ocsp_client_build, |
@@ -1247,6 +1252,7 @@ static struct tls_extension tls_extensions[] = { | |||
1247 | }, | 1252 | }, |
1248 | { | 1253 | { |
1249 | .type = TLSEXT_TYPE_ec_point_formats, | 1254 | .type = TLSEXT_TYPE_ec_point_formats, |
1255 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_SH, | ||
1250 | .client = { | 1256 | .client = { |
1251 | .needs = tlsext_ecpf_client_needs, | 1257 | .needs = tlsext_ecpf_client_needs, |
1252 | .build = tlsext_ecpf_client_build, | 1258 | .build = tlsext_ecpf_client_build, |
@@ -1260,6 +1266,7 @@ static struct tls_extension tls_extensions[] = { | |||
1260 | }, | 1266 | }, |
1261 | { | 1267 | { |
1262 | .type = TLSEXT_TYPE_supported_groups, | 1268 | .type = TLSEXT_TYPE_supported_groups, |
1269 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_EE, | ||
1263 | .client = { | 1270 | .client = { |
1264 | .needs = tlsext_supportedgroups_client_needs, | 1271 | .needs = tlsext_supportedgroups_client_needs, |
1265 | .build = tlsext_supportedgroups_client_build, | 1272 | .build = tlsext_supportedgroups_client_build, |
@@ -1273,6 +1280,7 @@ static struct tls_extension tls_extensions[] = { | |||
1273 | }, | 1280 | }, |
1274 | { | 1281 | { |
1275 | .type = TLSEXT_TYPE_session_ticket, | 1282 | .type = TLSEXT_TYPE_session_ticket, |
1283 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_SH, | ||
1276 | .client = { | 1284 | .client = { |
1277 | .needs = tlsext_sessionticket_client_needs, | 1285 | .needs = tlsext_sessionticket_client_needs, |
1278 | .build = tlsext_sessionticket_client_build, | 1286 | .build = tlsext_sessionticket_client_build, |
@@ -1286,6 +1294,7 @@ static struct tls_extension tls_extensions[] = { | |||
1286 | }, | 1294 | }, |
1287 | { | 1295 | { |
1288 | .type = TLSEXT_TYPE_signature_algorithms, | 1296 | .type = TLSEXT_TYPE_signature_algorithms, |
1297 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_CR, | ||
1289 | .client = { | 1298 | .client = { |
1290 | .needs = tlsext_sigalgs_client_needs, | 1299 | .needs = tlsext_sigalgs_client_needs, |
1291 | .build = tlsext_sigalgs_client_build, | 1300 | .build = tlsext_sigalgs_client_build, |
@@ -1299,6 +1308,7 @@ static struct tls_extension tls_extensions[] = { | |||
1299 | }, | 1308 | }, |
1300 | { | 1309 | { |
1301 | .type = TLSEXT_TYPE_application_layer_protocol_negotiation, | 1310 | .type = TLSEXT_TYPE_application_layer_protocol_negotiation, |
1311 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_EE, | ||
1302 | .client = { | 1312 | .client = { |
1303 | .needs = tlsext_alpn_client_needs, | 1313 | .needs = tlsext_alpn_client_needs, |
1304 | .build = tlsext_alpn_client_build, | 1314 | .build = tlsext_alpn_client_build, |
@@ -1313,6 +1323,7 @@ static struct tls_extension tls_extensions[] = { | |||
1313 | #ifndef OPENSSL_NO_SRTP | 1323 | #ifndef OPENSSL_NO_SRTP |
1314 | { | 1324 | { |
1315 | .type = TLSEXT_TYPE_use_srtp, | 1325 | .type = TLSEXT_TYPE_use_srtp, |
1326 | .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_EE, | ||
1316 | .client = { | 1327 | .client = { |
1317 | .needs = tlsext_srtp_client_needs, | 1328 | .needs = tlsext_srtp_client_needs, |
1318 | .build = tlsext_srtp_client_build, | 1329 | .build = tlsext_srtp_client_build, |
@@ -1357,13 +1368,19 @@ tlsext_funcs(struct tls_extension *tlsext, int is_server) | |||
1357 | } | 1368 | } |
1358 | 1369 | ||
1359 | static int | 1370 | static int |
1360 | tlsext_build(SSL *s, CBB *cbb, int is_server) | 1371 | tlsext_build(SSL *s, CBB *cbb, int is_server, uint16_t msg_type) |
1361 | { | 1372 | { |
1362 | struct tls_extension_funcs *ext; | 1373 | struct tls_extension_funcs *ext; |
1363 | struct tls_extension *tlsext; | 1374 | struct tls_extension *tlsext; |
1364 | CBB extensions, extension_data; | 1375 | CBB extensions, extension_data; |
1365 | int extensions_present = 0; | 1376 | int extensions_present = 0; |
1366 | size_t i; | 1377 | size_t i; |
1378 | uint16_t version; | ||
1379 | |||
1380 | if (is_server) | ||
1381 | version = s->version; | ||
1382 | else | ||
1383 | version = TLS1_get_client_version(s); | ||
1367 | 1384 | ||
1368 | if (!CBB_add_u16_length_prefixed(cbb, &extensions)) | 1385 | if (!CBB_add_u16_length_prefixed(cbb, &extensions)) |
1369 | return 0; | 1386 | return 0; |
@@ -1372,6 +1389,11 @@ tlsext_build(SSL *s, CBB *cbb, int is_server) | |||
1372 | tlsext = &tls_extensions[i]; | 1389 | tlsext = &tls_extensions[i]; |
1373 | ext = tlsext_funcs(tlsext, is_server); | 1390 | ext = tlsext_funcs(tlsext, is_server); |
1374 | 1391 | ||
1392 | /* RFC 8446 Section 4.2 */ | ||
1393 | if (version >= TLS1_3_VERSION && | ||
1394 | !(tlsext->messages & msg_type)) | ||
1395 | continue; | ||
1396 | |||
1375 | if (!ext->needs(s)) | 1397 | if (!ext->needs(s)) |
1376 | continue; | 1398 | continue; |
1377 | 1399 | ||
@@ -1396,7 +1418,7 @@ tlsext_build(SSL *s, CBB *cbb, int is_server) | |||
1396 | } | 1418 | } |
1397 | 1419 | ||
1398 | static int | 1420 | static int |
1399 | tlsext_parse(SSL *s, CBS *cbs, int *alert, int is_server) | 1421 | tlsext_parse(SSL *s, CBS *cbs, int *alert, int is_server, uint16_t msg_type) |
1400 | { | 1422 | { |
1401 | struct tls_extension_funcs *ext; | 1423 | struct tls_extension_funcs *ext; |
1402 | struct tls_extension *tlsext; | 1424 | struct tls_extension *tlsext; |
@@ -1404,6 +1426,12 @@ tlsext_parse(SSL *s, CBS *cbs, int *alert, int is_server) | |||
1404 | uint32_t extensions_seen = 0; | 1426 | uint32_t extensions_seen = 0; |
1405 | uint16_t type; | 1427 | uint16_t type; |
1406 | size_t idx; | 1428 | size_t idx; |
1429 | uint16_t version; | ||
1430 | |||
1431 | if (is_server) | ||
1432 | version = s->version; | ||
1433 | else | ||
1434 | version = TLS1_get_client_version(s); | ||
1407 | 1435 | ||
1408 | /* An empty extensions block is valid. */ | 1436 | /* An empty extensions block is valid. */ |
1409 | if (CBS_len(cbs) == 0) | 1437 | if (CBS_len(cbs) == 0) |
@@ -1430,6 +1458,13 @@ tlsext_parse(SSL *s, CBS *cbs, int *alert, int is_server) | |||
1430 | if ((tlsext = tls_extension_find(type, &idx)) == NULL) | 1458 | if ((tlsext = tls_extension_find(type, &idx)) == NULL) |
1431 | continue; | 1459 | continue; |
1432 | 1460 | ||
1461 | /* RFC 8446 Section 4.2 */ | ||
1462 | if (version >= TLS1_3_VERSION && | ||
1463 | !(tlsext->messages & msg_type)) { | ||
1464 | *alert = SSL_AD_ILLEGAL_PARAMETER; | ||
1465 | return 0; | ||
1466 | } | ||
1467 | |||
1433 | /* Check for duplicate known extensions. */ | 1468 | /* Check for duplicate known extensions. */ |
1434 | if ((extensions_seen & (1 << idx)) != 0) | 1469 | if ((extensions_seen & (1 << idx)) != 0) |
1435 | return 0; | 1470 | return 0; |
@@ -1460,7 +1495,7 @@ tlsext_client_reset_state(SSL *s) | |||
1460 | int | 1495 | int |
1461 | tlsext_client_build(SSL *s, CBB *cbb, uint16_t msg_type) | 1496 | tlsext_client_build(SSL *s, CBB *cbb, uint16_t msg_type) |
1462 | { | 1497 | { |
1463 | return tlsext_build(s, cbb, 0); | 1498 | return tlsext_build(s, cbb, 0, msg_type); |
1464 | } | 1499 | } |
1465 | 1500 | ||
1466 | int | 1501 | int |
@@ -1469,13 +1504,13 @@ tlsext_server_parse(SSL *s, CBS *cbs, int *alert, uint16_t msg_type) | |||
1469 | /* XXX - this possibly should be done by the caller... */ | 1504 | /* XXX - this possibly should be done by the caller... */ |
1470 | tlsext_client_reset_state(s); | 1505 | tlsext_client_reset_state(s); |
1471 | 1506 | ||
1472 | return tlsext_parse(s, cbs, alert, 0); | 1507 | return tlsext_parse(s, cbs, alert, 0, msg_type); |
1473 | } | 1508 | } |
1474 | 1509 | ||
1475 | static void | 1510 | static void |
1476 | tlsext_server_reset_state(SSL *s) | 1511 | tlsext_server_reset_state(SSL *s) |
1477 | { | 1512 | { |
1478 | S3I(s)->renegotiate_seen = 0; | 1513 | S3I(s)->renegotiate_seen = 0; |
1479 | free(S3I(s)->alpn_selected); | 1514 | free(S3I(s)->alpn_selected); |
1480 | S3I(s)->alpn_selected = NULL; | 1515 | S3I(s)->alpn_selected = NULL; |
1481 | } | 1516 | } |
@@ -1483,7 +1518,7 @@ tlsext_server_reset_state(SSL *s) | |||
1483 | int | 1518 | int |
1484 | tlsext_server_build(SSL *s, CBB *cbb, uint16_t msg_type) | 1519 | tlsext_server_build(SSL *s, CBB *cbb, uint16_t msg_type) |
1485 | { | 1520 | { |
1486 | return tlsext_build(s, cbb, 1); | 1521 | return tlsext_build(s, cbb, 1, msg_type); |
1487 | } | 1522 | } |
1488 | 1523 | ||
1489 | int | 1524 | int |
@@ -1492,5 +1527,5 @@ tlsext_client_parse(SSL *s, CBS *cbs, int *alert, uint16_t msg_type) | |||
1492 | /* XXX - this possibly should be done by the caller... */ | 1527 | /* XXX - this possibly should be done by the caller... */ |
1493 | tlsext_server_reset_state(s); | 1528 | tlsext_server_reset_state(s); |
1494 | 1529 | ||
1495 | return tlsext_parse(s, cbs, alert, 1); | 1530 | return tlsext_parse(s, cbs, alert, 1, msg_type); |
1496 | } | 1531 | } |