Merge branch 'master' of github.com:cyassl/cyassl

This commit is contained in:
toddouska
2013-03-27 15:12:44 -07:00
10 changed files with 164 additions and 39 deletions

2
.gitignore vendored
View File

@ -78,3 +78,5 @@ clang_output_*
internal.plist internal.plist
cov-int cov-int
cyassl.tgz cyassl.tgz
*.log
*.trs

View File

@ -35,7 +35,7 @@
#include <cyassl/ctaocrypt/sha256.h> #include <cyassl/ctaocrypt/sha256.h>
#endif #endif
#ifdef CYASSL_SHA384 #ifdef CYASSL_SHA512
#include <cyassl/ctaocrypt/sha512.h> #include <cyassl/ctaocrypt/sha512.h>
#endif #endif

View File

@ -131,6 +131,7 @@
typedef struct tcp_ready { typedef struct tcp_ready {
int ready; /* predicate */ int ready; /* predicate */
int port;
#ifdef _POSIX_THREADS #ifdef _POSIX_THREADS
pthread_mutex_t mutex; pthread_mutex_t mutex;
pthread_cond_t cond; pthread_cond_t cond;
@ -454,14 +455,14 @@ static INLINE int tcp_select(SOCKET_T socketfd, int to_sec)
} }
static INLINE void tcp_listen(SOCKET_T* sockfd, int port, int useAnyAddr, static INLINE void tcp_listen(SOCKET_T* sockfd, int* port, int useAnyAddr,
int udp) int udp)
{ {
SOCKADDR_IN_T addr; SOCKADDR_IN_T addr;
/* don't use INADDR_ANY by default, firewall may block, make user switch /* don't use INADDR_ANY by default, firewall may block, make user switch
on */ on */
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), port); build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), *port);
tcp_socket(sockfd, udp); tcp_socket(sockfd, udp);
#ifndef USE_WINDOWS_API #ifndef USE_WINDOWS_API
@ -480,6 +481,14 @@ static INLINE void tcp_listen(SOCKET_T* sockfd, int port, int useAnyAddr,
if (listen(*sockfd, 5) != 0) if (listen(*sockfd, 5) != 0)
err_sys("tcp listen failed"); err_sys("tcp listen failed");
} }
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
if (*port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0)
*port = ntohs(addr.sin_port);
}
#endif
} }
@ -504,12 +513,12 @@ static INLINE int udp_read_connect(SOCKET_T sockfd)
} }
static INLINE void udp_accept(SOCKET_T* sockfd, int* clientfd, int useAnyAddr, static INLINE void udp_accept(SOCKET_T* sockfd, int* clientfd, int useAnyAddr,
func_args* args) int port, func_args* args)
{ {
SOCKADDR_IN_T addr; SOCKADDR_IN_T addr;
(void)args; (void)args;
build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), yasslPort); build_addr(&addr, (useAnyAddr ? INADDR_ANY : yasslIP), port);
tcp_socket(sockfd, 1); tcp_socket(sockfd, 1);
@ -526,12 +535,22 @@ static INLINE void udp_accept(SOCKET_T* sockfd, int* clientfd, int useAnyAddr,
if (bind(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0) if (bind(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0)
err_sys("tcp bind failed"); err_sys("tcp bind failed");
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
if (port == 0)
{
socklen_t len = sizeof(addr);
if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0)
port = ntohs(addr.sin_port);
}
#endif
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) #if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to accept data */ /* signal ready to accept data */
{ {
tcp_ready* ready = args->signal; tcp_ready* ready = args->signal;
pthread_mutex_lock(&ready->mutex); pthread_mutex_lock(&ready->mutex);
ready->ready = 1; ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond); pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex); pthread_mutex_unlock(&ready->mutex);
} }
@ -547,11 +566,11 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, int* clientfd, func_args* args,
socklen_t client_len = sizeof(client); socklen_t client_len = sizeof(client);
if (udp) { if (udp) {
udp_accept(sockfd, clientfd, useAnyAddr, args); udp_accept(sockfd, clientfd, useAnyAddr, port, args);
return; return;
} }
tcp_listen(sockfd, port, useAnyAddr, udp); tcp_listen(sockfd, &port, useAnyAddr, udp);
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) #if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to tcp_accept */ /* signal ready to tcp_accept */
@ -559,6 +578,7 @@ static INLINE void tcp_accept(SOCKET_T* sockfd, int* clientfd, func_args* args,
tcp_ready* ready = args->signal; tcp_ready* ready = args->signal;
pthread_mutex_lock(&ready->mutex); pthread_mutex_lock(&ready->mutex);
ready->ready = 1; ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond); pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex); pthread_mutex_unlock(&ready->mutex);
} }

