Skip to content

Commit 6e82658

Browse files
committed
DTLS: Add tests for custom I/O callbacks and stateless handling with wolfio
1 parent 0d7fe2f commit 6e82658

2 files changed

Lines changed: 213 additions & 1 deletion

File tree

tests/api/test_dtls.c

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,3 +2049,211 @@ int test_dtls_certreq_order(void)
20492049
#endif
20502050
return EXPECT_RESULT();
20512051
}
2052+
2053+
#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS)
2054+
struct {
2055+
struct test_memio_ctx* test_ctx;
2056+
WOLFSSL* ssl_s;
2057+
int fd;
2058+
SOCKADDR_S peer_addr;
2059+
} test_memio_wolfio_ctx;
2060+
2061+
static ssize_t test_memio_wolfio_recvfrom(int sockfd, void* buf,
2062+
size_t len, int flags, void* src_addr, void* addrlen)
2063+
{
2064+
int ret;
2065+
(void)flags;
2066+
if (sockfd != test_memio_wolfio_ctx.fd) {
2067+
errno = EINVAL;
2068+
return -1;
2069+
}
2070+
ret = test_memio_read_cb(test_memio_wolfio_ctx.ssl_s,
2071+
(char*)buf, (int)len, test_memio_wolfio_ctx.test_ctx);
2072+
if (ret <= 0) {
2073+
if (ret == WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_WANT_READ))
2074+
errno = EAGAIN;
2075+
else
2076+
errno = EINVAL;
2077+
return -1;
2078+
}
2079+
XMEMCPY(src_addr, &test_memio_wolfio_ctx.peer_addr,
2080+
MIN(sizeof(test_memio_wolfio_ctx.peer_addr),
2081+
*(word32*)addrlen));
2082+
*(word32*)addrlen = sizeof(test_memio_wolfio_ctx.peer_addr);
2083+
return ret;
2084+
}
2085+
2086+
static ssize_t test_memio_wolfio_sendto(int sockfd, const void* buf,
2087+
size_t len, int flags, const void* dest_addr, word32 addrlen)
2088+
{
2089+
int ret;
2090+
(void) flags;
2091+
(void) dest_addr;
2092+
(void) addrlen;
2093+
if (sockfd != test_memio_wolfio_ctx.fd) {
2094+
errno = EINVAL;
2095+
return -1;
2096+
}
2097+
if (dest_addr != NULL && addrlen != 0 &&
2098+
(sizeof(test_memio_wolfio_ctx.peer_addr) != addrlen ||
2099+
XMEMCMP(dest_addr, &test_memio_wolfio_ctx.peer_addr,
2100+
addrlen) != 0)) {
2101+
errno = EINVAL;
2102+
return -1;
2103+
}
2104+
ret = test_memio_write_cb(test_memio_wolfio_ctx.ssl_s, (char*)buf,
2105+
(int)len, test_memio_wolfio_ctx.test_ctx);
2106+
if (ret <= 0) {
2107+
if (ret == WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_WANT_WRITE))
2108+
errno = EAGAIN;
2109+
else
2110+
errno = EINVAL;
2111+
return -1;
2112+
}
2113+
return ret;
2114+
}
2115+
#endif
2116+
2117+
/* Test stateless API with wolfio */
2118+
int test_dtls_memio_wolfio(void)
2119+
{
2120+
EXPECT_DECLS;
2121+
#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS)
2122+
size_t i;
2123+
struct {
2124+
method_provider client_meth;
2125+
method_provider server_meth;
2126+
} params[] = {
2127+
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DTLS13)
2128+
{ wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method },
2129+
#endif
2130+
#if !defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_DTLS)
2131+
{ wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method },
2132+
#endif
2133+
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_DTLS)
2134+
{ wolfDTLSv1_client_method, wolfDTLSv1_server_method },
2135+
#endif
2136+
};
2137+
XMEMSET(&test_memio_wolfio_ctx, 0, sizeof(test_memio_wolfio_ctx));
2138+
for (i = 0; i < XELEM_CNT(params) && !EXPECT_FAIL(); i++) {
2139+
WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL;
2140+
WOLFSSL *ssl_c = NULL, *ssl_s = NULL;
2141+
struct test_memio_ctx test_ctx;
2142+
2143+
XMEMSET(&test_ctx, 0, sizeof(test_ctx));
2144+
2145+
ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
2146+
params[i].client_meth, params[i].server_meth), 0);
2147+
2148+
test_memio_wolfio_ctx.test_ctx = &test_ctx;
2149+
test_memio_wolfio_ctx.ssl_s = ssl_s;
2150+
/* Large number to error out if any syscalls are called with it */
2151+
test_memio_wolfio_ctx.fd = 6000;
2152+
XMEMSET(&test_memio_wolfio_ctx.peer_addr, 0,
2153+
sizeof(test_memio_wolfio_ctx.peer_addr));
2154+
test_memio_wolfio_ctx.peer_addr.ss_family = AF_INET;
2155+
2156+
wolfSSL_dtls_set_using_nonblock(ssl_s, 1);
2157+
wolfSSL_SetRecvFrom(ssl_s, test_memio_wolfio_recvfrom);
2158+
wolfSSL_SetSendTo(ssl_s, test_memio_wolfio_sendto);
2159+
/* Restore default functions */
2160+
wolfSSL_SSLSetIORecv(ssl_s, EmbedReceiveFrom);
2161+
wolfSSL_SSLSetIOSend(ssl_s, EmbedSendTo);
2162+
ExpectIntEQ(wolfSSL_set_fd(ssl_s, test_memio_wolfio_ctx.fd),
2163+
WOLFSSL_SUCCESS);
2164+
2165+
ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0);
2166+
2167+
wolfSSL_free(ssl_s);
2168+
wolfSSL_free(ssl_c);
2169+
wolfSSL_CTX_free(ctx_s);
2170+
wolfSSL_CTX_free(ctx_c);
2171+
}
2172+
#endif
2173+
return EXPECT_RESULT();
2174+
}
2175+
2176+
/* DTLS using stateless API handling new addresses with wolfio */
2177+
int test_dtls_memio_wolfio_stateless(void)
2178+
{
2179+
EXPECT_DECLS;
2180+
#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS)
2181+
size_t i, j;
2182+
struct {
2183+
method_provider client_meth;
2184+
method_provider server_meth;
2185+
} params[] = {
2186+
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DTLS13)
2187+
{ wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method },
2188+
#endif
2189+
#if !defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_DTLS)
2190+
{ wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method },
2191+
#endif
2192+
#if !defined(NO_OLD_TLS) && defined(WOLFSSL_DTLS)
2193+
{ wolfDTLSv1_client_method, wolfDTLSv1_server_method },
2194+
#endif
2195+
};
2196+
XMEMSET(&test_memio_wolfio_ctx, 0, sizeof(test_memio_wolfio_ctx));
2197+
for (i = 0; i < XELEM_CNT(params) && !EXPECT_FAIL(); i++) {
2198+
WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL;
2199+
WOLFSSL *ssl_c = NULL, *ssl_s = NULL;
2200+
struct test_memio_ctx test_ctx;
2201+
char chBuf[1000];
2202+
int chSz = sizeof(chBuf);
2203+
2204+
XMEMSET(&test_ctx, 0, sizeof(test_ctx));
2205+
2206+
ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
2207+
params[i].client_meth, params[i].server_meth), 0);
2208+
2209+
test_memio_wolfio_ctx.test_ctx = &test_ctx;
2210+
test_memio_wolfio_ctx.ssl_s = ssl_s;
2211+
/* Large number to error out if any syscalls are called with it */
2212+
test_memio_wolfio_ctx.fd = 6000;
2213+
XMEMSET(&test_memio_wolfio_ctx.peer_addr, 0,
2214+
sizeof(test_memio_wolfio_ctx.peer_addr));
2215+
test_memio_wolfio_ctx.peer_addr.ss_family = AF_INET;
2216+
2217+
wolfSSL_dtls_set_using_nonblock(ssl_s, 1);
2218+
wolfSSL_SetRecvFrom(ssl_s, test_memio_wolfio_recvfrom);
2219+
/* Restore default functions */
2220+
wolfSSL_SSLSetIORecv(ssl_s, EmbedReceiveFrom);
2221+
ExpectIntEQ(wolfSSL_set_read_fd(ssl_s, test_memio_wolfio_ctx.fd),
2222+
WOLFSSL_SUCCESS);
2223+
2224+
/* start handshake, send first ClientHello */
2225+
ExpectIntEQ(wolfSSL_connect(ssl_c), -1);
2226+
ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ);
2227+
ExpectIntEQ(test_memio_copy_message(&test_ctx, 0, chBuf, &chSz, 0), 0);
2228+
ExpectIntGT(chSz, 0);
2229+
test_memio_clear_buffer(&test_ctx, 0);
2230+
2231+
/* Send CH from different addresses */
2232+
for (j = 0; j < 10 && !EXPECT_FAIL(); j++,
2233+
(((SOCKADDR_IN*)&test_memio_wolfio_ctx.peer_addr))->sin_port++) {
2234+
const char* hrrBuf = NULL;
2235+
int hrrSz = 0;
2236+
ExpectIntEQ(test_memio_inject_message(&test_ctx, 0, chBuf, chSz), 0);
2237+
ExpectIntEQ(wolfDTLS_accept_stateless(ssl_s), 0);
2238+
ExpectIntEQ(test_memio_get_message(&test_ctx, 1, &hrrBuf, &hrrSz, 0), 0);
2239+
ExpectNotNull(hrrBuf);
2240+
ExpectIntGT(hrrSz, 0);
2241+
test_memio_clear_buffer(&test_ctx, 0);
2242+
}
2243+
test_memio_clear_buffer(&test_ctx, 1);
2244+
ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), 1);
2245+
ExpectIntEQ(wolfDTLS_accept_stateless(ssl_s), 0);
2246+
ExpectIntEQ(wolfSSL_connect(ssl_c), -1);
2247+
ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ);
2248+
ExpectIntEQ(wolfDTLS_accept_stateless(ssl_s), 1);
2249+
2250+
ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0);
2251+
2252+
wolfSSL_free(ssl_s);
2253+
wolfSSL_free(ssl_c);
2254+
wolfSSL_CTX_free(ctx_s);
2255+
wolfSSL_CTX_free(ctx_c);
2256+
}
2257+
#endif
2258+
return EXPECT_RESULT();
2259+
}

tests/api/test_dtls.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ int test_dtls_replay(void);
4545
int test_dtls_srtp(void);
4646
int test_dtls_timeout(void);
4747
int test_dtls_certreq_order(void);
48+
int test_dtls_memio_wolfio(void);
49+
int test_dtls_memio_wolfio_stateless(void);
4850

4951
#define TEST_DTLS_DECLS \
5052
TEST_DECL_GROUP("dtls", test_dtls12_basic_connection_id), \
@@ -69,5 +71,7 @@ int test_dtls_certreq_order(void);
6971
TEST_DECL_GROUP("dtls", test_dtls_replay), \
7072
TEST_DECL_GROUP("dtls", test_dtls_srtp), \
7173
TEST_DECL_GROUP("dtls", test_dtls_certreq_order), \
72-
TEST_DECL_GROUP("dtls", test_dtls_timeout)
74+
TEST_DECL_GROUP("dtls", test_dtls_timeout), \
75+
TEST_DECL_GROUP("dtls", test_dtls_memio_wolfio), \
76+
TEST_DECL_GROUP("dtls", test_dtls_memio_wolfio_stateless)
7377
#endif /* TESTS_API_DTLS_H */

0 commit comments

Comments
 (0)