diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index 6d8f51833b..64fa52e20c 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.148 2024/04/04 08:02:21 tb Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.149 2024/04/16 17:46:30 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
| @@ -1493,6 +1493,45 @@ tlsext_keyshare_server_process(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
| 1493 | return 0; | 1493 | return 0; |
| 1494 | } | 1494 | } |
| 1495 | 1495 | ||
| 1496 | if (s->s3->hs.tls13.hrr) { | ||
| 1497 | if (!CBS_get_u16_length_prefixed(cbs, &client_shares)) | ||
| 1498 | return 0; | ||
| 1499 | |||
| 1500 | /* Unpack client share. */ | ||
| 1501 | if (!CBS_get_u16(&client_shares, &group)) | ||
| 1502 | return 0; | ||
| 1503 | if (!CBS_get_u16_length_prefixed(&client_shares, &key_exchange)) | ||
| 1504 | return 0; | ||
| 1505 | |||
| 1506 | /* There should only be one share. */ | ||
| 1507 | if (CBS_len(&client_shares) != 0) | ||
| 1508 | return 0; | ||
| 1509 | |||
| 1510 | if (group != s->s3->hs.tls13.server_group) { | ||
| 1511 | *alert = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1512 | return 0; | ||
| 1513 | } | ||
| 1514 | |||
| 1515 | if (s->s3->hs.key_share != NULL) { | ||
| 1516 | *alert = SSL_AD_INTERNAL_ERROR; | ||
| 1517 | return 0; | ||
| 1518 | } | ||
| 1519 | |||
| 1520 | /* Decode and store the selected key share. */ | ||
| 1521 | if ((s->s3->hs.key_share = tls_key_share_new(group)) == NULL) { | ||
| 1522 | *alert = SSL_AD_INTERNAL_ERROR; | ||
| 1523 | return 0; | ||
| 1524 | } | ||
| 1525 | if (!tls_key_share_peer_public(s->s3->hs.key_share, | ||
| 1526 | &key_exchange, &decode_error, NULL)) { | ||
| 1527 | if (!decode_error) | ||
| 1528 | *alert = SSL_AD_INTERNAL_ERROR; | ||
| 1529 | return 0; | ||
| 1530 | } | ||
| 1531 | |||
| 1532 | return 1; | ||
| 1533 | } | ||
| 1534 | |||
| 1496 | /* | 1535 | /* |
| 1497 | * XXX similar to tls1_get_supported_group, but client pref | 1536 | * XXX similar to tls1_get_supported_group, but client pref |
| 1498 | * only - consider deduping later. | 1537 | * only - consider deduping later. |
