mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-07-30 22:43:08 +03:00
Merge pull request #7083 from KloolK/record-size-limit/parsing
Add parsing for Record Size Limit extension in TLS 1.3
This commit is contained in:
@ -107,6 +107,7 @@
|
||||
#define MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC 25
|
||||
#define MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET 26
|
||||
#define MBEDTLS_SSL_EXT_ID_SESSION_TICKET 27
|
||||
#define MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT 28
|
||||
|
||||
/* Utility for translating IANA extension type. */
|
||||
uint32_t mbedtls_ssl_get_extension_id(unsigned int extension_type);
|
||||
@ -167,6 +168,7 @@ uint32_t mbedtls_ssl_get_extension_mask(unsigned int extension_type);
|
||||
MBEDTLS_SSL_EXT_MASK(CERT_AUTH) | \
|
||||
MBEDTLS_SSL_EXT_MASK(POST_HANDSHAKE_AUTH) | \
|
||||
MBEDTLS_SSL_EXT_MASK(SIG_ALG_CERT) | \
|
||||
MBEDTLS_SSL_EXT_MASK(RECORD_SIZE_LIMIT) | \
|
||||
MBEDTLS_SSL_TLS1_3_EXT_MASK_UNRECOGNIZED)
|
||||
|
||||
/* RFC 8446 section 4.2. Allowed extensions for EncryptedExtensions */
|
||||
@ -179,7 +181,8 @@ uint32_t mbedtls_ssl_get_extension_mask(unsigned int extension_type);
|
||||
MBEDTLS_SSL_EXT_MASK(ALPN) | \
|
||||
MBEDTLS_SSL_EXT_MASK(CLI_CERT_TYPE) | \
|
||||
MBEDTLS_SSL_EXT_MASK(SERV_CERT_TYPE) | \
|
||||
MBEDTLS_SSL_EXT_MASK(EARLY_DATA))
|
||||
MBEDTLS_SSL_EXT_MASK(EARLY_DATA) | \
|
||||
MBEDTLS_SSL_EXT_MASK(RECORD_SIZE_LIMIT))
|
||||
|
||||
/* RFC 8446 section 4.2. Allowed extensions for CertificateRequest */
|
||||
#define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR \
|
||||
@ -2662,6 +2665,16 @@ int mbedtls_ssl_parse_server_name_ext(mbedtls_ssl_context *ssl,
|
||||
const unsigned char *end);
|
||||
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
||||
|
||||
#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
|
||||
#define MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH (2)
|
||||
#define MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN (64)
|
||||
|
||||
MBEDTLS_CHECK_RETURN_CRITICAL
|
||||
int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
|
||||
const unsigned char *buf,
|
||||
const unsigned char *end);
|
||||
#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
|
||||
|
||||
#if defined(MBEDTLS_SSL_ALPN)
|
||||
MBEDTLS_CHECK_RETURN_CRITICAL
|
||||
int mbedtls_ssl_parse_alpn_ext(mbedtls_ssl_context *ssl,
|
||||
|
@ -591,6 +591,9 @@ uint32_t mbedtls_ssl_get_extension_id(unsigned int extension_type)
|
||||
case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
|
||||
return MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET;
|
||||
|
||||
case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
|
||||
return MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT;
|
||||
|
||||
case MBEDTLS_TLS_EXT_SESSION_TICKET:
|
||||
return MBEDTLS_SSL_EXT_ID_SESSION_TICKET;
|
||||
|
||||
@ -633,7 +636,8 @@ static const char *extension_name_table[] = {
|
||||
[MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS] = "supported_point_formats",
|
||||
[MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC] = "encrypt_then_mac",
|
||||
[MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET] = "extended_master_secret",
|
||||
[MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = "session_ticket"
|
||||
[MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = "session_ticket",
|
||||
[MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT] = "record_size_limit"
|
||||
};
|
||||
|
||||
static unsigned int extension_type_table[] = {
|
||||
@ -664,7 +668,8 @@ static unsigned int extension_type_table[] = {
|
||||
[MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS] = MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS,
|
||||
[MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC] = MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC,
|
||||
[MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET] = MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET,
|
||||
[MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = MBEDTLS_TLS_EXT_SESSION_TICKET
|
||||
[MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = MBEDTLS_TLS_EXT_SESSION_TICKET,
|
||||
[MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT] = MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT
|
||||
};
|
||||
|
||||
const char *mbedtls_ssl_get_extension_name(unsigned int extension_type)
|
||||
|
@ -2117,10 +2117,11 @@ static int ssl_tls13_parse_encrypted_extensions(mbedtls_ssl_context *ssl,
|
||||
extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
|
||||
p += 2;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF(3, "encrypted extensions", p, extensions_len);
|
||||
MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
|
||||
extensions_end = p + extensions_len;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF(3, "encrypted extensions", p, extensions_len);
|
||||
|
||||
handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
|
||||
|
||||
while (p < extensions_end) {
|
||||
@ -2172,6 +2173,19 @@ static int ssl_tls13_parse_encrypted_extensions(mbedtls_ssl_context *ssl,
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_EARLY_DATA */
|
||||
|
||||
#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
|
||||
case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
|
||||
MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension"));
|
||||
|
||||
ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(ssl, p, p + extension_data_len);
|
||||
|
||||
/* TODO: Return unconditionally here until we handle the record size limit correctly.
|
||||
* Once handled correctly, only return in case of errors. */
|
||||
return ret;
|
||||
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
|
||||
|
||||
default:
|
||||
MBEDTLS_SSL_PRINT_EXT(
|
||||
3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
|
||||
|
@ -1567,4 +1567,61 @@ int mbedtls_ssl_tls13_check_received_extension(
|
||||
return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
|
||||
/* RFC 8449, section 4:
|
||||
*
|
||||
* The ExtensionData of the "record_size_limit" extension is
|
||||
* RecordSizeLimit:
|
||||
* uint16 RecordSizeLimit;
|
||||
*/
|
||||
MBEDTLS_CHECK_RETURN_CRITICAL
|
||||
int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
|
||||
const unsigned char *buf,
|
||||
const unsigned char *end)
|
||||
{
|
||||
const unsigned char *p = buf;
|
||||
uint16_t record_size_limit;
|
||||
const size_t extension_data_len = end - buf;
|
||||
|
||||
if (extension_data_len != MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH) {
|
||||
MBEDTLS_SSL_DEBUG_MSG(2,
|
||||
("record_size_limit extension has invalid length: %"
|
||||
MBEDTLS_PRINTF_SIZET " Bytes",
|
||||
extension_data_len));
|
||||
|
||||
MBEDTLS_SSL_PEND_FATAL_ALERT(
|
||||
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
|
||||
MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
|
||||
return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
|
||||
}
|
||||
|
||||
MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
|
||||
record_size_limit = MBEDTLS_GET_UINT16_BE(p, 0);
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG(2, ("RecordSizeLimit: %u Bytes", record_size_limit));
|
||||
|
||||
/* RFC 8449, section 4
|
||||
*
|
||||
* Endpoints MUST NOT send a "record_size_limit" extension with a value
|
||||
* smaller than 64. An endpoint MUST treat receipt of a smaller value
|
||||
* as a fatal error and generate an "illegal_parameter" alert.
|
||||
*/
|
||||
if (record_size_limit < MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN) {
|
||||
MBEDTLS_SSL_PEND_FATAL_ALERT(
|
||||
MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
|
||||
MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
|
||||
return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
|
||||
}
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG(2,
|
||||
(
|
||||
"record_size_limit extension is still in development. Aborting handshake."));
|
||||
|
||||
MBEDTLS_SSL_PEND_FATAL_ALERT(
|
||||
MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
|
||||
MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
|
||||
return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
|
||||
|
||||
#endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */
|
||||
|
@ -1585,6 +1585,19 @@ static int ssl_tls13_parse_client_hello(mbedtls_ssl_context *ssl,
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
|
||||
|
||||
#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
|
||||
case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
|
||||
MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension"));
|
||||
|
||||
ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(ssl, p, extension_data_end);
|
||||
|
||||
/* TODO: Return unconditionally here until we handle the record size limit correctly.
|
||||
* Once handled correctly, only return in case of errors. */
|
||||
return ret;
|
||||
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
|
||||
|
||||
default:
|
||||
MBEDTLS_SSL_PRINT_EXT(
|
||||
3, MBEDTLS_SSL_HS_CLIENT_HELLO,
|
||||
|
Reference in New Issue
Block a user