]> begriffs open source - freertos/blob - FreeRTOS-Plus/Source/WolfSSL/testsuite/testsuite.c
Add the option to specify a stack size in the standard demo MessageBuffer tests.
[freertos] / FreeRTOS-Plus / Source / WolfSSL / testsuite / testsuite.c
1 /* testsuite.c
2  *
3  * Copyright (C) 2006-2015 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL. (formerly known as CyaSSL)
6  *
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.
11  *
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.
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 <wolfssl/wolfcrypt/settings.h>
27
28 #include <wolfssl/ssl.h>
29 #include <wolfssl/test.h>
30 #include "wolfcrypt/test/test.h"
31
32 #ifndef SINGLE_THREADED
33
34 #include <wolfssl/openssl/ssl.h>
35 #include <wolfssl/wolfcrypt/sha256.h>
36
37 #include "examples/echoclient/echoclient.h"
38 #include "examples/echoserver/echoserver.h"
39 #include "examples/server/server.h"
40 #include "examples/client/client.h"
41
42
43 void file_test(const char* file, byte* hash);
44
45 void simple_test(func_args*);
46
47 enum {
48     NUMARGS = 3
49 };
50
51 static const char *outputName;
52
53 int myoptind = 0;
54 char* myoptarg = NULL;
55
56
57 #ifndef NO_TESTSUITE_MAIN_DRIVER
58
59     static int testsuite_test(int argc, char** argv);
60
61     int main(int argc, char** argv)
62     {
63         return testsuite_test(argc, argv);
64     }
65
66 #endif /* NO_TESTSUITE_MAIN_DRIVER */
67
68
69 int testsuite_test(int argc, char** argv)
70 {
71     func_args server_args;
72
73     tcp_ready ready;
74     THREAD_TYPE serverThread;
75
76 #ifndef USE_WINDOWS_API
77     char tempName[] = "/tmp/output-XXXXXX";
78     int len = 18;
79     int num = 6;
80 #else
81     char tempName[] = "fnXXXXXX";
82     int len = 8;
83     int num = 6;
84 #endif
85
86 #ifdef HAVE_CAVIUM
87         int ret = OpenNitroxDevice(CAVIUM_DIRECT, CAVIUM_DEV_ID);
88         if (ret != 0)
89             err_sys("Cavium OpenNitroxDevice failed");
90 #endif /* HAVE_CAVIUM */
91
92     StartTCP();
93
94     server_args.argc = argc;
95     server_args.argv = argv;
96
97     wolfSSL_Init();
98 #if defined(DEBUG_WOLFSSL) && !defined(HAVE_VALGRIND)
99     wolfSSL_Debugging_ON();
100 #endif
101
102 #if !defined(WOLFSSL_TIRTOS)
103     if (CurrentDir("testsuite") || CurrentDir("_build"))
104         ChangeDirBack(1);
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 */
110 #endif
111
112 #ifdef WOLFSSL_TIRTOS
113     fdOpenSession(Task_self());
114 #endif
115
116     server_args.signal = &ready;
117     InitTcpReady(&ready);
118
119     /* wc_ test */
120     wolfcrypt_test(&server_args);
121     if (server_args.return_code != 0) return server_args.return_code;
122  
123     /* Simple wolfSSL client server test */
124     simple_test(&server_args);
125     if (server_args.return_code != 0) return server_args.return_code;
126
127     /* Echo input wolfSSL client server test */
128     start_thread(echoserver_test, &server_args, &serverThread);
129     wait_tcp_ready(&server_args);
130     {
131         func_args echo_args;
132         char* myArgv[NUMARGS];
133
134         char argc0[32];
135         char argc1[32];
136         char argc2[32];
137
138         myArgv[0] = argc0;
139         myArgv[1] = argc1;
140         myArgv[2] = argc2;
141
142         echo_args.argc = 3;
143         echo_args.argv = myArgv;
144
145         /* Create unique file name */
146         outputName = mymktemp(tempName, len, num);
147         if (outputName == NULL) {
148             printf("Could not create unique file name");
149             return EXIT_FAILURE;
150         }
151
152         strcpy(echo_args.argv[0], "echoclient");
153         strcpy(echo_args.argv[1], "input");
154         strcpy(echo_args.argv[2], outputName);
155
156         /* Share the signal, it has the new port number in it. */
157         echo_args.signal = server_args.signal;
158
159         /* make sure OK */
160         echoclient_test(&echo_args);
161         if (echo_args.return_code != 0) return echo_args.return_code;
162
163 #ifdef WOLFSSL_DTLS
164         wait_tcp_ready(&server_args);
165 #endif
166         /* send quit to echoserver */
167         echo_args.argc = 2;
168         strcpy(echo_args.argv[1], "quit");
169
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;
174     }
175
176     /* show ciphers */
177     {
178         char ciphers[1024];
179         XMEMSET(ciphers, 0, sizeof(ciphers));
180         wolfSSL_get_ciphers(ciphers, sizeof(ciphers)-1);
181         printf("ciphers = %s\n", ciphers);
182     }
183
184     /* validate output equals input */
185     {
186         byte input[SHA256_DIGEST_SIZE];
187         byte output[SHA256_DIGEST_SIZE];
188
189         file_test("input",  input);
190         file_test(outputName, output);
191         remove(outputName);
192         if (memcmp(input, output, sizeof(input)) != 0)
193             return EXIT_FAILURE;
194     }
195
196     wolfSSL_Cleanup();
197     FreeTcpReady(&ready);
198
199 #ifdef WOLFSSL_TIRTOS
200     fdCloseSession(Task_self());
201 #endif
202
203 #ifdef HAVE_CAVIUM
204         CspShutdown(CAVIUM_DEV_ID);
205 #endif
206     printf("\nAll tests passed!\n");
207     return EXIT_SUCCESS;
208 }
209
210 void simple_test(func_args* args)
211 {
212     THREAD_TYPE serverThread;
213
214     func_args svrArgs;
215     char *svrArgv[9];
216     char argc0s[32];
217     char argc1s[32];
218     char argc2s[32];
219     char argc3s[32];
220     char argc4s[32];
221     char argc5s[32];
222     char argc6s[32];
223     char argc7s[32];
224     char argc8s[32];
225
226     func_args cliArgs;
227     char *cliArgv[NUMARGS];
228     char argc0c[32];
229     char argc1c[32];
230     char argc2c[32];
231
232     svrArgv[0] = argc0s;
233     svrArgv[1] = argc1s;
234     svrArgv[2] = argc2s;
235     svrArgv[3] = argc3s;
236     svrArgv[4] = argc4s;
237     svrArgv[5] = argc5s;
238     svrArgv[6] = argc6s;
239     svrArgv[7] = argc7s;
240     svrArgv[8] = argc8s;
241     cliArgv[0] = argc0c;
242     cliArgv[1] = argc1c;
243     cliArgv[2] = argc2c;
244
245     svrArgs.argc = 1;
246     svrArgs.argv = svrArgv;
247     svrArgs.return_code = 0;
248     cliArgs.argc = 1;
249     cliArgs.argv = cliArgv;
250     cliArgs.return_code = 0;
251
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");
257     #endif
258     #ifdef HAVE_NTRU
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");
265     #endif
266     /* Set the last arg later, when it is known. */
267
268     args->return_code = 0;
269     svrArgs.signal = args->signal;
270     start_thread(server_test, &svrArgs, &serverThread);
271     wait_tcp_ready(&svrArgs);
272
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);
279     #endif
280
281     client_test(&cliArgs);
282     if (cliArgs.return_code != 0) {
283         args->return_code = cliArgs.return_code;
284         return;
285     }
286     join_thread(serverThread);
287     if (svrArgs.return_code != 0) args->return_code = svrArgs.return_code;
288 }
289
290
291 void wait_tcp_ready(func_args* args)
292 {
293 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
294     pthread_mutex_lock(&args->signal->mutex);
295
296     if (!args->signal->ready)
297         pthread_cond_wait(&args->signal->cond, &args->signal->mutex);
298     args->signal->ready = 0; /* reset */
299
300     pthread_mutex_unlock(&args->signal->mutex);
301 #else
302     (void)args;
303 #endif
304 }
305
306
307 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
308 {
309 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
310     pthread_create(thread, 0, fun, args);
311     return;
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");
321     }
322     Task_yield();
323 #else
324     *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
325 #endif
326 }
327
328
329 void join_thread(THREAD_TYPE thread)
330 {
331 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
332     pthread_join(thread, 0);
333 #elif defined(WOLFSSL_TIRTOS)
334     while(1) {
335         if (Task_getMode(thread) == Task_Mode_TERMINATED) {
336                     Task_sleep(5);
337             break;
338         }
339         Task_yield();
340     }
341 #else
342     int res = WaitForSingleObject((HANDLE)thread, INFINITE);
343     assert(res == WAIT_OBJECT_0);
344     res = CloseHandle((HANDLE)thread);
345     assert(res);
346 #endif
347 }
348
349
350 void InitTcpReady(tcp_ready* ready)
351 {
352     ready->ready = 0;
353     ready->port = 0;
354 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
355       pthread_mutex_init(&ready->mutex, 0);
356       pthread_cond_init(&ready->cond, 0);
357 #endif
358 }
359
360
361 void FreeTcpReady(tcp_ready* ready)
362 {
363 #if defined(_POSIX_THREADS) && !defined(__MINGW32__)
364     pthread_mutex_destroy(&ready->mutex);
365     pthread_cond_destroy(&ready->cond);
366 #else
367     (void)ready;
368 #endif
369 }
370
371
372 void file_test(const char* file, byte* check)
373 {
374     FILE* f;
375     int   i = 0, j, ret;
376     Sha256   sha256;
377     byte  buf[1024];
378     byte  shasum[SHA256_DIGEST_SIZE];
379
380     ret = wc_InitSha256(&sha256);
381     if (ret != 0) {
382         printf("Can't wc_InitSha256 %d\n", ret);
383         return;
384     }
385     if( !( f = fopen( file, "rb" ) )) {
386         printf("Can't open %s\n", file);
387         return;
388     }
389     while( ( i = (int)fread(buf, 1, sizeof(buf), f )) > 0 ) {
390         ret = wc_Sha256Update(&sha256, buf, i);
391         if (ret != 0) {
392             printf("Can't wc_Sha256Update %d\n", ret);
393             return;
394         }
395     }
396
397     ret = wc_Sha256Final(&sha256, shasum);
398     if (ret != 0) {
399         printf("Can't wc_Sha256Final %d\n", ret);
400         return;
401     }
402
403     memcpy(check, shasum, sizeof(shasum));
404
405     for(j = 0; j < SHA256_DIGEST_SIZE; ++j )
406         printf( "%02x", shasum[j] );
407
408     printf("  %s\n", file);
409
410     fclose(f);
411 }
412
413
414 #else /* SINGLE_THREADED */
415
416
417 int myoptind = 0;
418 char* myoptarg = NULL;
419
420
421 int main(int argc, char** argv)
422 {
423     func_args server_args;
424
425     server_args.argc = argc;
426     server_args.argv = argv;
427
428     if (CurrentDir("testsuite") || CurrentDir("_build"))
429         ChangeDirBack(1);
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 */
435
436     wolfcrypt_test(&server_args);
437     if (server_args.return_code != 0) return server_args.return_code;
438
439     printf("\nAll tests passed!\n");
440     return EXIT_SUCCESS;
441 }
442
443
444 #endif /* SINGLE_THREADED */
445