added non-blocking and session resume as example server and client command line options

This commit is contained in:
John Safranek
2012-10-17 13:13:58 -07:00
parent d99c5d8e06
commit fe632a3f77
5 changed files with 543 additions and 191 deletions

View File

@@ -30,9 +30,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <pthread.h> #include <pthread.h>
#ifdef NON_BLOCKING
#include <fcntl.h> #include <fcntl.h>
#endif
#ifdef TEST_IPV6 #ifdef TEST_IPV6
#include <netdb.h> #include <netdb.h>
#endif #endif
@@ -549,7 +547,6 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, int* clientfd, func_args* args,
static INLINE void tcp_set_nonblocking(SOCKET_T* sockfd) static INLINE void tcp_set_nonblocking(SOCKET_T* sockfd)
{ {
#ifdef NON_BLOCKING
#ifdef USE_WINDOWS_API #ifdef USE_WINDOWS_API
unsigned long blocking = 1; unsigned long blocking = 1;
int ret = ioctlsocket(*sockfd, FIONBIO, &blocking); int ret = ioctlsocket(*sockfd, FIONBIO, &blocking);
@@ -557,8 +554,6 @@ static INLINE void tcp_set_nonblocking(SOCKET_T* sockfd)
int flags = fcntl(*sockfd, F_GETFL, 0); int flags = fcntl(*sockfd, F_GETFL, 0);
fcntl(*sockfd, F_SETFL, flags | O_NONBLOCK); fcntl(*sockfd, F_SETFL, flags | O_NONBLOCK);
#endif #endif
#endif
(void)sockfd;
} }

View File