View File

@ -94,7 +94,7 @@ static void Usage(void)
" NOTE: All files relative to CyaSSL home dir\n"); " NOTE: All files relative to CyaSSL home dir\n");
printf("-? Help, print this usage\n"); printf("-? Help, print this usage\n");
printf("-h <host> Host to connect to, default %s\n", yasslIP); printf("-h <host> Host to connect to, default %s\n", yasslIP);
printf("-p <num> Port to connect on, default %d\n", yasslPort); printf("-p <num> Port to connect on, not 0, default %d\n", yasslPort);
printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n", printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n",
CLIENT_DEFAULT_VERSION); CLIENT_DEFAULT_VERSION);
printf("-l <str> Cipher list\n"); printf("-l <str> Cipher list\n");
@ -206,6 +206,10 @@ void client_test(void* args)
case 'p' : case 'p' :
port = atoi(myoptarg); port = atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0)
err_sys("port number cannot be 0");
#endif
break; break;
case 'v' : case 'v' :

View File

@ -50,6 +50,7 @@ void echoclient_test(void* args)
int sendSz; int sendSz;
int argc = 0; int argc = 0;
char** argv = 0; char** argv = 0;
int port = yasslPort;
((func_args*)args)->return_code = -1; /* error state */ ((func_args*)args)->return_code = -1; /* error state */
argc = ((func_args*)args)->argc; argc = ((func_args*)args)->argc;
@ -79,6 +80,10 @@ void echoclient_test(void* args)
doPSK = 1; doPSK = 1;
#endif #endif
#if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
port = ((func_args*)args)->signal->port;
#endif
#if defined(CYASSL_DTLS) #if defined(CYASSL_DTLS)
method = DTLSv1_client_method(); method = DTLSv1_client_method();
#elif !defined(NO_TLS) #elif !defined(NO_TLS)
@ -128,12 +133,12 @@ void echoclient_test(void* args)
if (doDTLS) { if (doDTLS) {
SOCKADDR_IN_T addr; SOCKADDR_IN_T addr;
build_addr(&addr, yasslIP, yasslPort); build_addr(&addr, yasslIP, port);
CyaSSL_dtls_set_peer(ssl, &addr, sizeof(addr)); CyaSSL_dtls_set_peer(ssl, &addr, sizeof(addr));
tcp_socket(&sockfd, 1); tcp_socket(&sockfd, 1);
} }
else { else {
tcp_connect(&sockfd, yasslIP, yasslPort, 0); tcp_connect(&sockfd, yasslIP, port, 0);
} }
SSL_set_fd(ssl, sockfd); SSL_set_fd(ssl, sockfd);

View File

