Skip to content

Commit f7bc78c

Browse files
Merge pull request #7602 from night1rider/Parsing-bug
Send BUFFER_ERROR if size does not meet minimum Requirements
2 parents e960a00 + ebca337 commit f7bc78c

5 files changed

Lines changed: 477 additions & 39 deletions

File tree

src/tls.c

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14366,6 +14366,143 @@ int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
1436614366
return ret;
1436714367
}
1436814368
#endif
14369+
/* Jump Table to check minimum size values for client case in TLSX_Parse */
14370+
#ifndef NO_WOLFSSL_SERVER
14371+
static word16 TLSX_GetMinSize_Client(word16* type)
14372+
{
14373+
switch (*type) {
14374+
case TLSXT_SERVER_NAME:
14375+
return WOLFSSL_SNI_MIN_SIZE_CLIENT;
14376+
case TLSXT_EARLY_DATA:
14377+
return WOLFSSL_EDI_MIN_SIZE_CLIENT;
14378+
case TLSXT_MAX_FRAGMENT_LENGTH:
14379+
return WOLFSSL_MFL_MIN_SIZE_CLIENT;
14380+
case TLSXT_TRUSTED_CA_KEYS:
14381+
return WOLFSSL_TCA_MIN_SIZE_CLIENT;
14382+
case TLSXT_TRUNCATED_HMAC:
14383+
return WOLFSSL_THM_MIN_SIZE_CLIENT;
14384+
case TLSXT_STATUS_REQUEST:
14385+
return WOLFSSL_CSR_MIN_SIZE_CLIENT;
14386+
case TLSXT_SUPPORTED_GROUPS:
14387+
return WOLFSSL_EC_MIN_SIZE_CLIENT;
14388+
case TLSXT_EC_POINT_FORMATS:
14389+
return WOLFSSL_PF_MIN_SIZE_CLIENT;
14390+
case TLSXT_SIGNATURE_ALGORITHMS:
14391+
return WOLFSSL_SA_MIN_SIZE_CLIENT;
14392+
case TLSXT_USE_SRTP:
14393+
return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
14394+
case TLSXT_APPLICATION_LAYER_PROTOCOL:
14395+
return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
14396+
case TLSXT_STATUS_REQUEST_V2:
14397+
return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
14398+
case TLSXT_CLIENT_CERTIFICATE:
14399+
return WOLFSSL_CCT_MIN_SIZE_CLIENT;
14400+
case TLSXT_SERVER_CERTIFICATE:
14401+
return WOLFSSL_SCT_MIN_SIZE_CLIENT;
14402+
case TLSXT_ENCRYPT_THEN_MAC:
14403+
return WOLFSSL_ETM_MIN_SIZE_CLIENT;
14404+
case TLSXT_SESSION_TICKET:
14405+
return WOLFSSL_STK_MIN_SIZE_CLIENT;
14406+
case TLSXT_PRE_SHARED_KEY:
14407+
return WOLFSSL_PSK_MIN_SIZE_CLIENT;
14408+
case TLSXT_COOKIE:
14409+
return WOLFSSL_CKE_MIN_SIZE_CLIENT;
14410+
case TLSXT_PSK_KEY_EXCHANGE_MODES:
14411+
return WOLFSSL_PKM_MIN_SIZE_CLIENT;
14412+
case TLSXT_CERTIFICATE_AUTHORITIES:
14413+
return WOLFSSL_CAN_MIN_SIZE_CLIENT;
14414+
case TLSXT_POST_HANDSHAKE_AUTH:
14415+
return WOLFSSL_PHA_MIN_SIZE_CLIENT;
14416+
case TLSXT_SIGNATURE_ALGORITHMS_CERT:
14417+
return WOLFSSL_SA_MIN_SIZE_CLIENT;
14418+
case TLSXT_KEY_SHARE:
14419+
return WOLFSSL_KS_MIN_SIZE_CLIENT;
14420+
case TLSXT_CONNECTION_ID:
14421+
return WOLFSSL_CID_MIN_SIZE_CLIENT;
14422+
case TLSXT_RENEGOTIATION_INFO:
14423+
return WOLFSSL_SCR_MIN_SIZE_CLIENT;
14424+
case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
14425+
return WOLFSSL_QTP_MIN_SIZE_CLIENT;
14426+
case TLSXT_ECH:
14427+
return WOLFSSL_ECH_MIN_SIZE_CLIENT;
14428+
default:
14429+
return 0;
14430+
}
14431+
}
14432+
#define TLSX_GET_MIN_SIZE_CLIENT TLSX_GetMinSize_Client
14433+
#else
14434+
#define TLSX_GET_MIN_SIZE_CLIENT(...) 0
14435+
#endif
14436+
14437+
14438+
#ifndef NO_WOLFSSL_CLIENT
14439+
/* Jump Table to check minimum size values for server case in TLSX_Parse */
14440+
static word16 TLSX_GetMinSize_Server(const word16 *type)
14441+
{
14442+
switch (*type) {
14443+
case TLSXT_SERVER_NAME:
14444+
return WOLFSSL_SNI_MIN_SIZE_SERVER;
14445+
case TLSXT_EARLY_DATA:
14446+
return WOLFSSL_EDI_MIN_SIZE_SERVER;
14447+
case TLSXT_MAX_FRAGMENT_LENGTH:
14448+
return WOLFSSL_MFL_MIN_SIZE_SERVER;
14449+
case TLSXT_TRUSTED_CA_KEYS:
14450+
return WOLFSSL_TCA_MIN_SIZE_SERVER;
14451+
case TLSXT_TRUNCATED_HMAC:
14452+
return WOLFSSL_THM_MIN_SIZE_SERVER;
14453+
case TLSXT_STATUS_REQUEST:
14454+
return WOLFSSL_CSR_MIN_SIZE_SERVER;
14455+
case TLSXT_SUPPORTED_GROUPS:
14456+
return WOLFSSL_EC_MIN_SIZE_SERVER;
14457+
case TLSXT_EC_POINT_FORMATS:
14458+
return WOLFSSL_PF_MIN_SIZE_SERVER;
14459+
case TLSXT_SIGNATURE_ALGORITHMS:
14460+
return WOLFSSL_SA_MIN_SIZE_SERVER;
14461+
case TLSXT_USE_SRTP:
14462+
return WOLFSSL_SRTP_MIN_SIZE_SERVER;
14463+
case TLSXT_APPLICATION_LAYER_PROTOCOL:
14464+
return WOLFSSL_ALPN_MIN_SIZE_SERVER;
14465+
case TLSXT_STATUS_REQUEST_V2:
14466+
return WOLFSSL_CSR2_MIN_SIZE_SERVER;
14467+
case TLSXT_CLIENT_CERTIFICATE:
14468+
return WOLFSSL_CCT_MIN_SIZE_SERVER;
14469+
case TLSXT_SERVER_CERTIFICATE:
14470+
return WOLFSSL_SCT_MIN_SIZE_SERVER;
14471+
case TLSXT_ENCRYPT_THEN_MAC:
14472+
return WOLFSSL_ETM_MIN_SIZE_SERVER;
14473+
case TLSXT_SESSION_TICKET:
14474+
return WOLFSSL_STK_MIN_SIZE_SERVER;
14475+
case TLSXT_PRE_SHARED_KEY:
14476+
return WOLFSSL_PSK_MIN_SIZE_SERVER;
14477+
case TLSXT_COOKIE:
14478+
return WOLFSSL_CKE_MIN_SIZE_SERVER;
14479+
case TLSXT_PSK_KEY_EXCHANGE_MODES:
14480+
return WOLFSSL_PKM_MIN_SIZE_SERVER;
14481+
case TLSXT_CERTIFICATE_AUTHORITIES:
14482+
return WOLFSSL_CAN_MIN_SIZE_SERVER;
14483+
case TLSXT_POST_HANDSHAKE_AUTH:
14484+
return WOLFSSL_PHA_MIN_SIZE_SERVER;
14485+
case TLSXT_SIGNATURE_ALGORITHMS_CERT:
14486+
return WOLFSSL_SA_MIN_SIZE_SERVER;
14487+
case TLSXT_KEY_SHARE:
14488+
return WOLFSSL_KS_MIN_SIZE_SERVER;
14489+
case TLSXT_CONNECTION_ID:
14490+
return WOLFSSL_CID_MIN_SIZE_SERVER;
14491+
case TLSXT_RENEGOTIATION_INFO:
14492+
return WOLFSSL_SCR_MIN_SIZE_SERVER;
14493+
case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
14494+
return WOLFSSL_QTP_MIN_SIZE_SERVER;
14495+
case TLSXT_ECH:
14496+
return WOLFSSL_ECH_MIN_SIZE_SERVER;
14497+
default:
14498+
return 0;
14499+
}
14500+
}
14501+
#define TLSX_GET_MIN_SIZE_SERVER TLSX_GetMinSize_Server
14502+
#else
14503+
#define TLSX_GET_MIN_SIZE_SERVER(...) 0
14504+
#endif
14505+
1436914506

