3 * Copyright (C) 2006-2014 wolfSSL Inc.
5 * This file is part of CyaSSL.
7 * CyaSSL 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 * CyaSSL 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 <cyassl/ctaocrypt/settings.h>
28 #include <cyassl/test.h>
29 #include "ctaocrypt/test/test.h"
31 #ifndef SINGLE_THREADED
33 #include <cyassl/openssl/ssl.h>
34 #include <cyassl/ctaocrypt/sha256.h>
36 #include "examples/echoclient/echoclient.h"
37 #include "examples/echoserver/echoserver.h"
38 #include "examples/server/server.h"
39 #include "examples/client/client.h"
42 void file_test(const char* file, byte* hash);
44 void simple_test(func_args*);
50 #ifndef USE_WINDOWS_API
51 static const char outputName[] = "/tmp/output";
53 static const char outputName[] = "output";
58 char* myoptarg = NULL;
60 int main(int argc, char** argv)
62 func_args server_args;
65 THREAD_TYPE serverThread;
68 int ret = OpenNitroxDevice(CAVIUM_DIRECT, CAVIUM_DEV_ID);
70 err_sys("Cavium OpenNitroxDevice failed");
71 #endif /* HAVE_CAVIUM */
75 server_args.argc = argc;
76 server_args.argv = argv;
79 #if defined(DEBUG_CYASSL) && !defined(HAVE_VALGRIND)
80 CyaSSL_Debugging_ON();
83 if (CurrentDir("testsuite") || CurrentDir("_build"))
85 else if (CurrentDir("Debug") || CurrentDir("Release"))
86 ChangeDirBack(3); /* Xcode->Preferences->Locations->Locations*/
87 /* Derived Data Advanced -> Custom */
88 /* Relative to Workspace, Build/Products */
89 /* Debug or Release */
90 server_args.signal = &ready;
94 ctaocrypt_test(&server_args);
95 if (server_args.return_code != 0) return server_args.return_code;
97 /* Simple CyaSSL client server test */
98 simple_test(&server_args);
99 if (server_args.return_code != 0) return server_args.return_code;
101 /* Echo input yaSSL client server test */
102 start_thread(echoserver_test, &server_args, &serverThread);
103 wait_tcp_ready(&server_args);
106 char* myArgv[NUMARGS];
117 echo_args.argv = myArgv;
119 strcpy(echo_args.argv[0], "echoclient");
120 strcpy(echo_args.argv[1], "input");
121 strcpy(echo_args.argv[2], outputName);
124 /* Share the signal, it has the new port number in it. */
125 echo_args.signal = server_args.signal;
128 echoclient_test(&echo_args);
129 if (echo_args.return_code != 0) return echo_args.return_code;
132 wait_tcp_ready(&server_args);
134 /* send quit to echoserver */
136 strcpy(echo_args.argv[1], "quit");
138 echoclient_test(&echo_args);
139 if (echo_args.return_code != 0) return echo_args.return_code;
140 join_thread(serverThread);
141 if (server_args.return_code != 0) return server_args.return_code;
144 /* validate output equals input */
146 byte input[SHA256_DIGEST_SIZE];
147 byte output[SHA256_DIGEST_SIZE];
149 file_test("input", input);
150 file_test(outputName, output);
151 if (memcmp(input, output, sizeof(input)) != 0)
156 FreeTcpReady(&ready);
159 CspShutdown(CAVIUM_DEV_ID);
161 printf("\nAll tests passed!\n");
165 void simple_test(func_args* args)
167 THREAD_TYPE serverThread;
182 char *cliArgv[NUMARGS];
201 svrArgs.argv = svrArgv;
202 svrArgs.return_code = 0;
204 cliArgs.argv = cliArgv;
205 cliArgs.return_code = 0;
207 strcpy(svrArgs.argv[0], "SimpleServer");
208 #if !defined(USE_WINDOWS_API) && !defined(CYASSL_SNIFFER)
209 strcpy(svrArgs.argv[svrArgs.argc++], "-p");
210 strcpy(svrArgs.argv[svrArgs.argc++], "0");
213 strcpy(svrArgs.argv[svrArgs.argc++], "-d");
214 strcpy(svrArgs.argv[svrArgs.argc++], "-n");
215 strcpy(svrArgs.argv[svrArgs.argc++], "-c");
216 strcpy(svrArgs.argv[svrArgs.argc++], "./certs/ntru-cert.pem");
217 strcpy(svrArgs.argv[svrArgs.argc++], "-k");
218 strcpy(svrArgs.argv[svrArgs.argc++], "./certs/ntru-key.raw");
220 /* Set the last arg later, when it is known. */
222 args->return_code = 0;
223 svrArgs.signal = args->signal;
224 start_thread(server_test, &svrArgs, &serverThread);
225 wait_tcp_ready(&svrArgs);
227 /* Setting the actual port number. */
228 strcpy(cliArgs.argv[0], "SimpleClient");
229 #ifndef USE_WINDOWS_API
230 cliArgs.argc = NUMARGS;
231 strcpy(cliArgs.argv[1], "-p");
232 snprintf(cliArgs.argv[2], sizeof(argc2c), "%d", svrArgs.signal->port);
235 client_test(&cliArgs);
236 if (cliArgs.return_code != 0) {
237 args->return_code = cliArgs.return_code;
240 join_thread(serverThread);
241 if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
245 void wait_tcp_ready(func_args* args)
247 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
248 pthread_mutex_lock(&args->signal->mutex);
250 if (!args->signal->ready)
251 pthread_cond_wait(&args->signal->cond, &args->signal->mutex);
252 args->signal->ready = 0; /* reset */
254 pthread_mutex_unlock(&args->signal->mutex);
261 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
263 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
264 pthread_create(thread, 0, fun, args);
267 *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
272 void join_thread(THREAD_TYPE thread)
274 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
275 pthread_join(thread, 0);
277 int res = WaitForSingleObject((HANDLE)thread, INFINITE);
278 assert(res == WAIT_OBJECT_0);
279 res = CloseHandle((HANDLE)thread);
285 void InitTcpReady(tcp_ready* ready)
289 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
290 pthread_mutex_init(&ready->mutex, 0);
291 pthread_cond_init(&ready->cond, 0);
296 void FreeTcpReady(tcp_ready* ready)
298 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
299 pthread_mutex_destroy(&ready->mutex);
300 pthread_cond_destroy(&ready->cond);
307 void file_test(const char* file, byte* check)
313 byte shasum[SHA256_DIGEST_SIZE];
315 ret = InitSha256(&sha256);
317 printf("Can't InitSha256 %d\n", ret);
320 if( !( f = fopen( file, "rb" ) )) {
321 printf("Can't open %s\n", file);
324 while( ( i = (int)fread(buf, 1, sizeof(buf), f )) > 0 ) {
325 ret = Sha256Update(&sha256, buf, i);
327 printf("Can't Sha256Update %d\n", ret);
332 ret = Sha256Final(&sha256, shasum);
334 printf("Can't Sha256Final %d\n", ret);
338 memcpy(check, shasum, sizeof(shasum));
340 for(j = 0; j < SHA256_DIGEST_SIZE; ++j )
341 printf( "%02x", shasum[j] );
343 printf(" %s\n", file);
349 #else /* SINGLE_THREADED */
353 char* myoptarg = NULL;
356 int main(int argc, char** argv)
358 func_args server_args;
360 server_args.argc = argc;
361 server_args.argv = argv;
363 if (CurrentDir("testsuite") || CurrentDir("_build"))
365 else if (CurrentDir("Debug") || CurrentDir("Release"))
366 ChangeDirBack(3); /* Xcode->Preferences->Locations->Locations*/
367 /* Derived Data Advanced -> Custom */
368 /* Relative to Workspace, Build/Products */
369 /* Debug or Release */
371 ctaocrypt_test(&server_args);
372 if (server_args.return_code != 0) return server_args.return_code;
374 printf("\nAll tests passed!\n");
379 #endif /* SINGLE_THREADED */