@ -38,7 +38,7 @@
#endif #endif
static void SignalReady(void* args) static void SignalReady(void* args, int port)
{ {
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) #if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER)
/* signal ready to tcp_accept */ /* signal ready to tcp_accept */
@ -46,10 +46,12 @@ static void SignalReady(void* args)
tcp_ready* ready = server_args->signal; tcp_ready* ready = server_args->signal;
pthread_mutex_lock(&ready->mutex); pthread_mutex_lock(&ready->mutex);
ready->ready = 1; ready->ready = 1;
ready->port = port;
pthread_cond_signal(&ready->cond); pthread_cond_signal(&ready->cond);
pthread_mutex_unlock(&ready->mutex); pthread_mutex_unlock(&ready->mutex);
#endif #endif
(void)args; (void)args;
(void)port;
} }
@ -64,6 +66,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
int outCreated = 0; int outCreated = 0;
int shutDown = 0; int shutDown = 0;
int useAnyAddr = 0; int useAnyAddr = 0;
int port = yasslPort;
int argc = ((func_args*)args)->argc; int argc = ((func_args*)args)->argc;
char** argv = ((func_args*)args)->argv; char** argv = ((func_args*)args)->argv;
@ -93,7 +96,10 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
doPSK = 1; doPSK = 1;
#endif #endif
tcp_listen(&sockfd, yasslPort, useAnyAddr, doDTLS); #if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API)
port = 0;
#endif
tcp_listen(&sockfd, &port, useAnyAddr, doDTLS);
#if defined(CYASSL_DTLS) #if defined(CYASSL_DTLS)
method = CyaDTLSv1_server_method(); method = CyaDTLSv1_server_method();
@ -176,7 +182,7 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
#endif #endif
} }
SignalReady(args); SignalReady(args, port);
while (!shutDown) { while (!shutDown) {
CYASSL* ssl = 0; CYASSL* ssl = 0;
@ -279,8 +285,8 @@ THREAD_RETURN CYASSL_THREAD echoserver_test(void* args)
CyaSSL_free(ssl); CyaSSL_free(ssl);
CloseSocket(clientfd); CloseSocket(clientfd);
#ifdef CYASSL_DTLS #ifdef CYASSL_DTLS
tcp_listen(&sockfd, yasslPort, useAnyAddr, doDTLS); tcp_listen(&sockfd, &port, useAnyAddr, doDTLS);
SignalReady(args); SignalReady(args, port);
#endif #endif
} }

View File

@ -93,7 +93,7 @@ static void Usage(void)
printf("server " LIBCYASSL_VERSION_STRING printf("server " LIBCYASSL_VERSION_STRING
" NOTE: All files relative to CyaSSL home dir\n"); " NOTE: All files relative to CyaSSL home dir\n");
printf("-? Help, print this usage\n"); printf("-? Help, print this usage\n");
printf("-p <num> Port to listen on, default %d\n", yasslPort); printf("-p <num> Port to listen on, not 0, default %d\n", yasslPort);
printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n", printf("-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default %d\n",
SERVER_DEFAULT_VERSION); SERVER_DEFAULT_VERSION);
printf("-l <str> Cipher list\n"); printf("-l <str> Cipher list\n");
@ -182,6 +182,10 @@ THREAD_RETURN CYASSL_THREAD server_test(void* args)
case 'p' : case 'p' :
port = atoi(myoptarg); port = atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
if (port == 0)
err_sys("port number cannot be 0");
#endif
break; break;
case 'v' : case 'v' :

View File

