Skip to content

Commit 39c85c4

Browse files
committed
WIP: new test function for large HS messages
Signed-off-by: Manuel Pégourié-Gonnard <[email protected]>
1 parent 0c6fc39 commit 39c85c4

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

tests/suites/test_suite_ssl.data

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3606,3 +3606,6 @@ inject_client_content_on_the_wire:MBEDTLS_PK_ECDSA:MBEDTLS_SSL_CLIENT_HELLO:"160
36063606
Inject ClientHello - TLS 1.3 fragmented 4 + invalid type + 72 rejected
36073607
depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:MBEDTLS_SSL_HAVE_AES:MBEDTLS_MD_CAN_SHA256:MBEDTLS_SSL_HAVE_GCM:MBEDTLS_ECP_HAVE_SECP256R1:MBEDTLS_ECP_HAVE_SECP384R1:MBEDTLS_PK_CAN_ECDSA_SIGN:MBEDTLS_PK_CAN_ECDSA_VERIFY
36083608
inject_client_content_on_the_wire:MBEDTLS_PK_ECDSA:MBEDTLS_SSL_CLIENT_HELLO:"1603030004010000481003030002015a160303004803030123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00000213010100001d000a000400020017002b0003020304000d000400020403003300020000":"unknown record type":MBEDTLS_ERR_SSL_INVALID_RECORD
3609+
3610+
Send large fragmented ClientHello
3611+
send_large_fragmented_hello:MBEDTLS_SSL_IN_CONTENT_LEN:0

tests/suites/test_suite_ssl.function

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5112,3 +5112,109 @@ exit:
51125112
PSA_DONE();
51135113
}
51145114
/* END_CASE */
5115+
5116+
/* BEGIN_CASE depens_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C */
5117+
void send_large_fragmented_hello(int hs_len_int, int first_frag_content_len_int)
5118+
{
5119+
/* This function sends a long message (claiming to be a ClientHello)
5120+
* fragmented in 1-byte fragments (except the initial fragment).
5121+
* The purpose is to test how the stack reacts when receiving:
5122+
* - a message larger than our buffer;
5123+
* - a message smaller than our buffer, but where the intermediate size of
5124+
* holding all the fragments (including overhead) is larger than our
5125+
* buffer.
5126+
*/
5127+
enum { BUFFSIZE = 16384 };
5128+
mbedtls_test_ssl_endpoint server, client;
5129+
mbedtls_platform_zeroize(&server, sizeof(server));
5130+
mbedtls_platform_zeroize(&client, sizeof(client));
5131+
mbedtls_test_handshake_test_options options;
5132+
mbedtls_test_init_handshake_options(&options);
5133+
mbedtls_test_ssl_log_pattern srv_pattern;
5134+
unsigned char *first_frag = NULL;
5135+
size_t hs_len = (size_t) hs_len_int;
5136+
size_t first_frag_content_len = (size_t) first_frag_content_len_int;
5137+
int ret = -1;
5138+
5139+
PSA_INIT();
5140+
5141+
srv_pattern.pattern = "requesting more data than fits";
5142+
options.srv_log_obj = &srv_pattern;
5143+
options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
5144+
mbedtls_debug_set_threshold(5);
5145+
5146+
ret = mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
5147+
&options, NULL, NULL, NULL);
5148+
TEST_EQUAL(ret, 0);
5149+
5150+
ret = mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
5151+
&options, NULL, NULL, NULL);
5152+
TEST_EQUAL(ret, 0);
5153+
5154+
ret = mbedtls_test_mock_socket_connect(&server.socket, &client.socket,
5155+
BUFFSIZE);
5156+
TEST_EQUAL(ret, 0);
5157+
5158+
/* Make the server move past the initial dummy state */
5159+
ret = mbedtls_test_move_handshake_to_state(&client.ssl, &server.ssl,
5160+
MBEDTLS_SSL_CLIENT_HELLO);
5161+
TEST_EQUAL(ret, 0);
5162+
5163+
/* Prepare initial fragment */
5164+
const size_t first_len = 5 // record header, see below
5165+
+ 4 // handshake header, see balow
5166+
+ first_frag_content_len;
5167+
TEST_CALLOC(first_frag, first_len);
5168+
unsigned char *p = first_frag;
5169+
// record header
5170+
// record type: handshake
5171+
*p++ = 0x16,
5172+
// record version (actually common to TLS 1.2 and TLS 1.3)
5173+
*p++ = 0x03,
5174+
*p++ = 0x03,
5175+
// record length: two bytes
5176+
*p++ = (unsigned char) (((4 + first_frag_content_len) >> 8) & 0xff);
5177+
*p++ = (unsigned char) (((4 + first_frag_content_len) >> 0) & 0xff);
5178+
// handshake header
5179+
// handshake type: ClientHello
5180+
*p++ = 0x01,
5181+
// handshake length: three bytes
5182+
*p++ = (unsigned char) ((hs_len >> 16) & 0xff);
5183+
*p++ = (unsigned char) ((hs_len >> 8) & 0xff);
5184+
*p++ = (unsigned char) ((hs_len >> 0) & 0xff);
5185+
// handshake content: dummy value
5186+
memset(p, 0x2a, first_frag_content_len);
5187+
5188+
/* Send initial fragment and have the server process it. */
5189+
ret = mbedtls_test_mock_tcp_send_b(&client.socket, first_frag, first_len);
5190+
TEST_ASSERT(ret >= 0 && (size_t) ret == first_len);
5191+
5192+
ret = mbedtls_ssl_handshake_step(&server.ssl);
5193+
TEST_EQUAL(ret, MBEDTLS_ERR_SSL_WANT_READ);
5194+
5195+
/* Dummy 1-byte fragment to repeatedly send next */
5196+
const unsigned char next[] = {
5197+
0x16, 0x03, 0x03, 0x00, 0x01, // record header (see above)
5198+
0x2a, // Dummy handshake message content
5199+
};
5200+
for (size_t left = hs_len - first_frag_content_len; left != 0; left--) {
5201+
ret = mbedtls_test_mock_tcp_send_b(&client.socket, next, sizeof(next));
5202+
TEST_ASSERT(ret >= 0 && (size_t) ret == sizeof(next));
5203+
5204+
ret = mbedtls_ssl_handshake_step(&server.ssl);
5205+
if (ret != MBEDTLS_ERR_SSL_WANT_READ) {
5206+
break;
5207+
}
5208+
}
5209+
TEST_EQUAL(ret, MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
5210+
TEST_EQUAL(srv_pattern.counter, 1);
5211+
5212+
exit:
5213+
mbedtls_test_free_handshake_options(&options);
5214+
mbedtls_test_ssl_endpoint_free(&server, NULL);
5215+
mbedtls_test_ssl_endpoint_free(&client, NULL);
5216+
mbedtls_debug_set_threshold(0);
5217+
mbedtls_free(first_frag);
5218+
PSA_DONE();
5219+
}
5220+
/* END_CASE */

0 commit comments

Comments
 (0)