1437014507
/** Parses a buffer of TLS extensions. */
1437114508
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
@@ -14429,6 +14566,29 @@ int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
1442914566
if (length - offset < size)
1443014567
return BUFFER_ERROR;
1443114568

14569+
/* Check minimum size required for TLSX, even if disabled */
14570+
switch (msgType) {
14571+
#ifndef NO_WOLFSSL_SERVER
14572+
case client_hello:
14573+
if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
14574+
WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
14575+
return BUFFER_ERROR;
14576+
}
14577+
break;
14578+
#endif
14579+
#ifndef NO_WOLFSSL_CLIENT
14580+
case server_hello:
14581+
case hello_retry_request:
14582+
if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
14583+
WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
14584+
return BUFFER_ERROR;
14585+
}
14586+
break;
14587+
#endif
14588+
default:
14589+
break;
14590+
}
14591+
1443214592
switch (type) {
1443314593
#ifdef HAVE_SNI
1443414594
case TLSX_SERVER_NAME:

wolfssl/internal.h

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2820,74 +2820,108 @@ typedef struct Options Options;
28202820
/** TLS Extensions - RFC 6066 */
28212821
#ifdef HAVE_TLS_EXTENSIONS
28222822

2823+
#define TLSXT_SERVER_NAME 0x0000 /* a.k.a. SNI */
2824+
#define TLSXT_MAX_FRAGMENT_LENGTH 0x0001
2825+
#define TLSXT_TRUSTED_CA_KEYS 0x0003
2826+
#define TLSXT_TRUNCATED_HMAC 0x0004
2827+
#define TLSXT_STATUS_REQUEST 0x0005 /* a.k.a. OCSP stapling */
2828+
#define TLSXT_SUPPORTED_GROUPS 0x000a /* a.k.a. Supported Curves */
2829+
#define TLSXT_EC_POINT_FORMATS 0x000b
2830+
#define TLSXT_SIGNATURE_ALGORITHMS 0x000d /* HELLO_EXT_SIG_ALGO */
2831+
#define TLSXT_USE_SRTP 0x000e /* 14 */
2832+
#define TLSXT_APPLICATION_LAYER_PROTOCOL 0x0010 /* a.k.a. ALPN */
2833+
#define TLSXT_STATUS_REQUEST_V2 0x0011 /* a.k.a. OCSP stapling v2 */
2834+
#define TLSXT_CLIENT_CERTIFICATE 0x0013 /* RFC8446 */
2835+
#define TLSXT_SERVER_CERTIFICATE 0x0014 /* RFC8446 */
2836+
#define TLSXT_ENCRYPT_THEN_MAC 0x0016 /* RFC 7366 */
2837+
#define TLSXT_EXTENDED_MASTER_SECRET 0x0017 /* HELLO_EXT_EXTMS */
2838+
#define TLSXT_SESSION_TICKET 0x0023
2839+
#define TLSXT_PRE_SHARED_KEY 0x0029
2840+
#define TLSXT_EARLY_DATA 0x002a
2841+
#define TLSXT_SUPPORTED_VERSIONS 0x002b
2842+
#define TLSXT_COOKIE 0x002c
2843+
#define TLSXT_PSK_KEY_EXCHANGE_MODES 0x002d
2844+
#define TLSXT_CERTIFICATE_AUTHORITIES 0x002f
2845+
#define TLSXT_POST_HANDSHAKE_AUTH 0x0031
2846+
#define TLSXT_SIGNATURE_ALGORITHMS_CERT 0x0032
2847+
#define TLSXT_KEY_SHARE 0x0033
2848+
#define TLSXT_CONNECTION_ID 0x0036
2849+
#define TLSXT_KEY_QUIC_TP_PARAMS 0x0039 /* RFC 9001, ch. 8.2 */
2850+
#define TLSXT_ECH 0xfe0d /* from */
2851+
/* draft-ietf-tls-esni-13 */
2852+
/* The 0xFF section is experimental/custom/personal use */
2853+
#define TLSXT_CKS 0xff92 /* X9.146 */
2854+
#define TLSXT_RENEGOTIATION_INFO 0xff01
2855+
#define TLSXT_KEY_QUIC_TP_PARAMS_DRAFT 0xffa5 /* from */
2856+
/* draft-ietf-quic-tls-27 */
2857+
28232858
typedef enum {
28242859
#ifdef HAVE_SNI
2825-
TLSX_SERVER_NAME = 0x0000, /* a.k.a. SNI */
2826-
#endif
2827-
TLSX_MAX_FRAGMENT_LENGTH = 0x0001,
2828-
TLSX_TRUSTED_CA_KEYS = 0x0003,
2829-
TLSX_TRUNCATED_HMAC = 0x0004,
2830-
TLSX_STATUS_REQUEST = 0x0005, /* a.k.a. OCSP stapling */
2831-
TLSX_SUPPORTED_GROUPS = 0x000a, /* a.k.a. Supported Curves */
2832-
TLSX_EC_POINT_FORMATS = 0x000b,
2860+
TLSX_SERVER_NAME = TLSXT_SERVER_NAME,
2861+
#endif
2862+
TLSX_MAX_FRAGMENT_LENGTH = TLSXT_MAX_FRAGMENT_LENGTH,
2863+
TLSX_TRUSTED_CA_KEYS = TLSXT_TRUSTED_CA_KEYS,
2864+
TLSX_TRUNCATED_HMAC = TLSXT_TRUNCATED_HMAC,
2865+
TLSX_STATUS_REQUEST = TLSXT_STATUS_REQUEST,
2866+
TLSX_SUPPORTED_GROUPS = TLSXT_SUPPORTED_GROUPS,
2867+
TLSX_EC_POINT_FORMATS = TLSXT_EC_POINT_FORMATS,
28332868
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
2834-
TLSX_SIGNATURE_ALGORITHMS = 0x000d, /* HELLO_EXT_SIG_ALGO */
2869+
TLSX_SIGNATURE_ALGORITHMS = TLSXT_SIGNATURE_ALGORITHMS,
28352870
#endif
28362871
#ifdef WOLFSSL_SRTP
2837-
TLSX_USE_SRTP = 0x000e, /* 14 */
2872+
TLSX_USE_SRTP = TLSXT_USE_SRTP,
28382873
#endif
2839-
TLSX_APPLICATION_LAYER_PROTOCOL = 0x0010, /* a.k.a. ALPN */
2840-
TLSX_STATUS_REQUEST_V2 = 0x0011, /* a.k.a. OCSP stapling v2 */
2874+
TLSX_APPLICATION_LAYER_PROTOCOL = TLSXT_APPLICATION_LAYER_PROTOCOL,
2875+
TLSX_STATUS_REQUEST_V2 = TLSXT_STATUS_REQUEST_V2,
28412876
#ifdef HAVE_RPK
2842-
TLSX_CLIENT_CERTIFICATE_TYPE = 0x0013, /* RFC8446 */
2843-
TLSX_SERVER_CERTIFICATE_TYPE = 0x0014, /* RFC8446 */
2877+
TLSX_CLIENT_CERTIFICATE_TYPE = TLSXT_CLIENT_CERTIFICATE,
2878+
TLSX_SERVER_CERTIFICATE_TYPE = TLSXT_SERVER_CERTIFICATE,
28442879
#endif
28452880
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
2846-
TLSX_ENCRYPT_THEN_MAC = 0x0016, /* RFC 7366 */
2881+
TLSX_ENCRYPT_THEN_MAC = TLSXT_ENCRYPT_THEN_MAC,
28472882
#endif
2848-
TLSX_EXTENDED_MASTER_SECRET = 0x0017, /* HELLO_EXT_EXTMS */
2849-
TLSX_SESSION_TICKET = 0x0023,
2883+
TLSX_EXTENDED_MASTER_SECRET = TLSXT_EXTENDED_MASTER_SECRET,
2884+
TLSX_SESSION_TICKET = TLSXT_SESSION_TICKET,
28502885
#ifdef WOLFSSL_TLS13
28512886
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
2852-
TLSX_PRE_SHARED_KEY = 0x0029,
2887+
TLSX_PRE_SHARED_KEY = TLSXT_PRE_SHARED_KEY,
28532888
#endif
28542889
#ifdef WOLFSSL_EARLY_DATA
2855-
TLSX_EARLY_DATA = 0x002a,
2890+
TLSX_EARLY_DATA = TLSXT_EARLY_DATA,
28562891
#endif
2857-
TLSX_SUPPORTED_VERSIONS = 0x002b,
2892+
TLSX_SUPPORTED_VERSIONS = TLSXT_SUPPORTED_VERSIONS,
28582893
#ifdef WOLFSSL_SEND_HRR_COOKIE
2859-
TLSX_COOKIE = 0x002c,
2894+
TLSX_COOKIE = TLSXT_COOKIE,
28602895
#endif
28612896
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
2862-
TLSX_PSK_KEY_EXCHANGE_MODES = 0x002d,
2897+
TLSX_PSK_KEY_EXCHANGE_MODES = TLSXT_PSK_KEY_EXCHANGE_MODES,
28632898
#endif
28642899
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
2865-
TLSX_CERTIFICATE_AUTHORITIES = 0x002f,
2900+
TLSX_CERTIFICATE_AUTHORITIES = TLSXT_CERTIFICATE_AUTHORITIES,
28662901
#endif
28672902
#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
2868-
TLSX_POST_HANDSHAKE_AUTH = 0x0031,
2903+
TLSX_POST_HANDSHAKE_AUTH = TLSXT_POST_HANDSHAKE_AUTH,
28692904
#endif
28702905
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
2871-
TLSX_SIGNATURE_ALGORITHMS_CERT = 0x0032,
2906+
TLSX_SIGNATURE_ALGORITHMS_CERT = TLSXT_SIGNATURE_ALGORITHMS_CERT,
28722907
#endif
2873-
TLSX_KEY_SHARE = 0x0033,
2908+
TLSX_KEY_SHARE = TLSXT_KEY_SHARE,
28742909
#if defined(WOLFSSL_DTLS_CID)
2875-
TLSX_CONNECTION_ID = 0x0036,
2910+
TLSX_CONNECTION_ID = TLSXT_CONNECTION_ID,
28762911
#endif /* defined(WOLFSSL_DTLS_CID) */
28772912
#ifdef WOLFSSL_QUIC
2878-
TLSX_KEY_QUIC_TP_PARAMS = 0x0039, /* RFC 9001, ch. 8.2 */
2913+
TLSX_KEY_QUIC_TP_PARAMS = TLSXT_KEY_QUIC_TP_PARAMS,
28792914
#endif
2880-
#ifdef WOLFSSL_DUAL_ALG_CERTS
2881-
TLSX_CKS = 0xff92, /* X9.146; ff indicates personal
2882-
* use and 92 is hex for 146. */
2915+
#ifdef HAVE_ECH
2916+
TLSX_ECH = TLSXT_ECH,
28832917
#endif
28842918
#endif
2885-
TLSX_RENEGOTIATION_INFO = 0xff01,
2886-
#ifdef WOLFSSL_QUIC
2887-
TLSX_KEY_QUIC_TP_PARAMS_DRAFT = 0xffa5, /* from draft-ietf-quic-tls-27 */
2919+
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
2920+
TLSX_CKS = TLSXT_CKS,
28882921
#endif
2889-
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2890-
TLSX_ECH = 0xfe0d, /* from draft-ietf-tls-esni-13 */
2922+
TLSX_RENEGOTIATION_INFO = TLSXT_RENEGOTIATION_INFO,
2923+
#ifdef WOLFSSL_QUIC
2924+
TLSX_KEY_QUIC_TP_PARAMS_DRAFT = TLSXT_KEY_QUIC_TP_PARAMS_DRAFT,
28912925
#endif
28922926
} TLSX_Type;
28932927

wolfssl/openssl/ssl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1530,7 +1530,8 @@ typedef WOLFSSL_SRTP_PROTECTION_PROFILE SRTP_PROTECTION_PROFILE;
15301530
#define OPENSSL_STRING WOLFSSL_STRING
15311531
#define OPENSSL_CSTRING WOLFSSL_STRING
15321532

1533-
#define TLSEXT_TYPE_application_layer_protocol_negotiation 16
1533+
#define TLSEXT_TYPE_application_layer_protocol_negotiation \
1534+
TLSXT_APPLICATION_LAYER_PROTOCOL
15341535

15351536
#define OPENSSL_NPN_UNSUPPORTED 0
15361537
#define OPENSSL_NPN_NEGOTIATED 1

wolfssl/openssl/tls1.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@
4545

4646
#ifdef WOLFSSL_QUIC
4747
/* from rfc9001 */
48-
#define TLSEXT_TYPE_quic_transport_parameters_draft 0xffa5
49-
#define TLSEXT_TYPE_quic_transport_parameters 0x0039
48+
#define TLSEXT_TYPE_quic_transport_parameters_draft \
49+
TLSXT_KEY_QUIC_TP_PARAMS_DRAFT
50+
#define TLSEXT_TYPE_quic_transport_parameters \
51+
TLSXT_KEY_QUIC_TP_PARAMS
5052
#endif
5153

5254
#endif /* WOLFSSL_OPENSSL_TLS1_H_ */

0 commit comments

Comments
 (0)