static int NonBlockingSSL_Accept(SSL* ssl) { #ifndef CYASSL_CALLBACKS int ret = SSL_accept(ssl); #else int ret = CyaSSL_accept_ex(ssl, srvHandShakeCB, srvTimeoutCB, srvTo); #endif int error = SSL_get_error(ssl, 0); SOCKET_T sockfd = (SOCKET_T)CyaSSL_get_fd(ssl); int select_ret; while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE)) { int currTimeout = 1; if (error == SSL_ERROR_WANT_READ) { /* printf("... server would read block\n"); */ } else { /* printf("... server would write block\n"); */ } #ifdef CYASSL_DTLS currTimeout = CyaSSL_dtls_get_current_timeout(ssl); #endif select_ret = tcp_select(sockfd, currTimeout); if ((select_ret == TEST_RECV_READY) || (select_ret == TEST_ERROR_READY)) { #ifndef CYASSL_CALLBACKS ret = SSL_accept(ssl); #else ret = CyaSSL_accept_ex(ssl, srvHandShakeCB, srvTimeoutCB, srvTo); #endif error = SSL_get_error(ssl, 0); } else if (select_ret == TEST_TIMEOUT && !CyaSSL_dtls(ssl)) { error = SSL_ERROR_WANT_READ; } #ifdef CYASSL_DTLS else if (select_ret == TEST_TIMEOUT && CyaSSL_dtls(ssl) && CyaSSL_dtls_got_timeout(ssl) >= 0) { error = SSL_ERROR_WANT_READ; } #endif else { error = SSL_FATAL_ERROR; } } return ret; }
static void NonBlockingSSL_Connect(CYASSL* ssl) { #ifndef CYASSL_CALLBACKS int ret = CyaSSL_connect(ssl); #else int ret = CyaSSL_connect_ex(ssl, handShakeCB, timeoutCB, timeout); #endif int error = CyaSSL_get_error(ssl, 0); SOCKET_T sockfd = (SOCKET_T)CyaSSL_get_fd(ssl); int select_ret; while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE)) { int currTimeout = 1; if (error == SSL_ERROR_WANT_READ) printf("... client would read block\n"); else printf("... client would write block\n"); #ifdef CYASSL_DTLS currTimeout = CyaSSL_dtls_get_current_timeout(ssl); #endif select_ret = tcp_select(sockfd, currTimeout); if ((select_ret == TEST_RECV_READY) || (select_ret == TEST_ERROR_READY)) { #ifndef CYASSL_CALLBACKS ret = CyaSSL_connect(ssl); #else ret = CyaSSL_connect_ex(ssl,handShakeCB,timeoutCB,timeout); #endif error = CyaSSL_get_error(ssl, 0); } else if (select_ret == TEST_TIMEOUT && !CyaSSL_dtls(ssl)) { error = SSL_ERROR_WANT_READ; } #ifdef CYASSL_DTLS else if (select_ret == TEST_TIMEOUT && CyaSSL_dtls(ssl) && CyaSSL_dtls_got_timeout(ssl) >= 0) { error = SSL_ERROR_WANT_READ; } #endif else { error = SSL_FATAL_ERROR; } } if (ret != SSL_SUCCESS) err_sys("SSL_connect failed"); }
static void NonBlockingSSL_Accept(SSL* ssl) { #ifndef CYASSL_CALLBACKS int ret = SSL_accept(ssl); #else int ret = CyaSSL_accept_ex(ssl, srvHandShakeCB, srvTimeoutCB, srvTo); #endif int error = SSL_get_error(ssl, 0); SOCKET_T sockfd = (SOCKET_T)CyaSSL_get_fd(ssl); int select_ret; while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE)) { if (error == SSL_ERROR_WANT_READ) printf("... server would read block\n"); else printf("... server would write block\n"); if (CyaSSL_dtls(ssl)) select_ret = tcp_select(sockfd, CyaSSL_dtls_get_current_timeout(ssl)); else select_ret = tcp_select(sockfd, 1); if ((select_ret == TEST_RECV_READY) || (select_ret == TEST_ERROR_READY)) { #ifndef CYASSL_CALLBACKS ret = SSL_accept(ssl); #else ret = CyaSSL_accept_ex(ssl, srvHandShakeCB, srvTimeoutCB, srvTo); #endif error = SSL_get_error(ssl, 0); } else if (select_ret == TEST_TIMEOUT && (!CyaSSL_dtls(ssl) || (CyaSSL_dtls_got_timeout(ssl) >= 0))) { error = SSL_ERROR_WANT_READ; } else { error = SSL_FATAL_ERROR; } } if (ret != SSL_SUCCESS) err_sys("SSL_accept failed"); }
/* Connect using Nonblocking - DTLS version */ static void NonBlockingDTLS_Connect(CYASSL* ssl) { int ret = CyaSSL_connect(ssl); int error = CyaSSL_get_error(ssl, 0); int sockfd = (int)CyaSSL_get_fd(ssl); int select_ret; while (ret != SSL_SUCCESS && (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE)) { int currTimeout = 1; if (error == SSL_ERROR_WANT_READ) printf("... client would read block\n"); else printf("... client would write block\n"); currTimeout = CyaSSL_dtls_get_current_timeout(ssl); select_ret = dtls_select(sockfd, currTimeout); if ( ( select_ret == TEST_RECV_READY) || (select_ret == TEST_ERROR_READY)) { ret = CyaSSL_connect(ssl); error = CyaSSL_get_error(ssl, 0); } else if (select_ret == TEST_TIMEOUT && !CyaSSL_dtls(ssl)) { error = 2; } else if (select_ret == TEST_TIMEOUT && CyaSSL_dtls(ssl) && CyaSSL_dtls_got_timeout(ssl) >= 0) { error = 2; } else{ error = SSL_FATAL_ERROR; } } if (ret != SSL_SUCCESS) { printf("SSL_connect failed with"); } }
/* * function with specific parameters : inbetween process of receiving msg * based from embeded receive in src/io.c */ int CbIORecv(CYASSL *ssl, char *buf, int sz, void *ctx) { int recvd; int sd = *(int*)ctx; recvd = recv(sd, buf, sz, 0); if (recvd < 0) { if (errno == SOCKET_EWOULDBLOCK || errno == SOCKET_EAGAIN) { if (!CyaSSL_dtls(ssl) || CyaSSL_get_using_nonblock(ssl)) { printf(" Would block\n"); return CYASSL_CBIO_ERR_WANT_READ; } else { printf("Socket timeout\n"); return CYASSL_CBIO_ERR_TIMEOUT; } } else if (errno == SOCKET_ECONNRESET) { printf("Connection reset\n"); return CYASSL_CBIO_ERR_CONN_RST; } else if (errno == SOCKET_EINTR) { printf("Socket interrupted\n"); return CYASSL_CBIO_ERR_ISR; } else if (errno == SOCKET_ECONNREFUSED) { printf("Connection refused\n"); return CYASSL_CBIO_ERR_WANT_READ; } else if (errno == SOCKET_ECONNABORTED) { printf("Connection aborted\n"); return CYASSL_CBIO_ERR_CONN_CLOSE; } else { printf("General error\n"); return CYASSL_CBIO_ERR_GENERAL; } } else if (recvd == 0) { printf("Embed receive connection closed\n"); return CYASSL_CBIO_ERR_CONN_CLOSE; } printf("Received %d bytes\n", sz); return recvd; }
/* The receive embedded callback * return : nb bytes read, or error */ int EmbedReceive(CYASSL *ssl, char *buf, int sz, void *ctx) { int recvd; int err; int sd = *(int*)ctx; #ifdef CYASSL_DTLS { int dtls_timeout = CyaSSL_dtls_get_current_timeout(ssl); if (CyaSSL_dtls(ssl) && !CyaSSL_get_using_nonblock(ssl) && dtls_timeout != 0) { #ifdef USE_WINDOWS_API DWORD timeout = dtls_timeout * 1000; #else struct timeval timeout; XMEMSET(&timeout, 0, sizeof(timeout)); timeout.tv_sec = dtls_timeout; #endif if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) != 0) { CYASSL_MSG("setsockopt rcvtimeo failed"); } } } #endif recvd = (int)RECV_FUNCTION(sd, buf, sz, ssl->rflags); recvd = TranslateReturnCode(recvd, sd); if (recvd < 0) { err = LastError(); CYASSL_MSG("Embed Receive error"); if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) { if (!CyaSSL_dtls(ssl) || CyaSSL_get_using_nonblock(ssl)) { CYASSL_MSG(" Would block"); return CYASSL_CBIO_ERR_WANT_READ; } else { CYASSL_MSG(" Socket timeout"); return CYASSL_CBIO_ERR_TIMEOUT; } } else if (err == SOCKET_ECONNRESET) { CYASSL_MSG(" Connection reset"); return CYASSL_CBIO_ERR_CONN_RST; } else if (err == SOCKET_EINTR) { CYASSL_MSG(" Socket interrupted"); return CYASSL_CBIO_ERR_ISR; } else if (err == SOCKET_ECONNREFUSED) { CYASSL_MSG(" Connection refused"); return CYASSL_CBIO_ERR_WANT_READ; } else if (err == SOCKET_ECONNABORTED) { CYASSL_MSG(" Connection aborted"); return CYASSL_CBIO_ERR_CONN_CLOSE; } else { CYASSL_MSG(" General error"); return CYASSL_CBIO_ERR_GENERAL; } } else if (recvd == 0) { CYASSL_MSG("Embed receive connection closed"); return CYASSL_CBIO_ERR_CONN_CLOSE; } return recvd; }