]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/WolfSSL/testsuite/testsuite.c
Rename the CyaSSL directory to WolfSSL
[freertos] / FreeRTOS-Plus / Source / WolfSSL / testsuite / testsuite.c
1 /* testsuite.c
2  *
3  * Copyright (C) 2006-2014 wolfSSL Inc.
4  *
5  * This file is part of CyaSSL.
6  *
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.
11  *
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.
16  *
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
20  */
21
22 #ifdef HAVE_CONFIG_H
23     #include <config.h>
24 #endif
25
26 #include <cyassl/ctaocrypt/settings.h>
27
28 #include <cyassl/test.h>
29 #include "ctaocrypt/test/test.h"
30
31 #ifndef SINGLE_THREADED
32
33 #include <cyassl/openssl/ssl.h>
34 #include <cyassl/ctaocrypt/sha256.h>
35
36 #include "examples/echoclient/echoclient.h"
37 #include "examples/echoserver/echoserver.h"
38 #include "examples/server/server.h"
39 #include "examples/client/client.h"
40
41
42 void file_test(const char* file, byte* hash);
43
44 void simple_test(func_args*);
45
46 enum {
47     NUMARGS = 3
48 };
49
50 #ifndef USE_WINDOWS_API
51     static const char outputName[] = "/tmp/output";
52 #else
53     static const char outputName[] = "output";
54 #endif
55
56
57 int myoptind = 0;
58 char* myoptarg = NULL;
59
60 int main(int argc, char** argv)
61 {
62     func_args server_args;
63
64     tcp_ready ready;
65     THREAD_TYPE serverThread;
66
67 #ifdef HAVE_CAVIUM
68         int ret = OpenNitroxDevice(CAVIUM_DIRECT, CAVIUM_DEV_ID);
69         if (ret != 0)
70             err_sys("Cavium OpenNitroxDevice failed");
71 #endif /* HAVE_CAVIUM */
72
73     StartTCP();
74
75     server_args.argc = argc;
76     server_args.argv = argv;
77
78     CyaSSL_Init();
79 #if defined(DEBUG_CYASSL) && !defined(HAVE_VALGRIND)
80     CyaSSL_Debugging_ON();
81 #endif
82
83     if (CurrentDir("testsuite") || CurrentDir("_build"))
84         ChangeDirBack(1);
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;
91     InitTcpReady(&ready);
92
93     /* CTaoCrypt test */
94     ctaocrypt_test(&server_args);
95     if (server_args.return_code != 0) return server_args.return_code;
96  
97     /* Simple CyaSSL client server test */
98     simple_test(&server_args);
99     if (server_args.return_code != 0) return server_args.return_code;
100
101     /* Echo input yaSSL client server test */
102     start_thread(echoserver_test, &server_args, &serverThread);
103     wait_tcp_ready(&server_args);
104     {
105         func_args echo_args;
106         char* myArgv[NUMARGS];
107
108         char argc0[32];
109         char argc1[32];
110         char argc2[32];
111
112         myArgv[0] = argc0;
113         myArgv[1] = argc1;
114         myArgv[2] = argc2;
115
116         echo_args.argc = 3;
117         echo_args.argv = myArgv;
118    
119         strcpy(echo_args.argv[0], "echoclient");
120         strcpy(echo_args.argv[1], "input");
121         strcpy(echo_args.argv[2], outputName);
122         remove(outputName);
123
124         /* Share the signal, it has the new port number in it. */
125         echo_args.signal = server_args.signal;
126
127         /* make sure OK */
128         echoclient_test(&echo_args);
129         if (echo_args.return_code != 0) return echo_args.return_code;  
130
131 #ifdef CYASSL_DTLS
132         wait_tcp_ready(&server_args);
133 #endif
134         /* send quit to echoserver */
135         echo_args.argc = 2;
136         strcpy(echo_args.argv[1], "quit");
137
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;
142     }
143
144     /* validate output equals input */
145     {
146         byte input[SHA256_DIGEST_SIZE];
147         byte output[SHA256_DIGEST_SIZE];
148
149         file_test("input",  input);
150         file_test(outputName, output);
151         if (memcmp(input, output, sizeof(input)) != 0)
152             return EXIT_FAILURE;
153     }
154
155     CyaSSL_Cleanup();
156     FreeTcpReady(&ready);
157
158 #ifdef HAVE_CAVIUM
159         CspShutdown(CAVIUM_DEV_ID);
160 #endif
161     printf("\nAll tests passed!\n");
162     return EXIT_SUCCESS;
163 }
164
165 void simple_test(func_args* args)
166 {
167     THREAD_TYPE serverThread;
168
169     func_args svrArgs;
170     char *svrArgv[9];
171     char argc0s[32];
172     char argc1s[32];
173     char argc2s[32];
174     char argc3s[32];
175     char argc4s[32];
176     char argc5s[32];
177     char argc6s[32];
178     char argc7s[32];
179     char argc8s[32];
180
181     func_args cliArgs;
182     char *cliArgv[NUMARGS];
183     char argc0c[32];
184     char argc1c[32];
185     char argc2c[32];
186
187     svrArgv[0] = argc0s;
188     svrArgv[1] = argc1s;
189     svrArgv[2] = argc2s;
190     svrArgv[3] = argc3s;
191     svrArgv[4] = argc4s;
192     svrArgv[5] = argc5s;
193     svrArgv[6] = argc6s;
194     svrArgv[7] = argc7s;
195     svrArgv[8] = argc8s;
196     cliArgv[0] = argc0c;
197     cliArgv[1] = argc1c;
198     cliArgv[2] = argc2c;
199
200     svrArgs.argc = 1;
201     svrArgs.argv = svrArgv;
202     svrArgs.return_code = 0;
203     cliArgs.argc = 1;
204     cliArgs.argv = cliArgv;
205     cliArgs.return_code = 0;
206    
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");
211     #endif
212     #ifdef HAVE_NTRU
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");
219     #endif
220     /* Set the last arg later, when it is known. */
221
222     args->return_code = 0;
223     svrArgs.signal = args->signal;
224     start_thread(server_test, &svrArgs, &serverThread);
225     wait_tcp_ready(&svrArgs);
226    
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);
233     #endif
234
235     client_test(&cliArgs);
236     if (cliArgs.return_code != 0) {
237         args->return_code = cliArgs.return_code;
238         return;
239     }
240     join_thread(serverThread);
241     if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
242 }
243
244
245 void wait_tcp_ready(func_args* args)
246 {
247 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
248     pthread_mutex_lock(&args->signal->mutex);
249     
250     if (!args->signal->ready)
251         pthread_cond_wait(&args->signal->cond, &args->signal->mutex);
252     args->signal->ready = 0; /* reset */
253
254     pthread_mutex_unlock(&args->signal->mutex);
255 #else
256     (void)args;
257 #endif
258 }
259
260
261 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
262 {
263 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
264     pthread_create(thread, 0, fun, args);
265     return;
266 #else
267     *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
268 #endif
269 }
270
271
272 void join_thread(THREAD_TYPE thread)
273 {
274 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
275     pthread_join(thread, 0);
276 #else
277     int res = WaitForSingleObject((HANDLE)thread, INFINITE);
278     assert(res == WAIT_OBJECT_0);
279     res = CloseHandle((HANDLE)thread);
280     assert(res);
281 #endif
282 }
283
284
285 void InitTcpReady(tcp_ready* ready)
286 {
287     ready->ready = 0;
288     ready->port = 0;
289 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
290       pthread_mutex_init(&ready->mutex, 0);
291       pthread_cond_init(&ready->cond, 0);
292 #endif
293 }
294
295
296 void FreeTcpReady(tcp_ready* ready)
297 {
298 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
299     pthread_mutex_destroy(&ready->mutex);
300     pthread_cond_destroy(&ready->cond);
301 #else
302     (void)ready;
303 #endif
304 }
305
306
307 void file_test(const char* file, byte* check)
308 {
309     FILE* f;
310     int   i = 0, j, ret;
311     Sha256   sha256;
312     byte  buf[1024];
313     byte  shasum[SHA256_DIGEST_SIZE];
314    
315     ret = InitSha256(&sha256);
316     if (ret != 0) {
317         printf("Can't InitSha256 %d\n", ret);
318         return;
319     }
320     if( !( f = fopen( file, "rb" ) )) {
321         printf("Can't open %s\n", file);
322         return;
323     }
324     while( ( i = (int)fread(buf, 1, sizeof(buf), f )) > 0 ) {
325         ret = Sha256Update(&sha256, buf, i);
326         if (ret != 0) {
327             printf("Can't Sha256Update %d\n", ret);
328             return;
329         }
330     }
331     
332     ret = Sha256Final(&sha256, shasum);
333     if (ret != 0) {
334         printf("Can't Sha256Final %d\n", ret);
335         return;
336     }
337
338     memcpy(check, shasum, sizeof(shasum));
339
340     for(j = 0; j < SHA256_DIGEST_SIZE; ++j ) 
341         printf( "%02x", shasum[j] );
342    
343     printf("  %s\n", file);
344
345     fclose(f);
346 }
347
348
349 #else /* SINGLE_THREADED */
350
351
352 int myoptind = 0;
353 char* myoptarg = NULL;
354
355
356 int main(int argc, char** argv)
357 {
358     func_args server_args;
359
360     server_args.argc = argc;
361     server_args.argv = argv;
362
363     if (CurrentDir("testsuite") || CurrentDir("_build"))
364         ChangeDirBack(1);
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 */
370
371     ctaocrypt_test(&server_args);
372     if (server_args.return_code != 0) return server_args.return_code;
373
374     printf("\nAll tests passed!\n");
375     return EXIT_SUCCESS;
376 }
377
378
379 #endif /* SINGLE_THREADED */
380