@@ -1816,16 +1816,20 @@ static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
18161816static word16 TLSX_ALPN_GetSize(ALPN *list)
18171817{
18181818 ALPN* alpn;
1819- word16 length = OPAQUE16_LEN; /* list length */
1819+ word32 length = OPAQUE16_LEN; /* list length */
18201820
18211821 while ((alpn = list)) {
18221822 list = alpn->next;
18231823
18241824 length++; /* protocol name length is on one byte */
1825- length += (word16)XSTRLEN(alpn->protocol_name);
1825+ length += (word32)XSTRLEN(alpn->protocol_name);
1826+
1827+ if (length > WOLFSSL_MAX_16BIT) {
1828+ return 0;
1829+ }
18261830 }
18271831
1828- return length;
1832+ return (word16) length;
18291833}
18301834
18311835/** Writes the ALPN objects of a list in a buffer. */
@@ -2951,7 +2955,7 @@ static void TLSX_TCA_FreeAll(TCA* list, void* heap)
29512955static word16 TLSX_TCA_GetSize(TCA* list)
29522956{
29532957 TCA* tca;
2954- word16 length = OPAQUE16_LEN; /* list length */
2958+ word32 length = OPAQUE16_LEN; /* list length */
29552959
29562960 while ((tca = list)) {
29572961 list = tca->next;
@@ -2969,9 +2973,13 @@ static word16 TLSX_TCA_GetSize(TCA* list)
29692973 length += OPAQUE16_LEN + tca->idSz;
29702974 break;
29712975 }
2976+
2977+ if (length > WOLFSSL_MAX_16BIT) {
2978+ return 0;
2979+ }
29722980 }
29732981
2974- return length;
2982+ return (word16) length;
29752983}
29762984
29772985/** Writes the TCA objects of a list in a buffer. */
@@ -7498,7 +7506,7 @@ static word16 TLSX_CA_Names_GetSize(void* data)
74987506{
74997507 WOLFSSL* ssl = (WOLFSSL*)data;
75007508 WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7501- word16 size = 0;
7509+ word32 size = 0;
75027510
75037511 /* Length of names */
75047512 size += OPAQUE16_LEN;
@@ -7508,11 +7516,14 @@ static word16 TLSX_CA_Names_GetSize(void* data)
75087516
75097517 if (name != NULL) {
75107518 /* 16-bit length | SEQ | Len | DER of name */
7511- size += (word16 )(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7519+ size += (word32 )(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
75127520 name->rawLen);
7521+ if (size > WOLFSSL_MAX_16BIT) {
7522+ return 0;
7523+ }
75137524 }
75147525 }
7515- return size;
7526+ return (word16) size;
75167527}
75177528
75187529static word16 TLSX_CA_Names_Write(void* data, byte* output)
@@ -11833,14 +11844,22 @@ static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
1183311844{
1183411845 if (msgType == client_hello) {
1183511846 /* Length of identities + Length of binders. */
11836- word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
11847+ word32 len = OPAQUE16_LEN + OPAQUE16_LEN;
1183711848 while (list != NULL) {
1183811849 /* Each entry has: identity, ticket age and binder. */
1183911850 len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11840- OPAQUE8_LEN + (word16)list->binderLen;
11851+ OPAQUE8_LEN + (word32)list->binderLen;
11852+ if (len > WOLFSSL_MAX_16BIT) {
11853+ WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11854+ return LENGTH_ERROR;
11855+ }
1184111856 list = list->next;
1184211857 }
11843- *pSz += len;
11858+ if ((word32)*pSz + len > WOLFSSL_MAX_16BIT) {
11859+ WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11860+ return LENGTH_ERROR;
11861+ }
11862+ *pSz += (word16)len;
1184411863 return 0;
1184511864 }
1184611865
@@ -11863,7 +11882,7 @@ static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
1186311882int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
1186411883 word16* pSz)
1186511884{
11866- word16 len;
11885+ word32 len;
1186711886
1186811887 if (msgType != client_hello) {
1186911888 WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
@@ -11873,11 +11892,15 @@ int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
1187311892 /* Length of all binders. */
1187411893 len = OPAQUE16_LEN;
1187511894 while (list != NULL) {
11876- len += OPAQUE8_LEN + (word16)list->binderLen;
11895+ len += OPAQUE8_LEN + (word32)list->binderLen;
11896+ if (len > WOLFSSL_MAX_16BIT) {
11897+ WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11898+ return LENGTH_ERROR;
11899+ }
1187711900 list = list->next;
1187811901 }
1187911902
11880- *pSz = len;
11903+ *pSz = (word16) len;
1188111904 return 0;
1188211905}
1188311906
@@ -14837,8 +14860,15 @@ static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
1483714860
1483814861 case TLSX_TRUSTED_CA_KEYS:
1483914862 /* TCA only sends the list on the request. */
14840- if (isRequest)
14841- length += TCA_GET_SIZE((TCA*)extension->data);
14863+ if (isRequest) {
14864+ word16 tcaSz = TCA_GET_SIZE((TCA*)extension->data);
14865+ /* 0 on non-empty list means 16-bit overflow. */
14866+ if (tcaSz == 0 && extension->data != NULL) {
14867+ ret = LENGTH_ERROR;
14868+ break;
14869+ }
14870+ length += tcaSz;
14871+ }
1484214872 break;
1484314873
1484414874 case TLSX_MAX_FRAGMENT_LENGTH:
@@ -14879,9 +14909,16 @@ static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
1487914909 isRequest);
1488014910 break;
1488114911
14882- case TLSX_APPLICATION_LAYER_PROTOCOL:
14883- length += ALPN_GET_SIZE((ALPN*)extension->data);
14912+ case TLSX_APPLICATION_LAYER_PROTOCOL: {
14913+ word16 alpnSz = ALPN_GET_SIZE((ALPN*)extension->data);
14914+ /* 0 on non-empty list means 16-bit overflow. */
14915+ if (alpnSz == 0 && extension->data != NULL) {
14916+ ret = LENGTH_ERROR;
14917+ break;
14918+ }
14919+ length += alpnSz;
1488414920 break;
14921+ }
1488514922#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
1488614923 case TLSX_SIGNATURE_ALGORITHMS:
1488714924 length += SA_GET_SIZE(extension->data);
@@ -14959,9 +14996,16 @@ static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
1495914996 #endif
1496014997
1496114998 #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14962- case TLSX_CERTIFICATE_AUTHORITIES:
14963- length += CAN_GET_SIZE(extension->data);
14999+ case TLSX_CERTIFICATE_AUTHORITIES: {
15000+ word16 canSz = CAN_GET_SIZE(extension->data);
15001+ /* 0 on non-empty list means 16-bit overflow. */
15002+ if (canSz == 0 && extension->data != NULL) {
15003+ ret = LENGTH_ERROR;
15004+ break;
15005+ }
15006+ length += canSz;
1496415007 break;
15008+ }
1496515009 #endif
1496615010#endif
1496715011#ifdef WOLFSSL_SRTP
@@ -15001,6 +15045,9 @@ static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
1500115045 break;
1500215046 }
1500315047
15048+ if (ret != 0)
15049+ return ret;
15050+
1500415051 /* Early exit: stop accumulating as soon as the running total
1500515052 * cannot possibly fit the 2-byte wire length. Check *before*
1500615053 * marking the extension as processed so the semaphore is not
0 commit comments