3 * Copyright (C) 2006-2015 wolfSSL Inc.
5 * This file is part of wolfSSL. (formerly known as CyaSSL)
7 * wolfSSL is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * wolfSSL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 #include <wolfssl/wolfcrypt/settings.h>
28 #include <wolfssl/ssl.h>
29 #include <wolfssl/test.h>
30 #include "wolfcrypt/test/test.h"
32 #ifndef SINGLE_THREADED
34 #include <wolfssl/openssl/ssl.h>
35 #include <wolfssl/wolfcrypt/sha256.h>
37 #include "examples/echoclient/echoclient.h"
38 #include "examples/echoserver/echoserver.h"
39 #include "examples/server/server.h"
40 #include "examples/client/client.h"
43 void file_test(const char* file, byte* hash);
45 void simple_test(func_args*);
51 static const char *outputName;
54 char* myoptarg = NULL;
57 #ifndef NO_TESTSUITE_MAIN_DRIVER
59 static int testsuite_test(int argc, char** argv);
61 int main(int argc, char** argv)
63 return testsuite_test(argc, argv);
66 #endif /* NO_TESTSUITE_MAIN_DRIVER */
69 int testsuite_test(int argc, char** argv)
71 func_args server_args;
74 THREAD_TYPE serverThread;
76 #ifndef USE_WINDOWS_API
77 char tempName[] = "/tmp/output-XXXXXX";
81 char tempName[] = "fnXXXXXX";
87 int ret = OpenNitroxDevice(CAVIUM_DIRECT, CAVIUM_DEV_ID);
89 err_sys("Cavium OpenNitroxDevice failed");
90 #endif /* HAVE_CAVIUM */
94 server_args.argc = argc;
95 server_args.argv = argv;
98 #if defined(DEBUG_WOLFSSL) && !defined(HAVE_VALGRIND)
99 wolfSSL_Debugging_ON();
102 #if !defined(WOLFSSL_TIRTOS)
103 if (CurrentDir("testsuite") || CurrentDir("_build"))
105 else if (CurrentDir("Debug") || CurrentDir("Release"))
106 ChangeDirBack(3); /* Xcode->Preferences->Locations->Locations*/
107 /* Derived Data Advanced -> Custom */
108 /* Relative to Workspace, Build/Products */
109 /* Debug or Release */
112 #ifdef WOLFSSL_TIRTOS
113 fdOpenSession(Task_self());
116 server_args.signal = &ready;
117 InitTcpReady(&ready);
120 wolfcrypt_test(&server_args);
121 if (server_args.return_code != 0) return server_args.return_code;
123 /* Simple wolfSSL client server test */
124 simple_test(&server_args);
125 if (server_args.return_code != 0) return server_args.return_code;
127 /* Echo input wolfSSL client server test */
128 start_thread(echoserver_test, &server_args, &serverThread);
129 wait_tcp_ready(&server_args);
132 char* myArgv[NUMARGS];
143 echo_args.argv = myArgv;
145 /* Create unique file name */
146 outputName = mymktemp(tempName, len, num);
147 if (outputName == NULL) {
148 printf("Could not create unique file name");
152 strcpy(echo_args.argv[0], "echoclient");
153 strcpy(echo_args.argv[1], "input");
154 strcpy(echo_args.argv[2], outputName);
156 /* Share the signal, it has the new port number in it. */
157 echo_args.signal = server_args.signal;
160 echoclient_test(&echo_args);
161 if (echo_args.return_code != 0) return echo_args.return_code;
164 wait_tcp_ready(&server_args);
166 /* send quit to echoserver */
168 strcpy(echo_args.argv[1], "quit");
170 echoclient_test(&echo_args);
171 if (echo_args.return_code != 0) return echo_args.return_code;
172 join_thread(serverThread);
173 if (server_args.return_code != 0) return server_args.return_code;
179 XMEMSET(ciphers, 0, sizeof(ciphers));
180 wolfSSL_get_ciphers(ciphers, sizeof(ciphers)-1);
181 printf("ciphers = %s\n", ciphers);
184 /* validate output equals input */
186 byte input[SHA256_DIGEST_SIZE];
187 byte output[SHA256_DIGEST_SIZE];
189 file_test("input", input);
190 file_test(outputName, output);
192 if (memcmp(input, output, sizeof(input)) != 0)
197 FreeTcpReady(&ready);
199 #ifdef WOLFSSL_TIRTOS
200 fdCloseSession(Task_self());
204 CspShutdown(CAVIUM_DEV_ID);
206 printf("\nAll tests passed!\n");
210 void simple_test(func_args* args)
212 THREAD_TYPE serverThread;
227 char *cliArgv[NUMARGS];
246 svrArgs.argv = svrArgv;
247 svrArgs.return_code = 0;
249 cliArgs.argv = cliArgv;
250 cliArgs.return_code = 0;
252 strcpy(svrArgs.argv[0], "SimpleServer");
253 #if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_SNIFFER) && \
254 !defined(WOLFSSL_TIRTOS)
255 strcpy(svrArgs.argv[svrArgs.argc++], "-p");
256 strcpy(svrArgs.argv[svrArgs.argc++], "0");
259 strcpy(svrArgs.argv[svrArgs.argc++], "-d");
260 strcpy(svrArgs.argv[svrArgs.argc++], "-n");
261 strcpy(svrArgs.argv[svrArgs.argc++], "-c");
262 strcpy(svrArgs.argv[svrArgs.argc++], "./certs/ntru-cert.pem");
263 strcpy(svrArgs.argv[svrArgs.argc++], "-k");
264 strcpy(svrArgs.argv[svrArgs.argc++], "./certs/ntru-key.raw");
266 /* Set the last arg later, when it is known. */
268 args->return_code = 0;
269 svrArgs.signal = args->signal;
270 start_thread(server_test, &svrArgs, &serverThread);
271 wait_tcp_ready(&svrArgs);
273 /* Setting the actual port number. */
274 strcpy(cliArgs.argv[0], "SimpleClient");
275 #ifndef USE_WINDOWS_API
276 cliArgs.argc = NUMARGS;
277 strcpy(cliArgs.argv[1], "-p");
278 snprintf(cliArgs.argv[2], sizeof(argc2c), "%d", svrArgs.signal->port);
281 client_test(&cliArgs);
282 if (cliArgs.return_code != 0) {
283 args->return_code = cliArgs.return_code;
286 join_thread(serverThread);
287 if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
291 void wait_tcp_ready(func_args* args)
293 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
294 pthread_mutex_lock(&args->signal->mutex);
296 if (!args->signal->ready)
297 pthread_cond_wait(&args->signal->cond, &args->signal->mutex);
298 args->signal->ready = 0; /* reset */
300 pthread_mutex_unlock(&args->signal->mutex);
307 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
309 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
310 pthread_create(thread, 0, fun, args);
312 #elif defined(WOLFSSL_TIRTOS)
313 /* Initialize the defaults and set the parameters. */
314 Task_Params taskParams;
315 Task_Params_init(&taskParams);
316 taskParams.arg0 = (UArg)args;
317 taskParams.stackSize = 65535;
318 *thread = Task_create((Task_FuncPtr)fun, &taskParams, NULL);
319 if (*thread == NULL) {
320 printf("Failed to create new Task\n");
324 *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
329 void join_thread(THREAD_TYPE thread)
331 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
332 pthread_join(thread, 0);
333 #elif defined(WOLFSSL_TIRTOS)
335 if (Task_getMode(thread) == Task_Mode_TERMINATED) {
342 int res = WaitForSingleObject((HANDLE)thread, INFINITE);
343 assert(res == WAIT_OBJECT_0);
344 res = CloseHandle((HANDLE)thread);
350 void InitTcpReady(tcp_ready* ready)
354 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
355 pthread_mutex_init(&ready->mutex, 0);
356 pthread_cond_init(&ready->cond, 0);
361 void FreeTcpReady(tcp_ready* ready)
363 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
364 pthread_mutex_destroy(&ready->mutex);
365 pthread_cond_destroy(&ready->cond);
372 void file_test(const char* file, byte* check)
378 byte shasum[SHA256_DIGEST_SIZE];
380 ret = wc_InitSha256(&sha256);
382 printf("Can't wc_InitSha256 %d\n", ret);
385 if( !( f = fopen( file, "rb" ) )) {
386 printf("Can't open %s\n", file);
389 while( ( i = (int)fread(buf, 1, sizeof(buf), f )) > 0 ) {
390 ret = wc_Sha256Update(&sha256, buf, i);
392 printf("Can't wc_Sha256Update %d\n", ret);
397 ret = wc_Sha256Final(&sha256, shasum);
399 printf("Can't wc_Sha256Final %d\n", ret);
403 memcpy(check, shasum, sizeof(shasum));
405 for(j = 0; j < SHA256_DIGEST_SIZE; ++j )
406 printf( "%02x", shasum[j] );
408 printf(" %s\n", file);
414 #else /* SINGLE_THREADED */
418 char* myoptarg = NULL;
421 int main(int argc, char** argv)
423 func_args server_args;
425 server_args.argc = argc;
426 server_args.argv = argv;
428 if (CurrentDir("testsuite") || CurrentDir("_build"))
430 else if (CurrentDir("Debug") || CurrentDir("Release"))
431 ChangeDirBack(3); /* Xcode->Preferences->Locations->Locations*/
432 /* Derived Data Advanced -> Custom */
433 /* Relative to Workspace, Build/Products */
434 /* Debug or Release */
436 wolfcrypt_test(&server_args);
437 if (server_args.return_code != 0) return server_args.return_code;
439 printf("\nAll tests passed!\n");
444 #endif /* SINGLE_THREADED */