mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-05 05:34:41 +02:00
Fix ClientHello parsing when no extensions are present
This commit is contained in:
11
src/dtls.c
11
src/dtls.c
@@ -285,10 +285,13 @@ static int ParseClientHello(const byte* input, word32 helloSz, WolfSSL_CH* ch)
|
|||||||
if (idx > helloSz - OPAQUE8_LEN)
|
if (idx > helloSz - OPAQUE8_LEN)
|
||||||
return BUFFER_ERROR;
|
return BUFFER_ERROR;
|
||||||
idx += ReadVector8(input + idx, &ch->compression);
|
idx += ReadVector8(input + idx, &ch->compression);
|
||||||
if (idx > helloSz - OPAQUE16_LEN)
|
if (idx < helloSz - OPAQUE16_LEN) {
|
||||||
return BUFFER_ERROR;
|
/* Extensions are optional */
|
||||||
idx += ReadVector16(input + idx, &ch->extension);
|
idx += ReadVector16(input + idx, &ch->extension);
|
||||||
if (idx > helloSz)
|
if (idx > helloSz)
|
||||||
|
return BUFFER_ERROR;
|
||||||
|
}
|
||||||
|
if (idx != helloSz)
|
||||||
return BUFFER_ERROR;
|
return BUFFER_ERROR;
|
||||||
ch->length = idx;
|
ch->length = idx;
|
||||||
return 0;
|
return 0;
|
||||||
|
89
tests/api.c
89
tests/api.c
@@ -62854,6 +62854,94 @@ static int test_wolfSSL_configure_args(void)
|
|||||||
#endif
|
#endif
|
||||||
return EXPECT_RESULT();
|
return EXPECT_RESULT();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int test_dtls_no_extensions(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_DTLS) && !defined(NO_FILESYSTEM)
|
||||||
|
WOLFSSL *ssl_s = NULL;
|
||||||
|
WOLFSSL_CTX *ctx_s = NULL;
|
||||||
|
struct test_memio_ctx test_ctx;
|
||||||
|
const byte chNoExtensions[] = {
|
||||||
|
/* Handshake type */
|
||||||
|
0x16,
|
||||||
|
/* Version */
|
||||||
|
0xfe, 0xff,
|
||||||
|
/* Epoch */
|
||||||
|
0x00, 0x00,
|
||||||
|
/* Seq number */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
/* Length */
|
||||||
|
0x00, 0x40,
|
||||||
|
/* CH type */
|
||||||
|
0x01,
|
||||||
|
/* Length */
|
||||||
|
0x00, 0x00, 0x34,
|
||||||
|
/* Msg Seq */
|
||||||
|
0x00, 0x00,
|
||||||
|
/* Frag offset */
|
||||||
|
0x00, 0x00, 0x00,
|
||||||
|
/* Frag length */
|
||||||
|
0x00, 0x00, 0x34,
|
||||||
|
/* Version */
|
||||||
|
0xfe, 0xff,
|
||||||
|
/* Random */
|
||||||
|
0x62, 0xfe, 0xbc, 0xfe, 0x2b, 0xfe, 0x3f, 0xeb, 0x03, 0xc4, 0xea, 0x37,
|
||||||
|
0xe7, 0x47, 0x7e, 0x8a, 0xd9, 0xbf, 0x77, 0x0f, 0x6c, 0xb6, 0x77, 0x0b,
|
||||||
|
0x03, 0x3f, 0x82, 0x2b, 0x21, 0x64, 0x57, 0x1d,
|
||||||
|
/* Session Length */
|
||||||
|
0x00,
|
||||||
|
/* Cookie Length */
|
||||||
|
0x00,
|
||||||
|
/* CS Length */
|
||||||
|
0x00, 0x0c,
|
||||||
|
/* CS */
|
||||||
|
0xc0, 0x0a, 0xc0, 0x09, 0xc0, 0x14, 0xc0, 0x13, 0x00, 0x39, 0x00, 0x33,
|
||||||
|
/* Comp Meths Length */
|
||||||
|
0x01,
|
||||||
|
/* Comp Meths */
|
||||||
|
0x00
|
||||||
|
/* And finally... no extensions */
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
int repeats = 2;
|
||||||
|
#else
|
||||||
|
int repeats = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0; i < repeats; i++) {
|
||||||
|
XMEMSET(&test_ctx, 0, sizeof(test_ctx));
|
||||||
|
ssl_s = NULL;
|
||||||
|
ctx_s = NULL;
|
||||||
|
|
||||||
|
ExpectIntEQ(test_memio_setup(&test_ctx, NULL, &ctx_s, NULL, &ssl_s,
|
||||||
|
NULL, wolfDTLS_server_method), 0);
|
||||||
|
|
||||||
|
XMEMCPY(test_ctx.s_buff, chNoExtensions, sizeof(chNoExtensions));
|
||||||
|
test_ctx.s_len = sizeof(chNoExtensions);
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
if (i > 0) {
|
||||||
|
ExpectIntEQ(wolfSSL_set_max_proto_version(ssl_s, DTLS1_2_VERSION),
|
||||||
|
WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ExpectIntEQ(wolfSSL_accept(ssl_s), -1);
|
||||||
|
ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ);
|
||||||
|
|
||||||
|
/* Expecting a handshake msg. Either HVR or SH. */
|
||||||
|
ExpectIntGT(test_ctx.c_len, 0);
|
||||||
|
ExpectIntEQ(test_ctx.c_buff[0], 0x16);
|
||||||
|
|
||||||
|
wolfSSL_free(ssl_s);
|
||||||
|
wolfSSL_CTX_free(ctx_s);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*
|
/*----------------------------------------------------------------------------*
|
||||||
| Main
|
| Main
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
@@ -64103,6 +64191,7 @@ TEST_CASE testCases[] = {
|
|||||||
TEST_DECL(test_dtls_msg_from_other_peer),
|
TEST_DECL(test_dtls_msg_from_other_peer),
|
||||||
TEST_DECL(test_dtls_ipv6_check),
|
TEST_DECL(test_dtls_ipv6_check),
|
||||||
TEST_DECL(test_wolfSSL_SCR_after_resumption),
|
TEST_DECL(test_wolfSSL_SCR_after_resumption),
|
||||||
|
TEST_DECL(test_dtls_no_extensions),
|
||||||
/* This test needs to stay at the end to clean up any caches allocated. */
|
/* This test needs to stay at the end to clean up any caches allocated. */
|
||||||
TEST_DECL(test_wolfSSL_Cleanup)
|
TEST_DECL(test_wolfSSL_Cleanup)
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user