@@ -1889,3 +1889,211 @@ int test_dtls_certreq_order(void)
18891889#endif
18901890 return EXPECT_RESULT ();
18911891}
1892+
1893+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && defined(WOLFSSL_DTLS )
1894+ struct {
1895+ struct test_memio_ctx * test_ctx ;
1896+ WOLFSSL * ssl_s ;
1897+ int fd ;
1898+ SOCKADDR_S peer_addr ;
1899+ } test_memio_wolfio_ctx ;
1900+
1901+ static ssize_t test_memio_wolfio_recvfrom (int sockfd , void * buf ,
1902+ size_t len , int flags , void * src_addr , void * addrlen )
1903+ {
1904+ int ret ;
1905+ (void )flags ;
1906+ if (sockfd != test_memio_wolfio_ctx .fd ) {
1907+ errno = EINVAL ;
1908+ return -1 ;
1909+ }
1910+ ret = test_memio_read_cb (test_memio_wolfio_ctx .ssl_s ,
1911+ (char * )buf , (int )len , test_memio_wolfio_ctx .test_ctx );
1912+ if (ret <= 0 ) {
1913+ if (ret == WC_NO_ERR_TRACE (WOLFSSL_CBIO_ERR_WANT_READ ))
1914+ errno = EAGAIN ;
1915+ else
1916+ errno = EINVAL ;
1917+ return -1 ;
1918+ }
1919+ XMEMCPY (src_addr , & test_memio_wolfio_ctx .peer_addr ,
1920+ MIN (sizeof (test_memio_wolfio_ctx .peer_addr ),
1921+ * (word32 * )addrlen ));
1922+ * (word32 * )addrlen = sizeof (test_memio_wolfio_ctx .peer_addr );
1923+ return ret ;
1924+ }
1925+
1926+ static ssize_t test_memio_wolfio_sendto (int sockfd , const void * buf ,
1927+ size_t len , int flags , const void * dest_addr , word32 addrlen )
1928+ {
1929+ int ret ;
1930+ (void ) flags ;
1931+ (void ) dest_addr ;
1932+ (void ) addrlen ;
1933+ if (sockfd != test_memio_wolfio_ctx .fd ) {
1934+ errno = EINVAL ;
1935+ return -1 ;
1936+ }
1937+ if (dest_addr != NULL && addrlen != 0 &&
1938+ (sizeof (test_memio_wolfio_ctx .peer_addr ) != addrlen ||
1939+ XMEMCMP (dest_addr , & test_memio_wolfio_ctx .peer_addr ,
1940+ addrlen ) != 0 )) {
1941+ errno = EINVAL ;
1942+ return -1 ;
1943+ }
1944+ ret = test_memio_write_cb (test_memio_wolfio_ctx .ssl_s , (char * )buf ,
1945+ (int )len , test_memio_wolfio_ctx .test_ctx );
1946+ if (ret <= 0 ) {
1947+ if (ret == WC_NO_ERR_TRACE (WOLFSSL_CBIO_ERR_WANT_WRITE ))
1948+ errno = EAGAIN ;
1949+ else
1950+ errno = EINVAL ;
1951+ return -1 ;
1952+ }
1953+ return ret ;
1954+ }
1955+ #endif
1956+
1957+ /* Test stateless API with wolfio */
1958+ int test_dtls_memio_wolfio (void )
1959+ {
1960+ EXPECT_DECLS ;
1961+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && defined(WOLFSSL_DTLS )
1962+ size_t i ;
1963+ struct {
1964+ method_provider client_meth ;
1965+ method_provider server_meth ;
1966+ } params [] = {
1967+ #if defined(WOLFSSL_TLS13 ) && defined (WOLFSSL_DTLS13 )
1968+ { wolfDTLSv1_3_client_method , wolfDTLSv1_3_server_method },
1969+ #endif
1970+ #if !defined (WOLFSSL_NO_TLS12 ) && defined (WOLFSSL_DTLS )
1971+ { wolfDTLSv1_2_client_method , wolfDTLSv1_2_server_method },
1972+ #endif
1973+ #if !defined (NO_OLD_TLS ) && defined (WOLFSSL_DTLS )
1974+ { wolfDTLSv1_client_method , wolfDTLSv1_server_method },
1975+ #endif
1976+ };
1977+ XMEMSET (& test_memio_wolfio_ctx , 0 , sizeof (test_memio_wolfio_ctx ));
1978+ for (i = 0 ; i < XELEM_CNT (params ) && !EXPECT_FAIL (); i ++ ) {
1979+ WOLFSSL_CTX * ctx_c = NULL , * ctx_s = NULL ;
1980+ WOLFSSL * ssl_c = NULL , * ssl_s = NULL ;
1981+ struct test_memio_ctx test_ctx ;
1982+
1983+ XMEMSET (& test_ctx , 0 , sizeof (test_ctx ));
1984+
1985+ ExpectIntEQ (test_memio_setup (& test_ctx , & ctx_c , & ctx_s , & ssl_c , & ssl_s ,
1986+ params [i ].client_meth , params [i ].server_meth ), 0 );
1987+
1988+ test_memio_wolfio_ctx .test_ctx = & test_ctx ;
1989+ test_memio_wolfio_ctx .ssl_s = ssl_s ;
1990+ /* Large number to error out if any syscalls are called with it */
1991+ test_memio_wolfio_ctx .fd = 6000 ;
1992+ XMEMSET (& test_memio_wolfio_ctx .peer_addr , 0 ,
1993+ sizeof (test_memio_wolfio_ctx .peer_addr ));
1994+ test_memio_wolfio_ctx .peer_addr .ss_family = AF_INET ;
1995+
1996+ wolfSSL_dtls_set_using_nonblock (ssl_s , 1 );
1997+ wolfSSL_SetRecvFrom (ssl_s , test_memio_wolfio_recvfrom );
1998+ wolfSSL_SetSendTo (ssl_s , test_memio_wolfio_sendto );
1999+ /* Restore default functions */
2000+ wolfSSL_SSLSetIORecv (ssl_s , EmbedReceiveFrom );
2001+ wolfSSL_SSLSetIOSend (ssl_s , EmbedSendTo );
2002+ ExpectIntEQ (wolfSSL_set_fd (ssl_s , test_memio_wolfio_ctx .fd ),
2003+ WOLFSSL_SUCCESS );
2004+
2005+ ExpectIntEQ (test_memio_do_handshake (ssl_c , ssl_s , 10 , NULL ), 0 );
2006+
2007+ wolfSSL_free (ssl_s );
2008+ wolfSSL_free (ssl_c );
2009+ wolfSSL_CTX_free (ctx_s );
2010+ wolfSSL_CTX_free (ctx_c );
2011+ }
2012+ #endif
2013+ return EXPECT_RESULT ();
2014+ }
2015+
2016+ /* DTLS using stateless API handling new addresses with wolfio */
2017+ int test_dtls_memio_wolfio_stateless (void )
2018+ {
2019+ EXPECT_DECLS ;
2020+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES ) && defined(WOLFSSL_DTLS )
2021+ size_t i , j ;
2022+ struct {
2023+ method_provider client_meth ;
2024+ method_provider server_meth ;
2025+ } params [] = {
2026+ #if defined(WOLFSSL_TLS13 ) && defined (WOLFSSL_DTLS13 )
2027+ { wolfDTLSv1_3_client_method , wolfDTLSv1_3_server_method },
2028+ #endif
2029+ #if !defined (WOLFSSL_NO_TLS12 ) && defined (WOLFSSL_DTLS )
2030+ { wolfDTLSv1_2_client_method , wolfDTLSv1_2_server_method },
2031+ #endif
2032+ #if !defined (NO_OLD_TLS ) && defined (WOLFSSL_DTLS )
2033+ { wolfDTLSv1_client_method , wolfDTLSv1_server_method },
2034+ #endif
2035+ };
2036+ XMEMSET (& test_memio_wolfio_ctx , 0 , sizeof (test_memio_wolfio_ctx ));
2037+ for (i = 0 ; i < XELEM_CNT (params ) && !EXPECT_FAIL (); i ++ ) {
2038+ WOLFSSL_CTX * ctx_c = NULL , * ctx_s = NULL ;
2039+ WOLFSSL * ssl_c = NULL , * ssl_s = NULL ;
2040+ struct test_memio_ctx test_ctx ;
2041+ char chBuf [1000 ];
2042+ int chSz = sizeof (chBuf );
2043+
2044+ XMEMSET (& test_ctx , 0 , sizeof (test_ctx ));
2045+
2046+ ExpectIntEQ (test_memio_setup (& test_ctx , & ctx_c , & ctx_s , & ssl_c , & ssl_s ,
2047+ params [i ].client_meth , params [i ].server_meth ), 0 );
2048+
2049+ test_memio_wolfio_ctx .test_ctx = & test_ctx ;
2050+ test_memio_wolfio_ctx .ssl_s = ssl_s ;
2051+ /* Large number to error out if any syscalls are called with it */
2052+ test_memio_wolfio_ctx .fd = 6000 ;
2053+ XMEMSET (& test_memio_wolfio_ctx .peer_addr , 0 ,
2054+ sizeof (test_memio_wolfio_ctx .peer_addr ));
2055+ test_memio_wolfio_ctx .peer_addr .ss_family = AF_INET ;
2056+
2057+ wolfSSL_dtls_set_using_nonblock (ssl_s , 1 );
2058+ wolfSSL_SetRecvFrom (ssl_s , test_memio_wolfio_recvfrom );
2059+ /* Restore default functions */
2060+ wolfSSL_SSLSetIORecv (ssl_s , EmbedReceiveFrom );
2061+ ExpectIntEQ (wolfSSL_set_read_fd (ssl_s , test_memio_wolfio_ctx .fd ),
2062+ WOLFSSL_SUCCESS );
2063+
2064+ /* start handshake, send first ClientHello */
2065+ ExpectIntEQ (wolfSSL_connect (ssl_c ), -1 );
2066+ ExpectIntEQ (wolfSSL_get_error (ssl_c , -1 ), WOLFSSL_ERROR_WANT_READ );
2067+ ExpectIntEQ (test_memio_copy_message (& test_ctx , 0 , chBuf , & chSz , 0 ), 0 );
2068+ ExpectIntGT (chSz , 0 );
2069+ test_memio_clear_buffer (& test_ctx , 0 );
2070+
2071+ /* Send CH from different addresses */
2072+ for (j = 0 ; j < 10 && !EXPECT_FAIL (); j ++ ,
2073+ (((SOCKADDR_IN * )& test_memio_wolfio_ctx .peer_addr ))-> sin_port ++ ) {
2074+ const char * hrrBuf = NULL ;
2075+ int hrrSz = 0 ;
2076+ ExpectIntEQ (test_memio_inject_message (& test_ctx , 0 , chBuf , chSz ), 0 );
2077+ ExpectIntEQ (wolfDTLS_accept_stateless (ssl_s ), 0 );
2078+ ExpectIntEQ (test_memio_get_message (& test_ctx , 1 , & hrrBuf , & hrrSz , 0 ), 0 );
2079+ ExpectNotNull (hrrBuf );
2080+ ExpectIntGT (hrrSz , 0 );
2081+ test_memio_clear_buffer (& test_ctx , 0 );
2082+ }
2083+ test_memio_clear_buffer (& test_ctx , 1 );
2084+ ExpectIntEQ (wolfSSL_dtls_got_timeout (ssl_c ), 1 );
2085+ ExpectIntEQ (wolfDTLS_accept_stateless (ssl_s ), 0 );
2086+ ExpectIntEQ (wolfSSL_connect (ssl_c ), -1 );
2087+ ExpectIntEQ (wolfSSL_get_error (ssl_c , -1 ), WOLFSSL_ERROR_WANT_READ );
2088+ ExpectIntEQ (wolfDTLS_accept_stateless (ssl_s ), 1 );
2089+
2090+ ExpectIntEQ (test_memio_do_handshake (ssl_c , ssl_s , 10 , NULL ), 0 );
2091+
2092+ wolfSSL_free (ssl_s );
2093+ wolfSSL_free (ssl_c );
2094+ wolfSSL_CTX_free (ctx_s );
2095+ wolfSSL_CTX_free (ctx_c );
2096+ }
2097+ #endif
2098+ return EXPECT_RESULT ();
2099+ }
0 commit comments