@ -43,7 +43,9 @@
CYASSL_CTX* cipherSuiteCtx = NULL; CYASSL_CTX* cipherSuiteCtx = NULL;
char nonblockFlag[] = "-N"; char nonblockFlag[] = "-N";
char noVerifyFlag[] = "-d"; char noVerifyFlag[] = "-d";
char portFlag[] = "-p";
char flagSep[] = " "; char flagSep[] = " ";
char svrPort[] = "0";
#ifdef NO_OLD_TLS #ifdef NO_OLD_TLS
@ -156,11 +158,10 @@ static int execute_test_case(int svr_argc, char** svr_argv,
if (addNoVerify) { if (addNoVerify) {
printf("repeating test with client cert request off\n"); printf("repeating test with client cert request off\n");
added += 4; /* -d plus space plus terminator */ added += 4; /* -d plus space plus terminator */
if (added >= MAX_COMMAND_SZ) if (added >= MAX_COMMAND_SZ || svr_argc >= MAX_ARGS)
printf("server command line too long\n"); printf("server command line too long\n");
else { else {
svr_argv[svr_argc] = noVerifyFlag; svr_argv[svr_argc++] = noVerifyFlag;
svr_argc++;
svrArgs.argc = svr_argc; svrArgs.argc = svr_argc;
strcat(commandLine, noVerifyFlag); strcat(commandLine, noVerifyFlag);
strcat(commandLine, flagSep); strcat(commandLine, flagSep);
@ -169,16 +170,26 @@ static int execute_test_case(int svr_argc, char** svr_argv,
if (addNonBlocking) { if (addNonBlocking) {
printf("repeating test with non blocking on\n"); printf("repeating test with non blocking on\n");
added += 4; /* -N plus terminator */ added += 4; /* -N plus terminator */
if (added >= MAX_COMMAND_SZ) if (added >= MAX_COMMAND_SZ || svr_argc >= MAX_ARGS)
printf("server command line too long\n"); printf("server command line too long\n");
else { else {
svr_argv[svr_argc] = nonblockFlag; svr_argv[svr_argc++] = nonblockFlag;
svr_argc++;
svrArgs.argc = svr_argc; svrArgs.argc = svr_argc;
strcat(commandLine, nonblockFlag); strcat(commandLine, nonblockFlag);
strcat(commandLine, flagSep); strcat(commandLine, flagSep);
} }
} }
#ifndef USE_WINDOWS_API
/* add port 0 */
if (svr_argc + 2 > MAX_ARGS)
printf("cannot add the magic port number flag to server\n");
else
{
svr_argv[svr_argc++] = portFlag;
svr_argv[svr_argc++] = svrPort;
svrArgs.argc = svr_argc;
}
#endif
printf("trying server command line[%d]: %s\n", tests, commandLine); printf("trying server command line[%d]: %s\n", tests, commandLine);
commandLine[0] = '\0'; commandLine[0] = '\0';
@ -197,11 +208,10 @@ static int execute_test_case(int svr_argc, char** svr_argv,
if (added >= MAX_COMMAND_SZ) if (added >= MAX_COMMAND_SZ)
printf("client command line too long\n"); printf("client command line too long\n");
else { else {
cli_argv[cli_argc] = nonblockFlag; cli_argv[cli_argc++] = nonblockFlag;
cli_argc++;
cliArgs.argc = cli_argc;
strcat(commandLine, nonblockFlag); strcat(commandLine, nonblockFlag);
strcat(commandLine, flagSep); strcat(commandLine, flagSep);
cliArgs.argc = cli_argc;
} }
} }
printf("trying client command line[%d]: %s\n", tests++, commandLine); printf("trying client command line[%d]: %s\n", tests++, commandLine);
@ -212,7 +222,20 @@ static int execute_test_case(int svr_argc, char** svr_argv,
svrArgs.signal = &ready; svrArgs.signal = &ready;
start_thread(server_test, &svrArgs, &serverThread); start_thread(server_test, &svrArgs, &serverThread);
wait_tcp_ready(&svrArgs); wait_tcp_ready(&svrArgs);
#ifndef USE_WINDOWS_API
if (ready.port != 0)
{
if (cli_argc + 2 > MAX_ARGS)
printf("cannot add the magic port number flag to client\n");
else {
char portNumber[8];
snprintf(portNumber, sizeof(portNumber), "%d", ready.port);
cli_argv[cli_argc++] = portFlag;
cli_argv[cli_argc++] = portNumber;
cliArgs.argc = cli_argc;
}
}
#endif
/* start client */ /* start client */
client_test(&cliArgs); client_test(&cliArgs);

View File

@ -94,6 +94,7 @@ void join_thread(THREAD_TYPE thread)
void InitTcpReady(tcp_ready* ready) void InitTcpReady(tcp_ready* ready)
{ {
ready->ready = 0; ready->ready = 0;
ready->port = 0;
#ifdef _POSIX_THREADS #ifdef _POSIX_THREADS
pthread_mutex_init(&ready->mutex, 0); pthread_mutex_init(&ready->mutex, 0);
pthread_cond_init(&ready->cond, 0); pthread_cond_init(&ready->cond, 0);

View File

@ -43,6 +43,8 @@ void client_test(void*);
void file_test(const char* file, byte* hash); void file_test(const char* file, byte* hash);
void simple_test(func_args*);
enum { enum {
NUMARGS = 3 NUMARGS = 3
}; };
@ -54,7 +56,6 @@ char* myoptarg = NULL;
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
func_args args;
func_args server_args; func_args server_args;
tcp_ready ready; tcp_ready ready;
@ -68,8 +69,8 @@ int main(int argc, char** argv)
StartTCP(); StartTCP();
args.argc = server_args.argc = argc; server_args.argc = argc;
args.argv = server_args.argv = argv; server_args.argv = argv;
CyaSSL_Init(); CyaSSL_Init();
#if defined(DEBUG_CYASSL) && !defined(HAVE_VALGRIND) #if defined(DEBUG_CYASSL) && !defined(HAVE_VALGRIND)
@ -81,19 +82,15 @@ int main(int argc, char** argv)
else if (CurrentDir("build")) /* Xcode->Preferences->Locations->Build */ else if (CurrentDir("build")) /* Xcode->Preferences->Locations->Build */
ChangeDirBack(2); /* Location "Place build product in locations ChangeDirBack(2); /* Location "Place build product in locations
specified by targets", uses build/Debug */ specified by targets", uses build/Debug */
server_args.signal = &ready;
InitTcpReady(&ready);
/* CTaoCrypt test */ /* CTaoCrypt test */
ctaocrypt_test(&args); ctaocrypt_test(&server_args);
if (args.return_code != 0) return args.return_code; if (server_args.return_code != 0) return server_args.return_code;
/* Simple CyaSSL client server test */ /* Simple CyaSSL client server test */
InitTcpReady(&ready); simple_test(&server_args);
server_args.signal = &ready;
start_thread(server_test, &server_args, &serverThread);
wait_tcp_ready(&server_args);
client_test(&args);
if (args.return_code != 0) return args.return_code;
join_thread(serverThread);
if (server_args.return_code != 0) return server_args.return_code; if (server_args.return_code != 0) return server_args.return_code;
/* Echo input yaSSL client server test */ /* Echo input yaSSL client server test */
@ -119,6 +116,9 @@ int main(int argc, char** argv)
strcpy(echo_args.argv[2], "output"); strcpy(echo_args.argv[2], "output");
remove("output"); remove("output");
/* Share the signal, it has the new port number in it. */
echo_args.signal = server_args.signal;
/* make sure OK */ /* make sure OK */
echoclient_test(&echo_args); echoclient_test(&echo_args);
if (echo_args.return_code != 0) return echo_args.return_code; if (echo_args.return_code != 0) return echo_args.return_code;
@ -157,6 +157,65 @@ int main(int argc, char** argv)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
void simple_test(func_args* args)
{
THREAD_TYPE serverThread;
func_args svrArgs;
char *svrArgv[NUMARGS];
char argc0s[32];
char argc1s[32];
char argc2s[32];
func_args cliArgs;
char *cliArgv[NUMARGS];
char argc0c[32];
char argc1c[32];
char argc2c[32];
svrArgv[0] = argc0s;
svrArgv[1] = argc1s;
svrArgv[2] = argc2s;
cliArgv[0] = argc0c;
cliArgv[1] = argc1c;
cliArgv[2] = argc2c;
svrArgs.argc = 1;
svrArgs.argv = svrArgv;
svrArgs.return_code = 0;
cliArgs.argc = 1;
cliArgs.argv = cliArgv;
cliArgs.return_code = 0;
strcpy(svrArgs.argv[0], "SimpleServer");
#ifndef USE_WINDOWS_API
svrArgs.argc = NUMARGS;
strcpy(svrArgs.argv[1], "-p");
strcpy(svrArgs.argv[2], "0");
#endif
/* Set the last arg later, when it is known. */
args->return_code = 0;
svrArgs.signal = args->signal;
start_thread(server_test, &svrArgs, &serverThread);
wait_tcp_ready(&svrArgs);
/* Setting the actual port number. */
strcpy(cliArgs.argv[0], "SimpleClient");
#ifndef USE_WINDOWS_API
cliArgs.argc = NUMARGS;
strcpy(cliArgs.argv[1], "-p");
snprintf(cliArgs.argv[2], sizeof(argc2c), "%d", svrArgs.signal->port);
#endif
client_test(&cliArgs);
if (cliArgs.return_code != 0) {
args->return_code = cliArgs.return_code;
return;
}
join_thread(serverThread);
if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
}
void wait_tcp_ready(func_args* args) void wait_tcp_ready(func_args* args)
@ -200,6 +259,7 @@ void join_thread(THREAD_TYPE thread)
void InitTcpReady(tcp_ready* ready) void InitTcpReady(tcp_ready* ready)
{ {
ready->ready = 0; ready->ready = 0;
ready->port = 0;
#ifdef _POSIX_THREADS #ifdef _POSIX_THREADS
pthread_mutex_init(&ready->mutex, 0); pthread_mutex_init(&ready->mutex, 0);
pthread_cond_init(&ready->cond, 0); pthread_cond_init(&ready->cond, 0);