@@ -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