@@ -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+ }
0 commit comments