mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
Add a test for SSL_select_next_proto
Follow on from CVE-2024-5535 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Neil Horman <nhorman@openssl.org> (Merged from https://github.com/openssl/openssl/pull/24716)
This commit is contained in:
parent
a210f580f4
commit
0d883f6309
@ -11973,6 +11973,142 @@ static int test_multi_resume(int idx)
|
||||
return testresult;
|
||||
}
|
||||
|
||||
static struct next_proto_st {
|
||||
int serverlen;
|
||||
unsigned char server[40];
|
||||
int clientlen;
|
||||
unsigned char client[40];
|
||||
int expected_ret;
|
||||
size_t selectedlen;
|
||||
unsigned char selected[40];
|
||||
} next_proto_tests[] = {
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
7, { 3, 'a', 'b', 'c', 2, 'a', 'b' },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
7, { 2, 'a', 'b', 3, 'a', 'b', 'c', },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
7, { 3, 'a', 'b', 'c', 2, 'a', 'b', },
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
7, { 2, 'a', 'b', 3, 'a', 'b', 'c'},
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
7, { 2, 'b', 'c', 3, 'a', 'b', 'c' },
|
||||
7, { 2, 'a', 'b', 3, 'a', 'b', 'c'},
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
10, { 2, 'b', 'c', 3, 'a', 'b', 'c', 2, 'a', 'b' },
|
||||
7, { 2, 'a', 'b', 3, 'a', 'b', 'c'},
|
||||
OPENSSL_NPN_NEGOTIATED,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
4, { 3, 'b', 'c', 'd' },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
0, { 0 },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
-1, { 0 },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
0, { 0 },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
0, { 0 }
|
||||
},
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
-1, { 0 },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
0, { 0 }
|
||||
},
|
||||
{
|
||||
3, { 3, 'a', 'b', 'c' },
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
3, { 'a', 'b', 'c' }
|
||||
},
|
||||
{
|
||||
4, { 3, 'a', 'b', 'c' },
|
||||
3, { 3, 'a', 'b', 'c' },
|
||||
OPENSSL_NPN_NO_OVERLAP,
|
||||
0, { 0 }
|
||||
}
|
||||
};
|
||||
|
||||
static int test_select_next_proto(int idx)
|
||||
{
|
||||
struct next_proto_st *np = &next_proto_tests[idx];
|
||||
int ret = 0;
|
||||
unsigned char *out, *client, *server;
|
||||
unsigned char outlen;
|
||||
unsigned int clientlen, serverlen;
|
||||
|
||||
if (np->clientlen == -1) {
|
||||
client = NULL;
|
||||
clientlen = 0;
|
||||
} else {
|
||||
client = np->client;
|
||||
clientlen = (unsigned int)np->clientlen;
|
||||
}
|
||||
if (np->serverlen == -1) {
|
||||
server = NULL;
|
||||
serverlen = 0;
|
||||
} else {
|
||||
server = np->server;
|
||||
serverlen = (unsigned int)np->serverlen;
|
||||
}
|
||||
|
||||
if (!TEST_int_eq(SSL_select_next_proto(&out, &outlen, server, serverlen,
|
||||
client, clientlen),
|
||||
np->expected_ret))
|
||||
goto err;
|
||||
|
||||
if (np->selectedlen == 0) {
|
||||
if (!TEST_ptr_null(out) || !TEST_uchar_eq(outlen, 0))
|
||||
goto err;
|
||||
} else {
|
||||
if (!TEST_mem_eq(out, outlen, np->selected, np->selectedlen))
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
OPT_TEST_DECLARE_USAGE("certfile privkeyfile srpvfile tmpfile provider config dhfile\n")
|
||||
|
||||
int setup_tests(void)
|
||||
@ -12289,6 +12425,7 @@ int setup_tests(void)
|
||||
ADD_ALL_TESTS(test_handshake_retry, 16);
|
||||
ADD_TEST(test_data_retry);
|
||||
ADD_ALL_TESTS(test_multi_resume, 5);
|
||||
ADD_ALL_TESTS(test_select_next_proto, OSSL_NELEM(next_proto_tests));
|
||||
return 1;
|
||||
|
||||
err:
|
||||
|
Loading…
Reference in New Issue
Block a user