Skip to content

Commit 540fae8

Browse files
committed
test_dtls: test payload split when WOLFSSL_NO_DTLS_SIZE_CHECK
1 parent 8cbc404 commit 540fae8

File tree

2 files changed

+118
-2
lines changed

2 files changed

+118
-2
lines changed

tests/api/test_dtls.c

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,8 +1489,9 @@ int test_records_span_network_boundaries(void)
14891489

14901490
int 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+
}

tests/api/test_dtls.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ int test_dtls_certreq_order(void);
4848
int test_dtls_memio_wolfio(void);
4949
int test_dtls_memio_wolfio_stateless(void);
5050
int test_dtls_mtu_fragment_headroom(void);
51+
int test_dtls_mtu_split_messages(void);
5152

5253
#define TEST_DTLS_DECLS \
5354
TEST_DECL_GROUP("dtls", test_dtls12_basic_connection_id), \
@@ -75,5 +76,6 @@ int test_dtls_mtu_fragment_headroom(void);
7576
TEST_DECL_GROUP("dtls", test_dtls_timeout), \
7677
TEST_DECL_GROUP("dtls", test_dtls_memio_wolfio), \
7778
TEST_DECL_GROUP("dtls", test_dtls_mtu_fragment_headroom), \
79+
TEST_DECL_GROUP("dtls", test_dtls_mtu_split_messages), \
7880
TEST_DECL_GROUP("dtls", test_dtls_memio_wolfio_stateless)
7981
#endif /* TESTS_API_DTLS_H */

0 commit comments

Comments
 (0)