@@ -1489,8 +1489,9 @@ int test_records_span_network_boundaries(void)
14891489
14901490int test_dtls_mtu_fragment_headroom (void )
14911491{
1492- #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && defined(WOLFSSL_DTLS_MTU ) && \
1493- defined(HAVE_AESGCM ) && defined(HAVE_ECC )
1492+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && \
1493+ defined(WOLFSSL_DTLS_MTU ) && defined(HAVE_AESGCM ) && defined(HAVE_ECC ) && \
1494+ !defined(WOLFSSL_NO_DTLS_SIZE_CHECK )
14941495 EXPECT_DECLS ;
14951496 struct {
14961497 method_provider client_meth ;
@@ -2375,3 +2376,116 @@ int test_dtls_memio_wolfio_stateless(void)
23752376#endif
23762377 return EXPECT_RESULT ();
23772378}
2379+
2380+ int test_dtls_mtu_split_messages (void )
2381+ {
2382+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && \
2383+ defined(WOLFSSL_DTLS_MTU ) && defined(WOLFSSL_NO_DTLS_SIZE_CHECK ) && \
2384+ defined(HAVE_AESGCM ) && defined(HAVE_ECC )
2385+ EXPECT_DECLS ;
2386+ struct {
2387+ method_provider client_meth ;
2388+ method_provider server_meth ;
2389+ const char * cipher ;
2390+ } params [] = {
2391+ #if defined(WOLFSSL_DTLS13 ) && defined (WOLFSSL_TLS13 )
2392+ { wolfDTLSv1_3_client_method , wolfDTLSv1_3_server_method ,
2393+ "TLS13-AES128-GCM-SHA256" },
2394+ #endif
2395+ #if defined(WOLFSSL_DTLS ) && !defined (WOLFSSL_NO_TLS12 )
2396+ { wolfDTLSv1_2_client_method , wolfDTLSv1_2_server_method ,
2397+ "ECDHE-RSA-AES128-GCM-SHA256" },
2398+ #if !defined (WOLFSSL_AEAD_ONLY ) && !defined (NO_AES ) && !defined (NO_SHA )
2399+ /* Block cipher test */
2400+ { wolfDTLSv1_2_client_method , wolfDTLSv1_2_server_method ,
2401+ "ECDHE-RSA-AES128-SHA" },
2402+ #endif
2403+ #endif
2404+ };
2405+ size_t i ;
2406+
2407+ for (i = 0 ; i < XELEM_CNT (params ) && EXPECT_SUCCESS (); i ++ ) {
2408+ WOLFSSL_CTX * ctx_c = NULL , * ctx_s = NULL ;
2409+ WOLFSSL * ssl_c = NULL , * ssl_s = NULL ;
2410+ struct test_memio_ctx test_ctx ;
2411+ /* Payload larger than typical MTU to force splitting */
2412+ unsigned char payload [200 ];
2413+ unsigned char readBuf [200 ];
2414+ word16 mtu ;
2415+ int recordLen ;
2416+ int overhead ;
2417+ int totalRead ;
2418+ int ret ;
2419+ int j ;
2420+
2421+ XMEMSET (& test_ctx , 0 , sizeof (test_ctx ));
2422+ XMEMSET (payload , 'A' , sizeof (payload ));
2423+
2424+ ExpectIntEQ (test_memio_setup (& test_ctx , & ctx_c , & ctx_s , & ssl_c , & ssl_s ,
2425+ params [i ].client_meth , params [i ].server_meth ),
2426+ 0 );
2427+
2428+ ExpectIntEQ (wolfSSL_set_cipher_list (ssl_c , params [i ].cipher ), 1 );
2429+ ExpectIntEQ (wolfSSL_set_cipher_list (ssl_s , params [i ].cipher ), 1 );
2430+
2431+ /* Complete handshake and clear any leftover records. */
2432+ ExpectIntEQ (test_memio_do_handshake (ssl_c , ssl_s , 10 , NULL ), 0 );
2433+ test_memio_clear_buffer (& test_ctx , 1 );
2434+ test_memio_clear_buffer (& test_ctx , 0 );
2435+
2436+ /* Measure application-data record overhead with small payload. */
2437+ ExpectIntEQ (wolfSSL_write (ssl_c , payload , 32 ), 32 );
2438+ ExpectIntEQ (test_ctx .s_msg_count , 1 );
2439+ recordLen = test_ctx .s_len ;
2440+ ExpectIntGT (recordLen , 32 );
2441+ overhead = recordLen - 32 ;
2442+
2443+ /* Reset buffers before MTU-limited send. */
2444+ test_memio_clear_buffer (& test_ctx , 0 );
2445+ test_memio_clear_buffer (& test_ctx , 1 );
2446+
2447+ /* Set MTU to allow only ~50 bytes of payload per record.
2448+ * This ensures a 200-byte payload must be split into multiple msgs. */
2449+ mtu = (word16 )(overhead + 50 );
2450+ ExpectIntEQ (wolfSSL_dtls_set_mtu (ssl_c , mtu ), WOLFSSL_SUCCESS );
2451+ ExpectIntEQ (wolfSSL_dtls_set_mtu (ssl_s , mtu ), WOLFSSL_SUCCESS );
2452+
2453+ /* Write payload larger than MTU allows in single record.
2454+ * With WOLFSSL_NO_DTLS_SIZE_CHECK, this should split into multiple
2455+ * messages instead of returning DTLS_SIZE_ERROR. */
2456+ ExpectIntEQ (wolfSSL_write (ssl_c , payload , (int )sizeof (payload )),
2457+ (int )sizeof (payload ));
2458+
2459+ /* Verify multiple messages were sent */
2460+ ExpectIntGT (test_ctx .s_msg_count , 1 );
2461+
2462+ /* Each record should fit within MTU */
2463+ for (j = 0 ; j < test_ctx .s_msg_count && EXPECT_SUCCESS (); j ++ ) {
2464+ ExpectIntLE (test_ctx .s_msg_sizes [j ], mtu );
2465+ }
2466+
2467+ /* Read all data on server side and verify it matches */
2468+ totalRead = 0 ;
2469+ while (totalRead < (int )sizeof (payload ) && EXPECT_SUCCESS ()) {
2470+ ret = wolfSSL_read (ssl_s , readBuf + totalRead ,
2471+ (int )sizeof (readBuf ) - totalRead );
2472+ if (ret > 0 ) {
2473+ totalRead += ret ;
2474+ }
2475+ else {
2476+ break ;
2477+ }
2478+ }
2479+ ExpectIntEQ (totalRead , (int )sizeof (payload ));
2480+ ExpectIntEQ (XMEMCMP (payload , readBuf , sizeof (payload )), 0 );
2481+
2482+ wolfSSL_free (ssl_c );
2483+ wolfSSL_CTX_free (ctx_c );
2484+ wolfSSL_free (ssl_s );
2485+ wolfSSL_CTX_free (ctx_s );
2486+ }
2487+ return EXPECT_RESULT ();
2488+ #else
2489+ return TEST_SKIPPED ;
2490+ #endif
2491+ }
0 commit comments