@@ -28,10 +28,6 @@
#include "examples/client/client.h" #include "examples/client/client.h"
/*
#define TEST_RESUME
*/
#ifdef CYASSL_CALLBACKS #ifdef CYASSL_CALLBACKS
int handShakeCB(HandShakeInfo*); int handShakeCB(HandShakeInfo*);
@@ -39,7 +35,6 @@
Timeval timeout; Timeval timeout;
#endif #endif
#if defined(NON_BLOCKING) || defined(CYASSL_CALLBACKS)
static void NonBlockingSSL_Connect(CYASSL* ssl) static void NonBlockingSSL_Connect(CYASSL* ssl)
{ {
#ifndef CYASSL_CALLBACKS #ifndef CYASSL_CALLBACKS
@@ -85,7 +80,6 @@
if (ret != SSL_SUCCESS) if (ret != SSL_SUCCESS)
err_sys("SSL_connect failed"); err_sys("SSL_connect failed");
} }
#endif
static void Usage(void) static void Usage(void)
@@ -107,6 +101,8 @@ static void Usage(void)
printf("-g Send server HTTP GET\n"); printf("-g Send server HTTP GET\n");
printf("-u Use UDP DTLS\n"); printf("-u Use UDP DTLS\n");
printf("-m Match domain name in cert\n"); printf("-m Match domain name in cert\n");
printf("-n Use non-blocking sockets\n");
printf("-r Resume session\n");
} }
@@ -118,12 +114,10 @@ void client_test(void* args)
CYASSL_CTX* ctx = 0; CYASSL_CTX* ctx = 0;
CYASSL* ssl = 0; CYASSL* ssl = 0;
#ifdef TEST_RESUME
CYASSL* sslResume = 0; CYASSL* sslResume = 0;
CYASSL_SESSION* session = 0; CYASSL_SESSION* session = 0;
char resumeMsg[] = "resuming cyassl!"; char resumeMsg[] = "resuming cyassl!";
int resumeSz = sizeof(resumeMsg); int resumeSz = sizeof(resumeMsg);
#endif
char msg[64] = "hello cyassl!"; char msg[64] = "hello cyassl!";
char reply[1024]; char reply[1024];
@@ -142,6 +136,8 @@ void client_test(void* args)
int doDTLS = 0; int doDTLS = 0;
int matchName = 0; int matchName = 0;
int doPeerCheck = 1; int doPeerCheck = 1;
int nonBlocking = 0;
int resumeSession = 0;
char* cipherList = NULL; char* cipherList = NULL;
char* verifyCert = (char*)caCert; char* verifyCert = (char*)caCert;
char* ourCert = (char*)cliCert; char* ourCert = (char*)cliCert;
@@ -152,7 +148,7 @@ void client_test(void* args)
((func_args*)args)->return_code = -1; /* error state */ ((func_args*)args)->return_code = -1; /* error state */
while ((ch = mygetopt(argc, argv, "?gdusmh:p:v:l:A:c:k:b:")) != -1) { while ((ch = mygetopt(argc, argv, "?gdusmNrh:p:v:l:A:c:k:b:")) != -1) {
switch (ch) { switch (ch) {
case '?' : case '?' :
Usage(); Usage();
@@ -222,6 +218,14 @@ void client_test(void* args)
} }
break; break;
case 'N' :
nonBlocking = 1;
break;
case 'r' :
resumeSession = 1;
break;
default: default:
Usage(); Usage();
exit(MY_EX_USAGE); exit(MY_EX_USAGE);
@@ -363,24 +367,26 @@ void client_test(void* args)
#endif #endif
if (matchName && doPeerCheck) if (matchName && doPeerCheck)
CyaSSL_check_domain_name(ssl, domain); CyaSSL_check_domain_name(ssl, domain);
#ifdef NON_BLOCKING #ifndef CYASSL_CALLBACKS
if (nonBlocking) {
CyaSSL_set_using_nonblock(ssl, 1); CyaSSL_set_using_nonblock(ssl, 1);
tcp_set_nonblocking(&sockfd); tcp_set_nonblocking(&sockfd);
NonBlockingSSL_Connect(ssl); NonBlockingSSL_Connect(ssl);
#else }
#ifndef CYASSL_CALLBACKS else if (CyaSSL_connect(ssl) != SSL_SUCCESS) {
if (CyaSSL_connect(ssl) != SSL_SUCCESS) {/* see note at top of README */ /* see note at top of README */
int err = CyaSSL_get_error(ssl, 0); int err = CyaSSL_get_error(ssl, 0);
char buffer[80]; char buffer[80];
printf("err = %d, %s\n", err, CyaSSL_ERR_error_string(err, buffer)); printf("err = %d, %s\n", err,
err_sys("SSL_connect failed");/* if you're getting an error here */ CyaSSL_ERR_error_string(err, buffer));
err_sys("SSL_connect failed");
/* if you're getting an error here */
} }
#else #else
timeout.tv_sec = 2; timeout.tv_sec = 2;
timeout.tv_usec = 0; timeout.tv_usec = 0;
NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */ NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */
#endif #endif
#endif
showPeer(ssl); showPeer(ssl);
if (sendGET) { if (sendGET) {
@@ -409,7 +415,7 @@ void client_test(void* args)
} }
} }
#ifdef TEST_RESUME if (resumeSession) {
if (doDTLS) { if (doDTLS) {
strncpy(msg, "break", 6); strncpy(msg, "break", 6);
msgSz = (int)strlen(msg); msgSz = (int)strlen(msg);
@@ -418,14 +424,14 @@ void client_test(void* args)
} }
session = CyaSSL_get_session(ssl); session = CyaSSL_get_session(ssl);
sslResume = CyaSSL_new(ctx); sslResume = CyaSSL_new(ctx);
#endif }
if (doDTLS == 0) /* don't send alert after "break" command */ if (doDTLS == 0) /* don't send alert after "break" command */
CyaSSL_shutdown(ssl); /* echoserver will interpret as new conn */ CyaSSL_shutdown(ssl); /* echoserver will interpret as new conn */
CyaSSL_free(ssl); CyaSSL_free(ssl);
CloseSocket(sockfd); CloseSocket(sockfd);
#ifdef TEST_RESUME if (resumeSession) {
if (doDTLS) { if (doDTLS) {
SOCKADDR_IN_T addr; SOCKADDR_IN_T addr;
#ifdef USE_WINDOWS_API #ifdef USE_WINDOWS_API
@@ -444,20 +450,19 @@ void client_test(void* args)
CyaSSL_set_session(sslResume, session); CyaSSL_set_session(sslResume, session);
showPeer(sslResume); showPeer(sslResume);
#ifdef NON_BLOCKING #ifndef CYASSL_CALLBACKS
if (nonBlocking) {
CyaSSL_set_using_nonblock(sslResume, 1); CyaSSL_set_using_nonblock(sslResume, 1);
tcp_set_nonblocking(&sockfd); tcp_set_nonblocking(&sockfd);
NonBlockingSSL_Connect(sslResume); NonBlockingSSL_Connect(sslResume);
#else }
#ifndef CYASSL_CALLBACKS else if (CyaSSL_connect(sslResume) != SSL_SUCCESS)
if (CyaSSL_connect(sslResume) != SSL_SUCCESS)
err_sys("SSL resume failed"); err_sys("SSL resume failed");
#else #else
timeout.tv_sec = 2; timeout.tv_sec = 2;
timeout.tv_usec = 0; timeout.tv_usec = 0;
NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */ NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */
#endif #endif
#endif
#ifdef OPENSSL_EXTRA #ifdef OPENSSL_EXTRA
if (CyaSSL_session_reused(sslResume)) if (CyaSSL_session_reused(sslResume))
@@ -469,14 +474,14 @@ void client_test(void* args)
if (CyaSSL_write(sslResume, resumeMsg, resumeSz) != resumeSz) if (CyaSSL_write(sslResume, resumeMsg, resumeSz) != resumeSz)
err_sys("SSL_write failed"); err_sys("SSL_write failed");
#ifdef NON_BLOCKING if (nonBlocking) {
/* need to give server a chance to bounce a message back to client */ /* need to give server a chance to bounce a message back to client */
#ifdef USE_WINDOWS_API #ifdef USE_WINDOWS_API
Sleep(500); Sleep(500);
#else #else
sleep(1); sleep(1);
#endif #endif
#endif }
input = CyaSSL_read(sslResume, reply, sizeof(reply)); input = CyaSSL_read(sslResume, reply, sizeof(reply));
if (input > 0) { if (input > 0) {
@@ -489,7 +494,7 @@ void client_test(void* args)
CyaSSL_shutdown(sslResume); CyaSSL_shutdown(sslResume);
CyaSSL_free(sslResume); CyaSSL_free(sslResume);
#endif /* TEST_RESUME */ }
CyaSSL_CTX_free(ctx); CyaSSL_CTX_free(ctx);
CloseSocket(sockfd); CloseSocket(sockfd);

View File

@@ -35,7 +35,6 @@
Timeval srvTo; Timeval srvTo;
#endif #endif
#if defined(NON_BLOCKING) || defined(CYASSL_CALLBACKS)
static void NonBlockingSSL_Accept(SSL* ssl) static void NonBlockingSSL_Accept(SSL* ssl)
{ {
#ifndef CYASSL_CALLBACKS #ifndef CYASSL_CALLBACKS
@@ -79,7 +78,6 @@
if (ret != SSL_SUCCESS) if (ret != SSL_SUCCESS)
err_sys("SSL_accept failed"); err_sys("SSL_accept failed");
} }
#endif
static void Usage(void) static void Usage(void)
@@ -98,6 +96,7 @@ static void Usage(void)
printf("-b Bind to any interface instead of localhost only\n"); printf("-b Bind to any interface instead of localhost only\n");
printf("-s Use pre Shared keys\n"); printf("-s Use pre Shared keys\n");
printf("-u Use UDP DTLS\n"); printf("-u Use UDP DTLS\n");
printf("-N Use non-blocking sockets\n");
} }
@@ -121,6 +120,7 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
int usePsk = 0; int usePsk = 0;
int doDTLS = 0; int doDTLS = 0;
int useNtruKey = 0; int useNtruKey = 0;
int nonBlocking = 0;
char* cipherList = NULL; char* cipherList = NULL;
char* verifyCert = (char*)cliCert; char* verifyCert = (char*)cliCert;
char* ourCert = (char*)svrCert; char* ourCert = (char*)svrCert;
@@ -130,7 +130,7 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
((func_args*)args)->return_code = -1; /* error state */ ((func_args*)args)->return_code = -1; /* error state */
while ((ch = mygetopt(argc, argv, "?dbsnup:v:l:A:c:k:")) != -1) { while ((ch = mygetopt(argc, argv, "?dbsnNup:v:l:A:c:k:")) != -1) {
switch (ch) { switch (ch) {
case '?' : case '?' :
Usage(); Usage();
@@ -187,6 +187,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
ourKey = myoptarg; ourKey = myoptarg;
break; break;
case 'N':
nonBlocking = 1;
break;
default: default:
Usage(); Usage();
exit(MY_EX_USAGE); exit(MY_EX_USAGE);
@@ -310,13 +314,12 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
#endif #endif
#endif #endif
#ifdef NON_BLOCKING #ifndef CYASSL_CALLBACKS
if (nonBlocking) {
CyaSSL_set_using_nonblock(ssl, 1); CyaSSL_set_using_nonblock(ssl, 1);
tcp_set_nonblocking(&clientfd); tcp_set_nonblocking(&clientfd);
NonBlockingSSL_Accept(ssl); NonBlockingSSL_Accept(ssl);
#else } else if (SSL_accept(ssl) != SSL_SUCCESS) {
#ifndef CYASSL_CALLBACKS
if (SSL_accept(ssl) != SSL_SUCCESS) {
int err = SSL_get_error(ssl, 0); int err = SSL_get_error(ssl, 0);
char buffer[80]; char buffer[80];
printf("error = %d, %s\n", err, ERR_error_string(err, buffer)); printf("error = %d, %s\n", err, ERR_error_string(err, buffer));
@@ -325,7 +328,6 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
#else #else
NonBlockingSSL_Accept(ssl); NonBlockingSSL_Accept(ssl);
#endif #endif
#endif
showPeer(ssl); showPeer(ssl);
idx = SSL_read(ssl, input, sizeof(input)); idx = SSL_read(ssl, input, sizeof(input));

View File

@@ -62,3 +62,83 @@
-u -u
-l RABBIT-SHA -l RABBIT-SHA
# server DTLSv1 RC4-SHA NON-BLOCKING
-u
-l RC4-SHA
-N
# client DTLSv1 RC4-SHA NON-BLOCKING
-u
-l RC4-SHA
-N
# server DTLSv1 RC4-MD5 NON-BLOCKING
-u
-l RC4-MD5
-N
# client DTLSv1 RC4-MD5 NON-BLOCKING
-u
-l RC4-MD5
-N
# server DTLSv1 DES-CBC3-SHA NON-BLOCKING
-u
-l DES-CBC3-SHA
-N
# client DTLSv1 DES-CBC3-SHA NON-BLOCKING
-u
-l DES-CBC3-SHA
-N
# server DTLSv1 AES128-SHA NON-BLOCKING
-u
-l AES128-SHA
-N
# client DTLSv1 AES128-SHA NON-BLOCKING
-u
-l AES128-SHA
-N
# server DTLSv1 AES256-SHA NON-BLOCKING
-u
-l AES256-SHA
-N
# client DTLSv1 AES256-SHA NON-BLOCKING
-u
-l AES256-SHA
-N
# server DTLSv1 AES128-SHA256 NON-BLOCKING
-u
-l AES128-SHA256
-N
# client DTLSv1 AES128-SHA256 NON-BLOCKING
-u
-l AES128-SHA256
-N
# server DTLSv1 AES256-SHA256 NON-BLOCKING
-u
-l AES256-SHA256
-N
# client DTLSv1 AES256-SHA256 NON-BLOCKING
-u
-l AES256-SHA256
-N
# server DTLSv1 RABBIT-SHA NON-BLOCKING
-u
-l RABBIT-SHA
-N
# client DTLSv1 RABBIT-SHA NON-BLOCKING
-u
-l RABBIT-SHA
-N

View File

@@ -214,3 +214,273 @@
-v 3 -v 3
-l RABBIT-SHA -l RABBIT-SHA
# server SSLv3 RC4-SHA NON-BLOCKING
-v 0
-l RC4-SHA
-N
# client SSLv3 RC4-SHA NON-BLOCKING
-v 0
-l RC4-SHA
-N
# server SSLv3 RC4-MD5 NON-BLOCKING
-v 0
-l RC4-MD5
-N
# client SSLv3 RC4-MD5 NON-BLOCKING
-v 0
-l RC4-MD5
-N
# server SSLv3 DES-CBC3-SHA NON-BLOCKING
-v 0
-l DES-CBC3-SHA
-N
# client SSLv3 DES-CBC3-SHA NON-BLOCKING
-v 0
-l DES-CBC3-SHA
-N
# server TLSv1 RC4-SHA NON-BLOCKING
-v 1
-l RC4-SHA
-N
# client TLSv1 RC4-SHA NON-BLOCKING
-v 1
-l RC4-SHA
-N
# server TLSv1 RC4-MD5 NON-BLOCKING
-v 1
-l RC4-MD5
-N
# client TLSv1 RC4-MD5 NON-BLOCKING
-v 1
-l RC4-MD5
-N
# server TLSv1 DES-CBC3-SHA NON-BLOCKING
-v 1
-l DES-CBC3-SHA
-N
# client TLSv1 DES-CBC3-SHA NON-BLOCKING
-v 1
-l DES-CBC3-SHA
-N
# server TLSv1 AES128-SHA NON-BLOCKING
-v 1
-l AES128-SHA
-N
# client TLSv1 AES128-SHA NON-BLOCKING
-v 1
-l AES128-SHA
-N
# server TLSv1 AES256-SHA NON-BLOCKING
-v 1
-l AES256-SHA
-N
# client TLSv1 AES256-SHA NON-BLOCKING
-v 1
-l AES256-SHA
-N
# server TLSv1 AES128-SHA256 NON-BLOCKING
-v 1
-l AES128-SHA256
-N
# client TLSv1 AES128-SHA256 NON-BLOCKING
-v 1
-l AES128-SHA256
-N
# server TLSv1 AES256-SHA256 NON-BLOCKING
-v 1
-l AES256-SHA256
-N
# client TLSv1 AES256-SHA256 NON-BLOCKING
-v 1
-l AES256-SHA256
-N
# server TLSv1 RABBIT-SHA NON-BLOCKING
-v 1
-l RABBIT-SHA
-N
# client TLSv1 RABBIT-SHA NON-BLOCKING
-v 1
-l RABBIT-SHA
-N
# server TLSv1.1 RC4-SHA NON-BLOCKING
-v 2
-l RC4-SHA
-N
# client TLSv1.1 RC4-SHA NON-BLOCKING
-v 2
-l RC4-SHA
-N
# server TLSv1.1 RC4-MD5 NON-BLOCKING
-v 2
-l RC4-MD5
-N
# client TLSv1.1 RC4-MD5 NON-BLOCKING
-v 2
-l RC4-MD5
-N
# server TLSv1.1 DES-CBC3-SHA NON-BLOCKING
-v 2
-l DES-CBC3-SHA
-N
# client TLSv1.1 DES-CBC3-SHA NON-BLOCKING
-v 2
-l DES-CBC3-SHA
-N
# server TLSv1.1 AES128-SHA NON-BLOCKING
-v 2
-l AES128-SHA
-N
# client TLSv1.1 AES128-SHA NON-BLOCKING
-v 2
-l AES128-SHA
-N
# server TLSv1.1 AES256-SHA NON-BLOCKING
-v 2
-l AES256-SHA
-N
# client TLSv1.1 AES256-SHA NON-BLOCKING
-v 2
-l AES256-SHA
-N
# server TLSv1.1 AES128-SHA256 NON-BLOCKING
-v 2
-l AES128-SHA256
-N
# client TLSv1.1 AES128-SHA256 NON-BLOCKING
-v 2
-l AES128-SHA256
-N
# server TLSv1.1 AES256-SHA256 NON-BLOCKING
-v 2
-l AES256-SHA256
-N
# client TLSv1.1 AES256-SHA256 NON-BLOCKING
-v 2
-l AES256-SHA256
-N
# server TLSv1.1 RABBIT-SHA NON-BLOCKING
-v 2
-l RABBIT-SHA
-N
# client TLSv1.1 RABBIT-SHA NON-BLOCKING
-v 2
-l RABBIT-SHA
-N
# server TLSv1.2 RC4-SHA NON-BLOCKING
-v 3
-l RC4-SHA
-N
# client TLSv1.2 RC4-SHA NON-BLOCKING
-v 3
-l RC4-SHA
-N
# server TLSv1.2 RC4-MD5 NON-BLOCKING
-v 3
-l RC4-MD5
-N
# client TLSv1.2 RC4-MD5 NON-BLOCKING
-v 3
-l RC4-MD5
-N
# server TLSv1.2 DES-CBC3-SHA NON-BLOCKING
-v 3
-l DES-CBC3-SHA
-N
# client TLSv1.2 DES-CBC3-SHA NON-BLOCKING
-v 3
-l DES-CBC3-SHA
-N
# server TLSv1.2 AES128-SHA NON-BLOCKING
-v 3
-l AES128-SHA
-N
# client TLSv1.2 AES128-SHA NON-BLOCKING
-v 3
-l AES128-SHA
-N
# server TLSv1.2 AES256-SHA NON-BLOCKING
-v 3
-l AES256-SHA
-N
# client TLSv1.2 AES256-SHA NON-BLOCKING
-v 3
-l AES256-SHA
-N
# server TLSv1.2 AES128-SHA256 NON-BLOCKING
-v 3
-l AES128-SHA256
-N
# client TLSv1.2 AES128-SHA256 NON-BLOCKING
-v 3
-l AES128-SHA256
-N
# server TLSv1.2 AES256-SHA256 NON-BLOCKING
-v 3
-l AES256-SHA256
-N
# client TLSv1.2 AES256-SHA256 NON-BLOCKING
-v 3
-l AES256-SHA256
-N
# server TLSv1.2 RABBIT-SHA NON-BLOCKING
-v 3
-l RABBIT-SHA
-N
# client TLSv1.2 RABBIT-SHA NON-BLOCKING
-v 3
-l RABBIT-SHA
-N